diff --git a/crates/activity_indicator/src/activity_indicator.rs b/crates/activity_indicator/src/activity_indicator.rs index 8b46d7cfc5..6d1db5ada5 100644 --- a/crates/activity_indicator/src/activity_indicator.rs +++ b/crates/activity_indicator/src/activity_indicator.rs @@ -318,7 +318,7 @@ impl View for ActivityIndicator { on_click, } = self.content_to_render(cx); - let mut element = MouseEventHandler::::new(0, cx, |state, cx| { + let mut element = MouseEventHandler::new::(0, cx, |state, cx| { let theme = &theme::current(cx).workspace.status_bar.lsp_status; let style = if state.hovered() && on_click.is_some() { theme.hovered.as_ref().unwrap_or(&theme.default) diff --git a/crates/ai/src/assistant.rs b/crates/ai/src/assistant.rs index 0a18266d2a..bb4e9f6db4 100644 --- a/crates/ai/src/assistant.rs +++ b/crates/ai/src/assistant.rs @@ -348,7 +348,7 @@ impl AssistantPanel { enum History {} let theme = theme::current(cx); let tooltip_style = theme::current(cx).tooltip.clone(); - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.assistant.hamburger_button.style_for(state); Svg::for_style(style.icon.clone()) .contained() @@ -380,7 +380,7 @@ impl AssistantPanel { fn render_split_button(cx: &mut ViewContext) -> impl Element { let theme = theme::current(cx); let tooltip_style = theme::current(cx).tooltip.clone(); - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.assistant.split_button.style_for(state); Svg::for_style(style.icon.clone()) .contained() @@ -404,7 +404,7 @@ impl AssistantPanel { fn render_assist_button(cx: &mut ViewContext) -> impl Element { let theme = theme::current(cx); let tooltip_style = theme::current(cx).tooltip.clone(); - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.assistant.assist_button.style_for(state); Svg::for_style(style.icon.clone()) .contained() @@ -422,7 +422,7 @@ impl AssistantPanel { fn render_quote_button(cx: &mut ViewContext) -> impl Element { let theme = theme::current(cx); let tooltip_style = theme::current(cx).tooltip.clone(); - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.assistant.quote_button.style_for(state); Svg::for_style(style.icon.clone()) .contained() @@ -450,7 +450,7 @@ impl AssistantPanel { fn render_plus_button(cx: &mut ViewContext) -> impl Element { let theme = theme::current(cx); let tooltip_style = theme::current(cx).tooltip.clone(); - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.assistant.plus_button.style_for(state); Svg::for_style(style.icon.clone()) .contained() @@ -480,7 +480,7 @@ impl AssistantPanel { &theme.assistant.zoom_in_button }; - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = style.style_for(state); Svg::for_style(style.icon.clone()) .contained() @@ -506,7 +506,7 @@ impl AssistantPanel { ) -> impl Element { let conversation = &self.saved_conversations[index]; let path = conversation.path.clone(); - MouseEventHandler::::new(index, cx, move |state, cx| { + MouseEventHandler::new::(index, cx, move |state, cx| { let style = &theme::current(cx).assistant.saved_conversation; Flex::row() .with_child( @@ -1818,7 +1818,7 @@ impl ConversationEditor { let theme = theme::current(cx); let style = &theme.assistant; let message_id = message.id; - let sender = MouseEventHandler::::new( + let sender = MouseEventHandler::new::( message_id.0, cx, |state, _| match message.role { @@ -2044,7 +2044,7 @@ impl ConversationEditor { ) -> impl Element { enum Model {} - MouseEventHandler::::new(0, cx, |state, cx| { + MouseEventHandler::new::(0, cx, |state, cx| { let style = style.model.style_for(state); Label::new(self.conversation.read(cx).model.clone(), style.text.clone()) .contained() diff --git a/crates/auto_update/src/update_notification.rs b/crates/auto_update/src/update_notification.rs index cd2e53905d..8397fa0745 100644 --- a/crates/auto_update/src/update_notification.rs +++ b/crates/auto_update/src/update_notification.rs @@ -31,7 +31,7 @@ impl View for UpdateNotification { let app_name = cx.global::().display_name(); - MouseEventHandler::::new(0, cx, |state, cx| { + MouseEventHandler::new::(0, cx, |state, cx| { Flex::column() .with_child( Flex::row() @@ -48,7 +48,7 @@ impl View for UpdateNotification { .flex(1., true), ) .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.dismiss_button.style_for(state); Svg::new("icons/x_mark_8.svg") .with_color(style.color) diff --git a/crates/breadcrumbs/src/breadcrumbs.rs b/crates/breadcrumbs/src/breadcrumbs.rs index 433dbed29b..615e238648 100644 --- a/crates/breadcrumbs/src/breadcrumbs.rs +++ b/crates/breadcrumbs/src/breadcrumbs.rs @@ -82,7 +82,7 @@ impl View for Breadcrumbs { .into_any(); } - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = style.style_for(state); crumbs.with_style(style.container) }) diff --git a/crates/collab_ui/src/collab_titlebar_item.rs b/crates/collab_ui/src/collab_titlebar_item.rs index fefb1c608f..bda11796e0 100644 --- a/crates/collab_ui/src/collab_titlebar_item.rs +++ b/crates/collab_ui/src/collab_titlebar_item.rs @@ -226,7 +226,7 @@ impl CollabTitlebarItem { let mut ret = Flex::row().with_child( Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |mouse_state, cx| { + MouseEventHandler::new::(0, cx, |mouse_state, cx| { let style = project_style .in_state(self.project_popover.is_some()) .style_for(mouse_state); @@ -266,7 +266,7 @@ impl CollabTitlebarItem { .with_child( Stack::new() .with_child( - MouseEventHandler::::new( + MouseEventHandler::new::( 0, cx, |mouse_state, cx| { @@ -398,7 +398,7 @@ impl CollabTitlebarItem { self.branch_popover.as_ref().map(|child| { let theme = theme::current(cx).clone(); let child = ChildView::new(child, cx); - let child = MouseEventHandler::::new(0, cx, |_, _| { + let child = MouseEventHandler::new::(0, cx, |_, _| { child .flex(1., true) .contained() @@ -433,7 +433,7 @@ impl CollabTitlebarItem { self.project_popover.as_ref().map(|child| { let theme = theme::current(cx).clone(); let child = ChildView::new(child, cx); - let child = MouseEventHandler::::new(0, cx, |_, _| { + let child = MouseEventHandler::new::(0, cx, |_, _| { child .flex(1., true) .contained() @@ -560,7 +560,7 @@ impl CollabTitlebarItem { Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = titlebar .toggle_contacts_button .in_state(self.contacts_popover.is_some()) @@ -610,7 +610,7 @@ impl CollabTitlebarItem { let active = room.read(cx).is_screen_sharing(); let titlebar = &theme.titlebar; - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = titlebar .screen_share_button .in_state(active) @@ -659,7 +659,7 @@ impl CollabTitlebarItem { } let titlebar = &theme.titlebar; - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = titlebar .toggle_microphone_button .in_state(is_muted) @@ -712,7 +712,7 @@ impl CollabTitlebarItem { } let titlebar = &theme.titlebar; - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = titlebar .toggle_speakers_button .in_state(is_deafened) @@ -747,7 +747,7 @@ impl CollabTitlebarItem { let tooltip = "Leave call"; let titlebar = &theme.titlebar; - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = titlebar.leave_call_button.style_for(state); Svg::new(icon) .with_color(style.color) @@ -801,7 +801,7 @@ impl CollabTitlebarItem { Some( Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { //TODO: Ensure this button has consistent width for both text variations let style = titlebar.share_button.inactive_state().style_for(state); Label::new(label, style.text.clone()) @@ -847,7 +847,7 @@ impl CollabTitlebarItem { let avatar_style = &user_menu_button_style.avatar; Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = user_menu_button_style .user_menu .inactive_state() @@ -907,7 +907,7 @@ impl CollabTitlebarItem { fn render_sign_in_button(&self, theme: &Theme, cx: &mut ViewContext) -> AnyElement { let titlebar = &theme.titlebar; - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = titlebar.sign_in_button.inactive_state().style_for(state); Label::new("Sign In", style.text.clone()) .contained() @@ -1142,7 +1142,7 @@ impl CollabTitlebarItem { if let Some(replica_id) = replica_id { enum ToggleFollow {} - content = MouseEventHandler::::new( + content = MouseEventHandler::new::( replica_id.into(), cx, move |_, _| content, @@ -1173,7 +1173,7 @@ impl CollabTitlebarItem { enum JoinProject {} let user_id = user.id; - content = MouseEventHandler::::new( + content = MouseEventHandler::new::( peer_id.as_u64() as usize, cx, move |_, _| content, @@ -1261,7 +1261,7 @@ impl CollabTitlebarItem { .into_any(), ), client::Status::UpgradeRequired => Some( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { Label::new( "Please update Zed to collaborate", theme.titlebar.outdated_warning.text.clone(), diff --git a/crates/collab_ui/src/contact_list.rs b/crates/collab_ui/src/contact_list.rs index b8024e2bfd..83f3bd97b2 100644 --- a/crates/collab_ui/src/contact_list.rs +++ b/crates/collab_ui/src/contact_list.rs @@ -810,7 +810,7 @@ impl ContactList { worktree_root_names.join(", ") }; - MouseEventHandler::::new(project_id as usize, cx, |mouse_state, _| { + MouseEventHandler::new::(project_id as usize, cx, |mouse_state, _| { let tree_branch = *tree_branch.in_state(is_selected).style_for(mouse_state); let row = theme .project_row @@ -904,7 +904,7 @@ impl ContactList { let baseline_offset = row.name.text.baseline_offset(font_cache) + (theme.row_height - line_height) / 2.; - MouseEventHandler::::new( + MouseEventHandler::new::( peer_id.as_u64() as usize, cx, |mouse_state, _| { @@ -1006,7 +1006,7 @@ impl ContactList { }; let leave_call = if section == Section::ActiveCall { Some( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.leave_call.style_for(state); Label::new("Leave Call", style.text.clone()) .contained() @@ -1024,7 +1024,7 @@ impl ContactList { }; let icon_size = theme.section_icon_size; - MouseEventHandler::::new(section as usize, cx, |_, _| { + MouseEventHandler::new::(section as usize, cx, |_, _| { Flex::row() .with_child( Svg::new(if is_collapsed { @@ -1075,7 +1075,7 @@ impl ContactList { let github_login = contact.user.github_login.clone(); let initial_project = project.clone(); let mut event_handler = - MouseEventHandler::::new(contact.user.id as usize, cx, |_, cx| { + MouseEventHandler::new::(contact.user.id as usize, cx, |_, cx| { Flex::row() .with_children(contact.user.avatar.clone().map(|avatar| { let status_badge = if contact.online { @@ -1114,7 +1114,7 @@ impl ContactList { .flex(1., true), ) .with_child( - MouseEventHandler::::new( + MouseEventHandler::new::( contact.user.id as usize, cx, |mouse_state, _| { @@ -1208,7 +1208,7 @@ impl ContactList { if is_incoming { row.add_child( - MouseEventHandler::::new(user.id as usize, cx, |mouse_state, _| { + MouseEventHandler::new::(user.id as usize, cx, |mouse_state, _| { let button_style = if is_contact_request_pending { &theme.disabled_button } else { @@ -1231,7 +1231,7 @@ impl ContactList { ); row.add_child( - MouseEventHandler::::new(user.id as usize, cx, |mouse_state, _| { + MouseEventHandler::new::(user.id as usize, cx, |mouse_state, _| { let button_style = if is_contact_request_pending { &theme.disabled_button } else { @@ -1254,7 +1254,7 @@ impl ContactList { ); } else { row.add_child( - MouseEventHandler::::new(user.id as usize, cx, |mouse_state, _| { + MouseEventHandler::new::(user.id as usize, cx, |mouse_state, _| { let button_style = if is_contact_request_pending { &theme.disabled_button } else { @@ -1333,7 +1333,7 @@ impl View for ContactList { .flex(1., true), ) .with_child( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { render_icon_button( &theme.contact_list.add_contact_button, "icons/user_plus_16.svg", diff --git a/crates/collab_ui/src/contacts_popover.rs b/crates/collab_ui/src/contacts_popover.rs index 1d6d1c84c7..39ab9c621c 100644 --- a/crates/collab_ui/src/contacts_popover.rs +++ b/crates/collab_ui/src/contacts_popover.rs @@ -113,7 +113,7 @@ impl View for ContactsPopover { Child::ContactFinder(child) => ChildView::new(child, cx), }; - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { Flex::column() .with_child(child.flex(1., true)) .contained() diff --git a/crates/collab_ui/src/incoming_call_notification.rs b/crates/collab_ui/src/incoming_call_notification.rs index 6f86a74300..410adbf862 100644 --- a/crates/collab_ui/src/incoming_call_notification.rs +++ b/crates/collab_ui/src/incoming_call_notification.rs @@ -173,7 +173,7 @@ impl IncomingCallNotification { let theme = theme::current(cx); Flex::column() .with_child( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { let theme = &theme.incoming_call_notification; Label::new("Accept", theme.accept_button.text.clone()) .aligned() @@ -187,7 +187,7 @@ impl IncomingCallNotification { .flex(1., true), ) .with_child( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { let theme = &theme.incoming_call_notification; Label::new("Decline", theme.decline_button.text.clone()) .aligned() diff --git a/crates/collab_ui/src/notifications.rs b/crates/collab_ui/src/notifications.rs index cbd072fe89..9258ad3ab1 100644 --- a/crates/collab_ui/src/notifications.rs +++ b/crates/collab_ui/src/notifications.rs @@ -52,7 +52,7 @@ where .flex(1., true), ) .with_child( - MouseEventHandler::::new(user.id as usize, cx, |state, _| { + MouseEventHandler::new::(user.id as usize, cx, |state, _| { let style = theme.dismiss_button.style_for(state); Svg::new("icons/x_mark_8.svg") .with_color(style.color) @@ -92,7 +92,7 @@ where Flex::row() .with_children(buttons.into_iter().enumerate().map( |(ix, (message, handler))| { - MouseEventHandler::::new(ix, cx, |state, _| { + MouseEventHandler::new::(ix, cx, |state, _| { let button = theme.button.style_for(state); Label::new(message, button.text.clone()) .contained() diff --git a/crates/collab_ui/src/project_shared_notification.rs b/crates/collab_ui/src/project_shared_notification.rs index 63922f2b65..500599db59 100644 --- a/crates/collab_ui/src/project_shared_notification.rs +++ b/crates/collab_ui/src/project_shared_notification.rs @@ -170,7 +170,7 @@ impl ProjectSharedNotification { let theme = theme::current(cx); Flex::column() .with_child( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { let theme = &theme.project_shared_notification; Label::new("Open", theme.open_button.text.clone()) .aligned() @@ -182,7 +182,7 @@ impl ProjectSharedNotification { .flex(1., true), ) .with_child( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { let theme = &theme.project_shared_notification; Label::new("Dismiss", theme.dismiss_button.text.clone()) .aligned() diff --git a/crates/collab_ui/src/sharing_status_indicator.rs b/crates/collab_ui/src/sharing_status_indicator.rs index a39ffc457a..9fcd15aa18 100644 --- a/crates/collab_ui/src/sharing_status_indicator.rs +++ b/crates/collab_ui/src/sharing_status_indicator.rs @@ -47,7 +47,7 @@ impl View for SharingStatusIndicator { Appearance::Dark | Appearance::VibrantDark => Color::white(), }; - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { Svg::new("icons/disable_screen_sharing_12.svg") .with_color(color) .constrained() diff --git a/crates/context_menu/src/context_menu.rs b/crates/context_menu/src/context_menu.rs index a5534b6262..89df86beef 100644 --- a/crates/context_menu/src/context_menu.rs +++ b/crates/context_menu/src/context_menu.rs @@ -439,14 +439,14 @@ impl ContextMenu { let style = theme::current(cx).context_menu.clone(); - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { Flex::column() .with_children(self.items.iter().enumerate().map(|(ix, item)| { match item { ContextMenuItem::Item { label, action } => { let action = action.clone(); let view_id = self.parent_view_id; - MouseEventHandler::::new(ix, cx, |state, _| { + MouseEventHandler::new::(ix, cx, |state, _| { let style = style.item.in_state(self.selected_index == Some(ix)); let style = style.style_for(state); let keystroke = match &action { diff --git a/crates/copilot/src/sign_in.rs b/crates/copilot/src/sign_in.rs index d03a2d393b..ac3b81f0c6 100644 --- a/crates/copilot/src/sign_in.rs +++ b/crates/copilot/src/sign_in.rs @@ -113,7 +113,7 @@ impl CopilotCodeVerification { let device_code_style = &style.auth.prompting.device_code; - MouseEventHandler::::new(0, cx, |state, _cx| { + MouseEventHandler::new::(0, cx, |state, _cx| { Flex::row() .with_child( Label::new(data.user_code.clone(), device_code_style.text.clone()) diff --git a/crates/copilot_button/src/copilot_button.rs b/crates/copilot_button/src/copilot_button.rs index eae1746a01..f73f854927 100644 --- a/crates/copilot_button/src/copilot_button.rs +++ b/crates/copilot_button/src/copilot_button.rs @@ -62,7 +62,7 @@ impl View for CopilotButton { Stack::new() .with_child( - MouseEventHandler::::new(0, cx, { + MouseEventHandler::new::(0, cx, { let theme = theme.clone(); let status = status.clone(); move |state, _cx| { diff --git a/crates/diagnostics/src/items.rs b/crates/diagnostics/src/items.rs index 0ae55e99d9..d1a32c72f1 100644 --- a/crates/diagnostics/src/items.rs +++ b/crates/diagnostics/src/items.rs @@ -94,7 +94,7 @@ impl View for DiagnosticIndicator { let tooltip_style = theme::current(cx).tooltip.clone(); let in_progress = !self.in_progress_checks.is_empty(); let mut element = Flex::row().with_child( - MouseEventHandler::::new(0, cx, |state, cx| { + MouseEventHandler::new::(0, cx, |state, cx| { let theme = theme::current(cx); let style = theme .workspace @@ -195,7 +195,7 @@ impl View for DiagnosticIndicator { } else if let Some(diagnostic) = &self.current_diagnostic { let message_style = style.diagnostic_message.clone(); element.add_child( - MouseEventHandler::::new(1, cx, |state, _| { + MouseEventHandler::new::(1, cx, |state, _| { Label::new( diagnostic.message.split('\n').next().unwrap().to_string(), message_style.style_for(state).text.clone(), diff --git a/crates/drag_and_drop/src/drag_and_drop.rs b/crates/drag_and_drop/src/drag_and_drop.rs index ddfed0c858..59b0bc89e2 100644 --- a/crates/drag_and_drop/src/drag_and_drop.rs +++ b/crates/drag_and_drop/src/drag_and_drop.rs @@ -202,7 +202,7 @@ impl DragAndDrop { let position = (position - region_offset).round(); Some( Overlay::new( - MouseEventHandler::::new( + MouseEventHandler::new::( 0, cx, |_, cx| render(payload, cx), @@ -235,7 +235,7 @@ impl DragAndDrop { } State::Canceled => Some( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { Empty::new().constrained().with_width(0.).with_height(0.) }) .on_up(MouseButton::Left, |_, _, cx| { @@ -301,7 +301,7 @@ pub trait Draggable { Self: Sized; } -impl Draggable for MouseEventHandler { +impl Draggable for MouseEventHandler { fn as_draggable( self, payload: P, diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 8d8b77ea95..d9bccdfea3 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -867,7 +867,7 @@ impl CompletionsMenu { let completion = &completions[mat.candidate_id]; let item_ix = start_ix + ix; items.push( - MouseEventHandler::::new( + MouseEventHandler::new::( mat.candidate_id, cx, |state, _| { @@ -1044,7 +1044,7 @@ impl CodeActionsMenu { for (ix, action) in actions[range].iter().enumerate() { let item_ix = start_ix + ix; items.push( - MouseEventHandler::::new(item_ix, cx, |state, _| { + MouseEventHandler::new::(item_ix, cx, |state, _| { let item_style = if item_ix == selected_item { style.autocomplete.selected_item } else if state.hovered() { @@ -3547,7 +3547,7 @@ impl Editor { if self.available_code_actions.is_some() { enum CodeActions {} Some( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { Svg::new("icons/bolt_8.svg").with_color( style .code_actions @@ -3594,7 +3594,7 @@ impl Editor { fold_data .map(|(fold_status, buffer_row, active)| { (active || gutter_hovered || fold_status == FoldStatus::Folded).then(|| { - MouseEventHandler::::new( + MouseEventHandler::new::( ix as usize, cx, |mouse_state, _| { @@ -8663,7 +8663,7 @@ pub fn diagnostic_block_renderer(diagnostic: Diagnostic, is_valid: bool) -> Rend let font_size = (style.text_scale_factor * settings.buffer_font_size(cx)).round(); let anchor_x = cx.anchor_x; enum BlockContextToolip {} - MouseEventHandler::::new(cx.block_id, cx, |_, _| { + MouseEventHandler::new::(cx.block_id, cx, |_, _| { Flex::column() .with_children(highlighted_lines.iter().map(|(line, highlights)| { Label::new( diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 13856cc8ef..0e9938cf47 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1637,7 +1637,7 @@ impl EditorElement { let jump_position = language::ToPoint::to_point(&jump_anchor, buffer); enum JumpIcon {} - MouseEventHandler::::new((*id).into(), cx, |state, _| { + MouseEventHandler::new::((*id).into(), cx, |state, _| { let style = style.jump_icon.style_for(state); Svg::new("icons/arrow_up_right_8.svg") .with_color(style.color) diff --git a/crates/editor/src/hover_popover.rs b/crates/editor/src/hover_popover.rs index afc13f983d..e4509a765c 100644 --- a/crates/editor/src/hover_popover.rs +++ b/crates/editor/src/hover_popover.rs @@ -565,7 +565,7 @@ impl InfoPopover { ) }); - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { let mut region_id = 0; let view_id = cx.view_id(); @@ -654,7 +654,7 @@ impl DiagnosticPopover { let tooltip_style = theme::current(cx).tooltip.clone(); - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { text.with_soft_wrap(true) .contained() .with_style(container_style) diff --git a/crates/feedback/src/deploy_feedback_button.rs b/crates/feedback/src/deploy_feedback_button.rs index d197f57fa5..ad2a40b60c 100644 --- a/crates/feedback/src/deploy_feedback_button.rs +++ b/crates/feedback/src/deploy_feedback_button.rs @@ -35,7 +35,7 @@ impl View for DeployFeedbackButton { let theme = theme::current(cx).clone(); Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = &theme .workspace .status_bar diff --git a/crates/feedback/src/feedback_info_text.rs b/crates/feedback/src/feedback_info_text.rs index 6c55b7a713..91ff22e904 100644 --- a/crates/feedback/src/feedback_info_text.rs +++ b/crates/feedback/src/feedback_info_text.rs @@ -41,7 +41,7 @@ impl View for FeedbackInfoText { .aligned(), ) .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let contained_text = if state.hovered() { &theme.feedback.link_text_hover } else { diff --git a/crates/feedback/src/submit_feedback_button.rs b/crates/feedback/src/submit_feedback_button.rs index 2133296e25..df59cf143f 100644 --- a/crates/feedback/src/submit_feedback_button.rs +++ b/crates/feedback/src/submit_feedback_button.rs @@ -52,7 +52,7 @@ impl View for SubmitFeedbackButton { .map_or(true, |i| i.read(cx).allow_submission); enum SubmitFeedbackButton {} - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let text; let style = if allow_submission { text = "Submit as Markdown"; diff --git a/crates/gpui/examples/components.rs b/crates/gpui/examples/components.rs new file mode 100644 index 0000000000..50ace5eee0 --- /dev/null +++ b/crates/gpui/examples/components.rs @@ -0,0 +1,335 @@ +use button_component::Button; + +use component::AdaptComponent; +use gpui::{ + color::Color, + elements::{ContainerStyle, Flex, Label, ParentElement}, + fonts::{self, TextStyle}, + platform::WindowOptions, + AnyElement, App, Element, Entity, View, ViewContext, +}; +use log::LevelFilter; +use pathfinder_geometry::vector::vec2f; +use simplelog::SimpleLogger; +use theme::Toggleable; +use toggleable_button::ToggleableButton; + +fn main() { + SimpleLogger::init(LevelFilter::Info, Default::default()).expect("could not initialize logger"); + + App::new(()).unwrap().run(|cx| { + cx.platform().activate(true); + cx.add_window(WindowOptions::with_bounds(vec2f(300., 200.)), |_| { + TestView { + count: 0, + is_doubling: false, + } + }); + }); +} + +pub struct TestView { + count: usize, + is_doubling: bool, +} + +impl TestView { + fn increase_count(&mut self) { + if self.is_doubling { + self.count *= 2; + } else { + self.count += 1; + } + } +} + +impl Entity for TestView { + type Event = (); +} + +type ButtonStyle = ContainerStyle; + +impl View for TestView { + fn ui_name() -> &'static str { + "TestView" + } + + fn render(&mut self, cx: &mut ViewContext<'_, '_, Self>) -> AnyElement { + fonts::with_font_cache(cx.font_cache.to_owned(), || { + Flex::column() + .with_child(Label::new( + format!("Count: {}", self.count), + TextStyle::for_color(Color::red()), + )) + .with_child( + Button::new(move |_, v: &mut Self, cx| { + v.increase_count(); + cx.notify(); + }) + .with_text( + "Hello from a counting BUTTON", + TextStyle::for_color(Color::blue()), + ) + .with_style(ButtonStyle::fill(Color::yellow())) + .into_element(), + ) + .with_child( + ToggleableButton::new(self.is_doubling, move |_, v: &mut Self, cx| { + v.is_doubling = !v.is_doubling; + cx.notify(); + }) + .with_text("Double the count?", TextStyle::for_color(Color::black())) + .with_style(Toggleable { + inactive: ButtonStyle::fill(Color::red()), + active: ButtonStyle::fill(Color::green()), + }) + .into_element(), + ) + .expanded() + .contained() + .with_background_color(Color::white()) + .into_any() + }) + } +} + +mod theme { + pub struct Toggleable { + pub inactive: T, + pub active: T, + } + + impl Toggleable { + pub fn style_for(&self, active: bool) -> &T { + if active { + &self.active + } else { + &self.inactive + } + } + } +} + +// Component creation: +mod toggleable_button { + use gpui::{ + elements::{ContainerStyle, LabelStyle}, + scene::MouseClick, + EventContext, View, + }; + + use crate::{button_component::Button, component::Component, theme::Toggleable}; + + pub struct ToggleableButton { + active: bool, + style: Option>, + button: Button, + } + + impl ToggleableButton { + pub fn new(active: bool, on_click: F) -> Self + where + F: Fn(MouseClick, &mut V, &mut EventContext) + 'static, + { + Self { + active, + button: Button::new(on_click), + style: None, + } + } + + pub fn with_text(self, text: &str, style: impl Into) -> ToggleableButton { + ToggleableButton { + active: self.active, + style: self.style, + button: self.button.with_text(text, style), + } + } + + pub fn with_style(self, style: Toggleable) -> ToggleableButton { + ToggleableButton { + active: self.active, + style: Some(style), + button: self.button, + } + } + } + + impl Component for ToggleableButton { + type View = V; + + fn render( + self, + v: &mut Self::View, + cx: &mut gpui::ViewContext, + ) -> gpui::AnyElement { + let button = if let Some(style) = self.style { + self.button.with_style(*style.style_for(self.active)) + } else { + self.button + }; + button.render(v, cx) + } + } +} + +mod button_component { + + use gpui::{ + elements::{ContainerStyle, Label, LabelStyle, MouseEventHandler}, + platform::MouseButton, + scene::MouseClick, + AnyElement, Element, EventContext, TypeTag, View, ViewContext, + }; + + use crate::component::Component; + + type ClickHandler = Box)>; + + pub struct Button { + click_handler: ClickHandler, + tag: TypeTag, + contents: Option>, + style: Option, + } + + impl Button { + pub fn new) + 'static>(handler: F) -> Self { + Self { + click_handler: Box::new(handler), + tag: TypeTag::new::(), + style: None, + contents: None, + } + } + + pub fn with_text(mut self, text: &str, style: impl Into) -> Self { + self.contents = Some(Label::new(text.to_string(), style).into_any()); + self + } + + pub fn _with_contents>(mut self, contents: E) -> Self { + self.contents = Some(contents.into_any()); + self + } + + pub fn with_style(mut self, style: ContainerStyle) -> Self { + self.style = Some(style); + self + } + } + + impl Component for Button { + type View = V; + + fn render(self, _: &mut Self::View, cx: &mut ViewContext) -> AnyElement { + let click_handler = self.click_handler; + + let result = MouseEventHandler::new_dynamic(self.tag, 0, cx, |_, _| { + self.contents + .unwrap_or_else(|| gpui::elements::Empty::new().into_any()) + }) + .on_click(MouseButton::Left, move |click, v, cx| { + click_handler(click, v, cx); + }) + .contained(); + + let result = if let Some(style) = self.style { + result.with_style(style) + } else { + result + }; + + result.into_any() + } + } +} + +mod component { + + use gpui::{AnyElement, Element, View, ViewContext}; + use pathfinder_geometry::vector::Vector2F; + + // Public API: + pub trait Component { + type View: View; + + fn render( + self, + v: &mut Self::View, + cx: &mut ViewContext, + ) -> AnyElement; + } + + pub struct ComponentAdapter { + component: Option, + } + + impl ComponentAdapter { + pub fn new(e: E) -> Self { + Self { component: Some(e) } + } + } + + pub trait AdaptComponent: Sized { + fn into_element(self) -> ComponentAdapter { + ComponentAdapter::new(self) + } + } + + impl AdaptComponent for C {} + + impl Element for ComponentAdapter { + type LayoutState = AnyElement; + + type PaintState = (); + + fn layout( + &mut self, + constraint: gpui::SizeConstraint, + view: &mut C::View, + cx: &mut gpui::LayoutContext, + ) -> (Vector2F, Self::LayoutState) { + let component = self.component.take().unwrap(); + let mut element = component.render(view, cx.view_context()); + let constraint = element.layout(constraint, view, cx); + (constraint, element) + } + + fn paint( + &mut self, + scene: &mut gpui::SceneBuilder, + bounds: gpui::geometry::rect::RectF, + visible_bounds: gpui::geometry::rect::RectF, + layout: &mut Self::LayoutState, + view: &mut C::View, + cx: &mut gpui::PaintContext, + ) -> Self::PaintState { + layout.paint(scene, bounds.origin(), visible_bounds, view, cx) + } + + fn rect_for_text_range( + &self, + _: std::ops::Range, + _: gpui::geometry::rect::RectF, + _: gpui::geometry::rect::RectF, + _: &Self::LayoutState, + _: &Self::PaintState, + _: &C::View, + _: &ViewContext, + ) -> Option { + todo!() + } + + fn debug( + &self, + _: gpui::geometry::rect::RectF, + _: &Self::LayoutState, + _: &Self::PaintState, + _: &C::View, + _: &ViewContext, + ) -> serde_json::Value { + todo!() + } + } +} diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 2a9d9f4768..8e6d43a45d 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -3280,7 +3280,11 @@ impl<'a, 'b, V: View> ViewContext<'a, 'b, V> { } pub fn mouse_state(&self, region_id: usize) -> MouseState { - let region_id = MouseRegionId::new::(self.view_id, region_id); + self.mouse_state_dynamic(TypeTag::new::(), region_id) + } + + pub fn mouse_state_dynamic(&self, tag: TypeTag, region_id: usize) -> MouseState { + let region_id = MouseRegionId::new(tag, self.view_id, region_id); MouseState { hovered: self.window.hovered_region_ids.contains(®ion_id), clicked: if let Some((clicked_region_id, button)) = self.window.clicked_region { @@ -3321,6 +3325,36 @@ impl<'a, 'b, V: View> ViewContext<'a, 'b, V> { } } +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] +pub struct TypeTag { + tag: TypeId, + #[cfg(debug_assertions)] + tag_type_name: &'static str, +} + +impl TypeTag { + pub fn new() -> Self { + Self { + tag: TypeId::of::(), + #[cfg(debug_assertions)] + tag_type_name: std::any::type_name::(), + } + } + + pub fn dynamic(tag: TypeId, #[cfg(debug_assertions)] type_name: &'static str) -> Self { + Self { + tag, + #[cfg(debug_assertions)] + tag_type_name: type_name, + } + } + + #[cfg(debug_assertions)] + pub(crate) fn type_name(&self) -> &'static str { + self.tag_type_name + } +} + impl BorrowAppContext for ViewContext<'_, '_, V> { fn read_with T>(&self, f: F) -> T { BorrowAppContext::read_with(&*self.window_context, f) @@ -5171,7 +5205,7 @@ mod tests { fn render(&mut self, cx: &mut ViewContext) -> AnyElement { enum Handler {} let mouse_down_count = self.mouse_down_count.clone(); - MouseEventHandler::::new(0, cx, |_, _| Empty::new()) + MouseEventHandler::new::(0, cx, |_, _| Empty::new()) .on_down(MouseButton::Left, move |_, _, _| { mouse_down_count.fetch_add(1, SeqCst); }) diff --git a/crates/gpui/src/elements.rs b/crates/gpui/src/elements.rs index 56a712802b..16c750ea8e 100644 --- a/crates/gpui/src/elements.rs +++ b/crates/gpui/src/elements.rs @@ -193,11 +193,11 @@ pub trait Element: 'static { Resizable::new(self.into_any(), side, size, on_resize) } - fn mouse(self, region_id: usize) -> MouseEventHandler + fn mouse(self, region_id: usize) -> MouseEventHandler where Self: Sized, { - MouseEventHandler::for_child(self.into_any(), region_id) + MouseEventHandler::for_child::(self.into_any(), region_id) } } diff --git a/crates/gpui/src/elements/container.rs b/crates/gpui/src/elements/container.rs index 698100ab29..bb1366b4e7 100644 --- a/crates/gpui/src/elements/container.rs +++ b/crates/gpui/src/elements/container.rs @@ -38,6 +38,15 @@ pub struct ContainerStyle { pub cursor: Option, } +impl ContainerStyle { + pub fn fill(color: Color) -> Self { + Self { + background_color: Some(color), + ..Default::default() + } + } +} + pub struct Container { child: AnyElement, style: ContainerStyle, diff --git a/crates/gpui/src/elements/mouse_event_handler.rs b/crates/gpui/src/elements/mouse_event_handler.rs index 6005277f73..2ed0f1720f 100644 --- a/crates/gpui/src/elements/mouse_event_handler.rs +++ b/crates/gpui/src/elements/mouse_event_handler.rs @@ -11,12 +11,12 @@ use crate::{ MouseHover, MouseMove, MouseMoveOut, MouseScrollWheel, MouseUp, MouseUpOut, }, AnyElement, Element, EventContext, LayoutContext, MouseRegion, MouseState, PaintContext, - SceneBuilder, SizeConstraint, View, ViewContext, + SceneBuilder, SizeConstraint, TypeTag, View, ViewContext, }; use serde_json::json; -use std::{marker::PhantomData, ops::Range}; +use std::ops::Range; -pub struct MouseEventHandler { +pub struct MouseEventHandler { child: AnyElement, region_id: usize, cursor_style: Option, @@ -26,13 +26,13 @@ pub struct MouseEventHandler { notify_on_click: bool, above: bool, padding: Padding, - _tag: PhantomData, + tag: TypeTag, } /// Element which provides a render_child callback with a MouseState and paints a mouse /// region under (or above) it for easy mouse event handling. -impl MouseEventHandler { - pub fn for_child(child: impl Element, region_id: usize) -> Self { +impl MouseEventHandler { + pub fn for_child(child: impl Element, region_id: usize) -> Self { Self { child: child.into_any(), region_id, @@ -43,16 +43,19 @@ impl MouseEventHandler { hoverable: false, above: false, padding: Default::default(), - _tag: PhantomData, + tag: TypeTag::new::(), } } - pub fn new(region_id: usize, cx: &mut ViewContext, render_child: F) -> Self + pub fn new( + region_id: usize, + cx: &mut ViewContext, + render_child: impl FnOnce(&mut MouseState, &mut ViewContext) -> E, + ) -> Self where E: Element, - F: FnOnce(&mut MouseState, &mut ViewContext) -> E, { - let mut mouse_state = cx.mouse_state::(region_id); + let mut mouse_state = cx.mouse_state_dynamic(TypeTag::new::(), region_id); let child = render_child(&mut mouse_state, cx).into_any(); let notify_on_hover = mouse_state.accessed_hovered(); let notify_on_click = mouse_state.accessed_clicked(); @@ -66,19 +69,46 @@ impl MouseEventHandler { hoverable: true, above: false, padding: Default::default(), - _tag: PhantomData, + tag: TypeTag::new::(), + } + } + + pub fn new_dynamic( + tag: TypeTag, + region_id: usize, + cx: &mut ViewContext, + render_child: impl FnOnce(&mut MouseState, &mut ViewContext) -> AnyElement, + ) -> Self { + let mut mouse_state = cx.mouse_state_dynamic(tag, region_id); + let child = render_child(&mut mouse_state, cx); + let notify_on_hover = mouse_state.accessed_hovered(); + let notify_on_click = mouse_state.accessed_clicked(); + Self { + child, + region_id, + cursor_style: None, + handlers: Default::default(), + notify_on_hover, + notify_on_click, + hoverable: true, + above: false, + padding: Default::default(), + tag, } } /// Modifies the MouseEventHandler to render the MouseRegion above the child element. Useful /// for drag and drop handling and similar events which should be captured before the child /// gets the opportunity - pub fn above(region_id: usize, cx: &mut ViewContext, render_child: F) -> Self + pub fn above( + region_id: usize, + cx: &mut ViewContext, + render_child: impl FnOnce(&mut MouseState, &mut ViewContext) -> D, + ) -> Self where D: Element, - F: FnOnce(&mut MouseState, &mut ViewContext) -> D, { - let mut handler = Self::new(region_id, cx, render_child); + let mut handler = Self::new::(region_id, cx, render_child); handler.above = true; handler } @@ -223,7 +253,8 @@ impl MouseEventHandler { }); } scene.push_mouse_region( - MouseRegion::from_handlers::( + MouseRegion::from_handlers( + self.tag, cx.view_id(), self.region_id, hit_bounds, @@ -236,7 +267,7 @@ impl MouseEventHandler { } } -impl Element for MouseEventHandler { +impl Element for MouseEventHandler { type LayoutState = (); type PaintState = (); diff --git a/crates/gpui/src/elements/tooltip.rs b/crates/gpui/src/elements/tooltip.rs index 14f3809e67..0ba0110303 100644 --- a/crates/gpui/src/elements/tooltip.rs +++ b/crates/gpui/src/elements/tooltip.rs @@ -95,7 +95,7 @@ impl Tooltip { } else { None }; - let child = MouseEventHandler::, _>::new(id, cx, |_, _| child) + let child = MouseEventHandler::new::, _>(id, cx, |_, _| child) .on_hover(move |e, _, cx| { let position = e.position; if e.started { diff --git a/crates/gpui/src/fonts.rs b/crates/gpui/src/fonts.rs index b003042866..8858e1a316 100644 --- a/crates/gpui/src/fonts.rs +++ b/crates/gpui/src/fonts.rs @@ -72,6 +72,13 @@ pub struct TextStyle { } impl TextStyle { + pub fn for_color(color: Color) -> Self { + Self { + color, + ..Default::default() + } + } + pub fn refine(self, refinement: TextStyleRefinement) -> TextStyle { TextStyle { color: refinement.color.unwrap_or(self.color), diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 1d93a45fc7..9f6e303cb7 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -24,6 +24,7 @@ use crate::{ use anyhow::{anyhow, bail, Result}; use async_task::Runnable; pub use event::*; +use pathfinder_geometry::vector::vec2f; use postage::oneshot; use schemars::JsonSchema; use serde::Deserialize; @@ -180,6 +181,16 @@ pub struct WindowOptions<'a> { pub screen: Option>, } +impl<'a> WindowOptions<'a> { + pub fn with_bounds(bounds: Vector2F) -> Self { + Self { + bounds: WindowBounds::Fixed(RectF::new(vec2f(0., 0.), bounds)), + center: true, + ..Default::default() + } + } +} + #[derive(Debug)] pub struct TitlebarOptions<'a> { pub title: Option<&'a str>, diff --git a/crates/gpui/src/scene/mouse_region.rs b/crates/gpui/src/scene/mouse_region.rs index cf39ac782f..1632b494a3 100644 --- a/crates/gpui/src/scene/mouse_region.rs +++ b/crates/gpui/src/scene/mouse_region.rs @@ -1,13 +1,10 @@ -use crate::{platform::MouseButton, window::WindowContext, EventContext, View, ViewContext}; +use crate::{ + platform::MouseButton, window::WindowContext, EventContext, TypeTag, View, ViewContext, +}; use collections::HashMap; use pathfinder_geometry::rect::RectF; use smallvec::SmallVec; -use std::{ - any::{Any, TypeId}, - fmt::Debug, - mem::Discriminant, - rc::Rc, -}; +use std::{any::Any, fmt::Debug, mem::Discriminant, rc::Rc}; use super::{ mouse_event::{ @@ -33,14 +30,27 @@ impl MouseRegion { /// should pass a different (consistent) region_id. If you have one big region that covers your /// whole component, just pass the view_id again. pub fn new(view_id: usize, region_id: usize, bounds: RectF) -> Self { - Self::from_handlers::(view_id, region_id, bounds, Default::default()) + Self::from_handlers( + TypeTag::new::(), + view_id, + region_id, + bounds, + Default::default(), + ) } pub fn handle_all(view_id: usize, region_id: usize, bounds: RectF) -> Self { - Self::from_handlers::(view_id, region_id, bounds, HandlerSet::capture_all()) + Self::from_handlers( + TypeTag::new::(), + view_id, + region_id, + bounds, + HandlerSet::capture_all(), + ) } - pub fn from_handlers( + pub fn from_handlers( + tag: TypeTag, view_id: usize, region_id: usize, bounds: RectF, @@ -49,10 +59,8 @@ impl MouseRegion { Self { id: MouseRegionId { view_id, - tag: TypeId::of::(), + tag, region_id, - #[cfg(debug_assertions)] - tag_type_name: std::any::type_name::(), }, bounds, handlers, @@ -180,20 +188,16 @@ impl MouseRegion { #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, PartialOrd, Ord)] pub struct MouseRegionId { view_id: usize, - tag: TypeId, + tag: TypeTag, region_id: usize, - #[cfg(debug_assertions)] - tag_type_name: &'static str, } impl MouseRegionId { - pub(crate) fn new(view_id: usize, region_id: usize) -> Self { + pub(crate) fn new(tag: TypeTag, view_id: usize, region_id: usize) -> Self { MouseRegionId { view_id, region_id, - tag: TypeId::of::(), - #[cfg(debug_assertions)] - tag_type_name: std::any::type_name::(), + tag, } } @@ -203,7 +207,7 @@ impl MouseRegionId { #[cfg(debug_assertions)] pub fn tag_type_name(&self) -> &'static str { - self.tag_type_name + self.tag.type_name() } } diff --git a/crates/gpui/src/views/select.rs b/crates/gpui/src/views/select.rs index f3be9de3ec..f76fab738e 100644 --- a/crates/gpui/src/views/select.rs +++ b/crates/gpui/src/views/select.rs @@ -106,7 +106,7 @@ impl View for Select { Default::default() }; let mut result = Flex::column().with_child( - MouseEventHandler::::new(self.handle.id(), cx, |mouse_state, cx| { + MouseEventHandler::new::(self.handle.id(), cx, |mouse_state, cx| { (self.render_item)( self.selected_item_ix, ItemType::Header, @@ -130,7 +130,7 @@ impl View for Select { let selected_item_ix = this.selected_item_ix; range.end = range.end.min(this.item_count); items.extend(range.map(|ix| { - MouseEventHandler::::new(ix, cx, |mouse_state, cx| { + MouseEventHandler::new::(ix, cx, |mouse_state, cx| { (this.render_item)( ix, if ix == selected_item_ix { diff --git a/crates/language_selector/src/active_buffer_language.rs b/crates/language_selector/src/active_buffer_language.rs index b97417580f..5ffcb13fba 100644 --- a/crates/language_selector/src/active_buffer_language.rs +++ b/crates/language_selector/src/active_buffer_language.rs @@ -53,7 +53,7 @@ impl View for ActiveBufferLanguage { "Unknown".to_string() }; - MouseEventHandler::::new(0, cx, |state, cx| { + MouseEventHandler::new::(0, cx, |state, cx| { let theme = &theme::current(cx).workspace.status_bar; let style = theme.active_language.style_for(state); Label::new(active_language_text, style.text.clone()) diff --git a/crates/language_tools/src/lsp_log.rs b/crates/language_tools/src/lsp_log.rs index 0dc594a13f..cc2bf37d4a 100644 --- a/crates/language_tools/src/lsp_log.rs +++ b/crates/language_tools/src/lsp_log.rs @@ -573,7 +573,7 @@ impl View for LspLogToolbarItemView { .with_children(if self.menu_open { Some( Overlay::new( - MouseEventHandler::::new(0, cx, move |_, cx| { + MouseEventHandler::new::(0, cx, move |_, cx| { Flex::column() .with_children(menu_rows.into_iter().map(|row| { Self::render_language_server_menu_item( @@ -672,7 +672,7 @@ impl LspLogToolbarItemView { cx: &mut ViewContext, ) -> impl Element { enum ToggleMenu {} - MouseEventHandler::::new(0, cx, move |state, cx| { + MouseEventHandler::new::(0, cx, move |state, cx| { let label: Cow = current_server .and_then(|row| { let worktree = row.worktree.read(cx); @@ -728,7 +728,7 @@ impl LspLogToolbarItemView { .with_height(theme.toolbar_dropdown_menu.row_height) }) .with_child( - MouseEventHandler::::new(id.0, cx, move |state, _| { + MouseEventHandler::new::(id.0, cx, move |state, _| { let style = theme .toolbar_dropdown_menu .item @@ -746,7 +746,7 @@ impl LspLogToolbarItemView { }), ) .with_child( - MouseEventHandler::::new(id.0, cx, move |state, cx| { + MouseEventHandler::new::(id.0, cx, move |state, cx| { let style = theme .toolbar_dropdown_menu .item diff --git a/crates/language_tools/src/syntax_tree_view.rs b/crates/language_tools/src/syntax_tree_view.rs index 3e6727bbf4..60788d034e 100644 --- a/crates/language_tools/src/syntax_tree_view.rs +++ b/crates/language_tools/src/syntax_tree_view.rs @@ -389,7 +389,7 @@ impl View for SyntaxTreeView { { let layer = layer.clone(); let theme = editor_theme.clone(); - return MouseEventHandler::::new(0, cx, move |state, cx| { + return MouseEventHandler::new::(0, cx, move |state, cx| { let list_hovered = state.hovered(); UniformList::new( self.list_state.clone(), @@ -505,7 +505,7 @@ impl SyntaxTreeToolbarItemView { .with_child(Self::render_header(&theme, &active_layer, cx)) .with_children(self.menu_open.then(|| { Overlay::new( - MouseEventHandler::::new(0, cx, move |_, cx| { + MouseEventHandler::new::(0, cx, move |_, cx| { Flex::column() .with_children(active_buffer.syntax_layers().enumerate().map( |(ix, layer)| { @@ -564,7 +564,7 @@ impl SyntaxTreeToolbarItemView { cx: &mut ViewContext, ) -> impl Element { enum ToggleMenu {} - MouseEventHandler::::new(0, cx, move |state, _| { + MouseEventHandler::new::(0, cx, move |state, _| { let style = theme.toolbar_dropdown_menu.header.style_for(state); Flex::row() .with_child( @@ -596,7 +596,7 @@ impl SyntaxTreeToolbarItemView { cx: &mut ViewContext, ) -> impl Element { enum ActivateLayer {} - MouseEventHandler::::new(layer_ix, cx, move |state, _| { + MouseEventHandler::new::(layer_ix, cx, move |state, _| { let is_selected = layer.node() == active_layer.node(); let style = theme .toolbar_dropdown_menu diff --git a/crates/picker/src/picker.rs b/crates/picker/src/picker.rs index 6efa33e961..a3b8672f9f 100644 --- a/crates/picker/src/picker.rs +++ b/crates/picker/src/picker.rs @@ -112,7 +112,7 @@ impl View for Picker { let selected_ix = this.delegate.selected_index(); range.end = cmp::min(range.end, this.delegate.match_count()); items.extend(range.map(move |ix| { - MouseEventHandler::::new(ix, cx, |state, cx| { + MouseEventHandler::new::(ix, cx, |state, cx| { this.delegate.render_match(ix, state, ix == selected_ix, cx) }) // Capture mouse events diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index f7582f1764..4acc539263 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -1407,7 +1407,7 @@ impl ProjectPanel { let show_editor = details.is_editing && !details.is_processing; - MouseEventHandler::::new(entry_id.to_usize(), cx, |state, cx| { + MouseEventHandler::new::(entry_id.to_usize(), cx, |state, cx| { let mut style = entry_style .in_state(details.is_selected) .style_for(state) @@ -1519,7 +1519,7 @@ impl View for ProjectPanel { if has_worktree { Stack::new() .with_child( - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { UniformList::new( self.list.clone(), self.visible_entries @@ -1563,7 +1563,7 @@ impl View for ProjectPanel { } else { Flex::column() .with_child( - MouseEventHandler::::new(2, cx, { + MouseEventHandler::new::(2, cx, { let button_style = theme.open_project_button.clone(); let context_menu_item_style = theme::current(cx).context_menu.item.clone(); move |state, cx| { diff --git a/crates/search/src/buffer_search.rs b/crates/search/src/buffer_search.rs index c3b4f5caa6..36c9d3becd 100644 --- a/crates/search/src/buffer_search.rs +++ b/crates/search/src/buffer_search.rs @@ -416,7 +416,7 @@ impl BufferSearchBar { let tooltip_style = theme::current(cx).tooltip.clone(); let is_active = self.search_options.contains(option); Some( - MouseEventHandler::::new(option.bits as usize, cx, |state, cx| { + MouseEventHandler::new::(option.bits as usize, cx, |state, cx| { let theme = theme::current(cx); let style = theme .search @@ -463,7 +463,7 @@ impl BufferSearchBar { let tooltip_style = theme::current(cx).tooltip.clone(); enum NavButton {} - MouseEventHandler::::new(direction as usize, cx, |state, cx| { + MouseEventHandler::new::(direction as usize, cx, |state, cx| { let theme = theme::current(cx); let style = theme.search.option_button.inactive_state().style_for(state); Label::new(icon, style.text.clone()) @@ -497,7 +497,7 @@ impl BufferSearchBar { let action_type_id = 0_usize; enum ActionButton {} - MouseEventHandler::::new(action_type_id, cx, |state, cx| { + MouseEventHandler::new::(action_type_id, cx, |state, cx| { let theme = theme::current(cx); let style = theme.search.action_button.style_for(state); Label::new(icon, style.text.clone()) @@ -527,7 +527,7 @@ impl BufferSearchBar { let tooltip_style = theme::current(cx).tooltip.clone(); enum CloseButton {} - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.dismiss_button.style_for(state); Svg::new("icons/x_mark_8.svg") .with_color(style.color) diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index 018ab9cb11..8bc8d7da88 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -328,7 +328,7 @@ impl View for ProjectSearchView { editor.set_placeholder_text(new_placeholder_text, cx); }); - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { Label::new(text, theme.search.results_status.clone()) .aligned() .contained() @@ -1103,7 +1103,7 @@ impl ProjectSearchBar { let tooltip_style = theme::current(cx).tooltip.clone(); enum NavButton {} - MouseEventHandler::::new(direction as usize, cx, |state, cx| { + MouseEventHandler::new::(direction as usize, cx, |state, cx| { let theme = theme::current(cx); let style = theme.search.option_button.inactive_state().style_for(state); Label::new(icon, style.text.clone()) @@ -1134,7 +1134,7 @@ impl ProjectSearchBar { ) -> AnyElement { let tooltip_style = theme::current(cx).tooltip.clone(); let is_active = self.is_option_enabled(option, cx); - MouseEventHandler::::new(option.bits as usize, cx, |state, cx| { + MouseEventHandler::new::(option.bits as usize, cx, |state, cx| { let theme = theme::current(cx); let style = theme .search @@ -1170,7 +1170,7 @@ impl ProjectSearchBar { let region_id = 3; - MouseEventHandler::::new(region_id, cx, |state, cx| { + MouseEventHandler::new::(region_id, cx, |state, cx| { let theme = theme::current(cx); let style = theme .search diff --git a/crates/theme/src/ui.rs b/crates/theme/src/ui.rs index a16c3cb21e..81663ed6ca 100644 --- a/crates/theme/src/ui.rs +++ b/crates/theme/src/ui.rs @@ -34,7 +34,7 @@ pub fn checkbox( id: usize, cx: &mut ViewContext, change: F, -) -> MouseEventHandler +) -> MouseEventHandler where Tag: 'static, V: View, @@ -43,7 +43,7 @@ where let label = Label::new(label, style.label.text.clone()) .contained() .with_style(style.label.container); - checkbox_with_label(label, style, checked, id, cx, change) + checkbox_with_label::(label, style, checked, id, cx, change) } pub fn checkbox_with_label( @@ -53,14 +53,14 @@ pub fn checkbox_with_label( id: usize, cx: &mut ViewContext, change: F, -) -> MouseEventHandler +) -> MouseEventHandler where Tag: 'static, D: Element, V: View, F: 'static + Fn(&mut V, bool, &mut EventContext), { - MouseEventHandler::new(id, cx, |state, _| { + MouseEventHandler::new::(id, cx, |state, _| { let indicator = if checked { svg(&style.icon) } else { @@ -143,14 +143,14 @@ pub fn cta_button( style: &ButtonStyle, cx: &mut ViewContext, f: F, -) -> MouseEventHandler +) -> MouseEventHandler where Tag: 'static, L: Into>, V: View, F: Fn(MouseClick, &mut V, &mut EventContext) + 'static, { - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = style.style_for(state); Label::new(label, style.text.to_owned()) .aligned() @@ -205,7 +205,7 @@ where )) .with_child( // FIXME: Get a better tag type - MouseEventHandler::::new(999999, cx, |state, _cx| { + MouseEventHandler::new::(999999, cx, |state, _cx| { let style = style.close_icon.style_for(state); icon(style) }) diff --git a/crates/vcs_menu/src/lib.rs b/crates/vcs_menu/src/lib.rs index 384b622469..9009c4e3d3 100644 --- a/crates/vcs_menu/src/lib.rs +++ b/crates/vcs_menu/src/lib.rs @@ -295,7 +295,7 @@ impl PickerDelegate for BranchListDelegate { let style = theme.picker.footer.clone(); enum BranchCreateButton {} Some( - Flex::row().with_child(MouseEventHandler::::new(0, cx, |state, _| { + Flex::row().with_child(MouseEventHandler::new::(0, cx, |state, _| { let style = style.style_for(state); Label::new("Create branch", style.label.clone()) .contained() diff --git a/crates/workspace/src/dock.rs b/crates/workspace/src/dock.rs index e33c0a5391..641eae081e 100644 --- a/crates/workspace/src/dock.rs +++ b/crates/workspace/src/dock.rs @@ -497,9 +497,8 @@ impl View for PanelButtons { }; Stack::new() .with_child( - MouseEventHandler::::new(panel_ix, cx, |state, cx| { + MouseEventHandler::new::(panel_ix, cx, |state, cx| { let style = button_style.in_state(is_active); - let style = style.style_for(state); Flex::row() .with_child( diff --git a/crates/workspace/src/notifications.rs b/crates/workspace/src/notifications.rs index 09cfb4d5d8..55b44e9673 100644 --- a/crates/workspace/src/notifications.rs +++ b/crates/workspace/src/notifications.rs @@ -290,7 +290,7 @@ pub mod simple_message_notification { .flex(1., true), ) .with_child( - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = theme.dismiss_button.style_for(state); Svg::new("icons/x_mark_8.svg") .with_color(style.color) @@ -319,7 +319,7 @@ pub mod simple_message_notification { .with_children({ click_message .map(|click_message| { - MouseEventHandler::::new( + MouseEventHandler::new::( 0, cx, |state, _| { diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index 06f13cd52d..4aca96374a 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -1211,7 +1211,7 @@ impl Pane { enum Tab {} let mouse_event_handler = - MouseEventHandler::::new(ix, cx, |_, cx| { + MouseEventHandler::new::(ix, cx, |_, cx| { Self::render_tab( &item, pane.clone(), @@ -1420,7 +1420,7 @@ impl Pane { let item_id = item.id(); enum TabCloseButton {} let icon = Svg::new("icons/x_mark_8.svg"); - MouseEventHandler::::new(item_id, cx, |mouse_state, _| { + MouseEventHandler::new::(item_id, cx, |mouse_state, _| { if mouse_state.hovered() { icon.with_color(tab_style.icon_close_active) } else { @@ -1485,7 +1485,7 @@ impl Pane { ) -> AnyElement { enum TabBarButton {} - let mut button = MouseEventHandler::::new(index, cx, |mouse_state, cx| { + let mut button = MouseEventHandler::new::(index, cx, |mouse_state, cx| { let theme = &settings::get::(cx).theme.workspace.tab_bar; let style = theme.pane_button.in_state(is_active).style_for(mouse_state); Svg::new(icon) @@ -1547,7 +1547,7 @@ impl View for Pane { fn render(&mut self, cx: &mut ViewContext) -> AnyElement { enum MouseNavigationHandler {} - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { let active_item_index = self.active_item_index; if let Some(active_item) = self.active_item() { @@ -1559,7 +1559,7 @@ impl View for Pane { enum TabBarEventHandler {} stack.add_child( - MouseEventHandler::::new(0, cx, |_, _| { + MouseEventHandler::new::(0, cx, |_, _| { Empty::new() .contained() .with_style(theme.workspace.tab_bar.container) diff --git a/crates/workspace/src/pane/dragged_item_receiver.rs b/crates/workspace/src/pane/dragged_item_receiver.rs index 165537a1af..1cbf3e4f50 100644 --- a/crates/workspace/src/pane/dragged_item_receiver.rs +++ b/crates/workspace/src/pane/dragged_item_receiver.rs @@ -19,7 +19,7 @@ pub fn dragged_item_receiver( split_margin: Option, cx: &mut ViewContext, render_child: F, -) -> MouseEventHandler +) -> MouseEventHandler where Tag: 'static, D: Element, @@ -39,7 +39,7 @@ where None }; - let mut handler = MouseEventHandler::::above(region_id, cx, |state, cx| { + let mut handler = MouseEventHandler::above::(region_id, cx, |state, cx| { // Observing hovered will cause a render when the mouse enters regardless // of if mouse position was accessed before let drag_position = if state.hovered() { drag_position } else { None }; diff --git a/crates/workspace/src/pane_group.rs b/crates/workspace/src/pane_group.rs index dfda5092ca..7528fb7468 100644 --- a/crates/workspace/src/pane_group.rs +++ b/crates/workspace/src/pane_group.rs @@ -212,7 +212,7 @@ impl Member { let leader_user_id = leader.user.id; let app_state = Arc::downgrade(app_state); Some( - MouseEventHandler::::new( + MouseEventHandler::new::( pane.id(), cx, |_, _| { diff --git a/crates/workspace/src/shared_screen.rs b/crates/workspace/src/shared_screen.rs index 977e167f60..aea03df5e0 100644 --- a/crates/workspace/src/shared_screen.rs +++ b/crates/workspace/src/shared_screen.rs @@ -72,7 +72,7 @@ impl View for SharedScreen { enum Focus {} let frame = self.frame.clone(); - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { Canvas::new(move |scene, bounds, _, _, _| { if let Some(frame) = frame.clone() { let size = constrain_size_preserving_aspect_ratio( diff --git a/crates/workspace/src/toolbar.rs b/crates/workspace/src/toolbar.rs index 945ac7b0f5..0516f3a145 100644 --- a/crates/workspace/src/toolbar.rs +++ b/crates/workspace/src/toolbar.rs @@ -223,7 +223,7 @@ fn nav_button action_name: &'static str, cx: &mut ViewContext, ) -> AnyElement { - MouseEventHandler::::new(0, cx, |state, _| { + MouseEventHandler::new::(0, cx, |state, _| { let style = if enabled { style.style_for(state) } else { diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index ab4f7286dc..a449c58de3 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -2560,7 +2560,7 @@ impl Workspace { }; enum TitleBar {} - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { Stack::new() .with_children( self.titlebar_item @@ -2649,7 +2649,7 @@ impl Workspace { if self.project.read(cx).is_read_only() { enum DisconnectedOverlay {} Some( - MouseEventHandler::::new(0, cx, |_, cx| { + MouseEventHandler::new::(0, cx, |_, cx| { let theme = &theme::current(cx); Label::new( "Your connection to the remote project has been lost.",