diff options
author | Joshua Leung <aligorith@gmail.com> | 2009-05-15 17:35:29 +0400 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2009-05-15 17:35:29 +0400 |
commit | 070f32f77806bed40086621f96e372c383ba9d96 (patch) | |
tree | a0126eb3779391dac2614448fb383103fc71deba | |
parent | e295cfd4d5e9adcd006cbab95f84eb93a73ea6bc (diff) | |
parent | b4d46e5dedfa88951558a4f941d987a171594a0a (diff) |
NLA Branch: Merge from 2.5 20116:20214
74 files changed, 2613 insertions, 2013 deletions
diff --git a/projectfiles_vc9/blender/editors/ED_editors.vcproj b/projectfiles_vc9/blender/editors/ED_editors.vcproj index a7deb22555e..7f3cac8df2a 100644 --- a/projectfiles_vc9/blender/editors/ED_editors.vcproj +++ b/projectfiles_vc9/blender/editors/ED_editors.vcproj @@ -44,7 +44,7 @@ Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
- PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG"
+ PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_FREETYPE2;WITH_INTERNATIONAL;WITH_OPENEXR;WITH_DDS;WITH_BULLET=1;WITH_FFMPEG"
StringPooling="true"
RuntimeLibrary="0"
EnableFunctionLevelLinking="true"
@@ -119,7 +119,7 @@ Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\..\build\msvc_9\intern\bsp\include;..\..\..\..\build\msvc_9\intern\ghost\include;..\..\..\..\build\msvc_9\intern\elbeem\include;..\..\..\..\build\msvc_9\intern\opennl\include;..\..\..\..\build\msvc_9\intern\bmfont\include;..\..\..\..\build\msvc_9\intern\blenkey\include;..\..\..\..\build\msvc_9\intern\decimation\include;..\..\..\..\build\msvc_9\intern\memutil\include;..\..\..\..\build\msvc_9\intern\guardedalloc\include;..\..\..\..\build\msvc_9\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\editors\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenfont;..\..\..\source\blender\makesdna;..\..\..\source\blender\makesrna;..\..\..\source\blender\nodes;..\..\..\source\blender\windowmanager;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_9\extern\verse\include;..\..\..\..\lib\windows\pthreads\include;..\..\..\..\lib\windows\ffmpeg\include;..\..\..\..\build\msvc_9\extern\glew\include;..\..\..\source\blender\gpu"
- PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER;WITH_QUICKTIME;INTERNATIONAL;WITH_OPENEXR;WITH_DDS;WITH_BULLET = 1;WITH_FFMPEG"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER;WITH_QUICKTIME;INTERNATIONAL;WITH_BF_INTERNATIONAL;WITH_FREETYPE2;WITH_OPENEXR;WITH_DDS;WITH_BULLET = 1;WITH_FFMPEG"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
DefaultCharIsUnsigned="true"
diff --git a/release/ui/buttons_data_camera.py b/release/ui/buttons_data_camera.py index 0f852216a87..27f63669cf7 100644 --- a/release/ui/buttons_data_camera.py +++ b/release/ui/buttons_data_camera.py @@ -21,30 +21,30 @@ class DATA_PT_cameralens(DataButtonsPanel): if not cam: return - layout.row() layout.itemR(cam, "type", expand=True) - layout.row() - if (cam.type == 'PERSP'): - layout.itemR(cam, "lens_unit") - if (cam.lens_unit == 'MILLIMETERS'): - layout.itemR(cam, "lens", text="Angle") - if (cam.lens_unit == 'DEGREES'): - layout.itemR(cam, "angle") - if (cam.type == 'ORTHO'): - layout.itemR(cam, "ortho_scale") + row = layout.row(align=True) + if cam.type == 'PERSP': + if cam.lens_unit == 'MILLIMETERS': + row.itemR(cam, "lens", text="Angle") + elif cam.lens_unit == 'DEGREES': + row.itemR(cam, "angle") + + row.itemR(cam, "lens_unit", text="") + elif cam.type == 'ORTHO': + row.itemR(cam, "ortho_scale") - layout.column_flow() - layout.itemL(text="Shift:") - layout.itemR(cam, "shift_x", text="X") - layout.itemR(cam, "shift_y", text="Y") - layout.itemL(text="Clipping:") - layout.itemR(cam, "clip_start", text="Start") - layout.itemR(cam, "clip_end", text="End") + flow = layout.column_flow() + flow.itemL(text="Shift:") + flow.itemR(cam, "shift_x", text="X") + flow.itemR(cam, "shift_y", text="Y") + flow.itemL(text="Clipping:") + flow.itemR(cam, "clip_start", text="Start") + flow.itemR(cam, "clip_end", text="End") - layout.row() - layout.itemR(cam, "dof_object") - layout.itemR(cam, "dof_distance") + row = layout.row() + row.itemR(cam, "dof_object") + row.itemR(cam, "dof_distance") class DATA_PT_cameradisplay(DataButtonsPanel): __idname__ = "DATA_PT_cameradisplay" @@ -57,23 +57,21 @@ class DATA_PT_cameradisplay(DataButtonsPanel): if not cam: return - layout.split(number=2) + split = layout.split() - sub = layout.sub(0) - sub.column() + sub = split.column() sub.itemR(cam, "show_limits", text="Limits") sub.itemR(cam, "show_mist", text="Mist") sub.itemR(cam, "show_title_safe", text="Title Safe") sub.itemR(cam, "show_name", text="Name") - sub = layout.sub(1) + sub = split.column() subsub = sub.box() - subsub.column() subsub.itemR(cam, "show_passepartout", text="Passepartout") if (cam.show_passepartout): subsub.itemR(cam, "passepartout_alpha", text="Alpha") - sub.row() - sub.itemR(cam, "draw_size", text="Size") + row = sub.row() + row.itemR(cam, "draw_size", text="Size") bpy.types.register(DATA_PT_cameralens) bpy.types.register(DATA_PT_cameradisplay) diff --git a/release/ui/buttons_data_empty.py b/release/ui/buttons_data_empty.py new file mode 100644 index 00000000000..5fe1e943f1f --- /dev/null +++ b/release/ui/buttons_data_empty.py @@ -0,0 +1,27 @@ + +import bpy + +class DataButtonsPanel(bpy.types.Panel): + __space_type__ = "BUTTONS_WINDOW" + __region_type__ = "WINDOW" + __context__ = "data" + + def poll(self, context): + ob = context.active_object + return (ob and ob.type == 'EMPTY') + +class DATA_PT_empty(DataButtonsPanel): + __idname__ = "DATA_PT_empty" + __label__ = "Empty" + + def draw(self, context): + ob = context.active_object + layout = self.layout + + if not ob: + return + + layout.itemR(ob, "empty_draw_type") + layout.itemR(ob, "empty_draw_size") + +bpy.types.register(DATA_PT_empty) diff --git a/release/ui/buttons_data_lamp.py b/release/ui/buttons_data_lamp.py index 5db840ccefe..da2701a43f2 100644 --- a/release/ui/buttons_data_lamp.py +++ b/release/ui/buttons_data_lamp.py @@ -21,29 +21,23 @@ class DATA_PT_lamp(DataButtonsPanel): if not lamp: return - layout.row() - layout.itemR(lamp, "type", expand=True) + row = layout.row() + row.itemR(lamp, "type", expand=True) - layout.split(number=2) + split = layout.split() - sub = layout.sub(0) - sub.column() - sub.itemL(text="LAMP DATABLOCKS") + sub = split.column() sub.itemR(lamp, "energy") sub.itemR(lamp, "distance") + sub.itemR(lamp, "negative") sub.itemR(lamp, "color") - sub = layout.sub(1) - - sub.column() - sub.itemL(text="Illumination:") - sub.itemR(lamp, "layer") - sub.itemR(lamp, "negative") + sub = split.column() + sub.itemR(lamp, "layer", text="This Layer Only") sub.itemR(lamp, "specular") sub.itemR(lamp, "diffuse") - if (lamp.type in ('LOCAL', 'SPOT')): - sub.column() + if lamp.type in ('POINT', 'SPOT'): sub.itemR(lamp, "falloff_type") sub.itemR(lamp, "sphere") @@ -51,7 +45,7 @@ class DATA_PT_lamp(DataButtonsPanel): sub.itemR(lamp, "linear_attenuation") sub.itemR(lamp, "quadratic_attenuation") - if (lamp.type == 'AREA'): + if lamp.type == 'AREA': sub.column() sub.itemR(lamp, "gamma") sub.itemR(lamp, "shape") @@ -77,33 +71,31 @@ class DATA_PT_sunsky(DataButtonsPanel): if not lamp: return - layout.row() - layout.itemR(lamp, "sky") - layout.itemR(lamp, "atmosphere") + row = layout.row() + row.itemR(lamp, "sky") + row.itemR(lamp, "atmosphere") - if (lamp.sky or lamp.atmosphere): - layout.row() + if lamp.sky or lamp.atmosphere: layout.itemR(lamp, "atmosphere_turbidity", text="Turbidity") - layout.split(number=2) + split = layout.split() - if (lamp.sky): - sub = layout.sub(0) - sub.column() + col = split.column() + if lamp.sky: + sub = col.column() + sub.itemR(lamp, "sky_blend_type", text="Blend Type") + sub.itemR(lamp, "sky_blend") + sub.itemR(lamp, "sky_color_space", text="Color Space") + sub.itemR(lamp, "sky_exposure") + sub = col.column() sub.itemR(lamp, "horizon_brightness", text="Hor Bright") sub.itemR(lamp, "spread", text="Hor Spread") sub.itemR(lamp, "sun_brightness", text="Sun Bright") sub.itemR(lamp, "sun_size") sub.itemR(lamp, "backscattered_light", text="Back Light") - sub.column() - sub.itemR(lamp, "sky_blend_type", text="Blend Type") - sub.itemR(lamp, "sky_blend") - sub.itemR(lamp, "sky_color_space", text="Color Space") - sub.itemR(lamp, "sky_exposure") - - if (lamp.atmosphere): - sub = layout.sub(1) - sub.column() + + sub = split.column() + if lamp.atmosphere: sub.itemR(lamp, "sun_intensity", text="Sun Intens") sub.itemR(lamp, "atmosphere_inscattering", text="Inscattering") sub.itemR(lamp, "atmosphere_extinction", text="Extinction") @@ -116,7 +108,7 @@ class DATA_PT_shadow(DataButtonsPanel): def poll(self, context): ob = context.active_object lamp = context.main.lamps[0] - return (ob.type == 'LAMP' and lamp.type in ('LOCAL','SUN', 'SPOT', 'AREA')) + return (ob.type == 'LAMP' and lamp.type in ('POINT','SUN', 'SPOT', 'AREA')) def draw(self, context): lamp = context.main.lamps[0] @@ -125,42 +117,72 @@ class DATA_PT_shadow(DataButtonsPanel): if not lamp: return - layout.row() layout.itemR(lamp, "shadow_method", expand=True) - layout.row() - layout.itemR(lamp, "only_shadow") - layout.itemR(lamp, "shadow_layer", text="Layer") - if (lamp.shadow_method == 'RAY_SHADOW'): - if (lamp.type in ('LOCAL', 'SUN', 'SPOT', 'AREA')): - - layout.split(number=2) - - sub = layout.sub(0) - sub.column() - sub.itemL(text="Display:") - sub.itemR(lamp, "shadow_color") + if lamp.shadow_method in ('BUFFER_SHADOW', 'RAY_SHADOW'): - sub = layout.sub(1) - sub.column() - sub.itemL(text="Sampling:") - sub.itemR(lamp, "shadow_ray_sampling_method", text="") + split = layout.split() + + sub = split.column() + sub.itemR(lamp, "only_shadow") + sub.itemR(lamp, "shadow_layer") + + sub = split.column() + sub.itemR(lamp, "shadow_color") + + if lamp.shadow_method == 'RAY_SHADOW': + + col = layout.column() + col.itemL(text="Sampling:") + col.row().itemR(lamp, "shadow_ray_sampling_method", expand=True) - if (lamp.type in ('LOCAL', 'SUN', 'SPOT') and lamp.shadow_ray_sampling_method in ('CONSTANT_QMC', 'ADAPTIVE_QMC')): - sub.itemR(lamp, "shadow_soft_size", text="Soft Size") - sub.itemR(lamp, "shadow_ray_samples", text="Samples") - if (lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC'): - sub.itemR(lamp, "shadow_adaptive_threshold", text="Threshold") - - if (lamp.type == 'AREA'): - sub.itemR(lamp, "shadow_ray_samples_x", text="Samples") - if (lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC'): - sub.itemR(lamp, "shadow_adaptive_threshold", text="Threshold") - if (lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED'): - sub.itemR(lamp, "umbra") - sub.itemR(lamp, "dither") - sub.itemR(lamp, "jitter") + if lamp.type in ('POINT', 'SUN', 'SPOT') and lamp.shadow_ray_sampling_method in ('CONSTANT_QMC', 'ADAPTIVE_QMC'): + flow = layout.column_flow() + flow.itemR(lamp, "shadow_soft_size", text="Soft Size") + flow.itemR(lamp, "shadow_ray_samples", text="Samples") + if lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC': + flow.itemR(lamp, "shadow_adaptive_threshold", text="Threshold") + if lamp.type == 'AREA': + flow = layout.column_flow() + flow.itemR(lamp, "shadow_ray_samples_x", text="Samples") + if lamp.shadow_ray_sampling_method == 'ADAPTIVE_QMC': + flow.itemR(lamp, "shadow_adaptive_threshold", text="Threshold") + if lamp.shadow_ray_sampling_method == 'CONSTANT_JITTERED': + flow.itemR(lamp, "umbra") + flow.itemR(lamp, "dither") + flow.itemR(lamp, "jitter") + + if lamp.shadow_method == 'BUFFER_SHADOW': + col = layout.column() + col.itemL(text="Buffer Type:") + col.row().itemR(lamp, "shadow_buffer_type", expand=True) + + if lamp.shadow_buffer_type in ('REGULAR', 'HALFWAY'): + flow = layout.column_flow() + flow.itemL(text="Sample Buffers:") + flow.row().itemR(lamp, "shadow_sample_buffers", expand=True) + flow.itemL(text="Filter Type:") + flow.row().itemR(lamp, "shadow_filter_type", expand=True) + flow = layout.column_flow() + flow.itemR(lamp, "shadow_buffer_size", text="Size") + flow.itemR(lamp, "shadow_buffer_samples", text="Samples") + flow.itemR(lamp, "shadow_buffer_bias", text="Bias") + flow.itemR(lamp, "shadow_buffer_soft", text="Soft") + + if (lamp.shadow_buffer_type == 'IRREGULAR'): + row = layout.row() + row.itemR(lamp, "shadow_buffer_bias", text="Bias") + + row = layout.row() + row.itemR(lamp, "auto_clip_start", text="Autoclip Start") + if not (lamp.auto_clip_start): + row.itemR(lamp, "shadow_buffer_clip_start", text="Clip Start") + row = layout.row() + row.itemR(lamp, "auto_clip_end", text="Autoclip End") + if not (lamp.auto_clip_end): + row.itemR(lamp, "shadow_buffer_clip_end", text=" Clip End") + class DATA_PT_spot(DataButtonsPanel): __idname__ = "DATA_PT_spot" __label__ = "Spot" @@ -177,20 +199,21 @@ class DATA_PT_spot(DataButtonsPanel): if not lamp: return - layout.split(number=2) + split = layout.split() - sub = layout.sub(0) - sub.column() + sub = split.column() sub.itemR(lamp, "square") - sub.itemR(lamp, "halo") - - sub = layout.sub(1) - sub.column() sub.itemR(lamp, "spot_size") sub.itemR(lamp, "spot_blend") - sub.itemR(lamp, "halo_intensity") + + sub = split.column() + sub.itemR(lamp, "halo") + if lamp.halo: + sub.itemR(lamp, "halo_intensity") + if lamp.shadow_method == 'BUFFER_SHADOW': + sub.itemR(lamp, "halo_step") bpy.types.register(DATA_PT_lamp) -bpy.types.register(DATA_PT_sunsky) bpy.types.register(DATA_PT_shadow) +bpy.types.register(DATA_PT_sunsky) bpy.types.register(DATA_PT_spot) diff --git a/release/ui/buttons_data_lattice.py b/release/ui/buttons_data_lattice.py index cf2053ae495..0446f3916a1 100644 --- a/release/ui/buttons_data_lattice.py +++ b/release/ui/buttons_data_lattice.py @@ -21,20 +21,20 @@ class DATA_PT_lattice(DataButtonsPanel): if not lat: return - layout.row() - layout.itemR(lat, "points_u") - layout.itemR(lat, "interpolation_type_u", expand=True) + row = layout.row() + row.itemR(lat, "points_u") + row.itemR(lat, "interpolation_type_u", expand=True) - layout.row() - layout.itemR(lat, "points_v") - layout.itemR(lat, "interpolation_type_v", expand=True) + row = layout.row() + row.itemR(lat, "points_v") + row.itemR(lat, "interpolation_type_v", expand=True) - layout.row() - layout.itemR(lat, "points_w") - layout.itemR(lat, "interpolation_type_w", expand=True) + row = layout.row() + row.itemR(lat, "points_w") + row.itemR(lat, "interpolation_type_w", expand=True) - layout.row() - layout.itemR(lat, "outside") - layout.itemR(lat, "shape_keys") + row = layout.row() + row.itemR(lat, "outside") + row.itemR(lat, "shape_keys") -bpy.types.register(DATA_PT_lattice)
\ No newline at end of file +bpy.types.register(DATA_PT_lattice) diff --git a/release/ui/buttons_data_modifier.py b/release/ui/buttons_data_modifier.py index f07a6cc4882..b93f0d6f218 100644 --- a/release/ui/buttons_data_modifier.py +++ b/release/ui/buttons_data_modifier.py @@ -27,34 +27,32 @@ class DATA_PT_modifiers(DataButtonsPanel): for md in ob.modifiers: sub = layout.box() - sub.row() - sub.itemR(md, "expanded", text="") - sub.itemR(md, "name", text="") + row = sub.row() + row.itemR(md, "expanded", text="") + row.itemR(md, "name", text="") - sub.itemR(md, "render", text="") - sub.itemR(md, "realtime", text="") - sub.itemR(md, "editmode", text="") - sub.itemR(md, "on_cage", text="") + row.itemR(md, "render", text="") + row.itemR(md, "realtime", text="") + row.itemR(md, "editmode", text="") + row.itemR(md, "on_cage", text="") - if (md.expanded): - sub.row() + if md.expanded: sub.itemS() if (md.type == 'ARMATURE'): self.armature(sub, md) def armature(self, layout, md): - layout.column() layout.itemR(md, "object") - layout.row() - layout.itemR(md, "vertex_group") - layout.itemR(md, "invert") - layout.column_flow() - layout.itemR(md, "use_vertex_groups") - layout.itemR(md, "use_bone_envelopes") - layout.itemR(md, "quaternion") - layout.itemR(md, "b_bone_rest") - layout.itemR(md, "multi_modifier") + row = layout.row() + row.itemR(md, "vertex_group") + row.itemR(md, "invert") + flow = layout.column_flow() + flow.itemR(md, "use_vertex_groups") + flow.itemR(md, "use_bone_envelopes") + flow.itemR(md, "quaternion") + flow.itemR(md, "b_bone_rest") + flow.itemR(md, "multi_modifier") bpy.types.register(DATA_PT_modifiers) diff --git a/release/ui/buttons_material.py b/release/ui/buttons_material.py new file mode 100644 index 00000000000..a80ae8d4624 --- /dev/null +++ b/release/ui/buttons_material.py @@ -0,0 +1,196 @@ + +import bpy + +class MaterialButtonsPanel(bpy.types.Panel): + __space_type__ = "BUTTONS_WINDOW" + __region_type__ = "WINDOW" + __context__ = "material" + +class MATERIAL_PT_material(MaterialButtonsPanel): + __idname__= "MATERIAL_PT_material" + __label__ = "Material" + + def draw(self, context): + layout = self.layout + try: + mat = context.active_object.active_material + except: + mat = None + + if not mat: + return + + row = layout.row() + row.column().itemR(mat, "diffuse_color") + row.column().itemR(mat, "specular_color") + row.column().itemR(mat, "mirror_color") + + row = layout.row() + row.itemR(mat, "color_model") + row.itemR(mat, "alpha") + +class MATERIAL_PT_sss(MaterialButtonsPanel): + __idname__= "MATERIAL_PT_sss" + __label__ = "Subsurface Scattering" + + def draw(self, context): + layout = self.layout + try: + sss = context.active_object.active_material.subsurface_scattering + except: + sss = None + + if not sss: + return + + layout.itemR(sss, "enabled", text="Enable") + + flow = layout.column_flow() + flow.itemR(sss, "error_tolerance") + flow.itemR(sss, "ior") + flow.itemR(sss, "scale") + + row = layout.row() + row.column().itemR(sss, "color") + row.column().itemR(sss, "radius") + + flow = layout.column_flow() + flow.itemR(sss, "color_factor") + flow.itemR(sss, "texture_factor") + flow.itemR(sss, "front") + flow.itemR(sss, "back") + +class MATERIAL_PT_raymir(MaterialButtonsPanel): + __idname__= "MATERIAL_PT_raymir" + __label__ = "Ray Mirror" + + def draw(self, context): + layout = self.layout + try: + raym = context.active_object.active_material.raytrace_mirror + except: + raym = None + + if not raym: + return + + layout.itemR(raym, "enabled", text="Enable") + + split = layout.split() + + sub = split.column() + sub.itemR(raym, "reflect", text="RayMir") + sub.itemR(raym, "fresnel") + sub.itemR(raym, "fresnel_fac", text="Fac") + + sub = split.column() + sub.itemR(raym, "gloss") + sub.itemR(raym, "gloss_threshold") + sub.itemR(raym, "gloss_samples") + sub.itemR(raym, "gloss_anisotropic") + + flow = layout.column_flow() + flow.itemR(raym, "distance", text="Max Dist") + flow.itemR(raym, "depth") + flow.itemR(raym, "fade_to") + +class MATERIAL_PT_raytransp(MaterialButtonsPanel): + __idname__= "MATERIAL_PT_raytransp" + __label__= "Ray Transparency" + + def draw(self, context): + layout = self.layout + try: + rayt = context.active_object.active_material.raytrace_transparency + except: + rayt = None + + if not rayt: + return + + layout.itemR(rayt, "enabled", text="Enable") + + split = layout.split() + + sub = split.column() + sub.itemR(rayt, "ior") + sub.itemR(rayt, "fresnel") + sub.itemR(rayt, "fresnel_fac", text="Fac") + + sub = split.column() + sub.itemR(rayt, "gloss") + sub.itemR(rayt, "gloss_threshold") + sub.itemR(rayt, "gloss_samples") + + flow = layout.column_flow() + flow.itemR(rayt, "filter") + flow.itemR(rayt, "limit") + flow.itemR(rayt, "falloff") + flow.itemR(rayt, "specular_opacity") + flow.itemR(rayt, "depth") + +class MATERIAL_PT_halo(MaterialButtonsPanel): + __idname__= "MATERIAL_PT_halo" + __label__= "Halo" + + def draw(self, context): + layout = self.layout + try: + halo = context.active_object.active_material.halo + except: + halo = None + + if not halo: + return + + layout.itemR(halo, "enabled", text="Enable Halo") + + if halo.enabled: + + split = layout.split() + + sub = split.column() + sub.itemL(text="General Settings:") + sub.itemR(halo, "size") + sub.itemR(halo, "hardness") + sub.itemR(halo, "add") + + sub = split.column() + sub.itemL(text="Elements:") + sub.itemR(halo, "ring") + sub.itemR(halo, "lines") + sub.itemR(halo, "star") + sub.itemR(halo, "flare_mode") + + row = layout.row() + + sub = row.column() + sub.itemL(text="Options:") + sub.itemR(halo, "use_texture", text="Texture") + sub.itemR(halo, "use_vertex_normal", text="Vertex Normal") + sub.itemR(halo, "xalpha") + sub.itemR(halo, "shaded") + sub.itemR(halo, "soft") + + sub = row.column() + if (halo.ring): + sub.itemR(halo, "rings") + if (halo.lines): + sub.itemR(halo, "line_number") + if (halo.ring or halo.lines): + sub.itemR(halo, "seed") + if (halo.star): + sub.itemR(halo, "star_tips") + if (halo.flare_mode): + sub.itemL(text="Flare:") + sub.itemR(halo, "flare_size", text="Size") + sub.itemR(halo, "flare_subsize", text="Subsize") + sub.itemR(halo, "flare_boost", text="Boost") + sub.itemR(halo, "flare_seed", text="Seed") + sub.itemR(halo, "flares_sub", text="Sub") + +bpy.types.register(MATERIAL_PT_material) +bpy.types.register(MATERIAL_PT_raymir) +bpy.types.register(MATERIAL_PT_raytransp) +bpy.types.register(MATERIAL_PT_sss) +bpy.types.register(MATERIAL_PT_halo) diff --git a/release/ui/buttons_objects.py b/release/ui/buttons_objects.py index 8e76bf50837..816995be224 100644 --- a/release/ui/buttons_objects.py +++ b/release/ui/buttons_objects.py @@ -17,10 +17,10 @@ class OBJECT_PT_transform(ObjectButtonsPanel): ob = context.active_object layout = self.layout - layout.row() - layout.itemR(ob, "location") - layout.itemR(ob, "rotation") - layout.itemR(ob, "scale") + row = layout.row() + row.column().itemR(ob, "location") + row.column().itemR(ob, "rotation") + row.column().itemR(ob, "scale") class OBJECT_PT_groups(ObjectButtonsPanel): __idname__ = "OBJECT_PT_groups" @@ -30,24 +30,24 @@ class OBJECT_PT_groups(ObjectButtonsPanel): ob = context.active_object layout = self.layout - layout.row() - layout.itemR(ob, "pass_index") - layout.itemR(ob, "parent") + row = layout.row() + row.itemR(ob, "pass_index") + row.itemR(ob, "parent") # layout.left_right() # layout.itemO("OBJECT_OT_add_group"); for group in bpy.data.groups: if ob in group.objects: - sub = layout.box() + box = layout.box() - sub.split(number=2, lr=True) - sub.sub(0).itemR(group, "name") - # sub.sub(1).itemO("OBJECT_OT_remove_group") + row = box.row() + row.itemR(group, "name") + #row.itemO("OBJECT_OT_remove_group") - sub.row() - sub.itemR(group, "layer") - sub.itemR(group, "dupli_offset") + row = box.row() + row.column().itemR(group, "layer") + row.column().itemR(group, "dupli_offset") class OBJECT_PT_display(ObjectButtonsPanel): __idname__ = "OBJECT_PT_display" @@ -57,17 +57,17 @@ class OBJECT_PT_display(ObjectButtonsPanel): ob = context.active_object layout = self.layout - layout.row() - layout.itemR(ob, "max_draw_type", text="Type") - layout.itemR(ob, "draw_bounds_type", text="Bounds") - - layout.column_flow() - layout.itemR(ob, "draw_name", text="Name") - layout.itemR(ob, "draw_axis", text="Axis") - layout.itemR(ob, "draw_wire", text="Wire") - layout.itemR(ob, "draw_texture_space", text="Texture Space") - layout.itemR(ob, "x_ray", text="X-Ray") - layout.itemR(ob, "draw_transparent", text="Transparency") + row = layout.row() + row.itemR(ob, "max_draw_type", text="Type") + row.itemR(ob, "draw_bounds_type", text="Bounds") + + flow = layout.column_flow() + flow.itemR(ob, "draw_name", text="Name") + flow.itemR(ob, "draw_axis", text="Axis") + flow.itemR(ob, "draw_wire", text="Wire") + flow.itemR(ob, "draw_texture_space", text="Texture Space") + flow.itemR(ob, "x_ray", text="X-Ray") + flow.itemR(ob, "draw_transparent", text="Transparency") class OBJECT_PT_duplication(ObjectButtonsPanel): __idname__ = "OBJECT_PT_duplication" @@ -77,15 +77,15 @@ class OBJECT_PT_duplication(ObjectButtonsPanel): ob = context.active_object layout = self.layout - layout.column() - layout.itemR(ob, "dupli_type", text="", expand=True) + row = layout.row() + row.itemR(ob, "dupli_type", text="", expand=True) if ob.dupli_type == "FRAMES": - layout.column_flow() - layout.itemR(ob, "dupli_frames_start", text="Start") - layout.itemR(ob, "dupli_frames_end", text="End") - layout.itemR(ob, "dupli_frames_on", text="On") - layout.itemR(ob, "dupli_frames_off", text="Off") + col = layout.column_flow() + col.itemR(ob, "dupli_frames_start", text="Start") + col.itemR(ob, "dupli_frames_end", text="End") + col.itemR(ob, "dupli_frames_on", text="On") + col.itemR(ob, "dupli_frames_off", text="Off") class OBJECT_PT_animation(ObjectButtonsPanel): __idname__ = "OBJECT_PT_animation" @@ -95,10 +95,9 @@ class OBJECT_PT_animation(ObjectButtonsPanel): ob = context.active_object layout = self.layout - layout.split(number=2) + row = layout.row() - sub = layout.sub(0) - sub.column() + sub = row.column() sub.itemL(text="Time Offset:") sub.itemR(ob, "time_offset_edit", text="Edit") sub.itemR(ob, "time_offset_particle", text="Particle") @@ -106,8 +105,7 @@ class OBJECT_PT_animation(ObjectButtonsPanel): sub.itemR(ob, "slow_parent") sub.itemR(ob, "time_offset", text="Offset") - sub = layout.sub(1) - sub.column() + sub = row.column() sub.itemL(text="Tracking:") sub.itemR(ob, "track_axis", text="Axis") sub.itemR(ob, "up_axis", text="Up Axis") diff --git a/release/ui/buttons_scene.py b/release/ui/buttons_scene.py index 6b3c7dca49d..170c94cdef1 100644 --- a/release/ui/buttons_scene.py +++ b/release/ui/buttons_scene.py @@ -15,22 +15,19 @@ class RENDER_PT_shading(RenderButtonsPanel): rd = scene.render_data - layout.split(number=2) + split = layout.split() - sub = layout.sub(0) - sub.column() + sub = split.column() sub.itemR(rd, "render_shadows", text="Shadows") sub.itemR(rd, "render_sss", text="SSS") sub.itemR(rd, "render_envmaps", text="EnvMap") sub.itemR(rd, "render_radiosity", text="Radio") - sub = layout.sub(1) + sub = split.column() subsub = sub.box() - subsub.column() subsub.itemR(rd, "render_raytracing", text="Ray Tracing") if (rd.render_raytracing): subsub.itemR(rd, "octree_resolution", text="Octree") - sub.row() sub.itemR(rd, "alpha_mode") class RENDER_PT_image(RenderButtonsPanel): @@ -42,21 +39,21 @@ class RENDER_PT_image(RenderButtonsPanel): rd = scene.render_data - layout.column_flow() - layout.itemR(rd, "resolution_x", text="SizeX") - layout.itemR(rd, "resolution_y", text="SizeY") - layout.itemR(rd, "pixel_aspect_x", text="AspX") - layout.itemR(rd, "pixel_aspect_y", text="AspY") - - sub = layout.box() - sub.row() - sub.itemR(rd, "image_type") - sub.row() - sub.itemR(rd, "file_extensions") - sub.itemR(rd, "color_mode") + flow = layout.column_flow() + flow.itemR(rd, "resolution_x", text="SizeX") + flow.itemR(rd, "resolution_y", text="SizeY") + flow.itemR(rd, "pixel_aspect_x", text="AspX") + flow.itemR(rd, "pixel_aspect_y", text="AspY") + + box = layout.box() + box.itemR(rd, "output_path") + box.itemR(rd, "image_type") + row = box.row() + row.itemR(rd, "file_extensions") + row.itemR(rd, "color_mode") if rd.image_type in ("AVIJPEG", "JPEG"): - sub.row() - sub.itemR(rd, "quality") + row = box.row() + row.itemR(rd, "quality") class RENDER_PT_antialiasing(RenderButtonsPanel): __label__ = "Anti-Aliasing" @@ -67,20 +64,21 @@ class RENDER_PT_antialiasing(RenderButtonsPanel): rd = scene.render_data - layout.row() - layout.itemR(rd, "antialiasing", text="Enable") - if (rd.antialiasing): - layout.row() - layout.itemL(text="Samples:") - layout.itemR(rd, "antialiasing_samples", expand=True) - layout.row() - layout.itemR(rd, "pixel_filter") - layout.itemR(rd, "filter_size") - - layout.row() - layout.itemR(rd, "save_buffers") - if (rd.save_buffers): - layout.itemR(rd, "full_sample") + row = layout.row() + row.itemR(rd, "antialiasing", text="Enable") + + if rd.antialiasing: + row = layout.row() + row.itemL(text="Samples:") + row.itemR(rd, "antialiasing_samples", expand=True) + row = layout.row() + row.itemR(rd, "pixel_filter") + row.itemR(rd, "filter_size") + + row = layout.row() + row.itemR(rd, "save_buffers") + if rd.save_buffers: + row.itemR(rd, "full_sample") class RENDER_PT_render(RenderButtonsPanel): __label__ = "Render" @@ -91,71 +89,67 @@ class RENDER_PT_render(RenderButtonsPanel): rd = scene.render_data - layout.row() - layout.itemO("SCREEN_OT_render", text="RENDER", icon=0) # ICON_SCENE - #layout.itemO("SCREEN_OT_render", text="ANIM", icon=0) # "anim", 1 + row = layout.row() + row.itemO("SCREEN_OT_render", text="RENDER", icon=0) # ICON_SCENE + row.item_booleanO("SCREEN_OT_render", "anim", True, text="ANIM", icon=0) - layout.row() - layout.itemR(scene, "start_frame", text="Start") - layout.itemR(rd, "fps") - layout.itemR(scene, "current_frame", text="Frame") + row = layout.row() + row.itemR(scene, "start_frame", text="Start") + row.itemR(rd, "fps") + row.itemR(scene, "current_frame", text="Frame") - layout.row() - layout.itemR(scene, "end_frame", text="End") - layout.itemR(rd, "fps_base",text="/") - layout.itemR(scene, "frame_step", text="Step") - - layout.row() - layout.itemR(rd, "do_composite") - layout.itemR(rd, "do_sequence") - - layout.row() - layout.itemL(text="General:") - - layout.column_flow() - layout.itemR(rd, "resolution_percentage", text="Size ") - layout.itemR(rd, "dither_intensity") - layout.itemR(rd, "parts_x") - layout.itemR(rd, "parts_y") + row = layout.row() + row.itemR(scene, "end_frame", text="End") + row.itemR(rd, "fps_base",text="/") + row.itemR(scene, "frame_step", text="Step") + + row = layout.row() + row.itemR(rd, "do_composite") + row.itemR(rd, "do_sequence") + + row = layout.row() + row.itemL(text="General:") + + flow = layout.column_flow() + flow.itemR(rd, "resolution_percentage", text="Size ") + flow.itemR(rd, "dither_intensity") + flow.itemR(rd, "parts_x") + flow.itemR(rd, "parts_y") - layout.split(number=2) + split = layout.split() - sub = layout.sub(0) + sub = split.column() subsub = sub.box() - subsub.column() subsub.itemL(text="Threads Mode:") subsub.itemR(rd, "threads_mode", expand=True) if rd.threads_mode == 'THREADS_FIXED': subsub.itemR(rd, "threads") subsub = sub.box() - subsub.column() subsub.itemL(text="Distributed Rendering:") subsub.itemR(rd, "placeholders") subsub.itemR(rd, "no_overwrite") subsub = sub.box() - subsub.column() subsub.itemR(rd, "fields", text="Fields") - if (rd.fields): + if rd.fields: subsub.itemR(rd, "fields_still", text="Still") subsub.itemR(rd, "field_order", text="Order") - sub = layout.sub(1) + sub = split.column() subsub = sub.box() - subsub.column() subsub.itemL(text="Extra:") subsub.itemR(rd, "panorama") subsub.itemR(rd, "backbuf") subsub.itemR(rd, "free_image_textures") subsub = sub.box() - subsub.column() subsub.itemL(text="Border:") subsub.itemR(rd, "border", text="Border Render") - if (rd.border): + if rd.border: subsub.itemR(rd, "crop_to_border") bpy.types.register(RENDER_PT_render) bpy.types.register(RENDER_PT_antialiasing) bpy.types.register(RENDER_PT_shading) bpy.types.register(RENDER_PT_image) + diff --git a/release/ui/buttons_world.py b/release/ui/buttons_world.py index 44ce472bf5d..124c9d3d766 100644 --- a/release/ui/buttons_world.py +++ b/release/ui/buttons_world.py @@ -16,15 +16,15 @@ class WORLD_PT_world(WorldButtonsPanel): world = context.scene.world layout = self.layout - layout.row() - layout.itemR(world, "blend_sky") - layout.itemR(world, "paper_sky") - layout.itemR(world, "real_sky") + row = layout.row() + row.itemR(world, "blend_sky") + row.itemR(world, "paper_sky") + row.itemR(world, "real_sky") - layout.row() - layout.itemR(world, "horizon_color") - layout.itemR(world, "zenith_color") - layout.itemR(world, "ambient_color") + row = layout.row() + row.column().itemR(world, "horizon_color") + row.column().itemR(world, "zenith_color") + row.column().itemR(world, "ambient_color") class WORLD_PT_color_correction(WorldButtonsPanel): __label__ = "Color Correction" @@ -33,9 +33,9 @@ class WORLD_PT_color_correction(WorldButtonsPanel): world = context.scene.world layout = self.layout - layout.row() - layout.itemR(world, "exposure") - layout.itemR(world, "range") + row = layout.row() + row.itemR(world, "exposure") + row.itemR(world, "range") class WORLD_PT_mist(WorldButtonsPanel): __label__ = "Mist" @@ -44,18 +44,18 @@ class WORLD_PT_mist(WorldButtonsPanel): world = context.scene.world layout = self.layout - layout.row() - layout.itemR(world.mist, "enabled", text="Enable") + row = layout.row() + row.itemR(world.mist, "enabled", text="Enable") if (world.mist.enabled): - layout.column_flow() - layout.itemR(world.mist, "start") - layout.itemR(world.mist, "depth") - layout.itemR(world.mist, "height") - layout.itemR(world.mist, "intensity") - layout.column() - layout.itemL(text="Fallof:") - layout.itemR(world.mist, "falloff", expand=True) + flow = layout.column_flow() + flow.itemR(world.mist, "start") + flow.itemR(world.mist, "depth") + flow.itemR(world.mist, "height") + flow.itemR(world.mist, "intensity") + col = layout.column() + col.itemL(text="Fallof:") + col.row().itemR(world.mist, "falloff", expand=True) class WORLD_PT_stars(WorldButtonsPanel): __label__ = "Stars" @@ -64,15 +64,15 @@ class WORLD_PT_stars(WorldButtonsPanel): world = context.scene.world layout = self.layout - layout.row() - layout.itemR(world.stars, "enabled", text="Enable") + row = layout.row() + row.itemR(world.stars, "enabled", text="Enable") if (world.stars.enabled): - layout.column_flow() - layout.itemR(world.stars, "size") - layout.itemR(world.stars, "min_distance", text="MinDist") - layout.itemR(world.stars, "average_separation", text="StarDist") - layout.itemR(world.stars, "color_randomization", text="Colnoise") + flow = layout.column_flow() + flow.itemR(world.stars, "size") + flow.itemR(world.stars, "min_distance", text="MinDist") + flow.itemR(world.stars, "average_separation", text="StarDist") + flow.itemR(world.stars, "color_randomization", text="Colnoise") class WORLD_PT_ambient_occlusion(WorldButtonsPanel): __label__ = "Ambient Occlusion" @@ -83,49 +83,49 @@ class WORLD_PT_ambient_occlusion(WorldButtonsPanel): ao = world.ambient_occlusion - layout.row() - layout.itemR(ao, "enabled", text="Enable") + row = layout.row() + row.itemR(ao, "enabled", text="Enable") if (ao.enabled): - layout.row() - layout.itemR(ao, "gather_method", expand=True) + row = layout.row() + row.itemR(ao, "gather_method", expand=True) if ao.gather_method == 'RAYTRACE': - layout.row() - layout.itemR(ao, "samples") - layout.itemR(ao, "distance") + row = layout.row() + row.itemR(ao, "samples") + row.itemR(ao, "distance") - layout.row() - layout.itemR(ao, "sample_method") + row = layout.row() + row.itemR(ao, "sample_method") if ao.sample_method == 'ADAPTIVE_QMC': - layout.row() - layout.itemR(ao, "threshold") - layout.itemR(ao, "adapt_to_speed") + row = layout.row() + row.itemR(ao, "threshold") + row.itemR(ao, "adapt_to_speed") if ao.sample_method == 'CONSTANT_JITTERED': - layout.row() - layout.itemR(ao, "bias") + row = layout.row() + row.itemR(ao, "bias") if ao.gather_method == 'APPROXIMATE': - layout.row() - layout.itemR(ao, "passes") - layout.itemR(ao, "error_tolerance") + row = layout.row() + row.itemR(ao, "passes") + row.itemR(ao, "error_tolerance") - layout.row() - layout.itemR(ao, "correction") - layout.itemR(ao, "pixel_cache") + row = layout.row() + row.itemR(ao, "correction") + row.itemR(ao, "pixel_cache") - layout.row() - layout.itemS() + row = layout.row() + row.itemS() - layout.row() - layout.itemR(ao, "falloff") - layout.itemR(ao, "strength") + row = layout.row() + row.itemR(ao, "falloff") + row.itemR(ao, "strength") - layout.column() - layout.itemR(ao, "blend_mode", expand=True) - layout.itemR(ao, "color", expand=True) - layout.itemR(ao, "energy") + col = layout.column() + col.row().itemR(ao, "blend_mode", expand=True) + col.row().itemR(ao, "color", expand=True) + col.itemR(ao, "energy") bpy.types.register(WORLD_PT_world) bpy.types.register(WORLD_PT_mist) diff --git a/release/ui/space_text.py b/release/ui/space_text.py index a3d27370ffa..d4187c10b69 100644 --- a/release/ui/space_text.py +++ b/release/ui/space_text.py @@ -18,38 +18,40 @@ class TEXT_HT_header(bpy.types.Header): text = st.text layout = self.layout - layout.template_header() - layout.itemM("TEXT_MT_text") - if text: - layout.itemM("TEXT_MT_edit") - layout.itemM("TEXT_MT_format") + layout.template_header(context) + + if context.area.show_menus: + row = layout.row(align=True) + row.itemM(context, "TEXT_MT_text") + if text: + row.itemM(context, "TEXT_MT_edit") + row.itemM(context, "TEXT_MT_format") if text and text.modified: - layout.row() - # layout.color(redalert) - layout.itemO("TEXT_OT_resolve_conflict", text="", icon=ICON_HELP) + row = layout.row() + # row.color(redalert) + row.itemO("TEXT_OT_resolve_conflict", text="", icon=ICON_HELP) - layout.row() - layout.itemR(st, "line_numbers", text="", icon=ICON_LINENUMBERS_OFF) - layout.itemR(st, "word_wrap", text="", icon=ICON_WORDWRAP_OFF) - layout.itemR(st, "syntax_highlight", text="", icon=ICON_SYNTAX_OFF) - # layout.itemR(st, "do_python_plugins", text="", icon=ICON_SCRIPTPLUGINS) + row = layout.row(align=True) + row.itemR(st, "line_numbers", text="", icon=ICON_LINENUMBERS_OFF) + row.itemR(st, "word_wrap", text="", icon=ICON_WORDWRAP_OFF) + row.itemR(st, "syntax_highlight", text="", icon=ICON_SYNTAX_OFF) + # row.itemR(st, "do_python_plugins", text="", icon=ICON_SCRIPTPLUGINS) - layout.row() - layout.template_header_ID(st, "text", new="TEXT_OT_new", open="TEXT_OT_open", unlink="TEXT_OT_unlink") + layout.template_header_ID(context, st, "text", new="TEXT_OT_new", open="TEXT_OT_open", unlink="TEXT_OT_unlink") if text: - layout.row() + row = layout.row() if text.filename != "": if text.dirty: - layout.itemL(text="File: *" + text.filename + " (unsaved)") + row.itemL(text="File: *" + text.filename + " (unsaved)") else: - layout.itemL(text="File: " + text.filename) + row.itemL(text="File: " + text.filename) else: if text.library: - layout.itemL(text="Text: External") + row.itemL(text="Text: External") else: - layout.itemL(text="Text: Internal") + row.itemL(text="Text: Internal") class TEXT_PT_properties(bpy.types.Panel): __space_type__ = "TEXT_EDITOR" @@ -60,14 +62,14 @@ class TEXT_PT_properties(bpy.types.Panel): st = context.space_data layout = self.layout - layout.column_flow() - layout.itemR(st, "line_numbers", icon=ICON_LINENUMBERS_OFF) - layout.itemR(st, "word_wrap", icon=ICON_WORDWRAP_OFF) - layout.itemR(st, "syntax_highlight", icon=ICON_SYNTAX_OFF) + flow = layout.column_flow() + flow.itemR(st, "line_numbers", icon=ICON_LINENUMBERS_OFF) + flow.itemR(st, "word_wrap", icon=ICON_WORDWRAP_OFF) + flow.itemR(st, "syntax_highlight", icon=ICON_SYNTAX_OFF) - layout.column_flow() - layout.itemR(st, "font_size") - layout.itemR(st, "tab_width") + flow = layout.column_flow() + flow.itemR(st, "font_size") + flow.itemR(st, "tab_width") class TEXT_PT_find(bpy.types.Panel): __space_type__ = "TEXT_EDITOR" @@ -79,27 +81,26 @@ class TEXT_PT_find(bpy.types.Panel): layout = self.layout # find - layout.row() - layout.itemR(st, "find_text", text="") - layout.itemO("TEXT_OT_find_set_selected", text="", icon=ICON_TEXT) - layout.column() - layout.itemO("TEXT_OT_find") + col = layout.column(align=True) + row = col.row() + row.itemR(st, "find_text", text="") + row.itemO("TEXT_OT_find_set_selected", text="", icon=ICON_TEXT) + col.itemO("TEXT_OT_find") # replace - layout.row() - layout.itemR(st, "replace_text", text="") - layout.itemO("TEXT_OT_replace_set_selected", text="", icon=ICON_TEXT) - layout.column() - layout.itemO("TEXT_OT_replace") + col = layout.column(align=True) + row = col.row() + row.itemR(st, "replace_text", text="") + row.itemO("TEXT_OT_replace_set_selected", text="", icon=ICON_TEXT) + col.itemO("TEXT_OT_replace") # mark - layout.column() layout.itemO("TEXT_OT_mark_all") # settings - layout.row() - layout.itemR(st, "find_wrap", text="Wrap") - layout.itemR(st, "find_all", text="All") + row = layout.row() + row.itemR(st, "find_wrap", text="Wrap") + row.itemR(st, "find_all", text="All") class TEXT_MT_text(bpy.types.Menu): __space_type__ = "TEXT_EDITOR" diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index 1a40911170e..b30eba5a631 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -210,8 +210,10 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo BezTriple *bezt; for (bezt=fcu->bezt, i=0; i < fcu->totvert; bezt++, i++) { - yminv= MIN2(yminv, bezt->vec[1][1]); - ymaxv= MAX2(ymaxv, bezt->vec[1][1]); + if (bezt->vec[1][1] < yminv) + yminv= bezt->vec[1][1]; + if (bezt->vec[1][1] > ymaxv) + ymaxv= bezt->vec[1][1]; } } } @@ -227,8 +229,10 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo FPoint *fpt; for (fpt=fcu->fpt, i=0; i < fcu->totvert; fpt++, i++) { - yminv= MIN2(yminv, fpt->vec[1]); - ymaxv= MAX2(ymaxv, fpt->vec[1]); + if (fpt->vec[1] < yminv) + yminv= fpt->vec[1]; + if (fpt->vec[1] > ymaxv) + ymaxv= fpt->vec[1]; } } } diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c index 67f89b3358d..afad396607b 100644 --- a/source/blender/editors/animation/anim_filter.c +++ b/source/blender/editors/animation/anim_filter.c @@ -754,7 +754,17 @@ static int animdata_filter_dopesheet_mats (ListBase *anim_data, bDopeSheet *ads, Material *ma= give_current_material(ob, a); /* for now, if no material returned, skip (this shouldn't confuse the user I hope) */ - if (ELEM3(NULL, ma, ma->adt, ma->adt->action)) continue; + if (ELEM(NULL, ma, ma->adt)) + continue; + + if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) { + if (ANIMDATA_HAS_KEYS(ma) == 0) + continue; + } + else { + if (ANIMDATA_HAS_DRIVERS(ma) == 0) + continue; + } /* make a temp list elem for this */ ld= MEM_callocN(sizeof(LinkData), "DopeSheet-MaterialCache"); @@ -791,10 +801,16 @@ static int animdata_filter_dopesheet_mats (ListBase *anim_data, bDopeSheet *ads, } } - /* add material's F-Curve channels? */ + /* add material's F-Curve or Driver channels? */ if (FILTER_MAT_OBJD(ma) || (filter_mode & ANIMFILTER_CURVESONLY)) { + if ((ads->filterflag & ADS_FILTER_ONLYDRIVERS)==0) { // XXX the 'owner' info here is still subject to improvement - items += animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma); + items += animdata_filter_action(anim_data, ma->adt->action, filter_mode, ma, ANIMTYPE_DSMAT, (ID *)ma); + } + else { + // need to make the ownertype normal object here... (maybe type should be a separate one for clarity?) + items += animdata_filter_fcurves(anim_data, ma->adt->drivers.first, NULL, ma, ANIMTYPE_DSMAT, filter_mode, (ID *)ma); + } } } } diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c index 4d4079a260a..14780ebb794 100644 --- a/source/blender/editors/animation/anim_ipo_utils.c +++ b/source/blender/editors/animation/anim_ipo_utils.c @@ -148,12 +148,6 @@ void getname_anim_fcurve(char *name, ID *id, FCurve *fcu) /* Array Index - only if applicable */ if (RNA_property_array_length(prop)) { - // XXX the format of these is not final... we don't know how this will go yet - // format 1 style - //static char *vectoritem[4]= {".X", ".Y", ".Z", ".W"}; - //static char *quatitem[4]= {".W", ".X", ".Y", ".Z"}; - //static char *coloritem[4]= {".R", ".G", ".B", ".A"}; - // format 2 style static char *vectoritem[4]= {"X ", "Y ", "Z ", "W "}; static char *quatitem[4]= {"W ", "X ", "Y ", "Z "}; static char *coloritem[4]= {"R ", "G ", "B ", "A "}; @@ -181,8 +175,7 @@ void getname_anim_fcurve(char *name, ID *id, FCurve *fcu) /* putting this all together into the buffer */ // XXX we need to check for invalid names... - //BLI_snprintf(name, 128, "%s.%s%s", structname, propname, arrayname); // format 1 - BLI_snprintf(name, 128, "%s%s (%s)", arrayname, propname, structname); // format 2 + BLI_snprintf(name, 128, "%s%s (%s)", arrayname, propname, structname); /* free temp name if nameprop is set */ if (nameprop) @@ -197,6 +190,7 @@ void getname_anim_fcurve(char *name, ID *id, FCurve *fcu) /* ------------------------------- Color Codes for F-Curve Channels ---------------------------- */ +#if 0 /* used for FCURVE_COLOR_AUTO_RAINBOW */ // XXX this still doesn't work too great when there are more than 32 curves (which happens most of the time) void ipo_rainbow (int cur, int tot, float *out) @@ -206,14 +200,57 @@ void ipo_rainbow (int cur, int tot, float *out) dfac= (float)(1.0/( (float)tot+1.0)); /* this calculation makes 2 or 4 different cycles of rainbow colors */ + // 2 different cycles - for hue if(cur< tot/2) fac= (float)(cur*2.0f*dfac); else fac= (float)((cur-tot/2)*2.0f*dfac +dfac); + + // third cycle with altered hue if(tot > 32) fac= fac*1.95f; + // clamping for excessive ranges if(fac>1.0f) fac-= 1.0f; + // saturation adjustments for more visible range if(fac>0.5f && fac<0.8f) sat= 0.5f; else sat= 0.6f; - //return hsv_to_cpack(fac, sat, 1.0f); hsv_to_rgb(fac, sat, 1.0f, out, out+1, out+2); } +#endif + +/* step between the major distinguishable color bands of the primary colors */ +#define HSV_BANDWIDTH 0.3f + +/* testbed for FCURVE_COLOR_AUTO_RAINBOW determination methods */ +//void fcurve_rainbow (unsigned int cur, unsigned int tot, float *out) +void ipo_rainbow (int cur, int tot, float *out) +{ + float hue, val, sat, fac; + int grouping; + + /* we try to divide the colours into groupings of n colors, + * where n is: + * 3 - for 'odd' numbers of curves - there should be a majority of triplets of curves + * 4 - for 'even' numbers of curves - there should be a majority of quartets of curves + * so the base color is simply one of the three primary colors + */ + grouping= (4 - (tot % 2)); + hue= HSV_BANDWIDTH * (float)(cur % grouping); + + /* 'Value' (i.e. darkness) needs to vary so that larger sets of three will be + * 'darker' (i.e. smaller value), so that they don't look that similar to previous ones. + * However, only a range of 0.3 to 1.0 is really usable to avoid clashing + * with some other stuff + */ + fac = ((float)cur / (float)tot) * 0.7f; + val = 1.0f - fac; + + /* the base color can get offset a bit so that the colors aren't so identical */ + hue += fac * HSV_BANDWIDTH; + if (hue > 1.0f) hue= fmod(hue, 1.0f); + + /* saturation fluctuates between 0.5 and 1.0 */ + sat = ((cur / grouping) % 2) ? 0.61f : 0.96f; + + /* finally, conver this to RGB colors */ + hsv_to_rgb(hue, sat, val, out, out+1, out+2); +} diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c index b09cc3b78e1..6d0c15ab724 100644 --- a/source/blender/editors/animation/keyframing.c +++ b/source/blender/editors/animation/keyframing.c @@ -29,6 +29,7 @@ #include "BKE_action.h" #include "BKE_constraint.h" #include "BKE_fcurve.h" +#include "BKE_global.h" #include "BKE_utildefines.h" #include "BKE_context.h" #include "BKE_report.h" @@ -68,6 +69,7 @@ bAction *verify_adt_action (ID *id, short add) adt= BKE_id_add_animdata(id); if (adt == NULL) { /* if still none (as not allowed to add, or ID doesn't have animdata for some reason) */ + printf("ERROR: Couldn't add AnimData (ID = %s) \n", (id) ? (id->name) : "<None>"); return NULL; } @@ -793,6 +795,9 @@ short insert_keyframe (ID *id, bAction *act, const char group[], const char rna_ } } + /* no F-Curve to add keyframes to */ + printf("ERROR: no F-Curve to add keyframes to \n"); + /* return failure */ return 0; } @@ -993,7 +998,7 @@ static int insert_key_menu_invoke (bContext *C, wmOperator *op, wmEvent *event) uiLayout *layout; int i = 0; - pup= uiPupMenuBegin("Insert Keyframe", 0); + pup= uiPupMenuBegin(C, "Insert Keyframe", 0); layout= uiPupMenuLayout(pup); /* active Keying Set */ @@ -1203,11 +1208,11 @@ static int insert_key_button_exec (bContext *C, wmOperator *op) memset(&ptr, 0, sizeof(PointerRNA)); uiAnimContextProperty(C, &ptr, &prop, &index); - if(ptr.data && prop && RNA_property_animateable(&ptr, prop)) { + if ((ptr.data && prop) && RNA_property_animateable(&ptr, prop)) { path= RNA_path_from_ID_to_property(&ptr, prop); - if(path) { - if(all) { + if (path) { + if (all) { length= RNA_property_array_length(prop); if(length) index= 0; @@ -1216,14 +1221,20 @@ static int insert_key_button_exec (bContext *C, wmOperator *op) else length= 1; - for(a=0; a<length; a++) + for (a=0; a<length; a++) success+= insert_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, 0); MEM_freeN(path); } + else if (G.f & G_DEBUG) + printf("Button Insert-Key: no path to property \n"); + } + else if (G.f & G_DEBUG) { + printf("ptr.data = %p, prop = %p,", ptr.data, prop); + printf("animateable = %d \n", RNA_property_animateable(&ptr, prop)); } - if(success) { + if (success) { /* send updates */ ED_anim_dag_flush_update(C); @@ -1267,11 +1278,11 @@ static int delete_key_button_exec (bContext *C, wmOperator *op) memset(&ptr, 0, sizeof(PointerRNA)); uiAnimContextProperty(C, &ptr, &prop, &index); - if(ptr.data && prop) { + if (ptr.data && prop) { path= RNA_path_from_ID_to_property(&ptr, prop); - if(path) { - if(all) { + if (path) { + if (all) { length= RNA_property_array_length(prop); if(length) index= 0; @@ -1280,11 +1291,16 @@ static int delete_key_button_exec (bContext *C, wmOperator *op) else length= 1; - for(a=0; a<length; a++) + for (a=0; a<length; a++) success+= delete_keyframe(ptr.id.data, NULL, NULL, path, index+a, cfra, 0); MEM_freeN(path); } + else if (G.f & G_DEBUG) + printf("Button Delete-Key: no path to property \n"); + } + else if (G.f & G_DEBUG) { + printf("ptr.data = %p, prop = %p \n", ptr.data, prop); } diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c index 98f51a4015d..1c113c25720 100644 --- a/source/blender/editors/armature/editarmature.c +++ b/source/blender/editors/armature/editarmature.c @@ -3461,7 +3461,7 @@ static int armature_subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("Subdivision Type", 0); + pup= uiPupMenuBegin(C, "Subdivision Type", 0); layout= uiPupMenuLayout(pup); uiItemsEnumO(layout, "ARMATURE_OT_subdivs", "type"); uiPupMenuEnd(C, pup); @@ -3744,7 +3744,7 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op) static int armature_parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event) { EditBone *actbone = CTX_data_active_bone(C); - uiPopupMenu *pup= uiPupMenuBegin("Make Parent ", 0); + uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", 0); uiLayout *layout= uiPupMenuLayout(pup); int allchildbones = 0; diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c index 43590346299..dec4847f125 100644 --- a/source/blender/editors/armature/poselib.c +++ b/source/blender/editors/armature/poselib.c @@ -326,7 +326,7 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *evt) return OPERATOR_CANCELLED; /* start building */ - pup= uiPupMenuBegin(op->type->name, 0); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); uiLayoutContext(layout, WM_OP_EXEC_DEFAULT); @@ -460,7 +460,7 @@ static int poselib_stored_pose_menu_invoke (bContext *C, wmOperator *op, wmEvent return OPERATOR_CANCELLED; /* start building */ - pup= uiPupMenuBegin(op->type->name, 0); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); uiLayoutContext(layout, WM_OP_EXEC_DEFAULT); diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c index 49d86d08db2..5292d86d3c9 100644 --- a/source/blender/editors/curve/curve_ops.c +++ b/source/blender/editors/curve/curve_ops.c @@ -70,7 +70,7 @@ static int specials_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("Specials", 0); + pup= uiPupMenuBegin(C, "Specials", 0); layout= uiPupMenuLayout(pup); uiItemO(layout, NULL, 0, "CURVE_OT_subdivide"); uiItemO(layout, NULL, 0, "CURVE_OT_switch_direction"); diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index c60007680ba..45b9a589bd5 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -3567,7 +3567,7 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *event) for(nu= editnurb->first; nu; nu= nu->next) { if(nu->pntsu>1 || nu->pntsv>1) { if(nu->type==CU_NURBS) { - pup= uiPupMenuBegin("Direction", 0); + pup= uiPupMenuBegin(C, "Direction", 0); layout= uiPupMenuLayout(pup); uiItemsEnumO(layout, op->type->idname, "direction"); uiPupMenuEnd(C, pup); @@ -4511,14 +4511,14 @@ static int delete_invoke(bContext *C, wmOperator *op, wmEvent *event) uiLayout *layout; if(obedit->type==OB_SURF) { - pup= uiPupMenuBegin("Delete", 0); + pup= uiPupMenuBegin(C, "Delete", 0); layout= uiPupMenuLayout(pup); uiItemEnumO(layout, NULL, 0, op->type->idname, "type", 0); uiItemEnumO(layout, NULL, 0, op->type->idname, "type", 2); uiPupMenuEnd(C, pup); } else { - pup= uiPupMenuBegin("Delete", 0); + pup= uiPupMenuBegin(C, "Delete", 0); layout= uiPupMenuLayout(pup); uiItemsEnumO(layout, op->type->idname, "type"); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/include/BIF_glutil.h b/source/blender/editors/include/BIF_glutil.h index 63bd451132d..5c611365a7e 100644 --- a/source/blender/editors/include/BIF_glutil.h +++ b/source/blender/editors/include/BIF_glutil.h @@ -137,6 +137,8 @@ void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, void glaDrawPixelsTex (float x, float y, int img_w, int img_h, int format, void *rect); +void glaDrawPixelsTexScaled(float x, float y, int img_w, int img_h, int format, void *rect, float scaleX, float scaleY); + /* 2D Drawing Assistance */ /** Define a 2D area (viewport, scissor, matrices) for OpenGL rendering. diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h index bb5ced66428..7cbef4984d7 100644 --- a/source/blender/editors/include/ED_fileselect.h +++ b/source/blender/editors/include/ED_fileselect.h @@ -62,6 +62,19 @@ typedef struct FileSelectParams { #define FILE_LAYOUT_HOR 1 #define FILE_LAYOUT_VER 2 +#define MAX_FILE_COLUMN 8 + +typedef enum FileListColumns { + COLUMN_NAME = 0, + COLUMN_DATE, + COLUMN_TIME, + COLUMN_SIZE, + COLUMN_MODE1, + COLUMN_MODE2, + COLUMN_MODE3, + COLUMN_OWNER +} FileListColumns; + typedef struct FileLayout { /* view settings - XXX - move into own struct */ @@ -78,7 +91,7 @@ typedef struct FileLayout short width; short height; short flag; - + float column_widths[MAX_FILE_COLUMN]; } FileLayout; FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile); diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 847120a5804..bfa0c680bd6 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -53,6 +53,8 @@ void ED_region_pixelspace(struct ARegion *ar); void ED_region_init(struct bContext *C, struct ARegion *ar); void ED_region_tag_redraw(struct ARegion *ar); void ED_region_tag_redraw_partial(struct ARegion *ar, struct rcti *rct); +void ED_region_panels(const struct bContext *C, struct ARegion *ar, int vertical, char *context); +void ED_region_header(const struct bContext *C, struct ARegion *ar); /* spaces */ void ED_spacetypes_init(void); diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 0e34b3702ed..475d77d90f3 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -131,6 +131,8 @@ typedef struct uiLayout uiLayout; #define UI_BUT_ANIMATED_KEY (1<<21) #define UI_BUT_DRIVEN (1<<22) +#define UI_PANEL_WIDTH 340 +#define UI_COMPACT_PANEL_WIDTH 160 /* Button types, bits stored in 1 value... and a short even! - bits 0-4: bitnr (0-31) @@ -215,7 +217,7 @@ typedef void (*uiMenuHandleFunc)(struct bContext *C, void *arg, int event); typedef struct uiPopupMenu uiPopupMenu; -uiPopupMenu *uiPupMenuBegin(const char *title, int icon); +uiPopupMenu *uiPupMenuBegin(struct bContext *C, const char *title, int icon); void uiPupMenuEnd(struct bContext *C, struct uiPopupMenu *head); struct uiLayout *uiPupMenuLayout(uiPopupMenu *head); @@ -260,6 +262,8 @@ void uiFreeBlock(const struct bContext *C, uiBlock *block); void uiFreeBlocks(const struct bContext *C, struct ListBase *lb); void uiFreeInactiveBlocks(const struct bContext *C, struct ListBase *lb); +void uiBlockSetRegion(uiBlock *block, struct ARegion *region); + void uiBlockSetButLock(uiBlock *block, int val, char *lockstr); void uiBlockClearButLock(uiBlock *block); @@ -523,7 +527,8 @@ uiBut *uiDefMenuTogR(uiBlock *block, struct PointerRNA *ptr, char *propname, cha * - Template: predefined layouts for buttons with a number of slots, each * slot can contain multiple items. * - Item: item to put in a template slot, being either an RNA property, - * operator, label or menu currently. */ + * operator, label or menu. Also regular buttons can be used when setting + * uiBlockCurLayout. */ /* layout */ #define UI_LAYOUT_HORIZONTAL 0 @@ -533,23 +538,29 @@ uiBut *uiDefMenuTogR(uiBlock *block, struct PointerRNA *ptr, char *propname, cha #define UI_LAYOUT_HEADER 1 #define UI_LAYOUT_MENU 2 -uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em, struct uiStyle *style); -void uiLayoutEnd(const struct bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y); +#define UI_UNIT_X 20 +#define UI_UNIT_Y 20 + +uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, struct uiStyle *style); +void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout); +void uiBlockLayoutResolve(const struct bContext *C, uiBlock *block, int *x, int *y); +float uiBlockAspect(uiBlock *block); /* temporary */ void uiLayoutContext(uiLayout *layout, int opcontext); void uiLayoutFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv); +uiBlock *uiLayoutBlock(uiLayout *layout); /* layout specifiers */ -void uiLayoutRow(uiLayout *layout); -void uiLayoutColumn(uiLayout *layout); -void uiLayoutColumnFlow(uiLayout *layout, int number); -void uiLayoutSplit(uiLayout *layout, int number, int lr); +uiLayout *uiLayoutRow(uiLayout *layout, int align); +uiLayout *uiLayoutColumn(uiLayout *layout, int align); +uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align); uiLayout *uiLayoutBox(uiLayout *layout); -uiLayout *uiLayoutSub(uiLayout *layout, int n); +uiLayout *uiLayoutFree(uiLayout *layout, int align); +uiLayout *uiLayoutSplit(uiLayout *layout); /* templates */ -void uiTemplateHeader(uiLayout *layout); -void uiTemplateHeaderID(uiLayout *layout, struct PointerRNA *ptr, char *propname, +void uiTemplateHeader(uiLayout *layout, struct bContext *C); +void uiTemplateHeaderID(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop); /* items */ @@ -568,7 +579,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, char *propname); void uiItemL(uiLayout *layout, char *name, int icon); /* label */ -void uiItemM(uiLayout *layout, char *name, int icon, char *menuname); /* menu */ +void uiItemM(uiLayout *layout, struct bContext *C, char *name, int icon, char *menuname); /* menu */ void uiItemV(uiLayout *layout, char *name, int icon, int argval); /* value */ void uiItemS(uiLayout *layout); /* separator */ @@ -576,21 +587,10 @@ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func); void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname); void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname); -/* utilities */ -#define UI_PANEL_WIDTH 340 -#define UI_COMPACT_PANEL_WIDTH 160 - -typedef void (*uiHeaderCreateFunc)(const struct bContext *C, uiLayout *layout); -typedef void (*uiPanelCreateFunc)(const struct bContext *C, uiLayout *layout); - -void uiRegionPanelLayout(const struct bContext *C, struct ARegion *ar, int vertical, char *context); -void uiRegionHeaderLayout(const struct bContext *C, struct ARegion *ar); - /* Animation */ void uiAnimContextProperty(const struct bContext *C, struct PointerRNA *ptr, struct PropertyRNA **prop, int *index); - /* Styled text draw */ void uiStyleFontSet(struct uiFontStyle *fs); void uiStyleFontDraw(struct uiFontStyle *fs, struct rcti *rect, char *str); diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index fd082c34238..57f45059865 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -502,10 +502,10 @@ void ui_menu_block_set_keymaps(const bContext *C, uiBlock *block) return; for(but=block->buttons.first; but; but=but->next) { - if(but->opname) { + if(but->optype) { prop= (but->opptr)? but->opptr->data: NULL; - if(WM_key_event_operator_string(C, but->opname, but->opcontext, prop, buf, sizeof(buf))) { + if(WM_key_event_operator_string(C, but->optype->idname, but->opcontext, prop, buf, sizeof(buf))) { butstr= MEM_mallocN(strlen(but->str)+strlen(buf)+2, "menu_block_set_keymaps"); strcpy(butstr, but->str); strcat(butstr, "|"); @@ -535,8 +535,8 @@ void uiEndBlock(const bContext *C, uiBlock *block) ui_check_but(but); /* temp? Proper check for greying out */ - if(but->opname) { - wmOperatorType *ot= WM_operatortype_find(but->opname); + if(but->optype) { + wmOperatorType *ot= but->optype; if(ot==NULL || (ot->poll && ot->poll((bContext *)C)==0)) { but->flag |= UI_BUT_DISABLED; but->lock = 1; @@ -559,6 +559,8 @@ void uiEndBlock(const bContext *C, uiBlock *block) } /* handle pending stuff */ + if(block->layout) uiBlockLayoutResolve(C, block, NULL, NULL); + ui_block_do_align(block); if(block->flag & UI_BLOCK_LOOP) ui_menu_block_set_keymaps(C, block); /* after keymaps! */ @@ -598,7 +600,7 @@ static void ui_but_to_pixelrect(rcti *rect, const ARegion *ar, uiBlock *block, u getsizex= ar->winx; getsizey= ar->winy; - + gx= (but?but->x1:block->minx) + (block->panel?block->panel->ofsx:0.0f); gy= (but?but->y1:block->miny) + (block->panel?block->panel->ofsy:0.0f); @@ -1716,21 +1718,18 @@ void uiFreeInactiveBlocks(const bContext *C, ListBase *lb) } } -uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, short dt) +void uiBlockSetRegion(uiBlock *block, ARegion *region) { ListBase *lb; - uiBlock *block, *oldblock= NULL; - wmWindow *window; - int getsizex, getsizey; + uiBlock *oldblock= NULL; - window= CTX_wm_window(C); lb= ®ion->uiblocks; /* each listbase only has one block with this name, free block * if is already there so it can be rebuilt from scratch */ if(lb) { for (oldblock= lb->first; oldblock; oldblock= oldblock->next) - if (BLI_streq(oldblock->name, name)) + if (BLI_streq(oldblock->name, block->name)) break; if (oldblock) { @@ -1738,20 +1737,32 @@ uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, shor oldblock->panel= NULL; } } - - block= MEM_callocN(sizeof(uiBlock), "uiBlock"); + block->oldblock= oldblock; - block->active= 1; - block->dt= dt; /* at the beginning of the list! for dynamical menus/blocks */ if(lb) BLI_addhead(lb, block); +} + +uiBlock *uiBeginBlock(const bContext *C, ARegion *region, const char *name, short dt) +{ + uiBlock *block; + wmWindow *window; + int getsizex, getsizey; + window= CTX_wm_window(C); + + block= MEM_callocN(sizeof(uiBlock), "uiBlock"); + block->active= 1; + block->dt= dt; BLI_strncpy(block->name, name, sizeof(block->name)); + if(region) + uiBlockSetRegion(block, region); + /* window matrix and aspect */ - if(region->swinid) { + if(region && region->swinid) { wm_subwindow_getmatrix(window, region->swinid, block->winmat); wm_subwindow_getsize(window, region->swinid, &getsizex, &getsizey); @@ -1952,7 +1963,9 @@ void uiBlockBeginAlign(uiBlock *block) if(block->flag & UI_BUT_ALIGN) uiBlockEndAlign(block); block->flag |= UI_BUT_ALIGN_DOWN; - /* buttons declared after this call will this align flag */ + block->alignnr++; + + /* buttons declared after this call will get this align nr */ // XXX flag? } static int buts_are_horiz(uiBut *but1, uiBut *but2) @@ -1968,36 +1981,33 @@ static int buts_are_horiz(uiBut *but1, uiBut *but2) void uiBlockEndAlign(uiBlock *block) { + block->flag &= ~UI_BUT_ALIGN; // all 4 flags +} + +static void ui_block_do_align_but(uiBlock *block, uiBut *first, int nr) +{ uiBut *prev, *but=NULL, *next; int flag= 0, cols=0, rows=0; - /* auto align: - - go back to first button of align start (ALIGN_DOWN) - - compare triples, and define flags - */ - prev= block->buttons.last; - while(prev) { - if( (prev->flag & UI_BUT_ALIGN_DOWN)) but= prev; - else break; - - if(but && but->next) { + /* auto align */ + + for(but=first; but && but->alignnr == nr; but=but->next) { + if(but->next && but->next->alignnr == nr) { if(buts_are_horiz(but, but->next)) cols++; else rows++; } - - prev= prev->prev; } - if(but==NULL) return; - + /* rows==0: 1 row, cols==0: 1 collumn */ /* note; how it uses 'flag' in loop below (either set it, or OR it) is confusing */ - prev= NULL; - while(but) { + for(but=first, prev=NULL; but && but->alignnr == nr; prev=but, but=but->next) { next= but->next; - + if(next && next->alignnr != nr) + next= NULL; + /* clear old flag */ - but->flag &= ~UI_BUT_ALIGN_DOWN; + but->flag &= ~UI_BUT_ALIGN; if(flag==0) { /* first case */ if(next) { @@ -2030,11 +2040,11 @@ void uiBlockEndAlign(uiBlock *block) /* exception case: bottom row */ if(rows>0) { uiBut *bt= but; - while(bt) { - if(bt->next && buts_are_horiz(bt, bt->next)==0 ) break; + while(bt && bt->alignnr == nr) { + if(bt->next && bt->next->alignnr == nr && buts_are_horiz(bt, bt->next)==0 ) break; bt= bt->next; } - if(bt==0) flag= UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT; + if(bt==0 || bt->alignnr != nr) flag= UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT; } } else flag |= UI_BUT_ALIGN_LEFT; @@ -2086,35 +2096,30 @@ void uiBlockEndAlign(uiBlock *block) } } } - - prev= but; - but= next; } - - block->flag &= ~UI_BUT_ALIGN; // all 4 flags } -#if 0 -static void uiBlockEndAligno(uiBlock *block) +void ui_block_do_align(uiBlock *block) { uiBut *but; - - /* correct last defined button */ - but= block->buttons.last; - if(but) { - /* vertical align case */ - if( (block->flag & UI_BUT_ALIGN) == (UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_DOWN) ) { - but->flag &= ~UI_BUT_ALIGN_DOWN; - } - /* horizontal align case */ - if( (block->flag & UI_BUT_ALIGN) == (UI_BUT_ALIGN_LEFT|UI_BUT_ALIGN_RIGHT) ) { - but->flag &= ~UI_BUT_ALIGN_RIGHT; + int nr; + + /* align buttons with same align nr */ + for(but=block->buttons.first; but;) { + if(but->alignnr) { + nr= but->alignnr; + ui_block_do_align_but(block, but, nr); + + /* skip with same number */ + for(; but && but->alignnr == nr; but=but->next); + + if(!but) + break; } - /* else do nothing, manually provided flags */ + else + but= but->next; } - block->flag &= ~UI_BUT_ALIGN; // all 4 flags } -#endif /* ui_def_but is the function that draws many button types @@ -2171,6 +2176,9 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short but->aspect= 1.0f; //XXX block->aspect; but->block= block; // pointer back, used for frontbuffer status, and picker + if(block->flag & UI_BUT_ALIGN) + but->alignnr= block->alignnr; + but->func= block->func; but->func_arg1= block->func_arg1; but->func_arg2= block->func_arg2; @@ -2217,6 +2225,9 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, char *str, short } else BLI_addtail(&block->buttons, but); + + if(block->curlayout) + ui_layout_add_but(block->curlayout, but); return but; } @@ -2374,7 +2385,7 @@ uiBut *ui_def_but_operator(uiBlock *block, int type, char *opname, int opcontext } but= ui_def_but(block, type, -1, str, x1, y1, x2, y2, NULL, 0, 0, 0, 0, tip); - but->opname= opname; + but->optype= ot; but->opcontext= opcontext; if(!ot) { @@ -2894,9 +2905,9 @@ int uiButGetRetVal(uiBut *but) PointerRNA *uiButGetOperatorPtrRNA(uiBut *but) { - if(but->opname && !but->opptr) { + if(but->optype && !but->opptr) { but->opptr= MEM_callocN(sizeof(PointerRNA), "uiButOpPtr"); - WM_operator_properties_create(but->opptr, but->opname); + WM_operator_properties_create(but->opptr, but->optype->idname); } return but->opptr; diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c index ac6f5d970eb..4a26db29160 100644 --- a/source/blender/editors/interface/interface_anim.c +++ b/source/blender/editors/interface/interface_anim.c @@ -119,7 +119,7 @@ void ui_but_anim_menu(bContext *C, uiBut *but) int length; if(but->rnapoin.data && but->rnaprop) { - pup= uiPupMenuBegin(RNA_property_ui_name(but->rnaprop), 0); + pup= uiPupMenuBegin(C, RNA_property_ui_name(but->rnaprop), 0); layout= uiPupMenuLayout(pup); length= RNA_property_array_length(but->rnaprop); diff --git a/source/blender/editors/interface/interface_api.c b/source/blender/editors/interface/interface_api.c index 1cd804851b5..873406de7aa 100644 --- a/source/blender/editors/interface/interface_api.c +++ b/source/blender/editors/interface/interface_api.c @@ -56,9 +56,20 @@ void RNA_api_ui_layout(StructRNA *srna) /* simple layout specifiers */ func= RNA_def_function(srna, "row", "uiLayoutRow"); + parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); + RNA_def_function_return(func, parm); + RNA_def_boolean(func, "align", 0, "", "Align buttons to each other."); + func= RNA_def_function(srna, "column", "uiLayoutColumn"); + parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); + RNA_def_function_return(func, parm); + RNA_def_boolean(func, "align", 0, "", "Align buttons to each other."); + func= RNA_def_function(srna, "column_flow", "uiLayoutColumnFlow"); parm= RNA_def_int(func, "columns", 0, 0, INT_MAX, "", "Number of columns, 0 is automatic.", 0, INT_MAX); + parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); + RNA_def_function_return(func, parm); + RNA_def_boolean(func, "align", 0, "", "Align buttons to each other."); /* box layout */ func= RNA_def_function(srna, "box", "uiLayoutBox"); @@ -67,13 +78,6 @@ void RNA_api_ui_layout(StructRNA *srna) /* split layout */ func= RNA_def_function(srna, "split", "uiLayoutSplit"); - parm= RNA_def_int(func, "number", 2, 0, INT_MAX, "", "Number of splits.", 0, INT_MAX); - parm= RNA_def_boolean(func, "lr", 0, "", "LR."); - - /* sub layout */ - func= RNA_def_function(srna, "sub", "uiLayoutSub"); - parm= RNA_def_int(func, "n", 0, 0, INT_MAX, "", "Index of sub-layout.", 0, INT_MAX); - RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_pointer(func, "layout", "UILayout", "", "Sub-layout to put items in."); RNA_def_function_return(func, parm); @@ -161,6 +165,8 @@ void RNA_api_ui_layout(StructRNA *srna) api_ui_item_common(func); func= RNA_def_function(srna, "itemM", "uiItemM"); + parm= RNA_def_pointer(func, "context", "Context", "", "Current context."); + RNA_def_property_flag(parm, PROP_REQUIRED); api_ui_item_common(func); parm= RNA_def_string(func, "menu", "", 0, "", "Identifier of the menu."); RNA_def_property_flag(parm, PROP_REQUIRED); @@ -169,8 +175,12 @@ void RNA_api_ui_layout(StructRNA *srna) /* templates */ func= RNA_def_function(srna, "template_header", "uiTemplateHeader"); + parm= RNA_def_pointer(func, "context", "Context", "", "Current context."); + RNA_def_property_flag(parm, PROP_REQUIRED); func= RNA_def_function(srna, "template_header_ID", "uiTemplateHeaderID"); + parm= RNA_def_pointer(func, "context", "Context", "", "Current context."); + RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_pointer(func, "data", "AnyType", "", "Data from which to take property."); RNA_def_property_flag(parm, PROP_REQUIRED); parm= RNA_def_string(func, "property", "", 0, "", "Identifier of pointer property in data."); diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 5aa2cded642..02c803963eb 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -151,7 +151,7 @@ typedef struct uiAfterFunc { void *butm_func_arg; int a2; - const char *opname; + wmOperatorType *optype; int opcontext; PointerRNA *opptr; @@ -222,7 +222,7 @@ static void ui_apply_but_func(bContext *C, uiBut *but) * handling is done, i.e. menus are closed, in order to avoid conflicts * with these functions removing the buttons we are working with */ - if(but->func || but->funcN || block->handle_func || (but->type == BUTM && block->butm_func) || but->opname || but->rnaprop) { + if(but->func || but->funcN || block->handle_func || (but->type == BUTM && block->butm_func) || but->optype || but->rnaprop) { after= MEM_callocN(sizeof(uiAfterFunc), "uiAfterFunc"); after->func= but->func; @@ -242,14 +242,14 @@ static void ui_apply_but_func(bContext *C, uiBut *but) after->a2= but->a2; } - after->opname= but->opname; + after->optype= but->optype; after->opcontext= but->opcontext; after->opptr= but->opptr; after->rnapoin= but->rnapoin; after->rnaprop= but->rnaprop; - but->opname= NULL; + but->optype= NULL; but->opcontext= 0; but->opptr= NULL; @@ -280,8 +280,8 @@ static void ui_apply_but_funcs_after(bContext *C) if(after.butm_func) after.butm_func(C, after.butm_func_arg, after.a2); - if(after.opname) - WM_operator_name_call(C, after.opname, after.opcontext, after.opptr); + if(after.optype) + WM_operator_name_call(C, after.optype->idname, after.opcontext, after.opptr); if(after.opptr) { WM_operator_properties_free(after.opptr); MEM_freeN(after.opptr); @@ -3780,8 +3780,8 @@ static int ui_handler_popup(bContext *C, wmEvent *event, void *userdata) if(temp.menuretval == UI_RETURN_OK) { if(temp.popup_func) temp.popup_func(C, temp.popup_arg, temp.retvalue); - if(temp.opname) - WM_operator_name_call(C, temp.opname, temp.opcontext, NULL); + if(temp.optype) + WM_operator_name_call(C, temp.optype->idname, temp.opcontext, NULL); } else if(temp.cancel_func) temp.cancel_func(temp.popup_arg); diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 0edcc95f7af..b96726a5ead 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -38,9 +38,11 @@ struct bContext; struct IDProperty; struct uiHandleButtonData; struct wmEvent; +struct wmOperatorType; struct wmWindow; struct uiStyle; struct uiWidgetColors; +struct uiLayout; /* ****************** general defines ************** */ @@ -99,8 +101,6 @@ typedef enum { /* internal panel drawing defines */ #define PNL_GRID 4 -#define PNL_DIST 4 -#define PNL_SAFETY 8 #define PNL_HEADER 20 /* panel->flag */ @@ -145,6 +145,7 @@ typedef struct { struct uiBut { struct uiBut *next, *prev; short type, pointype, bit, bitnr, retval, strwidth, ofs, pos, selsta, selend; + short alignnr; int flag; char *str; @@ -196,7 +197,7 @@ struct uiBut { int rnaindex; /* Operator data */ - const char *opname; + struct wmOperatorType *optype; int opcontext; struct IDProperty *opproperties; struct PointerRNA *opptr; @@ -216,10 +217,13 @@ struct uiBut { struct uiBlock { uiBlock *next, *prev; - + ListBase buttons; Panel *panel; uiBlock *oldblock; + + struct uiLayout *layout; + struct uiLayout *curlayout; char name[UI_MAX_NAME_STR]; @@ -228,6 +232,8 @@ struct uiBlock { float minx, miny, maxx, maxy; float aspect; + short alignnr; + uiButHandleFunc func; void *func_arg1; void *func_arg2; @@ -302,6 +308,7 @@ extern void ui_update_block_buts_hsv(uiBlock *block, float *hsv); extern void ui_bounds_block(uiBlock *block); extern void ui_block_translate(uiBlock *block, int x, int y); +extern void ui_block_do_align(uiBlock *block); /* interface_regions.c */ @@ -318,7 +325,7 @@ struct uiPopupBlockHandle { void *popup_arg; /* for operator popups */ - const char *opname; + struct wmOperatorType *optype; int opcontext; ScrArea *ctx_area; ARegion *ctx_region; @@ -389,6 +396,8 @@ void ui_theme_init_userdef(void); void ui_resources_init(void); void ui_resources_free(void); +/* interface_layout.c */ +void ui_layout_add_but(struct uiLayout *layout, uiBut *but); /* interface_anim.c */ void ui_but_anim_flag(uiBut *but, float cfra); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 6a02e992390..ab2bb57a25f 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1,3 +1,26 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): Blender Foundation 2009. + * + * ***** END GPL LICENSE BLOCK ***** + */ #include <limits.h> #include <math.h> @@ -44,163 +67,112 @@ #define RNA_NO_INDEX -1 #define RNA_ENUM_VALUE -2 -#define EM_UNIT_X XIC -#define EM_UNIT_Y YIC - #define EM_SEPR_X 6 #define EM_SEPR_Y 6 -/* Item */ - -typedef enum uiItemType { - ITEM_OPERATOR, - ITEM_RNA_PROPERTY, - ITEM_MENU, - ITEM_LABEL, - ITEM_VALUE, - ITEM_SEPARATOR -} uiItemType; - -enum uiItemFlag { - ITEM_ICON, - ITEM_TEXT -}; - -typedef struct uiItem { - struct uiItem *next, *prev; - uiItemType type; - int slot; - - char *name; - char namestr[UI_MAX_NAME_STR]; - int icon; - int disabled; -} uiItem; - -typedef struct uiItemRNA { - uiItem item; - - PointerRNA ptr; - PropertyRNA *prop; - int index, value; - int expand; -} uiItemRNA; +/* uiLayoutCommon */ -typedef struct uiItemOp { - uiItem item; +typedef struct uiLayoutCommon { + int type; + int opcontext; - wmOperatorType *ot; - IDProperty *properties; - int context; -} uiItemOp; + int emw, emh; -typedef struct uiItemMenu { - uiItem item; + uiMenuHandleFunc handlefunc; + void *argv; - char *menuname; - uiMenuCreateFunc func; - void *arg, *argN; -} uiItemMenu; + uiStyle *style; + uiBlock *block; +} uiLayoutCommon; -typedef struct uiItemValue { - uiItem item; +/* Item */ - int argval; -} uiItemValue; +typedef enum uiItemType { + ITEM_BUTTON, -/* Template */ + ITEM_LAYOUT_ROW, + ITEM_LAYOUT_COLUMN, + ITEM_LAYOUT_COLUMN_FLOW, + ITEM_LAYOUT_ROW_FLOW, + ITEM_LAYOUT_BOX, + ITEM_LAYOUT_FREE, + ITEM_LAYOUT_SPLIT, -typedef enum uiTemplateType { - TEMPLATE_ROW, - TEMPLATE_COLUMN, + ITEM_LAYOUT_ROOT +#if 0 TEMPLATE_COLUMN_FLOW, TEMPLATE_SPLIT, TEMPLATE_BOX, TEMPLATE_HEADER, TEMPLATE_HEADER_ID -} uiTemplateType; +#endif +} uiItemType; + +typedef struct uiItem { + void *next, *prev; + uiItemType type; +} uiItem; -typedef struct uiTemplate { - struct uiTemplate *next, *prev; - uiTemplateType type; +typedef struct uiButtonItem { + uiItem item; + uiBut *but; +} uiButtonItem; + +struct uiLayout { + uiItem item; + uiLayoutCommon *common; ListBase items; - int slot; -} uiTemplate; -typedef struct uiTemplateFlow { - uiTemplate template; + int x, y, w, h; + int space; + int align; +}; + +typedef struct uiLayoutItemFlow { + uiLayout litem; int number; -} uiTemplateFlow; + int totcol; +} uiLayoutItemFlow; -typedef struct uiTemplateSplt { - uiTemplate template; +typedef struct uiLayoutItemSplt { + uiLayout litem; int number; int lr; - uiLayout **sublayout; -} uiTemplateSplt; - -typedef struct uiTemplateBx { - uiTemplate template; - uiLayout *sublayout; -} uiTemplateBx; - -typedef struct uiTemplateHeadID { - uiTemplate template; - - PointerRNA ptr; - PropertyRNA *prop; - - int flag; - short browse; - char *newop; - char *openop; - char *unlinkop; -} uiTemplateHeadID; - -/* Layout */ - -struct uiLayout { - ListBase templates; - int opcontext; - int dir, type; - int x, y, w, h; - int emw, emh; +} uiLayoutItemSplt; - uiMenuHandleFunc handlefunc; - void *argv; +typedef struct uiLayoutItemBx { + uiLayout litem; +} uiLayoutItemBx; - uiStyle *style; -}; - -void ui_layout_free(uiLayout *layout); -void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y); +typedef struct uiLayoutItemRoot { + uiLayout litem; +} uiLayoutItemRoot; /************************** Item ***************************/ -static void ui_item_name(uiItem *item, char *name) -{ - if(!item->name && name) { - BLI_strncpy(item->namestr, name, sizeof(item->namestr)); - item->name= item->namestr; - } -} -static void ui_item_name_add_colon(uiItem *item) +static char *ui_item_name_add_colon(char *name, char namestr[UI_MAX_NAME_STR]) { - int len= strlen(item->namestr); + int len= strlen(name); - if(len != 0 && len+1 < sizeof(item->namestr)) { - item->namestr[len]= ':'; - item->namestr[len+1]= '\0'; + if(len != 0 && len+1 < UI_MAX_NAME_STR) { + BLI_strncpy(namestr, name, UI_MAX_NAME_STR); + namestr[len]= ':'; + namestr[len+1]= '\0'; + return namestr; } + + return name; } #define UI_FIT_EXPAND 1 static int ui_item_fit(int item, int pos, int all, int available, int spacing, int last, int flag) { - if(all > available-spacing) { + /* available == 0 is unlimited */ + + if(available != 0 && all > available-spacing) { /* contents is bigger than available space */ if(last) return available-pos; @@ -209,7 +181,7 @@ static int ui_item_fit(int item, int pos, int all, int available, int spacing, i } else { /* contents is smaller or equal to available space */ - if(flag & UI_FIT_EXPAND) { + if(available != 0 && (flag & UI_FIT_EXPAND)) { if(last) return available-pos; else @@ -220,54 +192,162 @@ static int ui_item_fit(int item, int pos, int all, int available, int spacing, i } } +/* variable button size in which direction? */ +#define UI_ITEM_VARY_X 1 +#define UI_ITEM_VARY_Y 2 + +static int ui_layout_vary_direction(uiLayout *layout) +{ + return (layout->common->type == UI_LAYOUT_HEADER)? UI_ITEM_VARY_X: UI_ITEM_VARY_Y; +} + +/* estimated size of text + icon */ +static int ui_text_icon_width(uiLayout *layout, char *name, int icon) +{ + int variable = ui_layout_vary_direction(layout) == UI_ITEM_VARY_X; + + if(icon && strcmp(name, "") == 0) + return UI_UNIT_X; /* icon only */ + else if(icon) + return (variable)? UI_GetStringWidth(name) + UI_UNIT_X: 10*UI_UNIT_X; /* icon + text */ + else + return (variable)? UI_GetStringWidth(name) + UI_UNIT_X: 10*UI_UNIT_X; /* text only */ +} + +static void ui_item_size(uiItem *item, int *r_w, int *r_h) +{ + if(item->type == ITEM_BUTTON) { + uiButtonItem *bitem= (uiButtonItem*)item; + + if(r_w) *r_w= bitem->but->x2 - bitem->but->x1; + if(r_h) *r_h= bitem->but->y2 - bitem->but->y1; + } + else { + uiLayout *litem= (uiLayout*)item; + + if(r_w) *r_w= litem->w; + if(r_h) *r_h= litem->h; + } +} + +static void ui_item_offset(uiItem *item, int *r_x, int *r_y) +{ + if(item->type == ITEM_BUTTON) { + uiButtonItem *bitem= (uiButtonItem*)item; + + if(r_x) *r_x= bitem->but->x1; + if(r_y) *r_y= bitem->but->y1; + } + else { + if(r_x) *r_x= 0; + if(r_y) *r_y= 0; + } +} + +static void ui_item_position(uiItem *item, int x, int y, int w, int h) +{ + if(item->type == ITEM_BUTTON) { + uiButtonItem *bitem= (uiButtonItem*)item; + + bitem->but->x1= x; + bitem->but->y1= y; + bitem->but->x2= x+w; + bitem->but->y2= y+h; + } + else { + uiLayout *litem= (uiLayout*)item; + + litem->x= x; + litem->y= y+h; + litem->w= w; + litem->h= h; + } +} + +/******************** Special RNA Items *********************/ + +static int ui_layout_local_dir(uiLayout *layout) +{ + switch(layout->item.type) { + case ITEM_LAYOUT_ROW: + case ITEM_LAYOUT_ROOT: + return UI_LAYOUT_HORIZONTAL; + case ITEM_LAYOUT_COLUMN: + case ITEM_LAYOUT_COLUMN_FLOW: + case ITEM_LAYOUT_SPLIT: + case ITEM_LAYOUT_FREE: + case ITEM_LAYOUT_BOX: + default: + return UI_LAYOUT_VERTICAL; + } +} + +static uiLayout *ui_item_local_sublayout(uiLayout *test, uiLayout *layout, int align) +{ + uiLayout *sub; + + if(ui_layout_local_dir(test) == UI_LAYOUT_HORIZONTAL) + sub= uiLayoutRow(layout, align); + else + sub= uiLayoutColumn(layout, align); + + sub->space= 0; + return sub; +} + /* create buttons for an item with an RNA array */ -static void ui_item_array(uiLayout *layout, uiBlock *block, uiItemRNA *rnaitem, int len, int x, int y, int w, int h) +static void ui_item_array(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int len, int x, int y, int w, int h, int expand) { - uiStyle *style= layout->style; + uiStyle *style= layout->common->style; PropertyType type; PropertySubType subtype; + uiLayout *sub; int a; /* retrieve type and subtype */ - type= RNA_property_type(rnaitem->prop); - subtype= RNA_property_subtype(rnaitem->prop); + type= RNA_property_type(prop); + subtype= RNA_property_subtype(prop); + + sub= ui_item_local_sublayout(layout, layout, 0); + uiBlockSetCurLayout(block, sub); /* create label */ - if(strcmp(rnaitem->item.name, "") != 0) - uiDefBut(block, LABEL, 0, rnaitem->item.name, x, y + h - EM_UNIT_Y, w, EM_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + if(strcmp(name, "") != 0) + uiDefBut(block, LABEL, 0, name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); /* create buttons */ - uiBlockBeginAlign(block); - if(type == PROP_BOOLEAN && len == 20) { /* special check for layer layout */ - int butw, buth; + int butw, buth, unit; - butw= ui_item_fit(EM_UNIT_X, 0, EM_UNIT_X*10 + style->buttonspacex, w, 0, 0, UI_FIT_EXPAND); - buth= MIN2(EM_UNIT_Y, butw); + uiBlockSetCurLayout(block, uiLayoutFree(layout, 0)); - y += 2*(EM_UNIT_Y - buth); + unit= UI_UNIT_X*0.75; + butw= unit; + buth= unit; uiBlockBeginAlign(block); for(a=0; a<5; a++) - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth); + uiDefAutoButR(block, ptr, prop, a, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth); for(a=0; a<5; a++) - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a+10, "", ICON_BLANK1, x + butw*a, y, butw, buth); + uiDefAutoButR(block, ptr, prop, a+10, "", ICON_BLANK1, x + butw*a, y, butw, buth); uiBlockEndAlign(block); x += 5*butw + style->buttonspacex; uiBlockBeginAlign(block); for(a=0; a<5; a++) - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a+5, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth); + uiDefAutoButR(block, ptr, prop, a+5, "", ICON_BLANK1, x + butw*a, y+buth, butw, buth); for(a=0; a<5; a++) - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a+15, "", ICON_BLANK1, x + butw*a, y, butw, buth); + uiDefAutoButR(block, ptr, prop, a+15, "", ICON_BLANK1, x + butw*a, y, butw, buth); uiBlockEndAlign(block); } else if(subtype == PROP_MATRIX) { /* matrix layout */ int row, col; + uiBlockSetCurLayout(block, uiLayoutFree(layout, 1)); + len= ceil(sqrt(len)); h /= len; @@ -278,315 +358,156 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, uiItemRNA *rnaitem, col= a%len; row= a/len; - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a, "", 0, x + w*col, y+(row-a-1)*EM_UNIT_Y, w, EM_UNIT_Y); + uiDefAutoButR(block, ptr, prop, a, "", 0, x + w*col, y+(row-a-1)*UI_UNIT_Y, w, UI_UNIT_Y); } } else if(len <= 4 && ELEM3(subtype, PROP_ROTATION, PROP_VECTOR, PROP_COLOR)) { - /* layout for known array subtypes */ - static char vectoritem[4]= {'X', 'Y', 'Z', 'W'}; - static char quatitem[4]= {'W', 'X', 'Y', 'Z'}; - static char coloritem[4]= {'R', 'G', 'B', 'A'}; - char str[3]; - - for(a=0; a<len; a++) { - if(len == 4 && subtype == PROP_ROTATION) - str[0]= quatitem[a]; - else if(subtype == PROP_VECTOR || subtype == PROP_ROTATION) - str[0]= vectoritem[a]; - else - str[0]= coloritem[a]; + uiBlockSetCurLayout(block, ui_item_local_sublayout(layout, sub, 1)); + + if(subtype == PROP_COLOR) + uiDefAutoButR(block, ptr, prop, -1, "", 0, 0, 0, w, UI_UNIT_Y); + + if(subtype != PROP_COLOR || expand) { + /* layout for known array subtypes */ + static char vectoritem[4]= {'X', 'Y', 'Z', 'W'}; + static char quatitem[4]= {'W', 'X', 'Y', 'Z'}; + static char coloritem[4]= {'R', 'G', 'B', 'A'}; + char str[3]; + + for(a=0; a<len; a++) { + if(len == 4 && subtype == PROP_ROTATION) + str[0]= quatitem[a]; + else if(subtype == PROP_VECTOR || subtype == PROP_ROTATION) + str[0]= vectoritem[a]; + else + str[0]= coloritem[a]; + + if(type == PROP_BOOLEAN) { + str[1]= '\0'; + } + else { + str[1]= ':'; + str[2]= '\0'; + } - if(type == PROP_BOOLEAN) { - str[1]= '\0'; - } - else { - str[1]= ':'; - str[2]= '\0'; + uiDefAutoButR(block, ptr, prop, a, str, 0, 0, 0, w, UI_UNIT_Y); } - - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a, str, 0, x, y+(len-a-1)*EM_UNIT_Y, w, EM_UNIT_Y); } + else if(subtype == PROP_COLOR && len == 4) + uiDefAutoButR(block, ptr, prop, 3, "A:", 0, 0, 0, w, UI_UNIT_Y); } else { /* default array layout */ + uiBlockSetCurLayout(block, ui_item_local_sublayout(layout, sub, 1)); + for(a=0; a<len; a++) - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a, "", 0, x, y+(len-a-1)*EM_UNIT_Y, w, EM_UNIT_Y); + uiDefAutoButR(block, ptr, prop, a, "", 0, 0, 0, w, UI_UNIT_Y); } - uiBlockEndAlign(block); + uiBlockSetCurLayout(block, layout); } -static void ui_item_enum_row(uiBlock *block, uiItemRNA *rnaitem, int x, int y, int w, int h) +static void ui_item_enum_row(uiLayout *layout, uiBlock *block, PointerRNA *ptr, PropertyRNA *prop, int x, int y, int w, int h) { const EnumPropertyItem *item; - int a, totitem, pos, itemw; + int a, totitem, itemw; const char *propname; - - propname= RNA_property_identifier(rnaitem->prop); - RNA_property_enum_items(&rnaitem->ptr, rnaitem->prop, &item, &totitem); - uiBlockBeginAlign(block); - pos= 0; + propname= RNA_property_identifier(prop); + RNA_property_enum_items(ptr, prop, &item, &totitem); + + uiBlockSetCurLayout(block, ui_item_local_sublayout(layout, layout, 1)); for(a=0; a<totitem; a++) { - itemw= ui_item_fit(1, pos, totitem, w, 0, a == totitem-1, UI_FIT_EXPAND); - uiDefButR(block, ROW, 0, NULL, x+pos, y, itemw, h, &rnaitem->ptr, propname, -1, 0, item[a].value, -1, -1, NULL); - pos += itemw; + itemw= ui_text_icon_width(block->curlayout, (char*)item[a].name, 0); + uiDefButR(block, ROW, 0, NULL, 0, 0, itemw, h, ptr, propname, -1, 0, item[a].value, -1, -1, NULL); } - uiBlockEndAlign(block); + uiBlockSetCurLayout(block, layout); } /* create label + button for RNA property */ -static void ui_item_with_label(uiBlock *block, uiItemRNA *rnaitem, int x, int y, int w, int h) +static void ui_item_with_label(uiLayout *layout, uiBlock *block, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int x, int y, int w, int h) { - if(strcmp(rnaitem->item.name, "") != 0) { - w= w/2; - uiDefBut(block, LABEL, 0, rnaitem->item.name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); - x += w; - } + uiLayout *sub; + PropertySubType subtype; - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, rnaitem->index, "", rnaitem->item.icon, x, y, w, h); -} - -/* create buttons for an arbitrary item */ -static void ui_item_buts(uiLayout *layout, uiBlock *block, uiItem *item, int x, int y, int w, int h) -{ - if(item->type == ITEM_RNA_PROPERTY) { - /* RNA property */ - uiItemRNA *rnaitem= (uiItemRNA*)item; - PropertyType type; - int len; - - /* retrieve info */ - type= RNA_property_type(rnaitem->prop); - len= RNA_property_array_length(rnaitem->prop); - - /* array property */ - if(rnaitem->index == RNA_NO_INDEX && len > 0) - ui_item_array(layout, block, rnaitem, len, x, y, w, h); - /* enum item */ - else if(type == PROP_ENUM && rnaitem->index == RNA_ENUM_VALUE) { - char *identifier= (char*)RNA_property_identifier(rnaitem->prop); - - if(item->icon && strcmp(item->name, "") != 0) - uiDefIconTextButR(block, ROW, 0, item->icon, item->name, x, y, w, h, &rnaitem->ptr, identifier, -1, 0, rnaitem->value, -1, -1, NULL); - else if(item->icon) - uiDefIconButR(block, ROW, 0, item->icon, x, y, w, h, &rnaitem->ptr, identifier, -1, 0, rnaitem->value, -1, -1, NULL); - else - uiDefButR(block, ROW, 0, item->name, x, y, w, h, &rnaitem->ptr, identifier, -1, 0, rnaitem->value, -1, -1, NULL); - } - /* expanded enum */ - else if(type == PROP_ENUM && rnaitem->expand) - ui_item_enum_row(block, rnaitem, x, y, w, h); - /* property with separate label */ - else if(type == PROP_ENUM || type == PROP_STRING || type == PROP_POINTER) - ui_item_with_label(block, rnaitem, x, y, w, h); - /* single button */ - else - uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, rnaitem->index, (char*)item->name, item->icon, x, y, w, h); - } - else if(item->type == ITEM_OPERATOR) { - /* operator */ - uiItemOp *opitem= (uiItemOp*)item; - uiBut *but; - - if(item->icon && strcmp(item->name, "") != 0) - but= uiDefIconTextButO(block, BUT, opitem->ot->idname, opitem->context, item->icon, (char*)item->name, x, y, w, h, NULL); - else if(item->icon) - but= uiDefIconButO(block, BUT, opitem->ot->idname, opitem->context, item->icon, x, y, w, h, NULL); - /* text only */ - else - but= uiDefButO(block, BUT, opitem->ot->idname, opitem->context, (char*)item->name, x, y, w, h, NULL); + sub= uiLayoutRow(layout, 0); + uiBlockSetCurLayout(block, sub); - if(but && opitem->properties) { - /* assign properties */ - PointerRNA *opptr= uiButGetOperatorPtrRNA(but); - opptr->data= opitem->properties; - opitem->properties= NULL; - } + if(strcmp(name, "") != 0) { + w= w/2; + uiDefBut(block, LABEL, 0, name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); } - else if(item->type == ITEM_MENU) { - /* menu */ - uiBut *but; - uiItemMenu *menuitem= (uiItemMenu*)item; - - if(layout->type == UI_LAYOUT_HEADER) { /* ugly .. */ - y -= 2; - w -= 3; - h += 4; - } - if(item->icon) - but= uiDefIconTextMenuBut(block, menuitem->func, menuitem->arg, item->icon, (char*)item->name, x, y, w, h, ""); - else - but= uiDefMenuBut(block, menuitem->func, menuitem->arg, (char*)item->name, x, y, w, h, ""); - - if(menuitem->argN) { /* ugly .. */ - but->poin= (char*)but; - but->func_argN= menuitem->argN; - } - } - else if(item->type == ITEM_LABEL) { - /* label */ - uiBut *but; - - if(item->icon && strcmp(item->name, "") != 0) - but= uiDefIconTextBut(block, LABEL, 0, item->icon, (char*)item->name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); - else if(item->icon) - but= uiDefIconBut(block, LABEL, 0, item->icon, x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); - else - but= uiDefBut(block, LABEL, 0, (char*)item->name, x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); + subtype= RNA_property_subtype(prop); - if(item->disabled) { - but->flag |= UI_BUT_DISABLED; - but->lock = 1; - but->lockstr = ""; - } - } - else if(item->type == ITEM_VALUE) { - /* label */ - uiItemValue *vitem= (uiItemValue*)item; - float *retvalue= (block->handle)? &block->handle->retvalue: NULL; - - if(item->icon && strcmp(item->name, "") != 0) - uiDefIconTextButF(block, BUTM, 0, item->icon, (char*)item->name, x, y, w, h, retvalue, 0.0, 0.0, 0, vitem->argval, ""); - else if(item->icon) - uiDefIconButF(block, BUTM, 0, item->icon, x, y, w, h, retvalue, 0.0, 0.0, 0, vitem->argval, ""); - else - uiDefButF(block, BUTM, 0, (char*)item->name, x, y, w, h, retvalue, 0.0, 0.0, 0, vitem->argval, ""); - } - else { - /* separator */ - uiDefBut(block, SEPR, 0, "", x, y, w, h, NULL, 0.0, 0.0, 0, 0, ""); + if(subtype == PROP_FILEPATH || subtype == PROP_DIRPATH) { + uiBlockSetCurLayout(block, uiLayoutRow(sub, 1)); + uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w-UI_UNIT_X, h); + uiDefIconBut(block, BUT, 0, ICON_FILESEL, x, y, UI_UNIT_X, h, NULL, 0.0f, 0.0f, 0.0f, 0.0f, "DUMMY file select button"); /* XXX */ } -} - -/* estimated size of text + icon */ -static int ui_text_icon_width(char *name, int icon, int variable) -{ - if(icon && strcmp(name, "") == 0) - return EM_UNIT_X; /* icon only */ - else if(icon) - return (variable)? UI_GetStringWidth(name) + EM_UNIT_X: 10*EM_UNIT_X; /* icon + text */ else - return (variable)? UI_GetStringWidth(name) + EM_UNIT_X: 10*EM_UNIT_X; /* text only */ -} - -/* estimated size of an item */ -#define UI_ITEM_VARY_X 1 -#define UI_ITEM_VARY_Y 2 - -static void ui_item_size(uiItem *item, int *r_w, int *r_h, int flag) -{ - int w, h; + uiDefAutoButR(block, ptr, prop, index, "", icon, x, y, w, h); - if(item->type == ITEM_RNA_PROPERTY) { - /* RNA property */ - uiItemRNA *rnaitem= (uiItemRNA*)item; - PropertyType type; - PropertySubType subtype; - int len; - - w= ui_text_icon_width(item->name, item->icon, flag & UI_ITEM_VARY_X); - h= EM_UNIT_Y; - - /* arbitrary extended width by type */ - type= RNA_property_type(rnaitem->prop); - subtype= RNA_property_subtype(rnaitem->prop); - len= RNA_property_array_length(rnaitem->prop); - - if(type == PROP_STRING) - w += 10*EM_UNIT_X; - - /* increase height for arrays */ - if(rnaitem->index == RNA_NO_INDEX && len > 0) { - if(strcmp(item->name, "") == 0 && item->icon == 0) - h= 0; - - if(type == PROP_BOOLEAN && len == 20) - h += 2*EM_UNIT_Y; - else if(subtype == PROP_MATRIX) - h += ceil(sqrt(len))*EM_UNIT_Y; - else - h += len*EM_UNIT_Y; - } - else if(flag & UI_ITEM_VARY_X) { - if(type == PROP_BOOLEAN && strcmp(item->name, "") != 0) - w += EM_UNIT_X; - } - } - else { - /* other */ - if(item->type == ITEM_SEPARATOR) { - w= EM_SEPR_X; - h= EM_SEPR_Y; - } - else { - w= ui_text_icon_width(item->name, item->icon, flag & UI_ITEM_VARY_X); - h= EM_UNIT_Y; - } - } - - if(r_w) *r_w= w; - if(r_h) *r_h= h; + uiBlockSetCurLayout(block, layout); } -static void ui_item_free(uiItem *item) -{ - if(item->type == ITEM_OPERATOR) { - uiItemOp *opitem= (uiItemOp*)item; - - if(opitem->properties) { - IDP_FreeProperty(opitem->properties); - MEM_freeN(opitem->properties); - } - } -} +/********************* Button Items *************************/ /* disabled item */ static void ui_item_disabled(uiLayout *layout, char *name) { - uiTemplate *template= layout->templates.last; - uiItem *item; - - if(!template) - return; + uiBlock *block= layout->common->block; + uiBut *but; + int w; + + uiBlockSetCurLayout(block, layout); - item= MEM_callocN(sizeof(uiItem), "uiItem"); + if(!name) + name= ""; - ui_item_name(item, name); - item->disabled= 1; - item->type= ITEM_LABEL; - item->slot= template->slot; + w= ui_text_icon_width(layout, name, 0); - BLI_addtail(&template->items, item); + but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + but->flag |= UI_BUT_DISABLED; + but->lock = 1; + but->lockstr = ""; } /* operator items */ void uiItemFullO(uiLayout *layout, char *name, int icon, char *idname, IDProperty *properties, int context) { - uiTemplate *template= layout->templates.last; + uiBlock *block= layout->common->block; wmOperatorType *ot= WM_operatortype_find(idname); - uiItemOp *opitem; + uiBut *but; + int w; - if(!template) - return; if(!ot) { ui_item_disabled(layout, idname); return; } - opitem= MEM_callocN(sizeof(uiItemOp), "uiItemOp"); + if(!name) + name= ot->name; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; - ui_item_name(&opitem->item, name); - opitem->item.icon= icon; - opitem->item.type= ITEM_OPERATOR; - opitem->item.slot= template->slot; + /* create button */ + uiBlockSetCurLayout(block, layout); - opitem->ot= ot; - opitem->properties= properties; - opitem->context= context; + w= ui_text_icon_width(layout, name, icon); + + if(icon && strcmp(name, "") != 0) + but= uiDefIconTextButO(block, BUT, ot->idname, context, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL); + else if(icon) + but= uiDefIconButO(block, BUT, ot->idname, context, icon, 0, 0, w, UI_UNIT_Y, NULL); + else + but= uiDefButO(block, BUT, ot->idname, context, (char*)name, 0, 0, w, UI_UNIT_Y, NULL); - BLI_addtail(&template->items, opitem); + /* assign properties */ + if(properties) { + PointerRNA *opptr= uiButGetOperatorPtrRNA(but); + opptr->data= properties; + } } static char *ui_menu_enumpropname(char *opname, char *propname, int retval) @@ -597,16 +518,16 @@ static char *ui_menu_enumpropname(char *opname, char *propname, int retval) if(!ot || !ot->srna) return ""; - + RNA_pointer_create(NULL, ot->srna, NULL, &ptr); prop= RNA_struct_find_property(&ptr, propname); - + if(prop) { const EnumPropertyItem *item; int totitem, i; - + RNA_property_enum_items(&ptr, prop, &item, &totitem); - + for (i=0; i<totitem; i++) { if(item[i].value==retval) return (char*)item[i].name; @@ -626,7 +547,7 @@ void uiItemEnumO(uiLayout *layout, char *name, int icon, char *opname, char *pro if(!name) name= ui_menu_enumpropname(opname, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); + uiItemFullO(layout, name, icon, opname, ptr.data, layout->common->opcontext); } void uiItemsEnumO(uiLayout *layout, char *opname, char *propname) @@ -661,7 +582,7 @@ void uiItemBooleanO(uiLayout *layout, char *name, int icon, char *opname, char * WM_operator_properties_create(&ptr, opname); RNA_boolean_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); + uiItemFullO(layout, name, icon, opname, ptr.data, layout->common->opcontext); } void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *propname, int value) @@ -671,7 +592,7 @@ void uiItemIntO(uiLayout *layout, char *name, int icon, char *opname, char *prop WM_operator_properties_create(&ptr, opname); RNA_int_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); + uiItemFullO(layout, name, icon, opname, ptr.data, layout->common->opcontext); } void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *propname, float value) @@ -681,7 +602,7 @@ void uiItemFloatO(uiLayout *layout, char *name, int icon, char *opname, char *pr WM_operator_properties_create(&ptr, opname); RNA_float_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); + uiItemFullO(layout, name, icon, opname, ptr.data, layout->common->opcontext); } void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *propname, char *value) @@ -691,39 +612,112 @@ void uiItemStringO(uiLayout *layout, char *name, int icon, char *opname, char *p WM_operator_properties_create(&ptr, opname); RNA_string_set(&ptr, propname, value); - uiItemFullO(layout, name, icon, opname, ptr.data, layout->opcontext); + uiItemFullO(layout, name, icon, opname, ptr.data, layout->common->opcontext); } void uiItemO(uiLayout *layout, char *name, int icon, char *opname) { - uiItemFullO(layout, name, icon, opname, NULL, layout->opcontext); + uiItemFullO(layout, name, icon, opname, NULL, layout->common->opcontext); } /* RNA property items */ + +static void ui_item_rna_size(uiLayout *layout, char *name, int icon, PropertyRNA *prop, int index, int *r_w, int *r_h) +{ + PropertyType type; + PropertySubType subtype; + int len, w, h; + + w= ui_text_icon_width(layout, name, icon); + h= UI_UNIT_Y; + + /* arbitrary extended width by type */ + type= RNA_property_type(prop); + subtype= RNA_property_subtype(prop); + len= RNA_property_array_length(prop); + + if(type == PROP_STRING) + w += 10*UI_UNIT_X; + + /* increase height for arrays */ + if(index == RNA_NO_INDEX && len > 0) { + if(strcmp(name, "") == 0 && icon == 0) + h= 0; + + if(type == PROP_BOOLEAN && len == 20) + h += 2*UI_UNIT_Y; + else if(subtype == PROP_MATRIX) + h += ceil(sqrt(len))*UI_UNIT_Y; + else + h += len*UI_UNIT_Y; + } + else if(ui_layout_vary_direction(layout) == UI_ITEM_VARY_X) { + if(type == PROP_BOOLEAN && strcmp(name, "") != 0) + w += UI_UNIT_X; + } + + *r_w= w; + *r_h= h; +} + void uiItemFullR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, PropertyRNA *prop, int index, int value, int expand) { - uiTemplate *template= layout->templates.last; - uiItemRNA *rnaitem; + uiBlock *block= layout->common->block; + PropertyType type; + char namestr[UI_MAX_NAME_STR]; + int len, w, h; if(!ptr->data || !prop) return; - if(!template) - return; - rnaitem= MEM_callocN(sizeof(uiItemRNA), "uiItemRNA"); + uiBlockSetCurLayout(block, layout); + + /* retrieve info */ + type= RNA_property_type(prop); + len= RNA_property_array_length(prop); - ui_item_name(&rnaitem->item, name); - rnaitem->item.icon= icon; - rnaitem->item.type= ITEM_RNA_PROPERTY; - rnaitem->item.slot= template->slot; + /* set name and icon */ + if(!name) + name= (char*)RNA_property_ui_name(prop); + + if(ELEM5(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_ENUM, PROP_POINTER)) + name= ui_item_name_add_colon(name, namestr); + if(type == PROP_BOOLEAN && len) + name= ui_item_name_add_colon(name, namestr); + + if(layout->common->type == UI_LAYOUT_MENU) { + if(type == PROP_BOOLEAN) + icon= (RNA_property_boolean_get(ptr, prop))? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; + else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) + icon= (RNA_property_enum_get(ptr, prop) == value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; + } - rnaitem->ptr= *ptr; - rnaitem->prop= prop; - rnaitem->index= index; - rnaitem->value= value; - rnaitem->expand= expand; + /* get size */ + ui_item_rna_size(layout, name, icon, prop, index, &w, &h); - BLI_addtail(&template->items, rnaitem); + /* array property */ + if(index == RNA_NO_INDEX && len > 0) + ui_item_array(layout, block, name, icon, ptr, prop, len, 0, 0, w, h, expand); + /* enum item */ + else if(type == PROP_ENUM && index == RNA_ENUM_VALUE) { + char *identifier= (char*)RNA_property_identifier(prop); + + if(icon && strcmp(name, "") != 0) + uiDefIconTextButR(block, ROW, 0, icon, name, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + else if(icon) + uiDefIconButR(block, ROW, 0, icon, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + else + uiDefButR(block, ROW, 0, name, 0, 0, w, h, ptr, identifier, -1, 0, value, -1, -1, NULL); + } + /* expanded enum */ + else if(type == PROP_ENUM && expand) + ui_item_enum_row(layout, block, ptr, prop, 0, 0, w, h); + /* property with separate label */ + else if(type == PROP_ENUM || type == PROP_STRING || type == PROP_POINTER) + ui_item_with_label(layout, block, name, icon, ptr, prop, index, 0, 0, w, h); + /* single button */ + else + uiDefAutoButR(block, ptr, prop, index, (char*)name, icon, 0, 0, w, h); } void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *propname, int expand) @@ -740,7 +734,7 @@ void uiItemR(uiLayout *layout, char *name, int icon, PointerRNA *ptr, char *prop printf("uiItemR: property not found: %s\n", propname); return; } - + uiItemFullR(layout, name, icon, ptr, prop, RNA_NO_INDEX, 0, expand); } @@ -758,7 +752,7 @@ void uiItemEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, printf("uiItemEnumR: property not found: %s\n", propname); return; } - + uiItemFullR(layout, name, icon, ptr, prop, RNA_ENUM_VALUE, value, 0); } @@ -795,106 +789,127 @@ static void ui_item_menutype_func(bContext *C, uiLayout *layout, void *arg_mt) mt->draw(C, &menu); } -void uiItemM(uiLayout *layout, char *name, int icon, char *menuname) +static void ui_item_menu(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func, void *arg, void *argN) { - uiTemplate *template= layout->templates.last; - uiItemMenu *menuitem; - - if(!template) - return; - if(!menuname) - return; + uiBlock *block= layout->common->block; + uiBut *but; + int w, h; + + uiBlockSetCurLayout(block, layout); + + if(layout->common->type == UI_LAYOUT_HEADER) + uiBlockSetEmboss(block, UI_EMBOSSP); + + if(!name) + name= ""; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; + + w= ui_text_icon_width(layout, name, icon); + h= UI_UNIT_Y; + + if(layout->common->type == UI_LAYOUT_HEADER) /* ugly .. */ + w -= 3; + + if(icon) + but= uiDefIconTextMenuBut(block, func, arg, icon, (char*)name, 0, 0, w, h, ""); + else + but= uiDefMenuBut(block, func, arg, (char*)name, 0, 0, w, h, ""); - menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu"); + if(argN) { /* ugly .. */ + but->poin= (char*)but; + but->func_argN= argN; + } - ui_item_name(&menuitem->item, name); - menuitem->item.icon= icon; - menuitem->item.type= ITEM_MENU; - menuitem->item.slot= template->slot; + if(layout->common->type == UI_LAYOUT_HEADER) + uiBlockSetEmboss(block, UI_EMBOSS); +} - menuitem->func= ui_item_menutype_func; - menuitem->menuname= menuname; +void uiItemM(uiLayout *layout, bContext *C, char *name, int icon, char *menuname) +{ + ARegion *ar= CTX_wm_region(C); + MenuType *mt; + + if(!menuname) + return; - BLI_addtail(&template->items, menuitem); + for(mt=ar->type->menutypes.first; mt; mt=mt->next) { + if(strcmp(menuname, mt->idname) == 0) { + if(!name) + name= mt->label; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; + ui_item_menu(layout, name, icon, ui_item_menutype_func, mt, NULL); + break; + } + } } /* label item */ void uiItemL(uiLayout *layout, char *name, int icon) { - uiTemplate *template= layout->templates.last; - uiItem *item; - - if(!template) - return; + uiBlock *block= layout->common->block; + uiBut *but; + int w; - item= MEM_callocN(sizeof(uiItem), "uiItem"); + uiBlockSetCurLayout(block, layout); + + if(!name) + name= ""; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; - ui_item_name(item, name); - item->icon= icon; - item->type= ITEM_LABEL; - item->slot= template->slot; + w= ui_text_icon_width(layout, name, icon); - BLI_addtail(&template->items, item); + if(icon && strcmp(name, "") != 0) + but= uiDefIconTextBut(block, LABEL, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + else if(icon) + but= uiDefIconBut(block, LABEL, 0, icon, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); + else + but= uiDefBut(block, LABEL, 0, (char*)name, 0, 0, w, UI_UNIT_Y, NULL, 0.0, 0.0, 0, 0, ""); } /* value item */ void uiItemV(uiLayout *layout, char *name, int icon, int argval) { - uiTemplate *template= layout->templates.last; - uiItemValue *vitem; - - if(!template) - return; + /* label */ + uiBlock *block= layout->common->block; + float *retvalue= (block->handle)? &block->handle->retvalue: NULL; + int w; - vitem= MEM_callocN(sizeof(uiItemValue), "uiItemValue"); + uiBlockSetCurLayout(block, layout); - vitem->item.name= name; - vitem->item.icon= icon; - vitem->item.type= ITEM_VALUE; - vitem->item.slot= template->slot; - vitem->argval= argval; + if(!name) + name= ""; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; - BLI_addtail(&template->items, vitem); + w= ui_text_icon_width(layout, name, icon); + + if(icon && strcmp(name, "") != 0) + uiDefIconTextButF(block, BUTM, 0, icon, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); + else if(icon) + uiDefIconButF(block, BUTM, 0, icon, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); + else + uiDefButF(block, BUTM, 0, (char*)name, 0, 0, w, UI_UNIT_Y, retvalue, 0.0, 0.0, 0, argval, ""); } /* separator item */ void uiItemS(uiLayout *layout) { - uiTemplate *template= layout->templates.last; - uiItem *item; - - if(!template) - return; - - item= MEM_callocN(sizeof(uiItem), "uiItem"); + uiBlock *block= layout->common->block; - item->type= ITEM_SEPARATOR; - item->slot= template->slot; - - BLI_addtail(&template->items, item); + uiBlockSetCurLayout(block, layout); + uiDefBut(block, SEPR, 0, "", 0, 0, EM_SEPR_X, EM_SEPR_Y, NULL, 0.0, 0.0, 0, 0, ""); } /* level items */ void uiItemMenuF(uiLayout *layout, char *name, int icon, uiMenuCreateFunc func) { - uiTemplate *template= layout->templates.last; - uiItemMenu *menuitem; - - if(!template) - return; if(!func) return; - menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu"); - - ui_item_name(&menuitem->item, name); - menuitem->item.icon= icon; - menuitem->item.type= ITEM_MENU; - menuitem->item.slot= template->slot; - - menuitem->func= func; - - BLI_addtail(&template->items, menuitem); + ui_item_menu(layout, name, icon, func, NULL, NULL); } typedef struct MenuItemLevel { @@ -915,36 +930,24 @@ static void menu_item_enum_opname_menu(bContext *C, uiLayout *layout, void *arg) void uiItemMenuEnumO(uiLayout *layout, char *name, int icon, char *opname, char *propname) { wmOperatorType *ot= WM_operatortype_find(opname); - uiTemplate *template= layout->templates.last; - uiItemMenu *menuitem; MenuItemLevel *lvl; if(!ot || !ot->srna) { ui_item_disabled(layout, opname); return; } - if(!template) - return; - - menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu"); if(!name) name= ot->name; - - ui_item_name(&menuitem->item, name); - menuitem->item.icon= icon; - menuitem->item.type= ITEM_MENU; - menuitem->item.slot= template->slot; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel"); lvl->opname= opname; lvl->propname= propname; - lvl->opcontext= layout->opcontext; + lvl->opcontext= layout->common->opcontext; - menuitem->func= menu_item_enum_opname_menu; - menuitem->argN= lvl; - - BLI_addtail(&template->items, menuitem); + ui_item_menu(layout, name, icon, menu_item_enum_opname_menu, NULL, lvl); } static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg) @@ -957,13 +960,8 @@ static void menu_item_enum_rna_menu(bContext *C, uiLayout *layout, void *arg) void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA *ptr, char *propname) { - uiTemplate *template= layout->templates.last; - uiItemMenu *menuitem; MenuItemLevel *lvl; PropertyRNA *prop; - - if(!template) - return; prop= RNA_struct_find_property(ptr, propname); if(!prop) { @@ -971,118 +969,210 @@ void uiItemMenuEnumR(uiLayout *layout, char *name, int icon, struct PointerRNA * return; } - menuitem= MEM_callocN(sizeof(uiItemMenu), "uiItemMenu"); - if(!name) name= (char*)RNA_property_ui_name(prop); - - ui_item_name(&menuitem->item, name); - menuitem->item.icon= icon; - menuitem->item.type= ITEM_MENU; - menuitem->item.slot= template->slot; + if(layout->common->type == UI_LAYOUT_MENU && !icon) + icon= ICON_BLANK1; lvl= MEM_callocN(sizeof(MenuItemLevel), "MenuItemLevel"); lvl->rnapoin= *ptr; lvl->propname= propname; - lvl->opcontext= layout->opcontext; - - menuitem->func= menu_item_enum_rna_menu; - menuitem->argN= lvl; + lvl->opcontext= layout->common->opcontext; - BLI_addtail(&template->items, menuitem); + ui_item_menu(layout, name, icon, menu_item_enum_rna_menu, NULL, lvl); } -/**************************** Template ***************************/ +/**************************** Layout Items ***************************/ -/* single row layout */ -static void ui_layout_row(uiLayout *layout, uiBlock *block, uiTemplate *template) +/* single-row layout */ +static void ui_litem_estimate_row(uiLayout *litem) { - uiStyle *style= layout->style; uiItem *item; - int tot=0, totw= 0, maxh= 0, itemw, itemh, x, w; + int itemw, itemh; + + litem->w= 0; + litem->h= 0; + + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); + + litem->w += itemw; + litem->h= MAX2(itemh, litem->h); + + if(item->next) + litem->w += litem->space; + } +} + +static void ui_litem_layout_row(uiLayout *litem) +{ + uiItem *item; + int neww, itemw, itemh, x, y, w, tot= 0, totw= 0, extra=0, available=0; + + x= litem->x; + y= litem->y; + w= litem->w; - /* estimate total width of buttons */ - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y); + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); totw += itemw; - maxh= MAX2(maxh, itemh); tot++; } if(totw == 0) return; - /* create buttons starting from left */ - x= 0; - w= layout->w; + /* two step to enforce minimum button with .. could be better */ + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); + + itemw= ui_item_fit(itemw, x-litem->x, totw, w, (tot-1)*litem->space, !item->next, UI_FIT_EXPAND); + x += itemw; + + if(itemw < UI_UNIT_X) + extra += UI_UNIT_X - itemw; + else + available += itemw - UI_UNIT_X; + + if(item->next) + x += litem->space; + } + + x= litem->x; - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y); - itemw= ui_item_fit(itemw, x, totw, w, (tot-1)*style->buttonspacex, !item->next, UI_FIT_EXPAND); + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); - ui_item_buts(layout, block, item, layout->x+x, layout->y-itemh, itemw, itemh); - x += itemw+style->buttonspacex; + neww= ui_item_fit(itemw, x-litem->x, totw, w, (tot-1)*litem->space, !item->next, UI_FIT_EXPAND); + if(neww < UI_UNIT_X) { + if(item->next) + itemw= UI_UNIT_X; + else + itemw= litem->w - (x-litem->x); + } + else + itemw= ui_item_fit(itemw, x-litem->x, totw, w-extra, (tot-1)*litem->space, !item->next, UI_FIT_EXPAND); + + ui_item_position(item, x, y-itemh, itemw, itemh); + x += itemw; + + if(item->next) + x += litem->space; } - layout->y -= maxh; + litem->w= x - litem->x; + litem->h= litem->y - y; + litem->x= x; + litem->y= y; } -/* multi-column layout */ -static void ui_layout_column(uiLayout *layout, uiBlock *block, uiTemplate *template) +/* single-column layout */ +static void ui_litem_estimate_column(uiLayout *litem) { - uiStyle *style= layout->style; uiItem *item; - int col, totcol= 0, x, y, miny, itemw, itemh, w; + int itemw, itemh; - /* compute number of columns */ - for(item=template->items.first; item; item=item->next) - totcol= MAX2(item->slot+1, totcol); - - if(totcol == 0) - return; - - x= 0; - miny= 0; - w= layout->w; + litem->w= 0; + litem->h= 0; - /* create column per column */ - for(col=0; col<totcol; col++) { - y= 0; + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); - itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*style->columnspace, col == totcol-1, UI_FIT_EXPAND); + litem->w= MAX2(litem->w, itemw); + litem->h += itemh; - for(item=template->items.first; item; item=item->next) { - if(item->slot != col) - continue; + if(item->next) + litem->h += litem->space; + } +} - ui_item_size(item, NULL, &itemh, UI_ITEM_VARY_Y); +static void ui_litem_layout_column(uiLayout *litem) +{ + uiItem *item; + int itemh, x, y; - y -= itemh; - ui_item_buts(layout, block, item, layout->x+x, layout->y+y, itemw, itemh); - y -= style->buttonspacey; - } + x= litem->x; + y= litem->y; - x += itemw + style->columnspace; - miny= MIN2(miny, y); + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, NULL, &itemh); + + y -= itemh; + ui_item_position(item, x, y, litem->w, itemh); + + if(item->next) + y -= litem->space; } - layout->y += miny; + litem->h= litem->y - y; + litem->x= x; + litem->y= y; +} + +/* root layout */ +static void ui_litem_estimate_root(uiLayout *litem) +{ + /* nothing to do */ +} + +static void ui_litem_layout_root(uiLayout *litem) +{ + if(litem->common->type == UI_LAYOUT_HEADER) + ui_litem_layout_row(litem); + else + ui_litem_layout_column(litem); +} + +/* box layout */ +static void ui_litem_estimate_box(uiLayout *litem) +{ + uiStyle *style= litem->common->style; + + ui_litem_estimate_column(litem); + litem->w += 2*style->boxspace; + litem->h += 2*style->boxspace; +} + +static void ui_litem_layout_box(uiLayout *litem) +{ + uiStyle *style= litem->common->style; + int w, h; + + w= litem->w; + h= litem->h; + + litem->x += style->boxspace; + litem->y -= style->boxspace; + + if(w != 0) litem->w -= 2*style->boxspace; + if(h != 0) litem->h -= 2*style->boxspace; + + ui_litem_layout_column(litem); + + litem->x -= style->boxspace; + litem->y -= style->boxspace; + + if(w != 0) litem->w += 2*style->boxspace; + if(h != 0) litem->h += 2*style->boxspace; + + /* roundbox around the sublayout */ + uiDefBut(litem->common->block, ROUNDBOX, 0, "", litem->x, litem->y, litem->w, litem->h, NULL, 7.0, 0.0, 3, 20, ""); } /* multi-column layout, automatically flowing to the next */ -static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate *template) +static void ui_litem_estimate_column_flow(uiLayout *litem) { - uiStyle *style= layout->style; - uiTemplateFlow *flow= (uiTemplateFlow*)template; + uiStyle *style= litem->common->style; + uiLayoutItemFlow *flow= (uiLayoutItemFlow*)litem; uiItem *item; - int col, x, y, w, emh, emy, miny, itemw, itemh, maxw=0; - int toth, totcol, totitem; + int col, x, y, emh, emy, miny, itemw, itemh, maxw=0; + int toth, totitem; /* compute max needed width and total height */ toth= 0; totitem= 0; - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y); + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); maxw= MAX2(maxw, itemw); toth += itemh; totitem++; @@ -1090,14 +1180,16 @@ static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate * if(flow->number <= 0) { /* auto compute number of columns, not very good */ - if(maxw == 0) + if(maxw == 0) { + flow->totcol= 1; return; + } - totcol= MAX2(layout->emw/maxw, 1); - totcol= MIN2(totcol, totitem); + flow->totcol= MAX2(litem->common->emw/maxw, 1); + flow->totcol= MIN2(flow->totcol, totitem); } else - totcol= flow->number; + flow->totcol= flow->number; /* compute sizes */ x= 0; @@ -1105,742 +1197,512 @@ static void ui_layout_column_flow(uiLayout *layout, uiBlock *block, uiTemplate * emy= 0; miny= 0; - w= layout->w; - emh= toth/totcol; + maxw= 0; + emh= toth/flow->totcol; /* create column per column */ col= 0; - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, NULL, &itemh, UI_ITEM_VARY_Y); - itemw= ui_item_fit(1, x, totcol, w, (totcol-1)*style->columnspace, col == totcol-1, UI_FIT_EXPAND); - - y -= itemh; - emy -= itemh; - ui_item_buts(layout, block, item, layout->x+x, layout->y+y, itemw, itemh); - y -= style->buttonspacey; + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); + + y -= itemh + style->buttonspacey; miny= MIN2(miny, y); + emy -= itemh; + maxw= MAX2(itemw, maxw); /* decide to go to next one */ - if(col < totcol-1 && emy <= -emh) { - x += itemw + style->columnspace; + if(col < flow->totcol-1 && emy <= -emh) { + x += maxw + litem->space; + maxw= 0; y= 0; col++; } } - layout->y += miny; + litem->h= litem->y - miny; } -#if 0 -/* left-right layout, with buttons aligned on both sides */ -static void ui_layout_split(uiLayout *layout, uiBlock *block, uiTemplate *template) +static void ui_litem_layout_column_flow(uiLayout *litem) { + uiStyle *style= litem->common->style; + uiLayoutItemFlow *flow= (uiLayoutItemFlow*)litem; uiItem *item; - int tot=0, totw= 0, maxh= 0, itemw, itemh, lx, rx, w; + int col, x, y, w, emh, emy, miny, itemw, itemh; + int toth, totitem; - /* estimate total width of buttons */ - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y); - totw += itemw; - maxh= MAX2(maxh, itemh); - tot++; + /* compute max needed width and total height */ + toth= 0; + totitem= 0; + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, &itemw, &itemh); + toth += itemh; + totitem++; } - if(totw == 0) - return; + /* compute sizes */ + x= litem->x; + y= litem->y; + emy= 0; + miny= 0; + + w= litem->w; + emh= toth/flow->totcol; + + /* create column per column */ + col= 0; + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, NULL, &itemh); + itemw= ui_item_fit(1, x-litem->x, flow->totcol, w, (flow->totcol-1)*style->columnspace, col == flow->totcol-1, UI_FIT_EXPAND); - /* create buttons starting from left and right */ - lx= 0; - rx= 0; - w= layout->w - style->buttonspacex*(tot-1) + style->buttonspacex; - - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_Y); - - if(item->slot == UI_TSLOT_LR_LEFT) { - itemw= ui_item_fit(itemw, lx, totw, w, 0, 0); - ui_item_buts(layout, block, item, layout->x+lx, layout->y-itemh, itemw, itemh); - lx += itemw + style->buttonspacex; - } - else { - itemw= ui_item_fit(itemw, totw + rx, totw, w, 0, 0); - rx -= itemw + style->buttonspacex; - ui_item_buts(layout, block, item, layout->x+layout->w+rx, layout->y-itemh, itemw, itemh); + y -= itemh; + emy -= itemh; + ui_item_position(item, x, y, itemw, itemh); + y -= style->buttonspacey; + miny= MIN2(miny, y); + + /* decide to go to next one */ + if(col < flow->totcol-1 && emy <= -emh) { + x += itemw + style->columnspace; + y= litem->y; + col++; } } - layout->y -= maxh; + litem->h= litem->y - miny; + litem->x= x; + litem->y= miny; } -#endif -/* split in columns */ -static void ui_layout_split(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template) +/* free layout */ +static void ui_litem_estimate_free(uiLayout *litem) { - uiStyle *style= layout->style; - uiTemplateSplt *split= (uiTemplateSplt*)template; - uiLayout *sublayout; - int a, x, y, miny, w= layout->w, h= layout->h, splitw; - - x= 0; - y= 0; - miny= layout->y; - - for(a=0; a<split->number; a++) { - sublayout= split->sublayout[a]; + uiItem *item; + int itemx, itemy, itemw, itemh, minx, miny; - splitw= ui_item_fit(1, x, split->number, w, (split->number-1)*style->columnspace, a == split->number-1, UI_FIT_EXPAND); - sublayout->x= layout->x + x; - sublayout->w= splitw; - sublayout->y= layout->y; - sublayout->h= h; + minx= 1e6; + miny= 1e6; + litem->w= 0; + litem->h= 0; - sublayout->emw= layout->emw/split->number; - sublayout->emh= layout->emh; + for(item=litem->items.first; item; item=item->next) { + ui_item_offset(item, &itemx, &itemy); + ui_item_size(item, &itemw, &itemh); - /* do layout for elements in sublayout */ - ui_layout_end(C, block, sublayout, NULL, &y); - miny= MIN2(y, miny); + minx= MIN2(minx, itemx); + miny= MIN2(miny, itemy); - x += splitw + style->columnspace; + litem->w= MAX2(litem->w, itemx+itemw); + litem->h= MAX2(litem->h, itemy+itemh); } - layout->y= miny; + litem->w -= minx; + litem->h -= miny; } -/* element in a box layout */ -static void ui_layout_box(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template) +static void ui_litem_layout_free(uiLayout *litem) { - uiStyle *style= layout->style; - uiTemplateBx *box= (uiTemplateBx*)template; - int starty, startx, w= layout->w, h= layout->h; + uiItem *item; + float scalex=1.0f, scaley=1.0f; + int x, y, newx, newy, itemx, itemy, itemh, itemw, minx, miny, totw, toth; - startx= layout->x; - starty= layout->y; + minx= 1e6; + miny= 1e6; + totw= 0; + toth= 0; - /* some extra padding */ - box->sublayout->x= layout->x + style->boxspace; - box->sublayout->w= w - 2*style->boxspace; - box->sublayout->y= layout->y - style->boxspace; - box->sublayout->h= h; + for(item=litem->items.first; item; item=item->next) { + ui_item_offset(item, &itemx, &itemy); + ui_item_size(item, &itemw, &itemh); - box->sublayout->emw= layout->emw; - box->sublayout->emh= layout->emh; + minx= MIN2(minx, itemx); + miny= MIN2(miny, itemy); - /* do layout for elements in sublayout */ - ui_layout_end(C, block, box->sublayout, NULL, &layout->y); + totw= MAX2(totw, itemx+itemw); + toth= MAX2(toth, itemy+itemh); + } - /* roundbox around the sublayout */ - uiDefBut(block, ROUNDBOX, 0, "", startx, layout->y, w, starty - layout->y, NULL, 7.0, 0.0, 3, 20, ""); -} + totw -= minx; + toth -= miny; -static void ui_layout_header_buttons(uiLayout *layout, uiBlock *block, uiTemplate *template) -{ - uiItem *item; - int itemw, itemh; + if(litem->w && totw > litem->w) + scalex= (float)litem->w/(float)totw; + if(litem->h && toth > litem->h) + scaley= (float)litem->h/(float)toth; - uiBlockBeginAlign(block); + x= litem->x; + y= litem->y - scalex*toth; - for(item=template->items.first; item; item=item->next) { - ui_item_size(item, &itemw, &itemh, UI_ITEM_VARY_X); - ui_item_buts(layout, block, item, layout->x, layout->y, itemw, itemh); - layout->x += itemw; - } + for(item=litem->items.first; item; item=item->next) { + ui_item_offset(item, &itemx, &itemy); + ui_item_size(item, &itemw, &itemh); - uiBlockEndAlign(block); -} - -static void ui_layout_header(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template) -{ - ScrArea *sa= CTX_wm_area(C); + if(scalex != 1.0f) { + newx= itemx*scalex; + itemw= (itemx + itemw)*scalex - newx; + itemx= newx; + } - layout->x= ED_area_header_standardbuttons(C, block, layout->y); + if(scaley != 1.0f) { + newy= itemy*scaley; + itemh= (itemy + itemh)*scaley - newy; + itemy= newy; + } - if((sa->flag & HEADER_NO_PULLDOWN)==0) { - uiBlockSetEmboss(block, UI_EMBOSSP); - ui_layout_header_buttons(layout, block, template); + ui_item_position(item, x+itemx-minx, y+itemy-miny, itemw, itemh); } - uiBlockSetEmboss(block, UI_EMBOSS); + litem->w= scalex*totw; + litem->h= litem->y - y; + litem->x= x + litem->w; + litem->y= y; } -static void header_id_cb(bContext *C, void *arg_template, void *arg_event) +/* split layout */ +static void ui_litem_estimate_split(uiLayout *litem) { - uiTemplateHeadID *idtemplate= (uiTemplateHeadID*)arg_template; - PointerRNA idptr= RNA_property_pointer_get(&idtemplate->ptr, idtemplate->prop); - ID *idtest, *id= idptr.data; - ListBase *lb= wich_libbase(CTX_data_main(C), ID_TXT); // XXX - int nr, event= GET_INT_FROM_POINTER(arg_event); - - if(event == UI_ID_BROWSE && idtemplate->browse == 32767) - event= UI_ID_ADD_NEW; - else if(event == UI_ID_BROWSE && idtemplate->browse == 32766) - event= UI_ID_OPEN; - - switch(event) { - case UI_ID_BROWSE: { - if(id==0) id= lb->first; - if(id==0) return; - - if(idtemplate->browse== -2) { - /* XXX implement or find a replacement - * activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_MESHBROWSE, &idtemplate->browse, do_global_buttons); */ - return; - } - if(idtemplate->browse < 0) - return; - - for(idtest=lb->first, nr=1; idtest; idtest=idtest->next, nr++) { - if(nr==idtemplate->browse) { - if(id == idtest) - return; - - id= idtest; - RNA_id_pointer_create(id, &idptr); - RNA_property_pointer_set(&idtemplate->ptr, idtemplate->prop, idptr); - RNA_property_update(C, &idtemplate->ptr, idtemplate->prop); - /* XXX */ - - break; - } - } - break; - } -#if 0 - case UI_ID_DELETE: - id= NULL; - break; - case UI_ID_FAKE_USER: - if(id) { - if(id->flag & LIB_FAKEUSER) id->us++; - else id->us--; - } - else return; - break; -#endif - case UI_ID_PIN: - break; - case UI_ID_ADD_NEW: - WM_operator_name_call(C, idtemplate->newop, WM_OP_INVOKE_REGION_WIN, NULL); - break; - case UI_ID_OPEN: - WM_operator_name_call(C, idtemplate->openop, WM_OP_INVOKE_REGION_WIN, NULL); - break; -#if 0 - case UI_ID_ALONE: - if(!id || id->us < 1) - return; - break; - case UI_ID_LOCAL: - if(!id || id->us < 1) - return; - break; - case UI_ID_AUTO_NAME: - break; -#endif - } + ui_litem_estimate_row(litem); } -static void ui_layout_header_id(const bContext *C, uiLayout *layout, uiBlock *block, uiTemplate *template) +static void ui_litem_layout_split(uiLayout *litem) { - uiTemplateHeadID *duptemplate, *idtemplate= (uiTemplateHeadID*)template; - uiBut *but; - PointerRNA idptr= RNA_property_pointer_get(&idtemplate->ptr, idtemplate->prop); - ListBase *lb= wich_libbase(CTX_data_main(C), ID_TXT); // XXX - - if(idtemplate->flag & UI_ID_BROWSE) { - char *extrastr, *str; - - if((idtemplate->flag & UI_ID_ADD_NEW) && (idtemplate->flag && UI_ID_OPEN)) - extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767"; - else if(idtemplate->flag & UI_ID_ADD_NEW) - extrastr= "ADD NEW %x 32767"; - else if(idtemplate->flag & UI_ID_OPEN) - extrastr= "OPEN NEW %x 32766"; - else - extrastr= NULL; + uiItem *item; + int itemh, x, y, w, tot=0, colw=0; - duptemplate= MEM_dupallocN(idtemplate); - IDnames_to_pupstring(&str, NULL, extrastr, lb, idptr.data, &duptemplate->browse); + x= litem->x; + y= litem->y; + w= litem->w; - but= uiDefButS(block, MENU, 0, str, layout->x, layout->y, EM_UNIT_X, EM_UNIT_Y, &duptemplate->browse, 0, 0, 0, 0, "Browse existing choices, or add new"); - uiButSetNFunc(but, header_id_cb, duptemplate, SET_INT_IN_POINTER(UI_ID_BROWSE)); - layout->x+= EM_UNIT_X; + for(item=litem->items.first; item; item=item->next) + tot++; - MEM_freeN(str); - } + if(tot == 0) + return; + + colw= (litem->w - (tot-1)*litem->space)/tot; + colw= MAX2(colw, 0); - /* text button with name */ - if(idptr.data) { - char name[64]; + for(item=litem->items.first; item; item=item->next) { + ui_item_size(item, NULL, &itemh); - text_idbutton(idptr.data, name); - but= uiDefButR(block, TEX, 0, name, layout->x, layout->y, EM_UNIT_X*6, EM_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL); - uiButSetNFunc(but, header_id_cb, MEM_dupallocN(idtemplate), SET_INT_IN_POINTER(UI_ID_RENAME)); - layout->x += EM_UNIT_X*6; + ui_item_position(item, x, y-itemh, colw, itemh); + x += colw; - /* delete button */ - if(idtemplate->flag & UI_ID_DELETE) { - but= uiDefIconButO(block, BUT, idtemplate->unlinkop, WM_OP_EXEC_REGION_WIN, ICON_X, layout->x, layout->y, EM_UNIT_X, EM_UNIT_Y, NULL); - layout->x += EM_UNIT_X; - } + if(item->next) + x += litem->space; } + + litem->w= x - litem->x; + litem->h= litem->y - y; + litem->x= x; + litem->y= y; } -void ui_template_free(uiTemplate *template) +/* layout create functions */ +uiLayout *uiLayoutRow(uiLayout *layout, int align) { - uiItem *item; - int a; - - if(template->type == TEMPLATE_BOX) { - uiTemplateBx *box= (uiTemplateBx*)template; - ui_layout_free(box->sublayout); - } - if(template->type == TEMPLATE_SPLIT) { - uiTemplateSplt *split= (uiTemplateSplt*)template; - - for(a=0; a<split->number; a++) - ui_layout_free(split->sublayout[a]); - MEM_freeN(split->sublayout); - } + uiLayout *litem; - for(item=template->items.first; item; item=item->next) - ui_item_free(item); + litem= MEM_callocN(sizeof(uiLayout), "uiLayoutRow"); + litem->item.type= ITEM_LAYOUT_ROW; + litem->common= layout->common; + litem->align= align; + litem->space= (align)? 0: layout->common->style->buttonspacex; + BLI_addtail(&layout->items, litem); - BLI_freelistN(&template->items); + return litem; } -/* template create functions */ -void uiLayoutRow(uiLayout *layout) +uiLayout *uiLayoutColumn(uiLayout *layout, int align) { - uiTemplate *template; + uiLayout *litem; - template= MEM_callocN(sizeof(uiTemplate), "uiTemplate"); - template->type= TEMPLATE_ROW; + litem= MEM_callocN(sizeof(uiLayout), "uiLayoutColumn"); + litem->item.type= ITEM_LAYOUT_COLUMN; + litem->common= layout->common; + litem->align= align; + litem->space= (litem->align)? 0: layout->common->style->buttonspacey; + BLI_addtail(&layout->items, litem); - BLI_addtail(&layout->templates, template); + return litem; } -void uiLayoutColumn(uiLayout *layout) +uiLayout *uiLayoutColumnFlow(uiLayout *layout, int number, int align) { - uiTemplate *template; + uiLayoutItemFlow *flow; - template= MEM_callocN(sizeof(uiTemplate), "uiTemplate"); - template->type= TEMPLATE_COLUMN; + flow= MEM_callocN(sizeof(uiLayoutItemFlow), "uiLayoutItemFlow"); + flow->litem.item.type= ITEM_LAYOUT_COLUMN_FLOW; + flow->litem.common= layout->common; + flow->litem.align= align; + flow->litem.space= (flow->litem.align)? 0: layout->common->style->columnspace; + flow->number= number; + BLI_addtail(&layout->items, flow); - BLI_addtail(&layout->templates, template); + return &flow->litem; } -void uiLayoutColumnFlow(uiLayout *layout, int number) +uiLayout *uiLayoutBox(uiLayout *layout) { - uiTemplateFlow *flow; + uiLayoutItemBx *box; - flow= MEM_callocN(sizeof(uiTemplateFlow), "uiTemplateFlow"); - flow->template.type= TEMPLATE_COLUMN_FLOW; - flow->number= number; - BLI_addtail(&layout->templates, flow); + box= MEM_callocN(sizeof(uiLayoutItemBx), "uiLayoutItemBx"); + box->litem.item.type= ITEM_LAYOUT_BOX; + box->litem.common= layout->common; + box->litem.space= layout->common->style->columnspace; + BLI_addtail(&layout->items, box); + + return &box->litem; } -uiLayout *uiLayoutBox(uiLayout *layout) +uiLayout *uiLayoutFree(uiLayout *layout, int align) { - uiTemplateBx *box; + uiLayout *litem; - box= MEM_callocN(sizeof(uiTemplateBx), "uiTemplateBx"); - box->template.type= TEMPLATE_BOX; - box->sublayout= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0, layout->style); - BLI_addtail(&layout->templates, box); + litem= MEM_callocN(sizeof(uiLayout), "uiLayoutFree"); + litem->item.type= ITEM_LAYOUT_FREE; + litem->common= layout->common; + litem->align= align; + BLI_addtail(&layout->items, litem); - return box->sublayout; + return litem; } -void uiLayoutSplit(uiLayout *layout, int number, int lr) +uiLayout *uiLayoutSplit(uiLayout *layout) { - uiTemplateSplt *split; - int a; + uiLayout *litem; - split= MEM_callocN(sizeof(uiTemplateSplt), "uiTemplateSplt"); - split->template.type= TEMPLATE_SPLIT; - split->number= number; - split->lr= lr; - split->sublayout= MEM_callocN(sizeof(uiLayout*)*number, "uiTemplateSpltSub"); + litem= uiLayoutRow(layout, 0); + litem->item.type = ITEM_LAYOUT_SPLIT; + litem->common= layout->common; + litem->space= layout->common->style->columnspace; - for(a=0; a<number; a++) - split->sublayout[a]= uiLayoutBegin(layout->dir, layout->type, 0, 0, 0, 0, layout->style); - - BLI_addtail(&layout->templates, split); + return litem; } -uiLayout *uiLayoutSub(uiLayout *layout, int n) +/********************** Layout *******************/ + +static void ui_item_estimate(uiItem *item) { - uiTemplate *template= layout->templates.last; + uiItem *subitem; + + if(item->type != ITEM_BUTTON) { + uiLayout *litem= (uiLayout*)item; + + for(subitem=litem->items.first; subitem; subitem=subitem->next) + ui_item_estimate(subitem); - if(template) { - switch(template->type) { - case TEMPLATE_SPLIT: - if(n >= 0 && n < ((uiTemplateSplt*)template)->number) - return ((uiTemplateSplt*)template)->sublayout[n]; + switch(litem->item.type) { + case ITEM_LAYOUT_COLUMN: + ui_litem_estimate_column(litem); + break; + case ITEM_LAYOUT_COLUMN_FLOW: + ui_litem_estimate_column_flow(litem); + break; + case ITEM_LAYOUT_ROW: + ui_litem_estimate_row(litem); + break; + case ITEM_LAYOUT_BOX: + ui_litem_estimate_box(litem); + break; + case ITEM_LAYOUT_ROOT: + ui_litem_estimate_root(litem); break; - case TEMPLATE_BOX: - return ((uiTemplateBx*)template)->sublayout; + case ITEM_LAYOUT_FREE: + ui_litem_estimate_free(litem); + break; + case ITEM_LAYOUT_SPLIT: + ui_litem_estimate_split(litem); break; default: break; } } - - return NULL; } -void uiTemplateHeader(uiLayout *layout) +static void ui_item_align(uiLayout *litem, int nr) { - uiTemplate *template; - - template= MEM_callocN(sizeof(uiTemplate), "uiTemplate"); - template->type= TEMPLATE_HEADER; + uiItem *item; - BLI_addtail(&layout->templates, template); + for(item=litem->items.first; item; item=item->next) { + if(item->type == ITEM_BUTTON) + ((uiButtonItem*)item)->but->alignnr= nr; + else + ui_item_align((uiLayout*)item, nr); + } } -void uiTemplateHeaderID(uiLayout *layout, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop) +static void ui_item_layout(uiItem *item, int align) { - uiTemplateHeadID *idtemplate; - PropertyRNA *prop; - - if(!ptr->data) - return; + uiItem *subitem; - prop= RNA_struct_find_property(ptr, propname); + if(item->type != ITEM_BUTTON) { + uiLayout *litem= (uiLayout*)item; - if(!prop) { - printf("uiTemplateHeaderID: property not found: %s\n", propname); - return; - } + if(litem->align && !align) + ui_item_align(litem, ++litem->common->block->alignnr); - idtemplate= MEM_callocN(sizeof(uiTemplateHeadID), "uiTemplateHeadID"); - idtemplate->template.type= TEMPLATE_HEADER_ID; - idtemplate->ptr= *ptr; - idtemplate->prop= prop; - idtemplate->flag= UI_ID_BROWSE|UI_ID_RENAME; + switch(litem->item.type) { + case ITEM_LAYOUT_COLUMN: + ui_litem_layout_column(litem); + break; + case ITEM_LAYOUT_COLUMN_FLOW: + ui_litem_layout_column_flow(litem); + break; + case ITEM_LAYOUT_ROW: + ui_litem_layout_row(litem); + break; + case ITEM_LAYOUT_BOX: + ui_litem_layout_box(litem); + break; + case ITEM_LAYOUT_ROOT: + ui_litem_layout_root(litem); + break; + case ITEM_LAYOUT_FREE: + ui_litem_layout_free(litem); + break; + case ITEM_LAYOUT_SPLIT: + ui_litem_layout_split(litem); + break; + default: + break; + } - if(newop) { - idtemplate->flag |= UI_ID_ADD_NEW; - idtemplate->newop= newop; + for(subitem=litem->items.first; subitem; subitem=subitem->next) + ui_item_layout(subitem, litem->align || align); } - if(openop) { - idtemplate->flag |= UI_ID_OPEN; - idtemplate->openop= openop; - } - if(unlinkop) { - idtemplate->flag |= UI_ID_DELETE; - idtemplate->unlinkop= unlinkop; - } - - BLI_addtail(&layout->templates, idtemplate); } -void uiTemplateSlot(uiLayout *layout, int slot) +static void ui_layout_items(const bContext *C, uiBlock *block, uiLayout *layout) { - uiTemplate *template= layout->templates.last; - - if(template) - template->slot= slot; + ui_item_estimate(&layout->item); + ui_item_layout(&layout->item, 0); } -/********************** Layout *******************/ - -static void ui_layout_init_items(const bContext *C, uiLayout *layout) +static void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y) { - ARegion *ar= CTX_wm_region(C); - MenuType *mt; - uiTemplate *template; - uiItem *item; - uiItemMenu *menuitem; - uiItemRNA *rnaitem; - uiItemOp *opitem; - PropertyType type; - - for(template=layout->templates.first; template; template=template->next) { - for(item=template->items.first; item; item=item->next) { - /* initialize buttons names */ - if(item->type == ITEM_MENU) { - menuitem= (uiItemMenu*)item; - - if(menuitem->menuname) { - for(mt=ar->type->menutypes.first; mt; mt=mt->next) { - if(strcmp(menuitem->menuname, mt->idname) == 0) { - menuitem->arg= mt; - ui_item_name(item, mt->label); - break; - } - } - } - } - else if(item->type == ITEM_RNA_PROPERTY) { - rnaitem= (uiItemRNA*)item; - type= RNA_property_type(rnaitem->prop); + if(layout->common->handlefunc) + uiBlockSetButmFunc(block, layout->common->handlefunc, layout->common->argv); - ui_item_name(item, (char*)RNA_property_ui_name(rnaitem->prop)); + ui_layout_items(C, block, layout); - if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_ENUM)) - ui_item_name_add_colon(item); - } - else if(item->type == ITEM_OPERATOR) { - opitem= (uiItemOp*)item; - ui_item_name(item, opitem->ot->name); - } - - ui_item_name(item, ""); + if(x) *x= layout->x; + if(y) *y= layout->y; +} - /* initialize icons */ - if(layout->type == UI_LAYOUT_MENU) { - if(item->type == ITEM_RNA_PROPERTY) { - rnaitem= (uiItemRNA*)item; - type= RNA_property_type(rnaitem->prop); +static void ui_layout_free(uiLayout *layout) +{ + uiItem *item, *next; - if(type == PROP_BOOLEAN) - item->icon= (RNA_property_boolean_get(&rnaitem->ptr, rnaitem->prop))? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; - else if(type == PROP_ENUM && rnaitem->index == RNA_ENUM_VALUE) - item->icon= (RNA_property_enum_get(&rnaitem->ptr, rnaitem->prop) == rnaitem->value)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT; - } + for(item=layout->items.first; item; item=next) { + next= item->next; - if(!item->icon) - item->icon= ICON_BLANK1; - } - } + if(item->type == ITEM_BUTTON) + MEM_freeN(item); + else + ui_layout_free((uiLayout*)item); } + + MEM_freeN(layout); } -static void ui_layout_templates(const bContext *C, uiBlock *block, uiLayout *layout) +uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, uiStyle *style) { - uiStyle *style= layout->style; - uiTemplate *template; + uiLayout *layout; + uiLayoutCommon *common; - ui_layout_init_items(C, layout); + if(!block->layout) { + common= MEM_callocN(sizeof(uiLayoutCommon), "uiLayoutCommon"); + common->type= type; + common->style= style; + common->block= block; + common->opcontext= WM_OP_INVOKE_REGION_WIN; - if(layout->dir == UI_LAYOUT_HORIZONTAL) { - for(template=layout->templates.first; template; template=template->next) { - switch(template->type) { - case TEMPLATE_HEADER: - ui_layout_header(C, layout, block, template); - break; - case TEMPLATE_HEADER_ID: - ui_layout_header_id(C, layout, block, template); - break; - default: - ui_layout_header_buttons(layout, block, template); - break; - } + layout= MEM_callocN(sizeof(uiLayout), "uiLayout"); + layout->item.type= ITEM_LAYOUT_ROOT; - layout->x += style->templatespace; - } - } - else { - for(template=layout->templates.first; template; template=template->next) { - switch(template->type) { - case TEMPLATE_ROW: - ui_layout_row(layout, block, template); - break; - case TEMPLATE_COLUMN_FLOW: - ui_layout_column_flow(layout, block, template); - break; - case TEMPLATE_SPLIT: - ui_layout_split(C, layout, block, template); - break; - case TEMPLATE_BOX: - ui_layout_box(C, layout, block, template); - break; - case TEMPLATE_COLUMN: - default: - ui_layout_column(layout, block, template); - break; - } + layout->x= x; + layout->y= y; + layout->common= common; + layout->space= style->templatespace; + + if(type == UI_LAYOUT_MENU) + layout->space= 0; - layout->y -= style->templatespace; + if(dir == UI_LAYOUT_HORIZONTAL) { + layout->h= size; + layout->common->emh= em*UI_UNIT_Y; } + else { + layout->w= size; + layout->common->emw= em*UI_UNIT_X; + } + + block->curlayout= layout; + block->layout= layout; } + + return block->layout; } -void ui_layout_end(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y) +uiBlock *uiLayoutBlock(uiLayout *layout) { - if(layout->handlefunc) - uiBlockSetButmFunc(block, layout->handlefunc, layout->argv); - - ui_layout_templates(C, block, layout); - - if(x) *x= layout->x; - if(y) *y= layout->y; - + return layout->common->block; } -void ui_layout_free(uiLayout *layout) +void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout) { - uiTemplate *template; - - for(template=layout->templates.first; template; template=template->next) - ui_template_free(template); - - BLI_freelistN(&layout->templates); - MEM_freeN(layout); + block->curlayout= layout; } -uiLayout *uiLayoutBegin(int dir, int type, int x, int y, int size, int em, uiStyle *style) +void ui_layout_add_but(uiLayout *layout, uiBut *but) { - uiLayout *layout; - - layout= MEM_callocN(sizeof(uiLayout), "uiLayout"); - layout->opcontext= WM_OP_INVOKE_REGION_WIN; - layout->dir= dir; - layout->type= type; - layout->x= x; - layout->y= y; - layout->style= style; - - if(dir == UI_LAYOUT_HORIZONTAL) { - layout->h= size; - layout->emh= em*EM_UNIT_Y; - } - else { - layout->w= size; - layout->emw= em*EM_UNIT_X; - } - - return layout; + uiButtonItem *bitem; + + bitem= MEM_callocN(sizeof(uiButtonItem), "uiButtonItem"); + bitem->item.type= ITEM_BUTTON; + bitem->but= but; + BLI_addtail(&layout->items, bitem); } void uiLayoutContext(uiLayout *layout, int opcontext) { - layout->opcontext= opcontext; + layout->common->opcontext= opcontext; } void uiLayoutFunc(uiLayout *layout, uiMenuHandleFunc handlefunc, void *argv) { - layout->handlefunc= handlefunc; - layout->argv= argv; + layout->common->handlefunc= handlefunc; + layout->common->argv= argv; } -void uiLayoutEnd(const bContext *C, uiBlock *block, uiLayout *layout, int *x, int *y) +void uiBlockLayoutResolve(const bContext *C, uiBlock *block, int *x, int *y) { - ui_layout_end(C, block, layout, x, y); - ui_layout_free(layout); -} + uiLayout *layout= block->layout; -/************************ Utilities ************************/ + if(layout) { + /* NULL in advance so we don't interfere when adding button */ + block->layout= NULL; + block->curlayout= NULL; -void uiRegionPanelLayout(const bContext *C, ARegion *ar, int vertical, char *context) -{ - uiStyle *style= U.uistyles.first; - uiBlock *block; - PanelType *pt; - Panel *panel; - float col[3]; - int xco, yco, x=PNL_DIST, y=-PNL_HEADER-PNL_DIST, w, em; - - // XXX this only hides cruft - - /* clear */ - UI_GetThemeColor3fv(TH_BACK, col); - glClearColor(col[0], col[1], col[2], 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - /* set view2d view matrix for scrolling (without scrollers) */ - UI_view2d_view_ortho(C, &ar->v2d); - - uiBeginPanels(C, ar); - - for(pt= ar->type->paneltypes.first; pt; pt= pt->next) { - if(context) - if(!pt->context || strcmp(context, pt->context) != 0) - continue; - - if(pt->draw && (!pt->poll || pt->poll(C, pt))) { - block= uiBeginBlock(C, ar, pt->idname, UI_EMBOSS); - panel= uiBeginPanel(ar, block, pt); - - if(panel) { - if(vertical) { - w= (ar->type->minsizex)? ar->type->minsizex-12: block->aspect*ar->winx-12; - em= (ar->type->minsizex)? 10: 20; - } - else { - w= (ar->type->minsizex)? ar->type->minsizex-12: UI_PANEL_WIDTH-12; - em= (ar->type->minsizex)? 10: 20; - } - - panel->type= pt; - panel->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, PNL_SAFETY, 0, w-2*PNL_SAFETY, em, style); - - pt->draw(C, panel); - - uiLayoutEnd(C, block, panel->layout, &xco, &yco); - panel->layout= NULL; - uiEndPanel(block, w, -yco + 12); - } - else { - w= PNL_HEADER; - yco= PNL_HEADER; - } - - uiEndBlock(C, block); - - if(vertical) - y += yco+PNL_DIST; - else - x += w+PNL_DIST; - } + ui_layout_end(C, block, layout, x, y); + MEM_freeN(layout->common); + ui_layout_free(layout); + } + else { + if(x) *x= 0; + if(y) *y= 0; } - uiEndPanels(C, ar); - - /* restore view matrix? */ - UI_view2d_view_restore(C); + /* XXX silly trick, interface_templates.c doesn't get linked + * because it's not used by other files in this module? */ + { + void ui_template_fix_linking(); + ui_template_fix_linking(); + } } -void uiRegionHeaderLayout(const bContext *C, ARegion *ar) +float uiBlockAspect(uiBlock *block) { - uiStyle *style= U.uistyles.first; - uiBlock *block; - uiLayout *layout; - HeaderType *ht; - Header header = {0}; - float col[3]; - int xco, yco; - - // XXX this only hides cruft - - /* clear */ - if(ED_screen_area_active(C)) - UI_GetThemeColor3fv(TH_HEADER, col); - else - UI_GetThemeColor3fv(TH_HEADERDESEL, col); - - glClearColor(col[0], col[1], col[2], 0.0); - glClear(GL_COLOR_BUFFER_BIT); - - /* set view2d view matrix for scrolling (without scrollers) */ - UI_view2d_view_ortho(C, &ar->v2d); - - xco= 8; - yco= 3; - - /* draw all headers types */ - for(ht= ar->type->headertypes.first; ht; ht= ht->next) { - block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS); - layout= uiLayoutBegin(UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, 24, 1, style); - - if(ht->draw) { - header.type= ht; - header.layout= layout; - ht->draw(C, &header); - } - - uiLayoutEnd(C, block, layout, &xco, &yco); - uiEndBlock(C, block); - uiDrawBlock(C, block); - } - - /* always as last */ - UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin); - - /* restore view matrix? */ - UI_view2d_view_restore(C); + return block->aspect; /* temporary */ } diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c index 730f22e3390..36c794ab098 100644 --- a/source/blender/editors/interface/interface_panel.c +++ b/source/blender/editors/interface/interface_panel.c @@ -157,6 +157,7 @@ static void ui_panel_copy_offset(Panel *pa, Panel *papar) Panel *uiBeginPanel(ARegion *ar, uiBlock *block, PanelType *pt) { + uiStyle *style= U.uistyles.first; Panel *pa, *patab, *palast, *panext; char *panelname= pt->label; char *tabname= pt->label; @@ -181,8 +182,8 @@ Panel *uiBeginPanel(ARegion *ar, uiBlock *block, PanelType *pt) BLI_strncpy(pa->panelname, panelname, UI_MAX_NAME_STR); BLI_strncpy(pa->tabname, tabname, UI_MAX_NAME_STR); - pa->ofsx= PNL_DIST; - pa->ofsy= PNL_DIST; + pa->ofsx= style->panelouter; + pa->ofsy= style->panelouter; pa->sizex= 0; pa->sizey= 0; @@ -377,31 +378,32 @@ static int panel_has_tabs(ARegion *ar, Panel *panel) static void ui_scale_panel_block(uiBlock *block) { + uiStyle *style= U.uistyles.first; uiBut *but; float facx= 1.0, facy= 1.0; - int centerx= 0, topy=0, tabsy=0; + int centerx= 0, topy=0, tabsy=0, space= style->panelspace; if(block->panel==NULL) return; /* buttons min/max centered, offset calculated */ ui_bounds_block(block); - if((!block->panel->type) && block->maxx-block->minx > block->panel->sizex - 2*PNL_SAFETY) - facx= (block->panel->sizex - (2*PNL_SAFETY))/(block->maxx-block->minx); + if((!block->panel->type) && block->maxx-block->minx > block->panel->sizex - 2*space) + facx= (block->panel->sizex - (2*space))/(block->maxx-block->minx); else - centerx= (block->panel->sizex-(block->maxx-block->minx) - 2*PNL_SAFETY)/2; + centerx= (block->panel->sizex-(block->maxx-block->minx) - 2*space)/2; // tabsy= PNL_HEADER*panel_has_tabs(block->panel); - if((!block->panel->type) && (block->maxy-block->miny) > block->panel->sizey - 2*PNL_SAFETY - tabsy) - facy= (block->panel->sizey - (2*PNL_SAFETY) - tabsy)/(block->maxy-block->miny); + if((!block->panel->type) && (block->maxy-block->miny) > block->panel->sizey - 2*space - tabsy) + facy= (block->panel->sizey - (2*space) - tabsy)/(block->maxy-block->miny); else - topy= (block->panel->sizey- 2*PNL_SAFETY - tabsy) - (block->maxy-block->miny) ; + topy= (block->panel->sizey- 2*space - tabsy) - (block->maxy-block->miny) ; for(but= block->buttons.first; but; but=but->next) { - but->x1= PNL_SAFETY+centerx+ facx*(but->x1-block->minx); - but->y1= PNL_SAFETY+topy + facy*(but->y1-block->miny); - but->x2= PNL_SAFETY+centerx+ facx*(but->x2-block->minx); - but->y2= PNL_SAFETY+topy + facy*(but->y2-block->miny); + but->x1= space+centerx+ facx*(but->x1-block->minx); + but->y1= space+topy + facy*(but->y1-block->miny); + but->x2= space+centerx+ facx*(but->x2-block->minx); + but->y2= space+topy + facy*(but->y2-block->miny); if(facx!=1.0) ui_check_but(but); /* for strlen */ } @@ -413,6 +415,7 @@ static void ui_scale_panel_block(uiBlock *block) // for 'home' key void uiPanelsHome(ARegion *ar) { + uiStyle *style= U.uistyles.first; Panel *pa; uiBlock *block; View2D *v2d; @@ -432,10 +435,10 @@ void uiPanelsHome(ARegion *ar) } if(done) { - v2d->tot.xmin= minx-PNL_DIST; - v2d->tot.xmax= maxx+PNL_DIST; - v2d->tot.ymin= miny-PNL_DIST; - v2d->tot.ymax= maxy+PNL_DIST; + v2d->tot.xmin= minx-style->panelouter; + v2d->tot.xmax= maxx+style->panelouter; + v2d->tot.ymin= miny-style->panelouter; + v2d->tot.ymax= maxy+style->panelouter; } else { v2d->tot.xmin= 0; @@ -890,6 +893,7 @@ static int compare_panel(const void *a1, const void *a2) /* returns 1 when it did something */ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag) { + uiStyle *style= U.uistyles.first; Panel *pa; PanelSort *ps, *panelsort, *psnext; int a, tot=0, done; @@ -940,18 +944,18 @@ int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag) /* no smart other default start loc! this keeps switching f5/f6/etc compatible */ ps= panelsort; - ps->pa->ofsx= PNL_DIST; - ps->pa->ofsy= -ps->pa->sizey-PNL_HEADER-PNL_DIST; + ps->pa->ofsx= style->panelouter; + ps->pa->ofsy= -ps->pa->sizey-PNL_HEADER-style->panelouter; for(a=0; a<tot-1; a++, ps++) { psnext= ps+1; if(align==BUT_VERTICAL) { psnext->pa->ofsx= ps->pa->ofsx; - psnext->pa->ofsy= get_panel_real_ofsy(ps->pa) - psnext->pa->sizey-PNL_HEADER-PNL_DIST; + psnext->pa->ofsy= get_panel_real_ofsy(ps->pa) - psnext->pa->sizey-PNL_HEADER-style->panelouter; } else { - psnext->pa->ofsx= get_panel_real_ofsx(ps->pa)+PNL_DIST; + psnext->pa->ofsx= get_panel_real_ofsx(ps->pa)+style->panelouter; psnext->pa->ofsy= ps->pa->ofsy + ps->pa->sizey - psnext->pa->sizey; } } diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 59725cc4954..57644e5decc 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -624,6 +624,7 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut /* create area region */ ar= ui_add_temporary_region(CTX_wm_screen(C)); + handle->region= ar; memset(&type, 0, sizeof(ARegionType)); type.draw= ui_block_region_draw; @@ -631,15 +632,21 @@ uiPopupBlockHandle *ui_popup_block_create(bContext *C, ARegion *butregion, uiBut UI_add_region_handlers(&ar->handlers); - handle->region= ar; - ar->regiondata= handle; - /* create ui block */ if(create_func) block= create_func(C, handle->region, arg); else block= handle_create_func(C, handle, arg); - block->handle= handle; + + if(block->handle) { + memcpy(block->handle, handle, sizeof(uiPopupBlockHandle)); + MEM_freeN(handle); + handle= block->handle; + } + else + block->handle= handle; + + ar->regiondata= handle; if(!block->endblock) uiEndBlock(C, block); @@ -1625,28 +1632,9 @@ uiBlock *ui_block_func_PUPMENUCOL(bContext *C, uiPopupBlockHandle *handle, void /* prototype */ static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle, void *arg_info); -#define MAX_MENU_STR 64 - -/* type, internal */ -#define MENU_ITEM_TITLE 0 -#define MENU_ITEM_ITEM 1 -#define MENU_ITEM_SEPARATOR 2 -#define MENU_ITEM_OPNAME 10 -#define MENU_ITEM_OPNAME_BOOL 11 -#define MENU_ITEM_OPNAME_ENUM 12 -#define MENU_ITEM_OPNAME_INT 13 -#define MENU_ITEM_OPNAME_FLOAT 14 -#define MENU_ITEM_OPNAME_STRING 15 -#define MENU_ITEM_RNA_BOOL 20 -#define MENU_ITEM_RNA_ENUM 21 -#define MENU_ITEM_LEVEL 30 -#define MENU_ITEM_LEVEL_OPNAME_ENUM 31 -#define MENU_ITEM_LEVEL_RNA_ENUM 32 - struct uiPopupMenu { + uiBlock *block; uiLayout *layout; - int icon; - char name[MAX_MENU_STR]; }; typedef struct uiMenuInfo { @@ -1694,46 +1682,26 @@ typedef struct MenuItemLevel { static uiBlock *ui_block_func_MENU_ITEM(bContext *C, uiPopupBlockHandle *handle, void *arg_info) { uiBlock *block; - uiBut *but; uiMenuInfo *info= arg_info; uiPopupMenu *pup; ScrArea *sa; ARegion *ar; - static int counter= 0; - char str[16]; pup= info->pup; + block= pup->block; /* block stuff first, need to know the font */ - sprintf(str, "tb %d", counter++); - block= uiBeginBlock(C, handle->region, str, UI_EMBOSSP); + uiBlockSetRegion(block, handle->region); block->direction= UI_DOWN; - /* here we go! */ - if(pup->name[0]) { - char titlestr[256]; - - if(pup->icon) { - sprintf(titlestr, " %s", pup->name); - uiDefIconTextBut(block, LABEL, 0, pup->icon, titlestr, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); - } - else { - but= uiDefBut(block, LABEL, 0, pup->name, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); - but->flag= UI_TEXT_LEFT; - } - - //uiDefBut(block, SEPR, 0, "", startx, (short)(starty+height)-MENU_SEPR_HEIGHT, width, MENU_SEPR_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); - } - - block->handle= handle; - uiLayoutEnd(C, block, pup->layout, NULL, NULL); + uiBlockLayoutResolve(C, block, NULL, NULL); if(info->popup) { uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_NUMSELECT|UI_BLOCK_RET_1); uiBlockSetDirection(block, UI_DOWN); /* here we set an offset for the mouse position */ - uiMenuPopupBoundsBlock(block, 1, 0, MENU_BUTTON_HEIGHT/2); + uiMenuPopupBoundsBlock(block, 1, 0, 1.5*MENU_BUTTON_HEIGHT); } else { /* for a header menu we set the direction automatic */ @@ -1769,9 +1737,12 @@ uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut uiMenuInfo info; pup= MEM_callocN(sizeof(uiPopupMenu), "menu dummy"); - pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style); + pup->block= uiBeginBlock(C, NULL, "ui_popup_menu_create", UI_EMBOSSP); + pup->layout= uiBlockLayout(pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style); uiLayoutContext(pup->layout, WM_OP_INVOKE_REGION_WIN); - uiLayoutColumn(pup->layout); + + /* create in advance so we can let buttons point to retval already */ + pup->block->handle= MEM_callocN(sizeof(uiPopupBlockHandle), "uiPopupBlockHandle"); menu_func(C, pup->layout, arg); @@ -1792,20 +1763,35 @@ uiPopupBlockHandle *ui_popup_menu_create(bContext *C, ARegion *butregion, uiBut /*************************** Popup Menu API **************************/ /* only return handler, and set optional title */ -uiPopupMenu *uiPupMenuBegin(const char *title, int icon) +uiPopupMenu *uiPupMenuBegin(bContext *C, const char *title, int icon) { uiStyle *style= U.uistyles.first; uiPopupMenu *pup= MEM_callocN(sizeof(uiPopupMenu), "menu start"); + uiBut *but; - pup->icon= icon; - pup->layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style); + pup->block= uiBeginBlock(C, NULL, "uiPupMenuBegin", UI_EMBOSSP); + pup->layout= uiBlockLayout(pup->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_MENU, 0, 0, 200, 0, style); uiLayoutContext(pup->layout, WM_OP_EXEC_REGION_WIN); - uiLayoutColumn(pup->layout); - - /* NULL is no title */ - if(title) - BLI_strncpy(pup->name, title, MAX_MENU_STR); + + /* create in advance so we can let buttons point to retval already */ + pup->block->handle= MEM_callocN(sizeof(uiPopupBlockHandle), "uiPopupBlockHandle"); + /* create title button */ + if(title && title[0]) { + char titlestr[256]; + + if(icon) { + sprintf(titlestr, " %s", title); + uiDefIconTextBut(pup->block, LABEL, 0, icon, titlestr, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); + } + else { + but= uiDefBut(pup->block, LABEL, 0, (char*)title, 0, 0, 200, MENU_BUTTON_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); + but->flag= UI_TEXT_LEFT; + } + + //uiDefBut(block, SEPR, 0, "", startx, (short)(starty+height)-MENU_SEPR_HEIGHT, width, MENU_SEPR_HEIGHT, NULL, 0.0, 0.0, 0, 0, ""); + } + return pup; } @@ -2002,7 +1988,7 @@ void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, char *opname, i handle= ui_popup_block_create(C, NULL, NULL, func, NULL, arg); handle->popup= 1; - handle->opname= opname; + handle->optype= (opname)? WM_operatortype_find(opname): NULL; handle->opcontext= opcontext; UI_add_popup_handlers(C, &window->handlers, handle); diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c index d0361174e70..f789f81e0d3 100644 --- a/source/blender/editors/interface/interface_style.c +++ b/source/blender/editors/interface/interface_style.c @@ -121,6 +121,8 @@ static uiStyle *ui_style_new(ListBase *styles, const char *name) style->boxspace= 5; style->buttonspacex= 5; style->buttonspacey= 2; + style->panelspace= 8; + style->panelouter= 4; return style; } diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c new file mode 100644 index 00000000000..5244c9983cf --- /dev/null +++ b/source/blender/editors/interface/interface_templates.c @@ -0,0 +1,248 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Contributor(s): Blender Foundation 2009. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stdlib.h> + +#include "MEM_guardedalloc.h" + +#include "BLI_string.h" + +#include "BKE_context.h" +#include "BKE_library.h" +#include "BKE_utildefines.h" + +#include "ED_screen.h" + +#include "RNA_access.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +static uiBlock *block_free_layout(uiLayout *layout) +{ + uiBlock *block; + + block= uiLayoutBlock(layout); + uiBlockSetCurLayout(block, uiLayoutFree(layout, 0)); + + return block; +} + +void ui_template_fix_linking() +{ +} + +/********************** Header Template *************************/ + +void uiTemplateHeader(uiLayout *layout, bContext *C) +{ + uiBlock *block; + + block= block_free_layout(layout); + ED_area_header_standardbuttons(C, block, 0); +} + +/******************* Header ID Template ************************/ + +typedef struct TemplateHeaderID { + PointerRNA ptr; + PropertyRNA *prop; + + int flag; + short browse; + + char newop[256]; + char openop[256]; + char unlinkop[256]; +} TemplateHeaderID; + +static void template_header_id_cb(bContext *C, void *arg_litem, void *arg_event) +{ + TemplateHeaderID *template= (TemplateHeaderID*)arg_litem; + PointerRNA idptr= RNA_property_pointer_get(&template->ptr, template->prop); + ID *idtest, *id= idptr.data; + ListBase *lb= wich_libbase(CTX_data_main(C), ID_TXT); + int nr, event= GET_INT_FROM_POINTER(arg_event); + + if(event == UI_ID_BROWSE && template->browse == 32767) + event= UI_ID_ADD_NEW; + else if(event == UI_ID_BROWSE && template->browse == 32766) + event= UI_ID_OPEN; + + switch(event) { + case UI_ID_BROWSE: { + if(template->browse== -2) { + /* XXX implement or find a replacement + * activate_databrowse((ID *)G.buts->lockpoin, GS(id->name), 0, B_MESHBROWSE, &template->browse, do_global_buttons); */ + return; + } + if(template->browse < 0) + return; + + for(idtest=lb->first, nr=1; idtest; idtest=idtest->next, nr++) { + if(nr==template->browse) { + if(id == idtest) + return; + + id= idtest; + RNA_id_pointer_create(id, &idptr); + RNA_property_pointer_set(&template->ptr, template->prop, idptr); + RNA_property_update(C, &template->ptr, template->prop); + /* XXX */ + + break; + } + } + break; + } +#if 0 + case UI_ID_DELETE: + id= NULL; + break; + case UI_ID_FAKE_USER: + if(id) { + if(id->flag & LIB_FAKEUSER) id->us++; + else id->us--; + } + else return; + break; +#endif + case UI_ID_PIN: + break; + case UI_ID_ADD_NEW: + WM_operator_name_call(C, template->newop, WM_OP_INVOKE_REGION_WIN, NULL); + break; + case UI_ID_OPEN: + WM_operator_name_call(C, template->openop, WM_OP_INVOKE_REGION_WIN, NULL); + break; +#if 0 + case UI_ID_ALONE: + if(!id || id->us < 1) + return; + break; + case UI_ID_LOCAL: + if(!id || id->us < 1) + return; + break; + case UI_ID_AUTO_NAME: + break; +#endif + } +} + +static void template_header_ID(bContext *C, uiBlock *block, TemplateHeaderID *template) +{ + uiBut *but; + TemplateHeaderID *duptemplate; + PointerRNA idptr; + ListBase *lb; + int x= 0, y= 0; + + idptr= RNA_property_pointer_get(&template->ptr, template->prop); + lb= wich_libbase(CTX_data_main(C), ID_TXT); + + uiBlockBeginAlign(block); + if(template->flag & UI_ID_BROWSE) { + char *extrastr, *str; + + if((template->flag & UI_ID_ADD_NEW) && (template->flag && UI_ID_OPEN)) + extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767"; + else if(template->flag & UI_ID_ADD_NEW) + extrastr= "ADD NEW %x 32767"; + else if(template->flag & UI_ID_OPEN) + extrastr= "OPEN NEW %x 32766"; + else + extrastr= NULL; + + duptemplate= MEM_dupallocN(template); + IDnames_to_pupstring(&str, NULL, extrastr, lb, idptr.data, &duptemplate->browse); + + but= uiDefButS(block, MENU, 0, str, x, y, UI_UNIT_X, UI_UNIT_Y, &duptemplate->browse, 0, 0, 0, 0, "Browse existing choices, or add new"); + uiButSetNFunc(but, template_header_id_cb, duptemplate, SET_INT_IN_POINTER(UI_ID_BROWSE)); + x+= UI_UNIT_X; + + MEM_freeN(str); + } + + /* text button with name */ + if(idptr.data) { + char name[64]; + + text_idbutton(idptr.data, name); + but= uiDefButR(block, TEX, 0, name, x, y, UI_UNIT_X*6, UI_UNIT_Y, &idptr, "name", -1, 0, 0, -1, -1, NULL); + uiButSetNFunc(but, template_header_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_RENAME)); + x += UI_UNIT_X*6; + + /* delete button */ + if(template->flag & UI_ID_DELETE) { + but= uiDefIconButO(block, BUT, template->unlinkop, WM_OP_EXEC_REGION_WIN, ICON_X, x, y, UI_UNIT_X, UI_UNIT_Y, NULL); + x += UI_UNIT_X; + } + } + uiBlockEndAlign(block); +} + +void uiTemplateHeaderID(uiLayout *layout, bContext *C, PointerRNA *ptr, char *propname, char *newop, char *openop, char *unlinkop) +{ + TemplateHeaderID *template; + uiBlock *block; + PropertyRNA *prop; + + if(!ptr->data) + return; + + prop= RNA_struct_find_property(ptr, propname); + + if(!prop) { + printf("uiTemplateHeaderID: property not found: %s\n", propname); + return; + } + + template= MEM_callocN(sizeof(TemplateHeaderID), "TemplateHeaderID"); + template->ptr= *ptr; + template->prop= prop; + template->flag= UI_ID_BROWSE|UI_ID_RENAME; + + if(newop) { + template->flag |= UI_ID_ADD_NEW; + BLI_strncpy(template->newop, newop, sizeof(template->newop)); + } + if(openop) { + template->flag |= UI_ID_OPEN; + BLI_strncpy(template->openop, openop, sizeof(template->openop)); + } + if(unlinkop) { + template->flag |= UI_ID_DELETE; + BLI_strncpy(template->unlinkop, unlinkop, sizeof(template->unlinkop)); + } + + block= block_free_layout(layout); + template_header_ID(C, block, template); + + MEM_freeN(template); +} + diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c index dc346be7af2..e3f986efde9 100644 --- a/source/blender/editors/interface/interface_utils.c +++ b/source/blender/editors/interface/interface_utils.c @@ -320,13 +320,12 @@ int uiDefAutoButsRNA(const bContext *C, uiBlock *block, PointerRNA *ptr) uiStyle *style= U.uistyles.first; CollectionPropertyIterator iter; PropertyRNA *iterprop, *prop; - uiLayout *layout; + uiLayout *layout, *split; char *name; int x= 0, y= 0; - layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, DEF_BUT_WIDTH*2, 20, style); + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, DEF_BUT_WIDTH*2, 20, style); - uiLayoutColumn(layout); uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0); iterprop= RNA_struct_iterator_property(ptr->type); @@ -338,17 +337,16 @@ int uiDefAutoButsRNA(const bContext *C, uiBlock *block, PointerRNA *ptr) if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) continue; - uiLayoutSplit(layout, 2, 0); + split = uiLayoutSplit(layout); name= (char*)RNA_property_ui_name(prop); - uiLayoutColumn(uiLayoutSub(layout, 0)); - uiItemL(uiLayoutSub(layout, 0), name, 0); - uiLayoutColumn(uiLayoutSub(layout, 1)); - uiItemFullR(uiLayoutSub(layout, 1), "", 0, ptr, prop, -1, 0, 0); + + uiItemL(uiLayoutColumn(split, 0), name, 0); + uiItemFullR(uiLayoutColumn(split, 0), "", 0, ptr, prop, -1, 0, 0); } RNA_property_collection_end(&iter); - uiLayoutEnd(C, block, layout, &x, &y); + uiBlockLayoutResolve(C, block, &x, &y); return -y; } @@ -363,9 +361,8 @@ int uiDefAutoButsRNA_single(const bContext *C, uiBlock *block, PointerRNA *ptr) char *name; int x= 0, y= 0; - layout= uiLayoutBegin(UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, block->panel->sizex, 20, style); + layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y, block->panel->sizex, 20, style); - uiLayoutColumn(layout); uiItemL(layout, (char*)RNA_struct_ui_name(ptr->type), 0); iterprop= RNA_struct_iterator_property(ptr->type); @@ -377,17 +374,13 @@ int uiDefAutoButsRNA_single(const bContext *C, uiBlock *block, PointerRNA *ptr) if(strcmp(RNA_property_identifier(prop), "rna_type") == 0) continue; - uiLayoutSplit(layout, 1, 0); - uiLayoutColumn(uiLayoutSub(layout, 0)); - name= (char*)RNA_property_ui_name(prop); - uiItemL(uiLayoutSub(layout, 0), name, 0); - - uiItemFullR(uiLayoutSub(layout, 0), "", 0, ptr, prop, -1, 0, 0); + uiItemL(layout, name, 0); + uiItemFullR(layout, "", 0, ptr, prop, -1, 0, 0); } RNA_property_collection_end(&iter); - uiLayoutEnd(C, block, layout, &x, &y); + uiBlockLayoutResolve(C, block, &x, &y); return -y; } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index b6e679468e0..3035ff6d3a6 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -6588,7 +6588,7 @@ static int subdivs_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("Subdivision Type", 0); + pup= uiPupMenuBegin(C, "Subdivision Type", 0); layout= uiPupMenuLayout(pup); uiItemsEnumO(layout, "MESH_OT_subdivs", "type"); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 68a2cf04692..cf61c16fbe4 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -463,7 +463,7 @@ static int object_add_curve_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin(op->type->name, 0); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); if(!obedit || obedit->type == OB_CURVE) uiItemsEnumO(layout, op->type->idname, "type"); @@ -632,7 +632,7 @@ void OBJECT_OT_armature_add(wmOperatorType *ot) static int object_primitive_add_invoke(bContext *C, wmOperator *op, wmEvent *event) { - uiPopupMenu *pup= uiPupMenuBegin("Add Object", 0); + uiPopupMenu *pup= uiPupMenuBegin(C, "Add Object", 0); uiLayout *layout= uiPupMenuLayout(pup); uiItemMenuEnumO(layout, NULL, ICON_OUTLINER_OB_MESH, "OBJECT_OT_mesh_add", "type"); @@ -2623,7 +2623,7 @@ static int parent_set_exec(bContext *C, wmOperator *op) static int parent_set_invoke(bContext *C, wmOperator *op, wmEvent *event) { Object *ob= CTX_data_active_object(C); - uiPopupMenu *pup= uiPupMenuBegin("Set Parent To", 0); + uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", 0); uiLayout *layout= uiPupMenuLayout(pup); uiLayoutContext(layout, WM_OP_EXEC_DEFAULT); diff --git a/source/blender/editors/physics/editparticle.c b/source/blender/editors/physics/editparticle.c index 0d58a0bfdcd..1c2b3c6b309 100644 --- a/source/blender/editors/physics/editparticle.c +++ b/source/blender/editors/physics/editparticle.c @@ -3842,7 +3842,7 @@ static int specials_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("Specials", 0); + pup= uiPupMenuBegin(C, "Specials", 0); layout= uiPupMenuLayout(pup); uiItemO(layout, NULL, 0, "PARTICLE_OT_rekey"); diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 6b7b7a914f4..e344a177517 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -31,6 +31,9 @@ #include "MEM_guardedalloc.h" +#include "DNA_screen_types.h" +#include "DNA_userdef_types.h" + #include "BLI_blenlib.h" #include "BLI_arithb.h" #include "BLI_rand.h" @@ -955,3 +958,128 @@ int ED_area_header_standardbuttons(const bContext *C, uiBlock *block, int yco) return xco; } +/************************ standard UI regions ************************/ + +void ED_region_panels(const bContext *C, ARegion *ar, int vertical, char *context) +{ + uiStyle *style= U.uistyles.first; + uiBlock *block; + PanelType *pt; + Panel *panel; + float col[3]; + int xco, yco, x, y, w, em, header; + + header= 20; // XXX + x= style->panelouter; + y= -(header + style->panelouter); + + /* clear */ + UI_GetThemeColor3fv(TH_BACK, col); + glClearColor(col[0], col[1], col[2], 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + /* set view2d view matrix for scrolling (without scrollers) */ + UI_view2d_view_ortho(C, &ar->v2d); + + /* create panels */ + uiBeginPanels(C, ar); + + for(pt= ar->type->paneltypes.first; pt; pt= pt->next) { + /* verify context */ + if(context) + if(!pt->context || strcmp(context, pt->context) != 0) + continue; + + /* draw panel */ + if(pt->draw && (!pt->poll || pt->poll(C, pt))) { + block= uiBeginBlock(C, ar, pt->idname, UI_EMBOSS); + panel= uiBeginPanel(ar, block, pt); + + if(panel) { + if(vertical) { + w= (ar->type->minsizex)? ar->type->minsizex-12: uiBlockAspect(block)*ar->winx-12; + em= (ar->type->minsizex)? 10: 20; + } + else { + w= (ar->type->minsizex)? ar->type->minsizex-12: UI_PANEL_WIDTH-12; + em= (ar->type->minsizex)? 10: 20; + } + + panel->type= pt; + panel->layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, + style->panelspace, 0, w-2*style->panelspace, em, style); + + pt->draw(C, panel); + + uiBlockLayoutResolve(C, block, &xco, &yco); + uiEndPanel(block, w, -yco + 12); + panel->layout= NULL; + } + else { + w= header; + yco= header; + } + + uiEndBlock(C, block); + + if(vertical) + y += yco+style->panelouter; + else + x += w+style->panelouter; + } + } + + uiEndPanels(C, ar); + + /* restore view matrix? */ + UI_view2d_view_restore(C); +} + +void ED_region_header(const bContext *C, ARegion *ar) +{ + uiStyle *style= U.uistyles.first; + uiBlock *block; + uiLayout *layout; + HeaderType *ht; + Header header = {0}; + float col[3]; + int xco, yco; + + /* clear */ + if(ED_screen_area_active(C)) + UI_GetThemeColor3fv(TH_HEADER, col); + else + UI_GetThemeColor3fv(TH_HEADERDESEL, col); + + glClearColor(col[0], col[1], col[2], 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + /* set view2d view matrix for scrolling (without scrollers) */ + UI_view2d_view_ortho(C, &ar->v2d); + + xco= 8; + yco= HEADERY-3; + + /* draw all headers types */ + for(ht= ar->type->headertypes.first; ht; ht= ht->next) { + block= uiBeginBlock(C, ar, "header buttons", UI_EMBOSS); + layout= uiBlockLayout(block, UI_LAYOUT_HORIZONTAL, UI_LAYOUT_HEADER, xco, yco, HEADERY-6, 1, style); + + if(ht->draw) { + header.type= ht; + header.layout= layout; + ht->draw(C, &header); + } + + uiBlockLayoutResolve(C, block, &xco, &yco); + uiEndBlock(C, block); + uiDrawBlock(C, block); + } + + /* always as last */ + UI_view2d_totRect_set(&ar->v2d, xco+XIC+80, ar->v2d.tot.ymax-ar->v2d.tot.ymin); + + /* restore view matrix? */ + UI_view2d_view_restore(C); +} + diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index 74e0bc3852e..e0849bae51f 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -419,7 +419,7 @@ static int get_cached_work_texture(int *w_r, int *h_r) return texid; } -void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *rect) +void glaDrawPixelsTexScaled(float x, float y, int img_w, int img_h, int format, void *rect, float scaleX, float scaleY) { unsigned char *uc_rect= (unsigned char*) rect; float *f_rect= (float *)rect; @@ -460,13 +460,13 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void * glVertex2f(rast_x, rast_y); glTexCoord2f((float) (subpart_w-1)/tex_w, 0); - glVertex2f(rast_x+subpart_w*xzoom, rast_y); + glVertex2f(rast_x+subpart_w*xzoom*scaleX, rast_y); glTexCoord2f((float) (subpart_w-1)/tex_w, (float) (subpart_h-1)/tex_h); - glVertex2f(rast_x+subpart_w*xzoom, rast_y+subpart_h*yzoom); + glVertex2f(rast_x+subpart_w*xzoom*scaleX, rast_y+subpart_h*yzoom*scaleY); glTexCoord2f(0, (float) (subpart_h-1)/tex_h); - glVertex2f(rast_x, rast_y+subpart_h*yzoom); + glVertex2f(rast_x, rast_y+subpart_h*yzoom*scaleY); glEnd(); glDisable(GL_TEXTURE_2D); } @@ -477,6 +477,11 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void * glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); } +void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *rect) +{ + glaDrawPixelsTexScaled(x, y, img_w, img_h, format, rect, 1.0f, 1.0f); +} + void glaDrawPixelsSafe_to32(float fx, float fy, int img_w, int img_h, int row_w, float *rectf) { float *rf; diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index e441a93fe23..10139f9851f 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -1581,7 +1581,7 @@ static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *event) if(items==0) return OPERATOR_CANCELLED; - pup= uiPupMenuBegin(op->type->name, 0); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); for (i=items-1, lastop= wm->operators.last; lastop; lastop= lastop->prev, i--) @@ -1827,7 +1827,7 @@ static void newlevel1(bContext *C, uiLayout *layout, void *arg) static int testing123(bContext *C, wmOperator *op, wmEvent *event) { - uiPopupMenu *pup= uiPupMenuBegin("Hello world", 0); + uiPopupMenu *pup= uiPupMenuBegin(C, "Hello world", 0); uiLayout *layout= uiPupMenuLayout(pup); uiLayoutContext(layout, WM_OP_EXEC_DEFAULT); diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c index 2013c3d72a9..893ef139bad 100644 --- a/source/blender/editors/space_buttons/space_buttons.c +++ b/source/blender/editors/space_buttons/space_buttons.c @@ -170,21 +170,21 @@ static void buttons_main_area_draw(const bContext *C, ARegion *ar) int vertical= (sbuts->align == BUT_VERTICAL); if(sbuts->mainb == BCONTEXT_SCENE) - uiRegionPanelLayout(C, ar, vertical, "scene"); + ED_region_panels(C, ar, vertical, "scene"); else if(sbuts->mainb == BCONTEXT_WORLD) - uiRegionPanelLayout(C, ar, vertical, "world"); + ED_region_panels(C, ar, vertical, "world"); else if(sbuts->mainb == BCONTEXT_OBJECT) - uiRegionPanelLayout(C, ar, vertical, "object"); + ED_region_panels(C, ar, vertical, "object"); else if(sbuts->mainb == BCONTEXT_DATA) - uiRegionPanelLayout(C, ar, vertical, "data"); + ED_region_panels(C, ar, vertical, "data"); else if(sbuts->mainb == BCONTEXT_MATERIAL) - uiRegionPanelLayout(C, ar, vertical, "material"); + ED_region_panels(C, ar, vertical, "material"); else if(sbuts->mainb == BCONTEXT_TEXTURE) - uiRegionPanelLayout(C, ar, vertical, "texture"); + ED_region_panels(C, ar, vertical, "texture"); else if(sbuts->mainb == BCONTEXT_PARTICLE) - uiRegionPanelLayout(C, ar, vertical, "particle"); + ED_region_panels(C, ar, vertical, "particle"); else if(sbuts->mainb == BCONTEXT_PHYSICS) - uiRegionPanelLayout(C, ar, vertical, "physics"); + ED_region_panels(C, ar, vertical, "physics"); sbuts->re_align= 0; sbuts->mainbo= sbuts->mainb; diff --git a/source/blender/editors/space_file/Makefile b/source/blender/editors/space_file/Makefile index c8f2af9c2e8..8f48217473c 100644 --- a/source/blender/editors/space_file/Makefile +++ b/source/blender/editors/space_file/Makefile @@ -48,6 +48,7 @@ CPPFLAGS += -I../../makesrna CPPFLAGS += -I../../imbuf CPPFLAGS += -I../../render/extern/include CPPFLAGS += -I../../python +CPPFLAGS += -I../../blenfont CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include # own include diff --git a/source/blender/editors/space_file/SConscript b/source/blender/editors/space_file/SConscript index 699b988f50f..36e042bdaa6 100644 --- a/source/blender/editors/space_file/SConscript +++ b/source/blender/editors/space_file/SConscript @@ -4,8 +4,8 @@ Import ('env') sources = env.Glob('*.c') incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' -incs += ' ../../blenloader ../../makesrna' -incs += ' ../../render/extern/include ' +incs += ' ../../blenloader ../../makesrna ../../blenfont' +incs += ' ../../render/extern/include' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' defs = [] diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c index dafb254f4bc..55b2910f769 100644 --- a/source/blender/editors/space_file/file_draw.c +++ b/source/blender/editors/space_file/file_draw.c @@ -44,12 +44,16 @@ #include "BKE_global.h" #include "BKE_utildefines.h" +#include "BLF_api.h" + #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" +#include "ED_datafiles.h" + #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" @@ -88,8 +92,6 @@ enum { B_FS_PARENT, } eFile_ButEvents; -/* XXX very bad, need to check font code */ -static int gFontsize=12; static void do_file_buttons(bContext *C, void *arg, int event) { @@ -152,19 +154,6 @@ void file_draw_buttons(const bContext *C, ARegion *ar) uiDefBut(block, BUT, B_FS_CANCEL, "Cancel", xmax-loadbutton, filebuty1, loadbutton, 21, params->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, ""); } -#if 0 - /* menu[0] = NULL happens when no .Bfs is there, and first time browse - disallow external directory browsing for databrowse */ - - if(menu[0] && (params->type != FILE_MAIN)) { - uiDefButS(block, MENU, 0 /* B_FS_DIR_MENU */, menu, xmin, filebuty2, fsmenubut_width, 21, ¶ms->menu, 0, 0, 0, 0, ""); - uiDefBut(block, BUT, 0 /* B_FS_BOOKMARK */, "B", xmin, filebuty1, bookmarkbut_width, 21, 0, 0, 0, 0, 0, "Bookmark current directory"); - } - - MEM_freeN(menu); -#endif - - uiEndBlock(C, block); uiDrawBlock(C, block); } @@ -180,8 +169,6 @@ static void draw_tile(short sx, short sy, short width, short height, int colorid UI_ThemeColorShade(colorid, shade); uiSetRoundBox(15); - // glRecti(sx, sy - height, sx + width, sy); - uiRoundBox(sx, sy - height, sx + width, sy, 6); } @@ -195,14 +182,14 @@ static float shorten_string(char* string, float w, int flag) float sw = 0; float pad = 0; - sw = UI_GetStringWidth(string); + sw = file_string_width(string); if (flag == FILE_SHORTEN_FRONT) { char *s = string; BLI_strncpy(temp, "...", 4); - pad = UI_GetStringWidth(temp); + pad = file_string_width(temp); while (s && (sw+pad>w)) { s++; - sw = UI_GetStringWidth(s); + sw = file_string_width(s); shortened = 1; } if (shortened) { @@ -216,7 +203,7 @@ static float shorten_string(char* string, float w, int flag) while (sw>w) { int slen = strlen(string); string[slen-1] = '\0'; - sw = UI_GetStringWidth(s); + sw = file_string_width(s); shortened = 1; } if (shortened) { @@ -267,7 +254,8 @@ static void file_draw_icon(short sx, short sy, int icon, short width, short heig UI_icon_draw_aspect_blended(x, y, icon, 1.f, blend); } -static void file_draw_string(short sx, short sy, const char* string, short width, short height, int flag) + +static void file_draw_string(short sx, short sy, const char* string, float width, short height, int flag) { short soffs; char fname[FILE_MAXFILE]; @@ -281,12 +269,8 @@ static void file_draw_string(short sx, short sy, const char* string, short width x = (float)(sx); y = (float)(sy-height); - /* XXX TODO: handling of international fonts. - TODO: proper support for utf8 in languages different from ja_JP abd zh_CH - needs update of iconv in lib/windows to support getting the system language string - */ - UI_DrawString(x, y, fname); - + BLF_position(x, y, 0); + BLF_draw(fname); } void file_calc_previews(const bContext *C, ARegion *ar) @@ -329,7 +313,7 @@ void file_draw_previews(const bContext *C, ARegion *ar) ED_fileselect_layout_tilepos(layout, i, &sx, &sy); sx += v2d->tot.xmin+2; sy = v2d->tot.ymax - sy; - file = filelist_file(files, i); + file = filelist_file(files, i); if (file->flags & ACTIVE) { colorid = TH_HILITE; @@ -351,29 +335,54 @@ void file_draw_previews(const bContext *C, ARegion *ar) } if (imb) { - float fx = ((float)layout->prv_w - (float)imb->x)/2.0f; - float fy = ((float)layout->prv_h - (float)imb->y)/2.0f; - float dx = (fx + 0.5f + sfile->layout->prv_border_x); - float dy = (fy + 0.5f - sfile->layout->prv_border_y); - short xco = (float)sx + dx; - short yco = (float)sy - sfile->layout->prv_h + dy; - + float fx, fy; + float dx, dy; + short xco, yco; + float scaledx, scaledy; + float scale; + short ex, ey; + + if ( (imb->x > layout->prv_w) || (imb->y > layout->prv_h) ) { + if (imb->x > imb->y) { + scaledx = (float)layout->prv_w; + scaledy = ( (float)imb->y/(float)imb->x )*layout->prv_w; + scale = scaledx/imb->x; + } + else { + scaledy = (float)layout->prv_h; + scaledx = ( (float)imb->x/(float)imb->y )*layout->prv_h; + scale = scaledy/imb->y; + } + } else { + scaledx = (float)imb->x; + scaledy = (float)imb->y; + scale = 1.0; + } + ex = (short)scaledx; + ey = (short)scaledy; + fx = ((float)layout->prv_w - (float)ex)/2.0f; + fy = ((float)layout->prv_h - (float)ey)/2.0f; + dx = (fx + 0.5f + sfile->layout->prv_border_x); + dy = (fy + 0.5f - sfile->layout->prv_border_y); + xco = (float)sx + dx; + yco = (float)sy - sfile->layout->prv_h + dy; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); /* shadow */ if (!is_icon && (file->flags & IMAGEFILE)) - uiDrawBoxShadow(220, xco, yco, xco + imb->x, yco + imb->y); + uiDrawBoxShadow(220, xco, yco, xco + ex, yco + ey); glEnable(GL_BLEND); /* the image */ glColor4f(1.0, 1.0, 1.0, 1.0); - glaDrawPixelsTex(xco, yco, imb->x, imb->y, GL_UNSIGNED_BYTE, imb->rect); + glaDrawPixelsTexScaled(xco, yco, imb->x, imb->y, GL_UNSIGNED_BYTE, imb->rect, scale, scale); /* border */ if (!is_icon && (file->flags & IMAGEFILE)) { glColor4f(0.0f, 0.0f, 0.0f, 0.4f); - fdrawbox(xco, yco, xco + imb->x, yco + imb->y); + fdrawbox(xco, yco, xco + ex, yco + ey); } glDisable(GL_BLEND); @@ -443,17 +452,14 @@ void file_draw_list(const bContext *C, ARegion *ar) if (offset<0) offset=0; /* alternating flat shade background */ - for (i=0; (i <= layout->rows); ++i) + for (i=0; (i <= layout->rows); i+=2) { sx = v2d->cur.xmin; sy = v2d->cur.ymax - i*(layout->tile_h+2*layout->tile_border_y) - layout->tile_border_y; - - if (i % 2) { - UI_ThemeColor(TH_BACK); - } else { - UI_ThemeColorShade(TH_BACK, -7); - } + + UI_ThemeColorShade(TH_BACK, -7); glRectf(v2d->cur.xmin, sy, v2d->cur.xmax, sy+layout->tile_h+2*layout->tile_border_y); + } /* vertical column dividers */ @@ -493,15 +499,14 @@ void file_draw_list(const bContext *C, ARegion *ar) UI_ThemeColor4(TH_TEXT); - - sw = UI_GetStringWidth(file->relname); + sw = file_string_width(file->relname); file_draw_string(spos, sy, file->relname, sw, layout->tile_h, FILE_SHORTEN_END); - spos += filelist_column_len(sfile->files, COLUMN_NAME) + 10; + spos += layout->column_widths[COLUMN_NAME] + 12; if (params->display == FILE_SHOWSHORT) { if (!(file->type & S_IFDIR)) { - sw = UI_GetStringWidth(file->size); - spos += filelist_column_len(sfile->files, COLUMN_SIZE) + 10 - sw; - file_draw_string(spos, sy, file->size, sw, layout->tile_h, FILE_SHORTEN_END); + sw = file_string_width(file->size); + spos += layout->column_widths[COLUMN_SIZE] + 12 - sw; + file_draw_string(spos, sy, file->size, sw+1, layout->tile_h, FILE_SHORTEN_END); } } else { #if 0 // XXX TODO: add this for non-windows systems @@ -524,17 +529,17 @@ void file_draw_list(const bContext *C, ARegion *ar) #endif - sw = UI_GetStringWidth(file->date); + sw = file_string_width(file->date); file_draw_string(spos, sy, file->date, sw, layout->tile_h, FILE_SHORTEN_END); - spos += filelist_column_len(sfile->files, COLUMN_DATE) + 10; + spos += layout->column_widths[COLUMN_DATE] + 12; - sw = UI_GetStringWidth(file->time); + sw = file_string_width(file->time); file_draw_string(spos, sy, file->time, sw, layout->tile_h, FILE_SHORTEN_END); - spos += filelist_column_len(sfile->files, COLUMN_TIME) + 10; + spos += layout->column_widths[COLUMN_TIME] + 12; if (!(file->type & S_IFDIR)) { - sw = UI_GetStringWidth(file->size); - spos += filelist_column_len(sfile->files, COLUMN_SIZE) + 10 - sw; + sw = file_string_width(file->size); + spos += layout->column_widths[COLUMN_SIZE] + 12 - sw; file_draw_string(spos, sy, file->size, sw, layout->tile_h, FILE_SHORTEN_END); } } @@ -546,10 +551,10 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate struct FSMenu* fsmenu = fsmenu_get(); char bookmark[FILE_MAX]; int nentries = fsmenu_get_nentries(fsmenu, category); - int linestep = gFontsize*2.0f; + short sx, sy, xpos, ypos; int bmwidth = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*TILE_BORDER_X - ICON_DEFAULT_WIDTH - 4; - int fontsize = gFontsize; + int fontsize = file_font_pointsize(); int cat_icon; int i; @@ -559,7 +564,7 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate UI_ThemeColor(TH_TEXT_HI); file_draw_string(sx, sy, category_name, bmwidth, fontsize, FILE_SHORTEN_END); - sy -= linestep; + sy -= fontsize*2.0f; switch(category) { case FS_CATEGORY_SYSTEM: @@ -579,17 +584,15 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate sl = strlen(bookmark)-1; if (sl > 1) { - while (bookmark[sl] == '\\' || bookmark[sl] == '/') { - bookmark[sl] = '\0'; - sl--; - } + while (bookmark[sl] == '\\' || bookmark[sl] == '/') { + bookmark[sl] = '\0'; + sl--; + } } if (fsmenu_is_selected(fsmenu, category, i) ) { UI_ThemeColor(TH_HILITE); - //uiSetRoundBox(15); - uiRoundBox(sx, sy - linestep, ar->v2d.cur.xmax - TILE_BORDER_X, sy, 4.0f); - // glRectf(ar->v2d.cur.xmin, sy-linestep, ar->v2d.cur.xmax + 2*TILE_BORDER_X, sy); + uiRoundBox(sx, sy - fontsize*2.0f, ar->v2d.cur.xmax - TILE_BORDER_X, sy, 4.0f); UI_ThemeColor(TH_TEXT); } else { UI_ThemeColor(TH_TEXT_HI); @@ -601,7 +604,7 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate file_draw_icon(xpos, ypos, cat_icon, ICON_DEFAULT_WIDTH, ICON_DEFAULT_WIDTH); xpos += ICON_DEFAULT_WIDTH + 4; file_draw_string(xpos, ypos, bookmark, bmwidth, fontsize, FILE_SHORTEN_FRONT); - sy -= linestep; + sy -= fontsize*2.0; fsmenu_set_pos(fsmenu, category, i, xpos, ypos); } } @@ -611,9 +614,9 @@ static void file_draw_fsmenu_category(const bContext *C, ARegion *ar, FSMenuCate void file_draw_fsmenu(const bContext *C, ARegion *ar) { - int linestep = gFontsize*2.0f; + int linestep = file_font_pointsize()*2.0f; short sy= ar->v2d.cur.ymax-2*TILE_BORDER_Y; - + file_draw_fsmenu_category(C, ar, FS_CATEGORY_SYSTEM, "SYSTEM", &sy); sy -= linestep; file_draw_fsmenu_category(C, ar, FS_CATEGORY_BOOKMARKS, "BOOKMARKS", &sy); diff --git a/source/blender/editors/space_file/file_header.c b/source/blender/editors/space_file/file_header.c index b7276c933e6..bfa0a553334 100644 --- a/source/blender/editors/space_file/file_header.c +++ b/source/blender/editors/space_file/file_header.c @@ -154,19 +154,20 @@ void file_header_buttons(const bContext *C, ARegion *ar) xco+=XIC; } */ + + uiDefIconButBitS(block, TOG, FILE_FILTER, B_FILTERIMASELDIR, ICON_FILTER,xco+=XIC,yco,XIC,YIC, ¶ms->flag, 0, 0, 0, 0, "Filter files"); - uiDefIconButBitS(block, TOG, FILE_FILTER, B_FILTERIMASELDIR, ICON_FILTER,xco+=XIC,0,XIC,YIC, ¶ms->flag, 0, 0, 0, 0, "Filter files"); if (params->flag & FILE_FILTER) { xco+=4; uiBlockBeginAlign(block); - uiDefIconButBitS(block, TOG, IMAGEFILE, B_FILTERIMASELDIR, ICON_FILE_IMAGE,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show images"); - uiDefIconButBitS(block, TOG, BLENDERFILE, B_FILTERIMASELDIR, ICON_FILE_BLEND,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show .blend files"); - uiDefIconButBitS(block, TOG, MOVIEFILE, B_FILTERIMASELDIR, ICON_FILE_MOVIE,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show movies"); - uiDefIconButBitS(block, TOG, PYSCRIPTFILE, B_FILTERIMASELDIR, ICON_FILE_SCRIPT,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show python scripts"); - uiDefIconButBitS(block, TOG, FTFONTFILE, B_FILTERIMASELDIR, ICON_FILE_FONT,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show fonts"); - uiDefIconButBitS(block, TOG, SOUNDFILE, B_FILTERIMASELDIR, ICON_FILE_SOUND,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show sound files"); - uiDefIconButBitS(block, TOG, TEXTFILE, B_FILTERIMASELDIR, ICON_FILE_BLANK,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show text files"); - uiDefIconButBitS(block, TOG, FOLDERFILE, B_FILTERIMASELDIR, ICON_FILE_FOLDER,xco+=XIC,0,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show folders"); + uiDefIconButBitS(block, TOG, IMAGEFILE, B_FILTERIMASELDIR, ICON_FILE_IMAGE,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show images"); + uiDefIconButBitS(block, TOG, BLENDERFILE, B_FILTERIMASELDIR, ICON_FILE_BLEND,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show .blend files"); + uiDefIconButBitS(block, TOG, MOVIEFILE, B_FILTERIMASELDIR, ICON_FILE_MOVIE,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show movies"); + uiDefIconButBitS(block, TOG, PYSCRIPTFILE, B_FILTERIMASELDIR, ICON_FILE_SCRIPT,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show python scripts"); + uiDefIconButBitS(block, TOG, FTFONTFILE, B_FILTERIMASELDIR, ICON_FILE_FONT,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show fonts"); + uiDefIconButBitS(block, TOG, SOUNDFILE, B_FILTERIMASELDIR, ICON_FILE_SOUND,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show sound files"); + uiDefIconButBitS(block, TOG, TEXTFILE, B_FILTERIMASELDIR, ICON_FILE_BLANK,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show text files"); + uiDefIconButBitS(block, TOG, FOLDERFILE, B_FILTERIMASELDIR, ICON_FILE_FOLDER,xco+=XIC,yco,XIC,YIC, ¶ms->filter, 0, 0, 0, 0, "Show folders"); uiBlockEndAlign(block); xco+=XIC; } diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h index 80b7eb21818..642189ad3fd 100644 --- a/source/blender/editors/space_file/file_intern.h +++ b/source/blender/editors/space_file/file_intern.h @@ -68,5 +68,9 @@ int file_cancel_exec(bContext *C, struct wmOperator *unused); int file_parent_exec(bContext *C, struct wmOperator *unused); int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my); +/* filesel.c */ +float file_string_width(const char* str); +float file_font_pointsize(); + #endif /* ED_FILE_INTERN_H */ diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c index 28a83c4cf80..94c023207f5 100644 --- a/source/blender/editors/space_file/file_ops.c +++ b/source/blender/editors/space_file/file_ops.c @@ -66,7 +66,7 @@ /* ---------- FILE SELECTION ------------ */ -static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, short y) +static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, short x, short y) { float fx,fy; int active_file = -1; @@ -77,7 +77,6 @@ static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, sh active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy); - printf("FINDFILE %d\n", active_file); if ( (active_file < 0) || (active_file >= numfiles) ) { active_file = -1; @@ -86,24 +85,6 @@ static int find_file_mouse_hor(SpaceFile *sfile, struct ARegion* ar, short x, sh } -static int find_file_mouse_vert(SpaceFile *sfile, struct ARegion* ar, short x, short y) -{ - float fx,fy; - int active_file = -1; - int numfiles = filelist_numfiles(sfile->files); - View2D* v2d = &ar->v2d; - - UI_view2d_region_to_view(v2d, x, y, &fx, &fy); - - active_file = ED_fileselect_layout_offset(sfile->layout, v2d->tot.xmin + fx, v2d->tot.ymax - fy); - - if ( (active_file < 0) || (active_file >= numfiles) ) - { - active_file = -1; - } - return active_file; -} - static void file_deselect_all(SpaceFile* sfile) { int numfiles = filelist_numfiles(sfile->files); @@ -129,13 +110,8 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v int numfiles = filelist_numfiles(sfile->files); params->selstate = NOTACTIVE; - if ( (layout->flag == FILE_LAYOUT_HOR) ) { - first_file = find_file_mouse_hor(sfile, ar, rect->xmin, rect->ymax); - last_file = find_file_mouse_hor(sfile, ar, rect->xmax, rect->ymin); - } else { - first_file = find_file_mouse_vert(sfile, ar, rect->xmin, rect->ymax); - last_file = find_file_mouse_vert(sfile, ar, rect->xmax, rect->ymin); - } + first_file = find_file_mouse(sfile, ar, rect->xmin, rect->ymax); + last_file = find_file_mouse(sfile, ar, rect->xmax, rect->ymin); /* select all valid files between first and last indicated */ if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) { @@ -147,8 +123,6 @@ static void file_select(SpaceFile* sfile, ARegion* ar, const rcti* rect, short v file->flags &= ~ACTIVE; } } - - printf("Selecting %d %d\n", first_file, last_file); /* make the last file active */ if (last_file >= 0 && last_file < numfiles) { @@ -318,30 +292,11 @@ void FILE_OT_select_all_toggle(wmOperatorType *ot) /* ---------- BOOKMARKS ----------- */ -#define MARK_HEIGHT 22 - -static void set_active_bookmark(FileSelectParams* params, struct ARegion* ar, short x, short y) -{ - int nentries = fsmenu_get_nentries(fsmenu_get(), FS_CATEGORY_BOOKMARKS); - float fx, fy; - short posy; - - UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy); - - posy = ar->v2d.cur.ymax - 2*TILE_BORDER_Y - fy; - posy -= MARK_HEIGHT; /* header */ - - params->active_bookmark = ((float)posy / (MARK_HEIGHT)); - if (params->active_bookmark < 0 || params->active_bookmark > nentries) { - params->active_bookmark = -1; - } -} - static int file_select_bookmark_category(SpaceFile* sfile, ARegion* ar, short x, short y, FSMenuCategory category) { struct FSMenu* fsmenu = fsmenu_get(); int nentries = fsmenu_get_nentries(fsmenu, category); - int linestep = MARK_HEIGHT; + int linestep = file_font_pointsize()*2.0f; short xs, ys; int i; int selected = -1; @@ -450,25 +405,20 @@ void FILE_OT_loadimages(wmOperatorType *ot) int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my) { FileSelectParams* params; - FileLayout* layout; int numfiles, actfile; if(sfile==NULL || sfile->files==NULL) return 0; numfiles = filelist_numfiles(sfile->files); params = ED_fileselect_get_params(sfile); - layout = ED_fileselect_get_layout(sfile, ar); - if ( (layout->flag == FILE_LAYOUT_HOR)) { - actfile = find_file_mouse_hor(sfile, ar, mx , my); - } else { - actfile = find_file_mouse_vert(sfile, ar, mx, my); - } + actfile = find_file_mouse(sfile, ar, mx , my); if (params && (actfile >= 0) && (actfile < numfiles) ) { params->active_file=actfile; return 1; - } + } + params->active_file= -1; return 0; } diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c index 9d7f16000c9..01cdf559c58 100644 --- a/source/blender/editors/space_file/filelist.c +++ b/source/blender/editors/space_file/filelist.c @@ -120,7 +120,6 @@ typedef struct FileList short hide_dot; unsigned int filter; short changed; - int columns[MAX_FILE_COLUMN]; ListBase loadimages; ListBase threads; } FileList; @@ -531,7 +530,7 @@ void filelist_loadimage(struct FileList* filelist, int index) dx = imgwidth - ex; dy = imgheight - ey; - IMB_scaleImBuf(imb, ex, ey); + // IMB_scaleImBuf(imb, ex, ey); filelist->filelist[fidx].image = imb; } else { /* prevent loading image twice */ @@ -622,6 +621,7 @@ struct direntry * filelist_file(struct FileList* filelist, int index) return &filelist->filelist[fidx]; } + int filelist_find(struct FileList* filelist, char *file) { int index = -1; @@ -658,15 +658,9 @@ void filelist_setfilter(struct FileList* filelist, unsigned int filter) filelist->filter = filter; } -int filelist_column_len(struct FileList* filelist, FileListColumns column) -{ - return filelist->columns[column]; -} - void filelist_readdir(struct FileList* filelist) { char wdir[FILE_MAX]; - int i; if (!filelist) return; filelist->fidx = 0; @@ -685,34 +679,6 @@ void filelist_readdir(struct FileList* filelist) if (!filelist->threads.first) { BLI_init_threads(&filelist->threads, exec_loadimages, 2); } - - for (i=0; i<MAX_FILE_COLUMN; ++i) { - filelist->columns[i] = 0; - } - - for (i=0; (i < filelist->numfiles); ++i) - { - struct direntry* file = filelist_file(filelist, i); - if (file) { - int len; - len = UI_GetStringWidth(file->relname); - if (len > filelist->columns[COLUMN_NAME]) filelist->columns[COLUMN_NAME] = len; - len = UI_GetStringWidth(file->date); - if (len > filelist->columns[COLUMN_DATE]) filelist->columns[COLUMN_DATE] = len; - len = UI_GetStringWidth(file->time); - if (len > filelist->columns[COLUMN_TIME]) filelist->columns[COLUMN_TIME] = len; - len = UI_GetStringWidth(file->size); - if (len > filelist->columns[COLUMN_SIZE]) filelist->columns[COLUMN_SIZE] = len; - len = UI_GetStringWidth(file->mode1); - if (len > filelist->columns[COLUMN_MODE1]) filelist->columns[COLUMN_MODE1] = len; - len = UI_GetStringWidth(file->mode2); - if (len > filelist->columns[COLUMN_MODE2]) filelist->columns[COLUMN_MODE2] = len; - len = UI_GetStringWidth(file->mode3); - if (len > filelist->columns[COLUMN_MODE3]) filelist->columns[COLUMN_MODE3] = len; - len = UI_GetStringWidth(file->owner); - if (len > filelist->columns[COLUMN_OWNER]) filelist->columns[COLUMN_OWNER] = len; - } - } } int filelist_empty(struct FileList* filelist) diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h index 26a2d46f5a7..4aa8359b068 100644 --- a/source/blender/editors/space_file/filelist.h +++ b/source/blender/editors/space_file/filelist.h @@ -41,19 +41,7 @@ struct FileList; struct direntry; struct BlendHandle; struct Scene; - -#define MAX_FILE_COLUMN 8 - -typedef enum FileListColumns { - COLUMN_NAME = 0, - COLUMN_DATE, - COLUMN_TIME, - COLUMN_SIZE, - COLUMN_MODE1, - COLUMN_MODE2, - COLUMN_MODE3, - COLUMN_OWNER -} FileListColumns; +struct rcti; struct FileList * filelist_new(); void filelist_init_icons(); @@ -78,7 +66,6 @@ struct ImBuf * filelist_getimage(struct FileList* filelist, int index); struct ImBuf * filelist_geticon(struct FileList* filelist, int index); short filelist_changed(struct FileList* filelist); void filelist_readdir(struct FileList* filelist); -int filelist_column_len(struct FileList* filelist, FileListColumns column); int filelist_empty(struct FileList* filelist); void filelist_parent(struct FileList* filelist); diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c index 126ef69aaec..cbd1457e562 100644 --- a/source/blender/editors/space_file/filesel.c +++ b/source/blender/editors/space_file/filesel.c @@ -45,6 +45,7 @@ #include "DNA_space_types.h" #include "DNA_scene_types.h" #include "DNA_screen_types.h" +#include "DNA_userdef_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -58,6 +59,8 @@ #include "BKE_screen.h" #include "BKE_global.h" +#include "BLF_api.h" + #include "DNA_userdef_types.h" #include "ED_screen.h" @@ -144,14 +147,13 @@ int ED_fileselect_layout_offset(FileLayout* layout, int x, int y) offsetx = (x)/(layout->tile_w + 2*layout->tile_border_x); offsety = (y)/(layout->tile_h + 2*layout->tile_border_y); - if (offsetx > layout->columns-1) offsetx = layout->columns-1 ; - if (offsety > layout->rows-1) offsety = layout->rows-1 ; + if (offsetx > layout->columns-1) offsetx = -1 ; + if (offsety > layout->rows-1) offsety = -1 ; if (layout->flag & FILE_LAYOUT_HOR) active_file = layout->rows*offsetx + offsety; else active_file = offsetx + layout->columns*offsety; - printf("OFFSET %d %d %d %d %d\n", x,y, offsetx, offsety, active_file); return active_file; } @@ -166,6 +168,56 @@ void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, short *x, short } } +float file_string_width(const char* str) +{ + uiStyle *style= U.uistyles.first; + uiStyleFontSet(&style->widget); + return BLF_width(str); +} + +float file_font_pointsize() +{ + float s; + char tmp[2] = "X"; + uiStyle *style= U.uistyles.first; + uiStyleFontSet(&style->widget); + s = BLF_height(tmp); + return style->widget.points; +} + +static void column_widths(struct FileList* files, struct FileLayout* layout) +{ + int i; + int numfiles = filelist_numfiles(files); + + for (i=0; i<MAX_FILE_COLUMN; ++i) { + layout->column_widths[i] = 0; + } + + for (i=0; (i < numfiles); ++i) + { + struct direntry* file = filelist_file(files, i); + if (file) { + int len; + len = file_string_width(file->relname); + if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len; + len = file_string_width(file->date); + if (len > layout->column_widths[COLUMN_DATE]) layout->column_widths[COLUMN_DATE] = len; + len = file_string_width(file->time); + if (len > layout->column_widths[COLUMN_TIME]) layout->column_widths[COLUMN_TIME] = len; + len = file_string_width(file->size); + if (len > layout->column_widths[COLUMN_SIZE]) layout->column_widths[COLUMN_SIZE] = len; + len = file_string_width(file->mode1); + if (len > layout->column_widths[COLUMN_MODE1]) layout->column_widths[COLUMN_MODE1] = len; + len = file_string_width(file->mode2); + if (len > layout->column_widths[COLUMN_MODE2]) layout->column_widths[COLUMN_MODE2] = len; + len = file_string_width(file->mode3); + if (len > layout->column_widths[COLUMN_MODE3]) layout->column_widths[COLUMN_MODE3] = len; + len = file_string_width(file->owner); + if (len > layout->column_widths[COLUMN_OWNER]) layout->column_widths[COLUMN_OWNER] = len; + } + } +} void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar) { @@ -173,11 +225,10 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar) View2D *v2d= &ar->v2d; int maxlen = 0; int numfiles = filelist_numfiles(sfile->files); - + int textheight = file_font_pointsize(); if (sfile->layout == 0) { sfile->layout = MEM_callocN(sizeof(struct FileLayout), "file_layout"); } - if (params->display == FILE_IMGDISPLAY) { sfile->layout->prv_w = 96; sfile->layout->prv_h = 96; @@ -186,7 +237,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar) sfile->layout->prv_border_x = 6; sfile->layout->prv_border_y = 6; sfile->layout->tile_w = sfile->layout->prv_w + 2*sfile->layout->prv_border_x; - sfile->layout->tile_h = sfile->layout->prv_h + 2*sfile->layout->prv_border_y + 12; // XXX 12 = font h + sfile->layout->tile_h = sfile->layout->prv_h + 2*sfile->layout->prv_border_y + textheight; sfile->layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*sfile->layout->tile_border_x); sfile->layout->columns= sfile->layout->width / (sfile->layout->tile_w + 2*sfile->layout->tile_border_x); if(sfile->layout->columns > 0) @@ -204,23 +255,22 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar) sfile->layout->tile_border_y = 2; sfile->layout->prv_border_x = 0; sfile->layout->prv_border_y = 0; - sfile->layout->tile_h = 12*3/2; // XXX 12 = font h + sfile->layout->tile_h = textheight*3/2; sfile->layout->height= v2d->cur.ymax - v2d->cur.ymin; sfile->layout->rows = sfile->layout->height / (sfile->layout->tile_h + 2*sfile->layout->tile_border_y);; + column_widths(sfile->files, sfile->layout); + if (params->display == FILE_SHORTDISPLAY) { - maxlen = filelist_column_len(sfile->files, COLUMN_NAME) + - filelist_column_len(sfile->files, COLUMN_SIZE); + maxlen = sfile->layout->column_widths[COLUMN_NAME] + + sfile->layout->column_widths[COLUMN_SIZE]; maxlen += 20+2*10; // for icon and space between columns } else { - maxlen = filelist_column_len(sfile->files, COLUMN_NAME) + - filelist_column_len(sfile->files, COLUMN_DATE) + - filelist_column_len(sfile->files, COLUMN_TIME) + - filelist_column_len(sfile->files, COLUMN_SIZE) /* + - filelist_column_len(sfile->files, COLUMN_MODE1) + - filelist_column_len(sfile->files, COLUMN_MODE2) + - filelist_column_len(sfile->files, COLUMN_MODE3) + - filelist_column_len(sfile->files, COLUMN_OWNER) */ ; + maxlen = sfile->layout->column_widths[COLUMN_NAME] + + sfile->layout->column_widths[COLUMN_DATE] + + sfile->layout->column_widths[COLUMN_TIME] + + sfile->layout->column_widths[COLUMN_SIZE]; + /* XXX add mode1, mode2, mode3, owner columns for non-windows platforms */ maxlen += 20+4*10; // for icon and space between columns } sfile->layout->tile_w = maxlen + 40; diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c index d4bdfce5414..a3d0b50b9a6 100644 --- a/source/blender/editors/space_graph/graph_edit.c +++ b/source/blender/editors/space_graph/graph_edit.c @@ -116,19 +116,21 @@ static void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xm for (ale= anim_data.first; ale; ale= ale->next) { Object *nob= NULL; //ANIM_nla_mapping_get(ac, ale); FCurve *fcu= (FCurve *)ale->key_data; - float tmin, tmax; + float txmin, txmax, tymin, tymax; /* get range and apply necessary scaling before */ - calc_fcurve_bounds(fcu, &tmin, &tmax, ymin, ymax); + calc_fcurve_bounds(fcu, &txmin, &txmax, &tymin, &tymax); if (nob) { - tmin= get_action_frame_inv(nob, tmin); - tmax= get_action_frame_inv(nob, tmax); + txmin= get_action_frame_inv(nob, txmin); + txmax= get_action_frame_inv(nob, txmax); } /* try to set cur using these values, if they're more extreme than previously set values */ - if (xmin) *xmin= MIN2(*xmin, tmin); - if (xmax) *xmax= MAX2(*xmax, tmax); + if ((xmin) && (txmin < *xmin)) *xmin= txmin; + if ((xmax) && (txmax > *xmax)) *xmax= txmax; + if ((ymin) && (tymin < *ymin)) *ymin= tymin; + if ((ymax) && (tymax > *ymax)) *ymax= tymax; } /* free memory */ diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c index 457d322f565..a584993005a 100644 --- a/source/blender/editors/space_image/image_header.c +++ b/source/blender/editors/space_image/image_header.c @@ -945,7 +945,7 @@ static int toolbox_invoke(bContext *C, wmOperator *op, wmEvent *event) show_uvedit= ED_space_image_show_uvedit(sima, obedit); - pup= uiPupMenuBegin("Toolbox", 0); + pup= uiPupMenuBegin(C, "Toolbox", 0); layout= uiPupMenuLayout(pup); uiItemMenuF(layout, "View", 0, image_viewmenu); diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 908b24bd84d..6efd508c335 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1133,7 +1133,7 @@ static int pack_invoke(bContext *C, wmOperator *op, wmEvent *event) return OPERATOR_CANCELLED; if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) { - pup= uiPupMenuBegin("OK", ICON_HELP); + pup= uiPupMenuBegin(C, "OK", ICON_HELP); layout= uiPupMenuLayout(pup); uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", 0, op->idname, "as_png", 1); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c index 577dae433c1..33fa85dbb5d 100644 --- a/source/blender/editors/space_text/space_text.c +++ b/source/blender/editors/space_text/space_text.c @@ -354,7 +354,7 @@ static void text_header_area_init(wmWindowManager *wm, ARegion *ar) static void text_header_area_draw(const bContext *C, ARegion *ar) { - uiRegionHeaderLayout(C, ar); + ED_region_header(C, ar); } /****************** properties region ******************/ @@ -367,7 +367,7 @@ static void text_properties_area_init(wmWindowManager *wm, ARegion *ar) static void text_properties_area_draw(const bContext *C, ARegion *ar) { - uiRegionPanelLayout(C, ar, 1, NULL); + ED_region_panels(C, ar, 1, NULL); } /********************* registration ********************/ diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c index 83c144d88c5..fe00b86e19f 100644 --- a/source/blender/editors/space_text/text_header.c +++ b/source/blender/editors/space_text/text_header.c @@ -323,7 +323,7 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPopupMenu *pup; if(text) { - pup= uiPupMenuBegin("Text", 0); + pup= uiPupMenuBegin(C, "Text", 0); if(txt_has_sel(text)) { uiItemO(layout, NULL, 0, "TEXT_OT_cut"); uiItemO(layout, NULL, 0, "TEXT_OT_copy"); @@ -337,7 +337,7 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPupMenuEnd(C, pup); } else { - pup= uiPupMenuBegin("File", 0); + pup= uiPupMenuBegin(C, "File", 0); uiItemO(layout, NULL, 0, "TEXT_OT_new"); uiItemO(layout, NULL, 0, "TEXT_OT_open"); uiPupMenuEnd(C, pup); @@ -349,7 +349,7 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPopupMenu *pup; - pup= uiPupMenuBegin("Edit", 0); + pup= uiPupMenuBegin(C, "Edit", 0); uiItemO(layout, NULL, 0, "TEXT_OT_cut"); uiItemO(layout, NULL, 0, "TEXT_OT_copy"); uiItemO(layout, NULL, 0, "TEXT_OT_paste"); @@ -362,7 +362,7 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPopupMenu *pup; if(text) { - pup= uiPupMenuBegin("Text", 0); + pup= uiPupMenuBegin(C, "Text", 0); uiItemO(layout, NULL, 0, "TEXT_OT_new"); uiItemO(layout, NULL, 0, "TEXT_OT_open"); uiItemO(layout, NULL, 0, "TEXT_OT_save"); @@ -371,7 +371,7 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPupMenuEnd(C, pup); } else { - pup= uiPupMenuBegin("File", 0); + pup= uiPupMenuBegin(C, "File", 0); uiItemO(layout, NULL, 0, "TEXT_OT_new"); uiItemO(layout, NULL, 0, "TEXT_OT_open"); uiPupMenuEnd(C, pup); @@ -383,7 +383,7 @@ void TEXT_OT_properties(wmOperatorType *ot) uiPopupMenu *pup; - pup= uiPupMenuBegin("Text", 0); + pup= uiPupMenuBegin(C, "Text", 0); uiItemEnumO(layout, "Top of File", 0, "TEXT_OT_move", "type", FILE_TOP); uiItemEnumO(layout, "Bottom of File", 0, "TEXT_OT_move", "type", FILE_BOTTOM); uiItemEnumO(layout, "Page Up", 0, "TEXT_OT_move", "type", PREV_PAGE); diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c index 913bd307ab2..5f974e7bcbb 100644 --- a/source/blender/editors/space_text/text_ops.c +++ b/source/blender/editors/space_text/text_ops.c @@ -2540,7 +2540,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event) case 1: if(text->flags & TXT_ISDIRTY) { /* modified locally and externally, ahhh. offer more possibilites. */ - pup= uiPupMenuBegin("File Modified Outside and Inside Blender", 0); + pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", 0); layout= uiPupMenuLayout(pup); uiItemEnumO(layout, "Reload from disk (ignore local changes)", 0, op->type->idname, "resolution", RESOLVE_RELOAD); uiItemEnumO(layout, "Save to disk (ignore outside changes)", 0, op->type->idname, "resolution", RESOLVE_SAVE); @@ -2548,7 +2548,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPupMenuEnd(C, pup); } else { - pup= uiPupMenuBegin("File Modified Outside Blender", 0); + pup= uiPupMenuBegin(C, "File Modified Outside Blender", 0); layout= uiPupMenuLayout(pup); uiItemEnumO(layout, "Reload from disk", 0, op->type->idname, "resolution", RESOLVE_RELOAD); uiItemEnumO(layout, "Make text internal (separate copy)", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL); @@ -2557,7 +2557,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *event) } break; case 2: - pup= uiPupMenuBegin("File Deleted Outside Blender", 0); + pup= uiPupMenuBegin(C, "File Deleted Outside Blender", 0); layout= uiPupMenuLayout(pup); uiItemEnumO(layout, "Make text internal", 0, op->type->idname, "resolution", RESOLVE_MAKE_INTERNAL); uiItemEnumO(layout, "Recreate file", 0, op->type->idname, "resolution", RESOLVE_SAVE); diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 24d211d81ab..9c0cffb547a 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -5554,7 +5554,7 @@ static int editmesh_face_toolbox_invoke(bContext *C, wmOperator *op, wmEvent *ev uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("Edit Faces", 0); + pup= uiPupMenuBegin(C, "Edit Faces", 0); layout= uiPupMenuLayout(pup); uiItemO(layout, NULL, 0, "MESH_OT_fill"); diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c index 7b417c94a73..fba8d13c6a5 100644 --- a/source/blender/editors/space_view3d/view3d_snap.c +++ b/source/blender/editors/space_view3d/view3d_snap.c @@ -1113,7 +1113,7 @@ int minmax_verts(Object *obedit, float *min, float *max) static int snap_menu_invoke(bContext *C, wmOperator *unused, wmEvent *event) { - uiPopupMenu *pup= uiPupMenuBegin("Snap", 0); + uiPopupMenu *pup= uiPupMenuBegin(C, "Snap", 0); uiLayout *layout= uiPupMenuLayout(pup); uiItemO(layout, NULL, 0, "VIEW3D_OT_snap_selected_to_grid"); diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 4212964ccec..674de81a9f5 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -599,6 +599,7 @@ void transformEvent(TransInfo *t, wmEvent *event) resetTransRestrictions(t); restoreTransObjects(t); initTranslation(t); + initSnapping(t, NULL); // need to reinit after mode change t->redraw = 1; } break; @@ -608,6 +609,7 @@ void transformEvent(TransInfo *t, wmEvent *event) resetTransRestrictions(t); restoreTransObjects(t); initResize(t); + initSnapping(t, NULL); // need to reinit after mode change t->redraw = 1; } break; @@ -625,6 +627,7 @@ void transformEvent(TransInfo *t, wmEvent *event) restoreTransObjects(t); initRotation(t); } + initSnapping(t, NULL); // need to reinit after mode change t->redraw = 1; } break; diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index 46a6f121990..769001b30a8 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -122,7 +122,7 @@ static int select_orientation_invoke(bContext *C, wmOperator *op, wmEvent *event uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("Orientation", 0); + pup= uiPupMenuBegin(C, "Orientation", 0); layout= uiPupMenuLayout(pup); BIF_menuTransformOrientation(C, layout, NULL); uiPupMenuEnd(C, pup); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c index be571c132ab..27d0c68ec36 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c @@ -1287,7 +1287,7 @@ static int mapping_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("UV Mapping", 0); + pup= uiPupMenuBegin(C, "UV Mapping", 0); layout= uiPupMenuLayout(pup); uiItemO(layout, NULL, 0, "UV_OT_unwrap"); diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index ab2b7ba498a..c7a74fe5358 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -100,8 +100,10 @@ typedef struct uiStyle { short boxspace; short buttonspacex; short buttonspacey; + short panelspace; + short panelouter; - short pad; + short pad[3]; } uiStyle; typedef struct uiWidgetColors { diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c index 5532ab90e42..cfe1778db41 100644 --- a/source/blender/makesrna/intern/rna_access.c +++ b/source/blender/makesrna/intern/rna_access.c @@ -69,8 +69,11 @@ void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr) memset(&tmp, 0, sizeof(tmp)); tmp.data= id; idtype= rna_ID_refine(&tmp); + + if(idtype->refine) + idtype= idtype->refine(&tmp); } - + r_ptr->id.data= id; r_ptr->type= idtype; r_ptr->data= id; @@ -379,6 +382,30 @@ PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier) return prop; } +/* Find the property which uses the given nested struct */ +PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna) +{ + CollectionPropertyIterator iter; + PropertyRNA *iterprop, *prop; + int i = 0; + + iterprop= RNA_struct_iterator_property(ptr->type); + RNA_property_collection_begin(ptr, iterprop, &iter); + prop= NULL; + + for(; iter.valid; RNA_property_collection_next(&iter), i++) { + /* This assumes that there can only be one user of this nested struct */ + if (RNA_property_pointer_type(iter.ptr.data) == srna) { + prop= iter.ptr.data; + break; + } + } + + RNA_property_collection_end(&iter); + + return prop; +} + const struct ListBase *RNA_struct_defined_properties(StructRNA *srna) { return &srna->cont.properties; @@ -1715,8 +1742,25 @@ char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop) return NULL; if(!RNA_struct_is_ID(ptr->type)) { - if(ptr->type->path) + if(ptr->type->path) { + /* if type has a path to some ID, use it */ ptrpath= ptr->type->path(ptr); + } + else if(ptr->type->nested) { + PointerRNA parentptr; + PropertyRNA *userprop; + + /* find the property in the struct we're nested in that references this struct, and + * use its identifier as the first part of the path used... + */ + RNA_pointer_create(ptr->id.data, ptr->type->nested, ptr->data, &parentptr); + userprop= RNA_struct_find_nested(&parentptr, ptr->type); + + if(userprop) + ptrpath= BLI_strdup(RNA_property_identifier(userprop)); + else + return NULL; // can't do anything about this case yet... + } else return NULL; } @@ -2533,9 +2577,9 @@ int RNA_function_call_direct_va(PointerRNA *ptr, FunctionRNA *func, const char * PropertyRNA *pret, *parm; PropertyType type; int i, ofs, flen, flag, len, alen, err= 0; - const char *tid, *fid, *pid; + const char *tid, *fid, *pid=NULL; char ftype; - void **retdata; + void **retdata=NULL; RNA_pointer_create(NULL, &RNA_Function, func, &funcptr); diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c index ece5b6cc1f9..e45319a42a6 100644 --- a/source/blender/makesrna/intern/rna_context.c +++ b/source/blender/makesrna/intern/rna_context.c @@ -97,6 +97,7 @@ void RNA_def_context(BlenderRNA *brna) srna= RNA_def_struct(brna, "Context", NULL); RNA_def_struct_ui_text(srna, "Context", "Current windowmanager and data context."); + RNA_def_struct_sdna(srna, "bContext"); /* WM */ prop= RNA_def_property(srna, "manager", PROP_POINTER, PROP_NONE); diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c index 719c6cb3c89..275a11377e2 100644 --- a/source/blender/makesrna/intern/rna_curve.c +++ b/source/blender/makesrna/intern/rna_curve.c @@ -291,6 +291,19 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) { PropertyRNA *prop; + static EnumPropertyItem prop_align_items[] = { + {CU_LEFT, "LEFT", "Left Align", "Align text to the left"}, + {CU_MIDDLE, "CENTRAL", "Central Align", "Center text"}, + {CU_RIGHT, "RIGHT", "Right Align", "Align text to the right"}, + {CU_JUSTIFY, "JUSTIFY", "Justify", "Align to the left and the right"}, + {CU_FLUSH, "FLUSH", "Flush", "Align to the left and the right, with equal character spacing"}, + {0, NULL, NULL, NULL}}; + + /* Enums */ + prop= RNA_def_property(srna, "spacemode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, prop_align_items); + RNA_def_property_ui_text(prop, "Text Align", "Text align from the object center."); + /* number values */ prop= RNA_def_property(srna, "text_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "fsize"); @@ -375,26 +388,6 @@ static void rna_def_font(BlenderRNA *brna, StructRNA *srna) prop= RNA_def_property(srna, "fast", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", CU_FAST); RNA_def_property_ui_text(prop, "Fast", "Don't fill polygons while editing."); - - prop= RNA_def_property(srna, "left_align", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "spacemode", CU_LEFT); - RNA_def_property_ui_text(prop, "Left Align", "Left align the text from the object center."); - - prop= RNA_def_property(srna, "middle_align", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "spacemode", CU_MIDDLE); - RNA_def_property_ui_text(prop, "Middle Align", "Middle align the text from the object center."); - - prop= RNA_def_property(srna, "right_align", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "spacemode", CU_RIGHT); - RNA_def_property_ui_text(prop, "Right Align", "Right align the text from the object center."); - - prop= RNA_def_property(srna, "justify", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "spacemode", CU_JUSTIFY); - RNA_def_property_ui_text(prop, "Justify", "Fill complete lines to maximum textframe width."); - - prop= RNA_def_property(srna, "flush", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "spacemode", CU_FLUSH); - RNA_def_property_ui_text(prop, "Left Align", "Fill every line to maximum textframe width distributing space among all characters."); } void rna_def_textbox(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c index d7d7fc348d9..333c356acbc 100644 --- a/source/blender/makesrna/intern/rna_lamp.c +++ b/source/blender/makesrna/intern/rna_lamp.c @@ -252,7 +252,7 @@ static void rna_def_lamp(BlenderRNA *brna) PropertyRNA *prop; static EnumPropertyItem prop_type_items[] = { - {LA_LOCAL, "LOCAL", "Local", "Omnidirectional point light source."}, + {LA_LOCAL, "POINT", "Point", "Omnidirectional point light source."}, {LA_SUN, "SUN", "Sun", "Constant direction parallel ray light source."}, {LA_SPOT, "SPOT", "Spot", "Directional cone light source."}, {LA_HEMI, "HEMI", "Hemi", "180 degree constant light source."}, diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 34a7ea7d1e9..b5f4ee98dfe 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -600,7 +600,7 @@ static void rna_def_material_sss(BlenderRNA *brna) RNA_def_struct_nested(brna, srna, "Material"); RNA_def_struct_ui_text(srna, "Material Subsurface Scattering", "Diffuse subsurface scattering settings for a Material datablock."); - prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_COLOR); + prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "sss_radius"); RNA_def_property_range(prop, 0.001, FLT_MAX); RNA_def_property_ui_range(prop, 0.001, 10000, 1, 3); diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c index 6a14fec4656..cbc80e68b4a 100644 --- a/source/blender/makesrna/intern/rna_object.c +++ b/source/blender/makesrna/intern/rna_object.c @@ -680,11 +680,13 @@ static StructRNA *rna_def_object(BlenderRNA *brna) RNA_def_property_enum_sdna(prop, NULL, "empty_drawtype"); RNA_def_property_enum_items(prop, empty_drawtype_items); RNA_def_property_ui_text(prop, "Empty Draw Type", "Viewport display style for empties."); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); prop= RNA_def_property(srna, "empty_draw_size", PROP_FLOAT, PROP_NONE); RNA_def_property_float_sdna(prop, NULL, "empty_drawsize"); RNA_def_property_range(prop, 0.01, 10.0); RNA_def_property_ui_text(prop, "Empty Draw Size", "Size of of display for empties in the viewport."); + RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL); /* render */ diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 2f732138643..e387dd680f3 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -502,6 +502,10 @@ void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Back Buffer", "Render backbuffer image"); RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); + prop= RNA_def_property(srna, "output_path", PROP_STRING, PROP_DIRPATH); + RNA_def_property_string_sdna(prop, NULL, "pic"); + RNA_def_property_ui_text(prop, "Output Path", "Directory/name to save animations, # characters defines the position and length of frame numbers."); + RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL); } void RNA_def_scene(BlenderRNA *brna) diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c index 034fd603367..e8b766ff2ea 100644 --- a/source/blender/makesrna/intern/rna_screen.c +++ b/source/blender/makesrna/intern/rna_screen.c @@ -67,6 +67,10 @@ static void rna_def_scrarea(BlenderRNA *brna) RNA_def_property_collection_sdna(prop, NULL, "regionbase", NULL); RNA_def_property_struct_type(prop, "Region"); RNA_def_property_ui_text(prop, "Regions", "Regions this area is subdivided in."); + + prop= RNA_def_property(srna, "show_menus", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", HEADER_NO_PULLDOWN); + RNA_def_property_ui_text(prop, "Show Menus", "Show menus in the header."); } static void rna_def_region(BlenderRNA *brna) diff --git a/source/blender/python/epy_doc_gen.py b/source/blender/python/epy_doc_gen.py index f65a3c417a0..9f3efc916bf 100644 --- a/source/blender/python/epy_doc_gen.py +++ b/source/blender/python/epy_doc_gen.py @@ -26,11 +26,11 @@ run this script from blenders root path once you have compiled blender This will generate rna.py and bpyoperator.py in "./source/blender/python/doc/" Generate html docs by running... - epydoc source/blender/python/doc/*.py -v \ - -o source/blender/python/doc/html \ - --inheritance=included \ - --no-sourcecode \ - --graph=classtree \ + epydoc source/blender/python/doc/*.py -v \\ + -o source/blender/python/doc/html \\ + --inheritance=included \\ + --no-sourcecode \\ + --graph=classtree \\ --graph-font-size=8 ''' @@ -523,7 +523,7 @@ def op2epy(target_path): if __name__ == '__main__': if 'bpy' not in dir(): - print("\nError, this script must run from inside blender.") + print("\nError, this script must run from inside blender2.5") print(script_help_msg) else: diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 27dc95a3f44..140c7ef947d 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -428,7 +428,6 @@ void BPY_run_ui_scripts(bContext *C, int reload) /* ****************************************** */ /* Drivers - PyExpression Evaluation */ -// XXX Hopefully I haven't committed any PyAPI coding sins here ;) - Aligorith, 2009Apr20 /* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */ PyObject *bpy_pydriver_Dict = NULL; diff --git a/source/blender/python/intern/bpy_ui.c b/source/blender/python/intern/bpy_ui.c index b795409c1c9..471263d9d63 100644 --- a/source/blender/python/intern/bpy_ui.c +++ b/source/blender/python/intern/bpy_ui.c @@ -43,12 +43,13 @@ static PyObject *Method_pupMenuBegin( PyObject * self, PyObject * args ) { + PyObject *py_context; char *title; int icon; - if( !PyArg_ParseTuple( args, "si:pupMenuBegin", &title, &icon)) + if( !PyArg_ParseTuple( args, "O!si:pupMenuBegin", &PyCObject_Type, &py_context, &title, &icon)) return NULL; - return PyCObject_FromVoidPtr( uiPupMenuBegin(title, icon), NULL ); + return PyCObject_FromVoidPtr( uiPupMenuBegin(PyCObject_AsVoidPtr(py_context), title, icon), NULL ); } static PyObject *Method_pupMenuEnd( PyObject * self, PyObject * args ) diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index 5a10aa4490e..7084bb799c0 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -211,7 +211,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *event) printf("WM_menu_invoke: %s \"type\" is not an enum property\n", op->type->idname); } else { - pup= uiPupMenuBegin(op->type->name, 0); + pup= uiPupMenuBegin(C, op->type->name, 0); layout= uiPupMenuLayout(pup); uiItemsEnumO(layout, op->type->idname, "type"); uiPupMenuEnd(C, pup); @@ -226,7 +226,7 @@ int WM_operator_confirm(bContext *C, wmOperator *op, wmEvent *event) uiPopupMenu *pup; uiLayout *layout; - pup= uiPupMenuBegin("OK?", ICON_HELP); + pup= uiPupMenuBegin(C, "OK?", ICON_HELP); layout= uiPupMenuLayout(pup); uiItemO(layout, NULL, 0, op->type->idname); uiPupMenuEnd(C, pup); @@ -378,7 +378,7 @@ static int wm_recentfile_invoke(bContext *C, wmOperator *op, wmEvent *event) uiLayout *layout; int i, ofs= 0; - pup= uiPupMenuBegin("Open Recent", 0); + pup= uiPupMenuBegin(C, "Open Recent", 0); layout= uiPupMenuLayout(pup); if(G.sce[0]) { |