From 7e2075b8097a62bc14f747dd0e02a2ccc8a9d507 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Fri, 26 Apr 2024 21:35:49 +0200 Subject: [PATCH] UI: Changes to Zoom Menus For Image, Clip, Sequence editors, try to make their View menus a bit more consistent. Changes to Zoom menus, including showing current level if matching. Pull Request: https://projects.blender.org/blender/blender/pulls/121044 --- scripts/startup/bl_ui/space_clip.py | 34 ++++---- scripts/startup/bl_ui/space_image.py | 38 ++++----- scripts/startup/bl_ui/space_sequencer.py | 23 +++--- source/blender/makesrna/intern/rna_space.cc | 91 +++++++++++++++++++++ 4 files changed, 139 insertions(+), 47 deletions(-) diff --git a/scripts/startup/bl_ui/space_clip.py b/scripts/startup/bl_ui/space_clip.py index 3e29c0aeb1c..d1f3110ff23 100644 --- a/scripts/startup/bl_ui/space_clip.py +++ b/scripts/startup/bl_ui/space_clip.py @@ -1287,23 +1287,29 @@ class CLIP_PT_tools_grease_pencil_draw(AnnotationDrawingToolsPanel, Panel): class CLIP_MT_view_zoom(Menu): - bl_label = "Fractional Zoom" + bl_label = "Zoom" def draw(self, _context): layout = self.layout + from math import isclose + current_zoom = _context.space_data.zoom_percentage ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1)) for i, (a, b) in enumerate(ratios): - if i in {3, 4}: # Draw separators around Zoom 1:1. - layout.separator() - + percent = a / b * 100 layout.operator( "clip.view_zoom_ratio", - text=iface_("Zoom %d:%d") % (a, b), + text=iface_("%g%% (%d:%d)") % (percent, a, b), translate=False, + icon=('NONE', 'LAYER_ACTIVE')[isclose(percent, current_zoom, abs_tol=0.5)] ).ratio = a / b + layout.separator() + layout.operator("clip.view_zoom_in") + layout.operator("clip.view_zoom_out") + layout.operator("clip.view_all", text="Zoom to Fit").fit_view = True + class CLIP_MT_view(Menu): bl_label = "View" @@ -1319,26 +1325,20 @@ class CLIP_MT_view(Menu): layout.prop(sc, "show_region_hud") layout.separator() - layout.operator("clip.view_selected") - layout.operator("clip.view_all") - layout.operator("clip.view_all", text="View Fit").fit_view = True - layout.operator("clip.view_center_cursor") - layout.menu("CLIP_MT_view_zoom") - layout.separator() - - layout.operator("clip.view_zoom_in") - layout.operator("clip.view_zoom_out") - layout.separator() - layout.prop(sc, "show_metadata") layout.separator() + + layout.operator("clip.view_all") + layout.operator("clip.view_selected") + layout.operator("clip.view_center_cursor") + + layout.menu("CLIP_MT_view_zoom") else: layout.operator_context = 'INVOKE_REGION_PREVIEW' layout.operator("clip.graph_view_all") if sc.view == 'GRAPH': layout.operator("clip.graph_center_current_frame") - layout.operator("view2d.zoom_border", text="Zoom") layout.operator_context = 'INVOKE_DEFAULT' layout.separator() diff --git a/scripts/startup/bl_ui/space_image.py b/scripts/startup/bl_ui/space_image.py index e0eec5a1801..bd5e8ef4505 100644 --- a/scripts/startup/bl_ui/space_image.py +++ b/scripts/startup/bl_ui/space_image.py @@ -83,29 +83,16 @@ class IMAGE_MT_view(Menu): layout.prop(sima, "use_realtime_update") layout.prop(uv, "show_metadata") - if paint.brush and (context.image_paint_object or sima.mode == 'PAINT'): - layout.prop(uv, "show_texpaint") - layout.prop(tool_settings, "show_uv_local_view", text="Show Same Material") - - layout.separator() - - layout.operator("image.view_zoom_in") - layout.operator("image.view_zoom_out") - - layout.separator() - - layout.menu("IMAGE_MT_view_zoom") - layout.separator() if show_uvedit: layout.operator("image.view_selected", text="Frame Selected") layout.operator("image.view_all") - layout.operator("image.view_all", text="Frame All Fit").fit_view = True - layout.operator("image.view_center_cursor", text="Center View to Cursor") + layout.menu("IMAGE_MT_view_zoom") + layout.separator() if show_render: @@ -118,27 +105,38 @@ class IMAGE_MT_view(Menu): layout.operator("image.cycle_render_slot", text="Render Slot Cycle Previous").reverse = True layout.separator() + if paint.brush and (context.image_paint_object or sima.mode == 'PAINT'): + layout.prop(uv, "show_texpaint") + layout.prop(tool_settings, "show_uv_local_view", text="Show Same Material") + layout.menu("INFO_MT_area") class IMAGE_MT_view_zoom(Menu): - bl_label = "Fractional Zoom" + bl_label = "Zoom" def draw(self, _context): layout = self.layout + from math import isclose + current_zoom = _context.space_data.zoom_percentage ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1)) for i, (a, b) in enumerate(ratios): - if i in {3, 4}: # Draw separators around Zoom 1:1. - layout.separator() - + percent = a / b * 100 layout.operator( "image.view_zoom_ratio", - text=iface_("Zoom %d:%d") % (a, b), + text=iface_("%g%% (%d:%d)") % (percent, a, b), translate=False, + icon=('NONE', 'LAYER_ACTIVE')[isclose(percent, current_zoom, abs_tol=0.5)] ).ratio = a / b + layout.separator() + layout.operator("image.view_zoom_in") + layout.operator("image.view_zoom_out") + layout.operator("image.view_all", text="Zoom to Fit").fit_view = True + layout.operator("image.view_zoom_border", text="Zoom Region...") + class IMAGE_MT_select(Menu): bl_label = "Select" diff --git a/scripts/startup/bl_ui/space_sequencer.py b/scripts/startup/bl_ui/space_sequencer.py index d9c14edb27f..621ad9fb501 100644 --- a/scripts/startup/bl_ui/space_sequencer.py +++ b/scripts/startup/bl_ui/space_sequencer.py @@ -366,24 +366,30 @@ class SEQUENCER_MT_range(Menu): class SEQUENCER_MT_preview_zoom(Menu): - bl_label = "Fractional Zoom" + bl_label = "Zoom" def draw(self, _context): layout = self.layout layout.operator_context = 'INVOKE_REGION_PREVIEW' + from math import isclose + current_zoom = _context.space_data.zoom_percentage ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1)) for i, (a, b) in enumerate(ratios): - if i in {3, 4}: # Draw separators around Zoom 1:1. - layout.separator() + percent = a / b * 100 layout.operator( "sequencer.view_zoom_ratio", - text=iface_("Zoom %d:%d") % (a, b), + text=iface_("%g%% (%d:%d)") % (percent, a, b), translate=False, + icon=('NONE', 'LAYER_ACTIVE')[isclose(percent, current_zoom, abs_tol=0.5)], ).ratio = a / b - layout.operator_context = 'INVOKE_DEFAULT' + + layout.separator() + layout.operator("view2d.zoom_in") + layout.operator("view2d.zoom_out") + layout.operator("view2d.zoom_border", text="Zoom Region...") class SEQUENCER_MT_proxy(Menu): @@ -444,7 +450,6 @@ class SEQUENCER_MT_view(Menu): layout.operator_context = 'INVOKE_REGION_WIN' layout.operator("sequencer.view_all") layout.operator("sequencer.view_frame") - layout.operator("view2d.zoom_border", text="Zoom to Border") layout.prop(st, "use_clamp_view") if is_preview: @@ -453,12 +458,10 @@ class SEQUENCER_MT_view(Menu): layout.operator_context = 'INVOKE_REGION_PREVIEW' layout.operator("sequencer.view_all_preview", text="Fit Preview in Window") if is_sequencer_view: - layout.menu("SEQUENCER_MT_preview_zoom", text="Fractional Preview Zoom") + layout.menu("SEQUENCER_MT_preview_zoom", text="Preview Zoom") else: - layout.operator("view2d.zoom_border", text="Zoom to Border") layout.menu("SEQUENCER_MT_preview_zoom") - layout.prop(st, "use_zoom_to_fit") - + layout.prop(st, "use_zoom_to_fit", text="Auto Zoom") layout.separator() layout.menu("SEQUENCER_MT_proxy") layout.operator_context = 'INVOKE_DEFAULT' diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index e3bb0ea8f92..d41d549b070 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -1804,6 +1804,18 @@ static void rna_SpaceImageEditor_zoom_get(PointerRNA *ptr, float *values) } } +static float rna_SpaceImageEditor_zoom_percentage_get(PointerRNA *ptr) +{ + SpaceImage *sima = (SpaceImage *)ptr->data; + return sima->zoom * 100.0f; +} + +static void rna_SpaceImageEditor_zoom_percentage_set(PointerRNA *ptr, const float value) +{ + SpaceImage *sima = (SpaceImage *)ptr->data; + sima->zoom = value / 100.0f; +} + static void rna_SpaceImageEditor_cursor_location_get(PointerRNA *ptr, float *values) { SpaceImage *sima = (SpaceImage *)ptr->data; @@ -2500,6 +2512,41 @@ static std::optional rna_SpaceSequencerTimelineOverlay_path( return "timeline_overlay"; } +static float rna_SpaceSequenceEditor_zoom_percentage_get(PointerRNA *ptr) +{ + ScrArea *area = rna_area_from_space(ptr); + if (area == nullptr) { + return 100.0f; + } + ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_PREVIEW); + if (region == nullptr) { + return 100.0f; + } + + View2D *v2d = ®ion->v2d; + const float zoom = 1.0f / (BLI_rctf_size_x(&v2d->cur) / float(BLI_rcti_size_x(&v2d->mask))) * + +100.0f; + return zoom; +} + +static void rna_SpaceSequenceEditor_zoom_percentage_set(PointerRNA *ptr, const float value) +{ + ScrArea *area = rna_area_from_space(ptr); + if (area == nullptr) { + return; + } + ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_PREVIEW); + if (region == nullptr) { + return; + } + + View2D *v2d = ®ion->v2d; + BLI_rctf_resize(&v2d->cur, + float(BLI_rcti_size_x(&v2d->mask)) / (value / 100.0f), + float(BLI_rcti_size_y(&v2d->mask)) / (value / 100.0f)); + ED_region_tag_redraw(region); +} + /* Space Node Editor */ static PointerRNA rna_SpaceNode_overlay_get(PointerRNA *ptr) { @@ -2760,6 +2807,18 @@ static void rna_SpaceClipEditor_view_type_update(Main * /*bmain*/, ED_area_tag_refresh(area); } +static float rna_SpaceClipEditor_zoom_percentage_get(PointerRNA *ptr) +{ + SpaceClip *sc = (SpaceClip *)ptr->data; + return sc->zoom * 100.0f; +} + +static void rna_SpaceClipEditor_zoom_percentage_set(PointerRNA *ptr, const float value) +{ + SpaceClip *sc = (SpaceClip *)ptr->data; + sc->zoom = value / 100.0f; +} + /* File browser. */ static std::optional rna_FileSelectParams_path(const PointerRNA * /*ptr*/) @@ -5616,6 +5675,16 @@ static void rna_def_space_image(BlenderRNA *brna) RNA_def_property_float_funcs(prop, "rna_SpaceImageEditor_zoom_get", nullptr, nullptr); RNA_def_property_ui_text(prop, "Zoom", "Zoom factor"); + prop = RNA_def_property(srna, "zoom_percentage", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_funcs(prop, + "rna_SpaceImageEditor_zoom_percentage_get", + "rna_SpaceImageEditor_zoom_percentage_set", + nullptr); + RNA_def_property_float_default(prop, 100.0); + RNA_def_property_range(prop, .4, 80000); + RNA_def_property_ui_range(prop, 25, 400, 100, 0); + RNA_def_property_ui_text(prop, "Zoom", "Zoom percentage"); + /* image draw */ prop = RNA_def_property(srna, "show_repeat", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", SI_DRAW_TILE); @@ -6104,6 +6173,17 @@ static void rna_def_space_sequencer(BlenderRNA *brna) RNA_def_property_array(prop, 2); RNA_def_property_ui_text(prop, "2D Cursor Location", "2D cursor location for this view"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, nullptr); + + /* Zoom. */ + prop = RNA_def_property(srna, "zoom_percentage", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_funcs(prop, + "rna_SpaceSequenceEditor_zoom_percentage_get", + "rna_SpaceSequenceEditor_zoom_percentage_set", + nullptr); + RNA_def_property_float_default(prop, 100.0); + RNA_def_property_range(prop, .4, 80000); + RNA_def_property_ui_range(prop, 25, 400, 100, 0); + RNA_def_property_ui_text(prop, "Zoom", "Zoom percentage"); } static void rna_def_space_text(BlenderRNA *brna) @@ -8015,6 +8095,17 @@ static void rna_def_space_clip(BlenderRNA *brna) RNA_def_property_boolean_negative_sdna(prop, nullptr, "gizmo_flag", SCLIP_GIZMO_HIDE_NAVIGATE); RNA_def_property_ui_text(prop, "Navigate Gizmo", "Viewport navigation gizmo"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_CLIP, nullptr); + + /* Zoom. */ + prop = RNA_def_property(srna, "zoom_percentage", PROP_FLOAT, PROP_PERCENTAGE); + RNA_def_property_float_funcs(prop, + "rna_SpaceClipEditor_zoom_percentage_get", + "rna_SpaceClipEditor_zoom_percentage_set", + nullptr); + RNA_def_property_float_default(prop, 100.0); + RNA_def_property_range(prop, .4f, 80000); + RNA_def_property_ui_range(prop, 25, 400, 100, 0); + RNA_def_property_ui_text(prop, "Zoom", "Zoom percentage"); } static void rna_def_spreadsheet_column_id(BlenderRNA *brna)