feat(editor): open the Openverse register link from Settings → Images

The "Register at Openverse" link in Settings → Images → Advanced was painted
but inert. Add a hit-test (register_link_rect → ImagesHit::OpenRegisterLink →
AgentSettingsHit::OpenImageRegisterLink) and open
https://api.openverse.org/v1/auth_tokens/register/ on click — default browser
on desktop (open/xdg-open/start) and a new tab on web (window.open).
This commit is contained in:
Kayshen-X 2026-06-21 09:03:09 +08:00
parent 881d9356d3
commit a922bd2d0b
5 changed files with 79 additions and 0 deletions

View file

@ -29,6 +29,10 @@ const ADD_BTN_W: f32 = 72.0;
const BTN_H: f32 = 28.0;
const BODY_GAP: f32 = 14.0;
const REGISTER_ROW_H: f32 = 36.0;
// Fixed hit-rect width for the "Register at Openverse" link. Covers the
// link text + trailing chevron across all locales without reaching the
// right-aligned Test button.
const REGISTER_LINK_W: f32 = 220.0;
const PROFILE_ROW_H: f32 = 32.0;
const PROFILE_ROW_GAP: f32 = 6.0;
const PROFILE_ROW_INSET_X: f32 = 8.0;
@ -48,6 +52,7 @@ const PROVIDER_OPTION_H: f32 = 24.0;
pub enum ImagesHit {
ToggleAdvanced,
FocusSearchField(ImageSearchField),
OpenRegisterLink,
TestSearch,
AddGenConfig,
ToggleGenConfigEditor(usize),
@ -117,6 +122,18 @@ fn register_link_y(content: Rect) -> f32 {
content.origin.y + TITLE_H + ADVANCED_ROW_H + SUBTITLE_H + ROW_H + ROW_VGAP + ROW_H + BODY_GAP
}
/// Click target for the "Register at Openverse" link (text + chevron).
/// A fixed `REGISTER_LINK_W` width covers every locale's link label
/// without reaching the right-aligned Test button.
pub(super) fn register_link_rect(content: Rect) -> Rect {
Rect::xywh(
content.origin.x,
register_link_y(content),
REGISTER_LINK_W,
REGISTER_ROW_H,
)
}
#[rustfmt::skip]
fn search_field_rect(content: Rect, index: usize) -> Rect {
let y = content.origin.y
@ -249,6 +266,9 @@ pub fn hit_test(content: Rect, settings: &AgentSettings, scrolled: Point2D) -> I
if (search_field_rect(content, 1)).contains(scrolled) {
return ImagesHit::FocusSearchField(ImageSearchField::ClientSecret);
}
if (register_link_rect(content)).contains(scrolled) {
return ImagesHit::OpenRegisterLink;
}
if search_test_enabled(settings) && (test_btn_rect(content, settings)).contains(scrolled) {
return ImagesHit::TestSearch;
}

View file

@ -644,3 +644,30 @@ fn expanded_image_gen_profile_card_is_inset_from_content_clip_edges() {
"profile card should leave horizontal room inside the clipped content area"
);
}
#[test]
fn images_register_link_hit_test_returns_open_register_link() {
use crate::widgets::agent_settings_images::{self, register_link_rect, ImagesHit};
use crate::widgets::agent_settings_panel_geometry::content_rect;
let mut state = EditorState::default();
state.editor_ui.agent_settings.tab = AgentSettingsTab::Images;
state.editor_ui.agent_settings.images_advanced_open = true;
let panel = AgentSettingsPanel::for_editor(&state);
let rect = panel.rect(1200.0, 800.0);
let content = content_rect(rect);
// Aim at the centre of the link's click target.
let link = register_link_rect(content);
let point = Point2D::new(
link.origin.x + link.size.x / 2.0,
link.origin.y + link.size.y / 2.0,
);
assert_eq!(
agent_settings_images::hit_test(content, &state.editor_ui.agent_settings, point),
ImagesHit::OpenRegisterLink,
"clicking the Register-at-Openverse link should map to OpenRegisterLink"
);
}

View file

@ -83,6 +83,7 @@ pub enum AgentSettingsHit {
CopyMcpClientConfig,
ToggleImagesAdvanced,
FocusSearchField(ImageSearchField),
OpenImageRegisterLink,
TestImageSearch,
AddGenConfig,
ToggleGenConfigEditor(usize),
@ -249,6 +250,9 @@ impl<'a> AgentSettingsPanel<'a> {
ImagesHit::FocusSearchField(field) => {
return AgentSettingsHit::FocusSearchField(field);
}
ImagesHit::OpenRegisterLink => {
return AgentSettingsHit::OpenImageRegisterLink;
}
ImagesHit::TestSearch => return AgentSettingsHit::TestImageSearch,
ImagesHit::AddGenConfig => return AgentSettingsHit::AddGenConfig,
ImagesHit::ToggleGenConfigEditor(index) => {

View file

@ -169,6 +169,10 @@ impl WidgetHostNative {
);
self.set_settings_input_text(text);
}
AgentSettingsHit::OpenImageRegisterLink => {
self.commit_settings_focus_if_any();
open_external_url("https://api.openverse.org/v1/auth_tokens/register/");
}
AgentSettingsHit::TestImageSearch => {
self.commit_settings_focus_if_any();
let settings = &mut self.editor_state.editor_ui.agent_settings;
@ -884,6 +888,21 @@ pub(in crate::widget_host) fn color_target(
}
}
/// Open `url` in the user's default browser. Spawns the platform's
/// URL launcher detached and ignores any error — opening a help link
/// must never block or panic the editor. Used by the agent-settings
/// "Register at Openverse" link.
fn open_external_url(url: &str) {
#[cfg(target_os = "macos")]
let _ = std::process::Command::new("open").arg(url).spawn();
#[cfg(target_os = "windows")]
let _ = std::process::Command::new("cmd")
.args(["/C", "start", "", url])
.spawn();
#[cfg(not(any(target_os = "macos", target_os = "windows")))]
let _ = std::process::Command::new("xdg-open").arg(url).spawn();
}
#[cfg(test)]
mod tests {
use super::create_initial_size_for_tool;

View file

@ -110,6 +110,15 @@ impl WidgetHost {
Some(SettingsFocus::ImageSearch(field));
self.set_settings_input_text(text);
}
AgentSettingsHit::OpenImageRegisterLink => {
self.commit_settings_focus();
if let Some(w) = web_sys::window() {
let _ = w.open_with_url_and_target(
"https://api.openverse.org/v1/auth_tokens/register/",
"_blank",
);
}
}
AgentSettingsHit::TestImageSearch => {
self.commit_settings_focus();
let settings = &mut self.editor_state.editor_ui.agent_settings;