mirror of
https://github.com/tiennm99/claude-code-usage-bubble.git
synced 2026-10-14 04:16:02 +00:00
feat: redesign bubble as two-bar rounded rect, finish port wiring
Bubble shape changes from circle to rounded rectangle showing two stacked horizontal bars — top: session (5h), bottom: weekly (7d) — each followed by a right-aligned "X% · Yh Zm" string (percent + countdown). Bubble surface: - BubbleConfig/BubbleState carry session+weekly percents and texts (mirrors PanelData); update_percentage renamed to update_data - Aspect ratio fixed at 3:1; size_logical is interpreted as width with height derived. Clamp is 120..360 (was 32..128 square) - Hit-testing uses a rounded-rect predicate (point_in_rounded_rect) shared with the alpha mask so paint and click area can't drift - New rgb_to_dib helper for direct DIB writes — BI_RGB 32bpp stores B,G,R,X in memory which is the opposite of COLORREF. The previous code wrote COLORREF-packed u32 straight into DIB pixels; invisible while every color was gray, but the new orange/red bar fills would have rendered blue - bar_h capped at h/4 (range 6..18) so the text font derived from it stays small enough that "100% · 23h" fits in right_text_w (= 6×bar_h, min 56); the first iteration had a 19-px font in a 60-px column and ellipsized away the countdown - Initial session_text/weekly_text seeded with "…" so the bubble has visible feedback during the first poll instead of two empty grey tracks Compile + cleanup needed to make the port build at all: - Color::from_hex added back as an infallible wrapper around parse_hex (15 call sites in bubble.rs/panel.rs assumed the old infallible API) - Color::to_colorref → into_colorref at 5 call sites - GetModuleFileNameW added to the LibraryLoader import in bubble.rs - usage::Error gains Creds(#[from] creds::Error) so `?` works in the Anthropic and ChatGPT providers - FlattenBoxed::flatten renamed to flatten_box — the std Option::flatten was shadowing it and yielding Option<Box<T>> instead of Option<T> - PanelState marked unsafe Send (HWND has *mut c_void; state is only touched from the UI thread, Mutex is for OnceLock satisfaction) - Crate-level #![allow(dead_code)] for in-progress port API surface (creds, usage, update, os::dpi); unused pub-use re-exports removed App wiring: - propagate_to_ui now feeds both windows + their formatted texts into update_data (was a single percent)
This commit is contained in:
1 parent
aa6217d2cf
commit
ee4e1c9b26
10 files changed
+1839
-149
No files matched your search
+9
-4
@@ -41,6 +41,11 @@ struct PanelState {
|
||||
data: PanelData,
|
||||
}
|
||||
|
||||
// HWND wraps `*mut c_void` which is `!Send`, but the panel state is only ever
|
||||
// accessed from the UI thread — the Mutex exists to satisfy the `OnceLock`
|
||||
// static contract, not because of real cross-thread sharing.
|
||||
unsafe impl Send for PanelState {}
|
||||
|
||||
fn state() -> &'static Mutex<Option<PanelState>> {
|
||||
static S: OnceLock<Mutex<Option<PanelState>>> = OnceLock::new();
|
||||
S.get_or_init(|| Mutex::new(None))
|
||||
@@ -267,7 +272,7 @@ fn paint(hwnd: HWND, hdc: HDC) {
|
||||
let accent = bar_color_for(data.session_pct.max(data.weekly_pct), data.is_dark);
|
||||
|
||||
unsafe {
|
||||
let bg_brush = CreateSolidBrush(COLORREF(bg.to_colorref()));
|
||||
let bg_brush = CreateSolidBrush(COLORREF(bg.into_colorref()));
|
||||
FillRect(hdc, &rc, bg_brush);
|
||||
let _ = DeleteObject(bg_brush);
|
||||
|
||||
@@ -362,7 +367,7 @@ fn draw_row(
|
||||
);
|
||||
|
||||
unsafe {
|
||||
let track_brush = CreateSolidBrush(COLORREF(track.to_colorref()));
|
||||
let track_brush = CreateSolidBrush(COLORREF(track.into_colorref()));
|
||||
let bar_rect = RECT {
|
||||
left: bar_x,
|
||||
top: row_y,
|
||||
@@ -374,7 +379,7 @@ fn draw_row(
|
||||
|
||||
let fill_w = ((pct.clamp(0.0, 100.0) / 100.0) * bar_w as f64).round() as i32;
|
||||
if fill_w > 0 {
|
||||
let accent_brush = CreateSolidBrush(COLORREF(accent.to_colorref()));
|
||||
let accent_brush = CreateSolidBrush(COLORREF(accent.into_colorref()));
|
||||
let fill_rect = RECT {
|
||||
left: bar_x,
|
||||
top: row_y,
|
||||
@@ -439,7 +444,7 @@ fn draw_text(
|
||||
PCWSTR::from_raw(font_name.as_ptr()),
|
||||
);
|
||||
let old_font = SelectObject(hdc, font);
|
||||
SetTextColor(hdc, COLORREF(color.to_colorref()));
|
||||
SetTextColor(hdc, COLORREF(color.into_colorref()));
|
||||
SetBkMode(hdc, TRANSPARENT);
|
||||
let mut rect = RECT {
|
||||
left: x,
|
||||
|
||||
Reference in new issue
Block a user