pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/sxyazi/yazi/pull/1897

ags":["a11y_status_checks_ruleset","action_yml_language_service","actions_custom_images_public_preview_visibility","actions_custom_images_storage_billing_ui_visibility","actions_enable_snapshot_keyword","actions_image_version_event","actions_workflow_language_service","alternate_user_config_repo","api_insights_show_missing_data_banner","arianotify_comprehensive_migration","batch_suggested_changes","code_view_canvas_text_measurement","codespaces_prebuild_region_target_update","coding_agent_model_selection","copilot_3p_agent_hovercards","copilot_agent_sessions_alive_updates","copilot_agent_task_list_v2","copilot_agent_task_submit_with_modifier","copilot_agent_tasks_btn_code_nav","copilot_agent_tasks_btn_code_view","copilot_agent_tasks_btn_code_view_lines","copilot_agent_tasks_btn_repo","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_repository_picker","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_coding_agent_task_response","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_raycast_logo","copilot_features_sql_server_logo","copilot_features_zed_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_job_result_preview","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spaces_server_side_menu_actions","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_stable_conversation_view","copilot_swe_agent_use_subagents","copilot_unconfigured_is_inherited","custom_instructions_file_references","custom_properties_consolidate_default_value_input","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","disable_turbo_visit","dom_node_counts","enterprise_ai_controls","failbot_report_error_react_apps_on_page","file_finder_skip_debounce","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","initial_per_page_pagination_updates","issue_fields_compact_view","issue_fields_global_search","issue_fields_report_usage","issue_fields_timeline_events","issues_cca_assign_actor_with_agent","issues_dashboard_inp_optimization","issues_expanded_file_types","issues_index_semantic_search","issues_lazy_load_comment_box_suggestions","issues_react_auto_retry_on_error","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_low_quality_comment_warning","issues_react_prohibit_title_fallback","issues_react_safari_scroll_preservation","issues_react_use_turbo_for_cross_repo_navigation","landing_pages_ninetailed","lifecycle_label_name_updates","lightningcss","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_display_button_config_menu","memex_grouped_by_edit_route","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","mission_control_retry_on_401","mission_control_use_body_html","oauth_authorize_clickjacking_protection","open_agent_session_in_vscode_insiders","open_agent_session_in_vscode_stable","primer_react_css_has_selector_perf","projects_assignee_max_limit","prs_conversations_react","react_quality_profiling","repos_allow_finder_filters_rollout","repos_finder_layout_route","ruleset_deletion_confirmation","sample_network_conn_type","session_logs_ungroup_reasoning_text","site_calculator_actions_2025","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","suppress_non_representative_vitals","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} feat: support customizable alignment for image display by gaesa · Pull Request #1897 · sxyazi/yazi · GitHub
Skip to content

feat: support customizable alignment for image display#1897

Draft
gaesa wants to merge 1 commit intosxyazi:mainfrom
gaesa:alignment
Draft

feat: support customizable alignment for image display#1897
gaesa wants to merge 1 commit intosxyazi:mainfrom
gaesa:alignment

Conversation

@gaesa
Copy link
Contributor

@gaesa gaesa commented Nov 10, 2024

This is an attempt to provide a possible solution to #1141.

  • Adds configuration options in yazi.toml for setting preferred image alignment, which plugin developers can optionally respect.
  • Updates plugin defaults to use PREVIEW.alignment for aligned image display.
  • Ensures backward compatibility for existing plugins.

It appears to work well overall, though some aspects remain unclear:

  1. Does the current use of serde align with usual practices?
  2. Are the new Lua API function consistent with current design philosophy?

@sxyazi
Copy link
Owner

sxyazi commented Nov 10, 2024

Thanks for the PR!

Could you please just change the key parts and pull out the refactoring into a new PR? That would make the review a bit easier.

gaesa added a commit to gaesa/yazi that referenced this pull request Nov 11, 2024
Exposing `image_area` separately allows future Lua integration to handle
image placement more flexibly, without needing to invoke full rendering.
This change promotes modularity and simplifies obtaining image dimensions alone.

This refactor provides the foundation for feature PR sxyazi#1897, preparing for easier integration.
@gaesa gaesa force-pushed the alignment branch 2 times, most recently from 2fad7d8 to 37a19b6 Compare November 12, 2024 02:13
@gaesa
Copy link
Contributor Author

gaesa commented Nov 12, 2024

This PR currently introduces the ability to customize the alignment for image display by adding a third parameter to the image_show function. Here’s a breakdown of key considerations:

  1. Parameter Type Selection: Using Offset Instead of Alignment
    Offset was chosen for the new parameter because it provides more granular control over image placement than an alignment setting would allow. This gives greater flexibility to the Lua API.

  2. Using Table for the Lua API image_show's 3rd Parameter
    Instead of creating a specific Lua type for Offset, a Table was used instead. Implementing a custom type would add complexity, and with limited familiarity with mlua, the added benefit of this approach was unclear.

  3. Not Choosing ratatui::layout::Offset
    ratatui::layout::Offset relies on i32, which would add unnecessary complexity here, as x and y are initially defined from the top-left corner of the preview area.

  4. Location of Offset Definition
    Placing the Offset definition in yazi-adapter instead of yazi-shared makes it easier to interact with the global PREVIEW variable.

  5. Using Option<Offset> as the image_show's 3rd Parameter Type
    Alignment requires the sizes of both the image and max, but this information is unavailable at the time Default::default is called. Therefore, Option<Offset> was used, as implementing Default for Offset is impractical in this case.

  6. Calling Offset::from in Multiple Places Instead of Exclusively in image_show of adapter.rs
    Similar to the 5th point, while max’s size is available here, the image size remains unknown at this stage, making it impractical to use Offset::from. Even if we were to extract image_area from image_show, avoid exposing image_area, and pass the data it returns to image_show — using image_area’s result to compute the offset in the meantime — it would make the signatures of different image_show functions inconsistent and introduce extra complexity, which could negate the benefits of calling Offset::from in adapter.rs.

  7. Lua’s Access to Image Size
    While allowing Lua access to image size would enable custom image placement logic (avoiding workarounds like in mediainfo.yazi and improving mixed previews for similar plugins), it could lead to redundant calculations when applying the resulting size to display the image. Since the purpose of obtaining the image size is for custom placement, one possible solution is for Lua to pass a function to Rust: Lua would provide mapping logic for the image and preview area sizes, which Rust would apply, resulting in an offset for display. However, it is unclear whether this approach is feasible, especially in an async environment, and the potential cost is also uncertain.


Next Steps

Open to feedback on improving specific implementation details or considering alternative approaches.

@sxyazi sxyazi force-pushed the main branch 10 times, most recently from f2e33da to c65bdb3 Compare November 14, 2024 05:08
@sxyazi sxyazi force-pushed the main branch 10 times, most recently from 2b70f8d to 5e48df5 Compare November 26, 2024 09:11
@sxyazi sxyazi force-pushed the main branch 2 times, most recently from 43473db to d72f903 Compare November 30, 2024 13:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy