11pub mod query_window;
2+ pub mod segmented_button;
23use std:: {
34 cell:: RefCell ,
45 collections:: HashMap ,
@@ -11,12 +12,16 @@ use std::{
1112} ;
1213
1314use crate :: {
14- ApiDocsState , LogState , TraceProvider , icon_colored, notifications:: draw_x, rect,
15- search:: query_window:: PaginatedResults , spawn_task,
15+ ApiDocsState , LogState , TraceProvider , icon_colored,
16+ notifications:: draw_x,
17+ rect,
18+ search:: { query_window:: PaginatedResults , segmented_button:: SegmentedIconButtons } ,
19+ spawn_task,
1620} ;
1721use crossbeam:: channel:: Receiver ;
1822use egui:: {
19- Color32 , CornerRadius , Margin , Pos2 , Rect , Response , Sense , Separator , TextEdit , Ui , pos2, vec2,
23+ Color32 , CornerRadius , Margin , Pos2 , Rect , Response , Sense , Separator , TextEdit , Ui ,
24+ epaint:: RectShape , pos2, vec2,
2025} ;
2126use entrace_core:: LogProviderError ;
2227use entrace_query:: {
@@ -287,6 +292,7 @@ pub fn bottom_panel_ui(
287292 let total_top_padding = resize_width + text_field_margin. topf ( ) ;
288293 let search_rect = search_response. rect ;
289294 let search_rect = search_rect. with_min_y ( search_rect. min . y - total_top_padding) ;
295+
290296 let icon_size = 20.0 ;
291297 let rect_top_left = pos2 ( avail. max . x - ( 3.0 * icon_size) , search_rect. min . y ) ;
292298 let rect_bottom_right = pos2 ( avail. max . x , search_rect. min . y + icon_size) ;
@@ -296,42 +302,14 @@ pub fn bottom_panel_ui(
296302 egui:: Theme :: Dark => Color32 :: DARK_GRAY ,
297303 egui:: Theme :: Light => Color32 :: LIGHT_GRAY ,
298304 } ;
299- ui. painter ( ) . rect_filled ( rect2, bg_corner_radius, color) ;
300-
301- // make sure the items we add do not overflow the bottom panel, since that will
302- // grow it. to do this, we define an inner rect.
303- let spacing = 3.0 ;
304- let inner_rect_min = rect2. min + vec2 ( 3.0 , 3.0 ) ;
305- let inner_rect_max = rect2. max + vec2 ( -1.0 , -3.0 ) ;
306- let total_width = inner_rect_max. x - inner_rect_min. x ;
307- // [<left><spacing>|<spacing><mid><spacing>|<spacing><right>]
308- let segment_width = ( total_width - ( 2.0 * spacing) ) / 3.0 ;
309- let segment_size = vec2 ( segment_width, inner_rect_max. y - inner_rect_min. y ) ;
310- let inner_left = Rect :: from_min_size ( inner_rect_min, segment_size) ;
311- let inner_mid =
312- Rect :: from_min_size ( pos2 ( inner_left. max . x + spacing, inner_rect_min. y ) , segment_size) ;
313- let inner_right = rect ! [ pos2( inner_mid. max. x + spacing, inner_rect_min. y) , inner_rect_max] ;
314- let bg_left = rect ! [ rect2. min, pos2( inner_left. max. x, rect2. max. y) ] ;
315- let bg_mid = rect ! [ pos2( inner_mid. min. x, rect2. min. y) , pos2( inner_mid. max. x, rect2. max. y) ] ;
316- let bg_right = rect ! [ pos2( inner_right. min. x, rect2. min. y) , rect2. max] ;
317-
318- let ( topy, bottomy) = ( rect2. min . y + 3.0 , rect2. max . y - 1.0 ) ;
319- let sep1_rect =
320- rect ! [ pos2( inner_left. max. x + spacing, topy) , pos2( inner_mid. min. x - spacing, bottomy) ] ;
321- let sep2_rect =
322- rect ! [ pos2( inner_mid. max. x + spacing, topy) , pos2( inner_right. min. x - spacing, bottomy) ] ;
323- ui. put ( sep1_rect, Separator :: default ( ) . vertical ( ) ) ;
324- ui. put ( sep2_rect, Separator :: default ( ) . vertical ( ) ) ;
325305
326- fn paint_label (
306+ fn paint_label < L , O > (
327307 ui : & mut Ui , bg_rect : Rect , bg_corner_radius : CornerRadius , inner_rect : Rect ,
328- label_callback : impl FnOnce ( & mut Ui , Color32 ) , on_click : impl FnOnce ( Response ) ,
329- hover_text : Option < & str > ,
308+ label_callback : impl FnOnce ( & mut Ui , Color32 ) -> L , on_click : impl FnOnce ( Response ) -> O ,
309+ hover_text : & str ,
330310 ) {
331311 let mut resp = ui. allocate_rect ( inner_rect, Sense :: click ( ) ) ;
332- if let Some ( x) = hover_text {
333- resp = resp. on_hover_text ( x) ;
334- }
312+ resp = resp. on_hover_text ( hover_text) ;
335313 if resp. hovered ( ) {
336314 ui. painter ( ) . rect_filled ( bg_rect, bg_corner_radius, Color32 :: GRAY . gamma_multiply ( 0.5 ) ) ;
337315 }
@@ -342,46 +320,46 @@ pub fn bottom_panel_ui(
342320 on_click ( resp) ;
343321 }
344322 }
345- paint_label (
346- ui ,
347- bg_left ,
348- bg_corner_radius ,
349- inner_left ,
350- |ui , color| {
351- ui . put ( inner_left , icon_colored ! ( "../../vendor/icons/play_arrow.svg" , color ) ) ;
352- } ,
353- |_| search_state . new_query ( log_state . trace_provider . clone ( ) ) ,
354- Some ( "Run (Ctrl+Enter)" ) ,
355- ) ;
356- paint_label (
357- ui ,
358- bg_mid ,
359- bg_corner_radius ,
360- inner_mid ,
361- |ui , color| {
362- ui . put ( inner_mid , icon_colored ! ( "../../vendor/icons/docs.svg" , color ) ) ;
363- } ,
364- |_| {
365- api_docs_state. open = true ;
366- } ,
367- Some ( "Lua API Docs" ) ,
368- ) ;
369-
370- paint_label (
371- ui ,
372- bg_right ,
373- CornerRadius :: ZERO ,
374- inner_right ,
375- |ui , color| {
376- ui . put ( inner_right , icon_colored ! ( "../../vendor/icons/ settings.svg" , color ) ) ;
377- } ,
378- |_| {
379- info ! ( settings_btn_rect = ?inner_right , "Query settings icon clicked" ) ;
380- search_state . settings . data =
381- QuerySettingsDialogData :: Open { settings_button_rect : inner_right , position : None }
382- } ,
383- Some ( "Settings" ) ,
384- ) ;
323+ let inner_to_bg_rect =
324+ | inner : Rect | rect ! [ pos2 ( inner . min . x , rect2 . min . y ) , pos2 ( inner . max . x , rect2 . max . y ) ] ;
325+ SegmentedIconButtons :: new ( RectShape :: filled ( rect2 , bg_corner_radius , color ) )
326+ . separator_y_padding ( [ 3.0 , 1.0 ] )
327+ . with_contents ( |ui , rects : [ Rect ; 3 ] | {
328+ paint_label (
329+ ui ,
330+ inner_to_bg_rect ( rects [ 0 ] ) . with_min_x ( rect2 . min . x ) ,
331+ bg_corner_radius ,
332+ rects [ 0 ] ,
333+ |ui , clr| ui . put ( rects [ 0 ] , icon_colored ! ( "../../vendor/icons/play_arrow.svg" , clr ) ) ,
334+ |_| search_state . new_query ( log_state . trace_provider . clone ( ) ) ,
335+ "Run (Ctrl+Enter)" ,
336+ ) ;
337+ paint_label (
338+ ui ,
339+ inner_to_bg_rect ( rects [ 1 ] ) ,
340+ CornerRadius :: ZERO ,
341+ rects [ 1 ] ,
342+ |ui , clr| ui . put ( rects [ 1 ] , icon_colored ! ( "../../vendor/icons/docs.svg" , clr ) ) ,
343+ |_| api_docs_state. open = true ,
344+ "Lua API Docs" ,
345+ ) ;
346+ paint_label (
347+ ui ,
348+ inner_to_bg_rect ( rect ! [ rects [ 2 ] . min , rect2 . max ] ) ,
349+ CornerRadius :: ZERO ,
350+ rects [ 2 ] ,
351+ |ui , clr| ui . put ( rects [ 2 ] , icon_colored ! ( "../../vendor/icons/settings.svg" , clr ) ) ,
352+ |_| {
353+ info ! ( settings_btn_rect = ?rects [ 2 ] , "Query settings icon clicked" ) ;
354+ search_state . settings . data = QuerySettingsDialogData :: Open {
355+ settings_button_rect : rects [ 2 ] ,
356+ position : None ,
357+ }
358+ } ,
359+ "Settings" ,
360+ ) ;
361+ } )
362+ . show ( ui ) ;
385363}
386364pub struct LocatingStarted {
387365 pub target : u32 ,
0 commit comments