From ab8e7e434f754811f855857af76e4215e01c6fd3 Mon Sep 17 00:00:00 2001 From: katie Date: Wed, 14 Feb 2024 12:49:34 -0500 Subject: [PATCH] changed it from using a ghost icon to being a line color --- src/assets.rs | 13 ++-- src/assets/atlas.hex | Bin 262144 -> 262144 bytes src/assets/atlas.png | Bin 20868 -> 22267 bytes src/elements/array.rs | 60 ++---------------- src/elements/chunk.rs | 127 +++----------------------------------- src/elements/compound.rs | 128 ++++----------------------------------- src/elements/list.rs | 67 ++------------------ src/main.rs | 81 ++++--------------------- src/tab.rs | 14 ++--- src/window.rs | 6 +- src/workbench.rs | 1 - 11 files changed, 55 insertions(+), 442 deletions(-) diff --git a/src/assets.rs b/src/assets.rs index b0ee503..dbf03e5 100644 --- a/src/assets.rs +++ b/src/assets.rs @@ -82,6 +82,7 @@ pub const LINE_NUMBER_SEPARATOR_UV: Vec2u = Vec2u::new(60, 64); pub const END_LINE_NUMBER_SEPARATOR_UV: Vec2u = Vec2u::new(62, 64); pub const HORIZONTAL_SEPARATOR_UV: Vec2u = Vec2u::new(17, 80); // (14 by 2) pub const TEXT_UNDERLINE_UV: Vec2u = Vec2u::new(16, 82); +pub const INSERTION_UV: Vec2u = Vec2u::new(16, 84); pub const TOOLTIP_UV: Vec2u = Vec2u::new(96, 144); pub const BOOKMARK_UV: Vec2u = Vec2u::new(112, 96); pub const HIDDEN_BOOKMARK_UV: Vec2u = Vec2u::new(96, 128); @@ -115,12 +116,12 @@ pub const LONG_ARRAY_UV: Vec2u = Vec2u::new(0, 32); pub const REGION_UV: Vec2u = Vec2u::new(96, 32); pub const CHUNK_UV: Vec2u = Vec2u::new(64, 32); -pub const BYTE_GHOST_UV: Vec2u = Vec2u::new(0, 16); -pub const SHORT_GHOST_UV: Vec2u = Vec2u::new(16, 16); -pub const INT_GHOST_UV: Vec2u = Vec2u::new(32, 16); -pub const LONG_GHOST_UV: Vec2u = Vec2u::new(48, 16); -pub const FLOAT_GHOST_UV: Vec2u = Vec2u::new(64, 16); -pub const DOUBLE_GHOST_UV: Vec2u = Vec2u::new(80, 16); +pub const BYTE_GRAYSCALE_UV: Vec2u = Vec2u::new(0, 16); +pub const SHORT_GRAYSCALE_UV: Vec2u = Vec2u::new(16, 16); +pub const INT_GRAYSCALE_UV: Vec2u = Vec2u::new(32, 16); +pub const LONG_GRAYSCALE_UV: Vec2u = Vec2u::new(48, 16); +pub const FLOAT_GRAYSCALE_UV: Vec2u = Vec2u::new(64, 16); +pub const DOUBLE_GRAYSCALE_UV: Vec2u = Vec2u::new(80, 16); pub const BYTE_ARRAY_GHOST_UV: Vec2u = Vec2u::new(96, 16); pub const STRING_GHOST_UV: Vec2u = Vec2u::new(16, 48); pub const LIST_GHOST_UV: Vec2u = Vec2u::new(32, 48); diff --git a/src/assets/atlas.hex b/src/assets/atlas.hex index 4e8693cf56bed73981f3c844899943d9d8f59cb9..d39fb4e46db3573bfbd4fa471d5ee8ad3f54fad3 100644 GIT binary patch delta 442 zcmZo@5NH6REsPEU4v|ZW>nXw88v+;)Fxvx-_)h`eULV4Ekl7*kWKTUMczZ(x$T2`8 q{!@Ur*T;YyQ~z>JJtcU1LjuS#KqLNBfZOX+7=f5+dwmLX<7@y_$^--e delta 81 zcmZo@5NH6REsPEUlMgg|Z0`tQ+`$ZCg}_-6a8?YEHQgbD(Pw*40^=44v%M#U5r~<# K_oOhF%mx5qe;~gA diff --git a/src/assets/atlas.png b/src/assets/atlas.png index 5bb4273088cb0585b4c6cb12164dd81b5c53eb70..bb62de27e83506ab67216dd6268489a797040f97 100644 GIT binary patch literal 22267 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

&fi=84c`=?vh73u5^AqP5ibi1Dc;Pbm5VPY{) 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 X$+4ieuOh6;iGZQrb=`6uhsb{cF{Q?j diff --git a/src/elements/array.rs b/src/elements/array.rs index 0f207aa..f1f43ff 100644 --- a/src/elements/array.rs +++ b/src/elements/array.rs @@ -194,34 +194,7 @@ macro_rules! array { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos == (x - 16, y - 8), - |id| id == $id, - ) { - builder.draw_texture( - ctx.pos() + (0, 16), - CONNECTION_UV, - (16, (self.height() != 1) as usize * 7 + 9), - ); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } else if self.height() == 1 - && ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos == (x - 16, y - 16), - |id| id == $id, - ) { - builder.draw_texture(ctx.pos() + (0, 16), CONNECTION_UV, (16, 9)); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } + if ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos == (x - 16, y - 8), |id| id == $id) {} else if self.height() == 1 && ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos == (x - 16, y - 16), |id| id == $id) {} ctx.y_offset += 16; } @@ -241,29 +214,14 @@ macro_rules! array { } let pos = ctx.pos(); - if ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y), |id| id == $id) { - builder.draw_texture(ctx.pos() - (16, 0), CONNECTION_UV, (16, 16)); - if !tail { - builder.draw_texture(ctx.pos() - (32, 0), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } - - let ghost_tail_mod = if let Some((id, x, y, _)) = ctx.ghost - && ctx.pos() + (0, 16 - *remaining_scroll * 16 - 8) == (x, y) - && id == $id - { - false - } else { - true - }; + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y), |id| id == $id); builder.draw_texture( ctx.pos() - (16, 0), CONNECTION_UV, ( 16, - (!(idx == self.len() - 1 && ghost_tail_mod)) as usize * 7 + 9, + (idx != self.len() - 1) as usize * 7 + 9, ), ); if !tail { @@ -283,17 +241,7 @@ macro_rules! array { ctx.y_offset += 16; let pos = ctx.pos(); - if ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y + 8), |id| id == $id) { - builder.draw_texture( - ctx.pos() - (16, 0), - CONNECTION_UV, - (16, (idx != self.len() - 1) as usize * 7 + 9), - ); - if !tail { - builder.draw_texture(ctx.pos() - (32, 0), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y + 8), |id| id == $id); } ctx.x_offset -= 16; diff --git a/src/elements/chunk.rs b/src/elements/chunk.rs index 4fc5034..44fdfa3 100644 --- a/src/elements/chunk.rs +++ b/src/elements/chunk.rs @@ -365,28 +365,7 @@ impl NbtRegion { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos == (x - 16, y - 8), - |id| id == NbtChunk::ID, - ) { - builder.draw_texture( - ctx.pos() + (0, 16), - CONNECTION_UV, - (16, (self.height() != 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } else if self.height() == 1 - && ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos == (x - 16, y - 16), - |id| id == NbtChunk::ID, - ) { - builder.draw_texture(ctx.pos() + (0, 16), CONNECTION_UV, (16, 9)); - ctx.y_offset += 16; - } + if ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos == (x - 16, y - 8), |id| id == NbtChunk::ID) {} else if self.height() == 1 && ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos == (x - 16, y - 16), |id| id == NbtChunk::ID) {} ctx.y_offset += 16; } @@ -451,23 +430,7 @@ impl NbtRegion { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y), - |id| id == NbtChunk::ID, - ) { - builder.draw_texture(ctx.pos() - (16, 0), CONNECTION_UV, (16, 16)); - ctx.y_offset += 16; - } - - let ghost_tail_mod = if let Some((_, x, y, _)) = ctx.ghost - && ctx.pos() + (0, height * 16 - remaining_scroll * 16 - 8) == (x, y) - { - false - } else { - true - }; + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y), |id| id == NbtChunk::ID); if remaining_scroll == 0 { builder.draw_texture( @@ -475,7 +438,7 @@ impl NbtRegion { CONNECTION_UV, ( 16, - (idx != self.len() - 1 || !ghost_tail_mod) as usize * 7 + 9, + (idx != self.len() - 1) as usize * 7 + 9, ), ); } @@ -488,24 +451,12 @@ impl NbtRegion { value.render( builder, &mut remaining_scroll, - idx == self.len() - 1 && ghost_tail_mod, + idx == self.len() - 1, ctx, ); let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y + 8), - |id| id == NbtChunk::ID, - ) { - builder.draw_texture( - ctx.pos() - (16, 0), - CONNECTION_UV, - (16, (idx != self.len() - 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y + 8), |id| id == NbtChunk::ID); } } } @@ -804,36 +755,6 @@ impl NbtChunk { let _ = write!(builder, "{name}"); } - let pos = ctx.pos(); - if ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos == (x - 16, y - 8), - |id| id != Self::ID, - ) { - builder.draw_texture( - ctx.pos() + (0, 16), - CONNECTION_UV, - (16, (self.height() != 1) as usize * 7 + 9), - ); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } else if self.height() == 1 - && ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos == (x - 16, y - 16), - |id| id != Self::ID, - ) { - builder.draw_texture(ctx.pos() + (0, 16), CONNECTION_UV, (16, 9)); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } - ctx.y_offset += 16; y_before += 16; } @@ -885,32 +806,13 @@ impl NbtChunk { continue; } - let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y), - |id| id != Self::ID, - ) { - builder.draw_texture(ctx.pos() - (16, 0), CONNECTION_UV, (16, 16)); - ctx.y_offset += 16; - } - - let ghost_tail_mod = if let Some((_, x, y, _)) = ctx.ghost - && ctx.pos() + (0, height * 16 - *remaining_scroll * 16 - 8) == (x, y) - { - false - } else { - true - }; - if *remaining_scroll == 0 { builder.draw_texture( ctx.pos() - (16, 0), CONNECTION_UV, ( 16, - (idx != self.len() - 1 || !ghost_tail_mod) as usize * 7 + 9, + (idx != self.len() - 1) as usize * 7 + 9, ), ); } @@ -922,24 +824,9 @@ impl NbtChunk { remaining_scroll, builder, Some(key), - tail && idx == self.len() - 1 && ghost_tail_mod, + tail && idx == self.len() - 1, ctx, ); - - let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y + 8), - |id| id != Self::ID, - ) { - builder.draw_texture( - ctx.pos() - (16, 0), - CONNECTION_UV, - (16, (idx != self.len() - 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } } if !tail { diff --git a/src/elements/compound.rs b/src/elements/compound.rs index 3324c28..7d068d8 100644 --- a/src/elements/compound.rs +++ b/src/elements/compound.rs @@ -250,30 +250,7 @@ impl NbtCompound { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos + (16, 8) == (x, y), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture( - ctx.pos() + (0, 16), - CONNECTION_UV, - (16, (self.height() != 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } - - if self.height() == 1 - && ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos + (16, 16) == (x, y), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture(ctx.pos() + (0, 16), CONNECTION_UV, (16, 9)); - ctx.y_offset += 16; - } + if ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos + (16, 8) == (x, y), |id| id != NbtChunk::ID) {} else if self.height() == 1 && ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos + (16, 16) == (x, y), |id| id != NbtChunk::ID) {} ctx.y_offset += 16; } @@ -323,24 +300,8 @@ impl NbtCompound { continue; } - let (gx, gy): (usize, usize) = ctx.pos().into(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| x == gx && y == gy, - |id| id != NbtChunk::ID, - ) { - builder.draw_texture(ctx.pos() - (16, 0), CONNECTION_UV, (16, 16)); - ctx.y_offset += 16; - } - - let ghost_tail_mod = if let Some((_, x, y, _)) = ctx.ghost - && ctx.pos() + (0, height * 16 - remaining_scroll * 16 - 8) == (x, y) - { - false - } else { - true - }; + let pos = ctx.pos(); + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y), |id| id != NbtChunk::ID); if remaining_scroll == 0 { builder.draw_texture( @@ -348,7 +309,7 @@ impl NbtCompound { CONNECTION_UV, ( 16, - (idx != self.len() - 1 || !ghost_tail_mod) as usize * 7 + 9, + (idx != self.len() - 1) as usize * 7 + 9, ), ); } @@ -360,24 +321,12 @@ impl NbtCompound { &mut remaining_scroll, builder, Some(name), - idx == self.len() - 1 && ghost_tail_mod, + idx == self.len() - 1, ctx, ); let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y + 8), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture( - ctx.pos() - (16, 0), - CONNECTION_UV, - (16, (idx != self.len() - 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y + 8), |id| id != NbtChunk::ID); } } } @@ -466,34 +415,7 @@ impl NbtCompound { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos + (16, 8) == (x, y), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture( - ctx.pos() + (0, 16), - CONNECTION_UV, - (16, (self.height() != 1) as usize * 7 + 9), - ); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } else if self.height() == 1 - && ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos + (16, 16) == (x, y), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture(ctx.pos() + (0, 16), CONNECTION_UV, (16, 9)); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } + if ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos + (16, 8) == (x, y), |id| id != NbtChunk::ID) {} else if self.height() == 1 && ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos + (16, 16) == (x, y), |id| id != NbtChunk::ID) {} ctx.y_offset += 16; y_before += 16; @@ -547,23 +469,7 @@ impl NbtCompound { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture(ctx.pos() - (16, 0), CONNECTION_UV, (16, 16)); - ctx.y_offset += 16; - } - - let ghost_tail_mod = if let Some((_, x, y, _)) = ctx.ghost - && ctx.pos() + (0, height * 16 - *remaining_scroll * 16 - 8) == (x, y) - { - false - } else { - true - }; + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y), |id| id != NbtChunk::ID); if *remaining_scroll == 0 { builder.draw_texture( @@ -571,7 +477,7 @@ impl NbtCompound { CONNECTION_UV, ( 16, - (idx != self.len() - 1 || !ghost_tail_mod) as usize * 7 + 9, + (idx != self.len() - 1) as usize * 7 + 9, ), ); } @@ -583,24 +489,12 @@ impl NbtCompound { remaining_scroll, builder, Some(key), - tail && idx == self.len() - 1 && ghost_tail_mod, + tail && idx == self.len() - 1, ctx, ); let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y + 8), - |id| id != NbtChunk::ID, - ) { - builder.draw_texture( - ctx.pos() - (16, 0), - CONNECTION_UV, - (16, (idx != self.len() - 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y + 8), |id| id != NbtChunk::ID); } if !tail { diff --git a/src/elements/list.rs b/src/elements/list.rs index 16e5dd3..2981d5c 100644 --- a/src/elements/list.rs +++ b/src/elements/list.rs @@ -255,34 +255,7 @@ impl NbtList { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos + (16, 8) == (x, y), - |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty()), - ) { - builder.draw_texture( - ctx.pos() + (0, 16), - CONNECTION_UV, - (16, (self.height() != 1) as usize * 7 + 9), - ); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } else if self.height() == 1 - && ctx.ghost( - ctx.pos() + (16, 16), - builder, - |x, y| pos + (16, 16) == (x, y), - |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty()), - ) { - builder.draw_texture(ctx.pos() + (0, 16), CONNECTION_UV, (16, 9)); - if !tail { - builder.draw_texture(ctx.pos() - (16, 0) + (0, 16), CONNECTION_UV, (8, 16)); - } - ctx.y_offset += 16; - } + if ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos + (16, 8) == (x, y), |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty())) {} else if self.height() == 1 && ctx.ghost(ctx.pos() + (16, 16), builder, |x, y| pos + (16, 16) == (x, y), |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty()), ) {} ctx.y_offset += 16; y_before += 16; @@ -306,25 +279,7 @@ impl NbtList { } let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y), - |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty()), - ) { - builder.draw_texture(ctx.pos() - (16, 0), CONNECTION_UV, (16, 16)); - ctx.y_offset += 16; - } - - let ghost_tail_mod = if let Some((id, x, y, _)) = ctx.ghost - && (id == self.element || self.is_empty()) - && id != NbtChunk::ID - && ctx.pos() + (0, height * 16 - *remaining_scroll * 16 - 8) == (x, y) - { - false - } else { - true - }; + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y), |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty())); if *remaining_scroll == 0 { builder.draw_texture( @@ -332,7 +287,7 @@ impl NbtList { CONNECTION_UV, ( 16, - (!(idx == self.len() - 1 && ghost_tail_mod)) as usize * 7 + 9, + (idx != self.len() - 1) as usize * 7 + 9, ), ); } @@ -341,24 +296,12 @@ impl NbtList { remaining_scroll, builder, None, - tail && idx == self.len() - 1 && ghost_tail_mod, + tail && idx == self.len() - 1, ctx, ); let pos = ctx.pos(); - if ctx.ghost( - ctx.pos(), - builder, - |x, y| pos == (x, y + 8), - |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty()), - ) { - builder.draw_texture( - ctx.pos() - (16, 0), - CONNECTION_UV, - (16, (idx != self.len() - 1) as usize * 7 + 9), - ); - ctx.y_offset += 16; - } + ctx.ghost(ctx.pos(), builder, |x, y| pos == (x, y + 8), |id| (id != NbtChunk::ID) && (id == self.element || self.is_empty())); } let difference = ctx.y_offset - y_before; diff --git a/src/main.rs b/src/main.rs index beb4358..653604f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,6 +43,7 @@ #![feature(stmt_expr_attributes)] #![feature(unchecked_math)] #![feature(lazy_cell)] +#![feature(slice_first_last_chunk)] #![cfg_attr(all(windows, not(debug_assertions)), windows_subsystem = "windows")] use std::cmp::Ordering; @@ -59,10 +60,7 @@ use winit::window::Window; use elements::element::NbtElement; use vertex_buffer_builder::VertexBufferBuilder; -use crate::assets::{ - BASE_TEXT_Z, BASE_Z, BOOKMARK_UV, BOOKMARK_Z, BYTE_ARRAY_GHOST_UV, BYTE_GHOST_UV, CHUNK_GHOST_UV, COMPOUND_GHOST_UV, DOUBLE_GHOST_UV, END_LINE_NUMBER_SEPARATOR_UV, FLOAT_GHOST_UV, HEADER_SIZE, HIDDEN_BOOKMARK_UV, INT_ARRAY_GHOST_UV, INT_GHOST_UV, INVALID_STRIPE_UV, LINE_NUMBER_SEPARATOR_UV, LINE_NUMBER_Z, LIST_GHOST_UV, LONG_ARRAY_GHOST_UV, LONG_GHOST_UV, REGION_GHOST_UV, SCROLLBAR_BOOKMARK_Z, SELECTED_TOGGLE_OFF_UV, SELECTED_TOGGLE_ON_UV, SHORT_GHOST_UV, STRING_GHOST_UV, TEXT_UNDERLINE_UV, - TOGGLE_Z, UNSELECTED_TOGGLE_OFF_UV, UNSELECTED_TOGGLE_ON_UV, -}; +use crate::assets::{BASE_TEXT_Z, BASE_Z, BOOKMARK_UV, BOOKMARK_Z, BYTE_ARRAY_GHOST_UV, BYTE_GRAYSCALE_UV, CHUNK_GHOST_UV, COMPOUND_GHOST_UV, DOUBLE_GRAYSCALE_UV, END_LINE_NUMBER_SEPARATOR_UV, FLOAT_GRAYSCALE_UV, HEADER_SIZE, HIDDEN_BOOKMARK_UV, INSERTION_UV, INT_ARRAY_GHOST_UV, INT_GRAYSCALE_UV, INVALID_STRIPE_UV, LINE_NUMBER_SEPARATOR_UV, LINE_NUMBER_Z, LIST_GHOST_UV, LONG_ARRAY_GHOST_UV, LONG_GRAYSCALE_UV, REGION_GHOST_UV, SCROLLBAR_BOOKMARK_Z, SELECTED_TOGGLE_OFF_UV, SELECTED_TOGGLE_ON_UV, SHORT_GRAYSCALE_UV, STRING_GHOST_UV, TEXT_UNDERLINE_UV, TOGGLE_Z, UNSELECTED_TOGGLE_OFF_UV, UNSELECTED_TOGGLE_ON_UV}; use crate::color::TextColor; use crate::elements::chunk::{NbtChunk, NbtRegion}; use crate::elements::compound::NbtCompound; @@ -466,8 +464,7 @@ pub struct RenderContext { extend_error: bool, invalid_value_error: bool, key_duplicate_error: bool, - ghost: Option<(u8, usize, usize, usize)>, - ghost_line_number: Option<(usize, usize)>, + ghost: Option<(u8, usize, usize)>, left_margin: usize, mouse_x: usize, mouse_y: usize, @@ -482,7 +479,7 @@ pub struct RenderContext { impl RenderContext { #[must_use] #[allow(clippy::type_complexity)] // forbidden is fine to be like that, c'mon - pub fn new(selected_y: usize, selected_key: Option>, selected_value: Option>, selecting_key: bool, ghost: Option<(u8, usize, usize, usize)>, left_margin: usize, mouse: (usize, usize)) -> Self { + pub fn new(selected_y: usize, selected_key: Option>, selected_value: Option>, selecting_key: bool, ghost: Option<(u8, usize, usize)>, left_margin: usize, mouse: (usize, usize)) -> Self { Self { selecting_key, selected_y, @@ -500,7 +497,6 @@ impl RenderContext { x_offset: 16 + left_margin, y_offset: HEADER_SIZE, line_numbers: vec![], - ghost_line_number: None, } } @@ -626,26 +622,7 @@ impl RenderContext { } let mut y = HEADER_SIZE; for (idx, &render_line_number) in self.line_numbers.iter().enumerate() { - let actual_line_number = if let Some((offset, height)) = self.ghost_line_number - && render_line_number > offset - { - render_line_number - height - } else { - render_line_number - }; - let next_line_number = self - .line_numbers - .get(idx + 1) - .copied() - .map(|next_line_number| { - if let Some((offset, height)) = self.ghost_line_number - && next_line_number > offset - { - next_line_number - height - } else { - next_line_number - } - }); + let next_line_number = self.line_numbers.get(idx + 1).copied(); let color = if (self.red_line_numbers[0] == y) | (self.red_line_numbers[1] == y) { if idx % 2 == 0 { @@ -672,12 +649,7 @@ impl RenderContext { let _ = write!(builder, "{render_line_number}"); builder.color = color; - if let Some((&first, rest)) = bookmarks.split_first() - && self - .ghost_line_number - .is_none_or(|(offset, _)| render_line_number != offset) - && actual_line_number == first.true_line_number - { + if let Some((&first, rest)) = bookmarks.split_first() && render_line_number == first.true_line_number { bookmarks = rest; builder.draw_texture_region_z( (2, y + 2), @@ -687,13 +659,7 @@ impl RenderContext { (16, 16), ); } - while let Some((&first, rest)) = bookmarks.split_first() - && next_line_number.is_none_or(|next_line_number| { - self.ghost_line_number - .is_none_or(|(offset, _)| next_line_number != offset) - && actual_line_number <= first.true_line_number - && first.true_line_number < next_line_number - }) { + while let Some((&first, rest)) = bookmarks.split_first() && next_line_number.is_none_or(|next_line_number| render_line_number <= first.true_line_number && first.true_line_number < next_line_number) { bookmarks = rest; builder.draw_texture_region_z( (2, y + 15), @@ -750,37 +716,12 @@ impl RenderContext { } } - #[must_use] pub fn ghost bool, G: FnOnce(u8) -> bool>(&mut self, pos: impl Into<(usize, usize)>, builder: &mut VertexBufferBuilder, f: F, g: G) -> bool { let (x_offset, y_offset) = pos.into(); - if self.ghost_line_number.is_none() - && let Some((id, x, y, true_height)) = self.ghost - && f(x, y) && g(id) - { - builder.draw_texture( - (x_offset, y_offset), - match id { - NbtByte::ID => BYTE_GHOST_UV, - NbtShort::ID => SHORT_GHOST_UV, - NbtInt::ID => INT_GHOST_UV, - NbtLong::ID => LONG_GHOST_UV, - NbtFloat::ID => FLOAT_GHOST_UV, - NbtDouble::ID => DOUBLE_GHOST_UV, - NbtByteArray::ID => BYTE_ARRAY_GHOST_UV, - NbtString::ID => STRING_GHOST_UV, - NbtList::ID => LIST_GHOST_UV, - NbtCompound::ID => COMPOUND_GHOST_UV, - NbtIntArray::ID => INT_ARRAY_GHOST_UV, - NbtLongArray::ID => LONG_ARRAY_GHOST_UV, - NbtChunk::ID => CHUNK_GHOST_UV, - NbtRegion::ID => REGION_GHOST_UV, - _ => unsafe { panic_unchecked("Invalid element id") }, - }, - (16, 16), - ); - self.ghost_line_number = Some((self.line_number, true_height)); - self.line_number(); - self.skip_line_numbers(true_height - 1); + if let Some((id, x, y)) = self.ghost && f(x, y) && g(id) { + let horizontal_scorll_before = core::mem::replace(&mut builder.horizontal_scroll, 0); + builder.draw_texture_region_z((self.left_margin, y_offset - 1), BASE_Z, INSERTION_UV, (x_offset + 16 - self.left_margin, 2), (16, 2)); + builder.horizontal_scroll = horizontal_scorll_before; true } else { false diff --git a/src/tab.rs b/src/tab.rs index 4705452..cf1112e 100644 --- a/src/tab.rs +++ b/src/tab.rs @@ -11,7 +11,7 @@ use flate2::Compression; use uuid::Uuid; use crate::{Bookmark, LinkedQueue, OptionExt, panic_unchecked, RenderContext, StrExt}; -use crate::assets::{BYTE_ARRAY_GHOST_UV, BYTE_ARRAY_UV, BYTE_GHOST_UV, BYTE_UV, CHUNK_GHOST_UV, CHUNK_UV, COMPOUND_GHOST_UV, COMPOUND_ROOT_UV, COMPOUND_UV, DOUBLE_GHOST_UV, DOUBLE_UV, ENABLED_FREEHAND_MODE_UV, FLOAT_GHOST_UV, FLOAT_UV, FREEHAND_MODE_UV, GZIP_FILE_TYPE_UV, HEADER_SIZE, HELD_SCROLLBAR_UV, INT_ARRAY_GHOST_UV, INT_ARRAY_UV, INT_GHOST_UV, INT_UV, JUST_OVERLAPPING_BASE_Z, LINE_NUMBER_SEPARATOR_UV, LIST_GHOST_UV, LIST_UV, LONG_ARRAY_GHOST_UV, LONG_ARRAY_UV, LONG_GHOST_UV, LONG_UV, MCA_FILE_TYPE_UV, NBT_FILE_TYPE_UV, REDO_UV, REGION_UV, SCROLLBAR_Z, SHORT_GHOST_UV, SHORT_UV, SNBT_FILE_TYPE_UV, STEAL_ANIMATION_OVERLAY, STRING_GHOST_UV, STRING_UV, UNDO_UV, UNHELD_SCROLLBAR_UV, UNKNOWN_NBT_GHOST_UV, UNKNOWN_NBT_UV, ZLIB_FILE_TYPE_UV}; +use crate::assets::{BYTE_ARRAY_GHOST_UV, BYTE_ARRAY_UV, BYTE_GRAYSCALE_UV, BYTE_UV, CHUNK_GHOST_UV, CHUNK_UV, COMPOUND_GHOST_UV, COMPOUND_ROOT_UV, COMPOUND_UV, DOUBLE_GRAYSCALE_UV, DOUBLE_UV, ENABLED_FREEHAND_MODE_UV, FLOAT_GRAYSCALE_UV, FLOAT_UV, FREEHAND_MODE_UV, GZIP_FILE_TYPE_UV, HEADER_SIZE, HELD_SCROLLBAR_UV, INT_ARRAY_GHOST_UV, INT_ARRAY_UV, INT_GRAYSCALE_UV, INT_UV, JUST_OVERLAPPING_BASE_Z, LINE_NUMBER_SEPARATOR_UV, LIST_GHOST_UV, LIST_UV, LONG_ARRAY_GHOST_UV, LONG_ARRAY_UV, LONG_GRAYSCALE_UV, LONG_UV, MCA_FILE_TYPE_UV, NBT_FILE_TYPE_UV, REDO_UV, REGION_UV, SCROLLBAR_Z, SHORT_GRAYSCALE_UV, SHORT_UV, SNBT_FILE_TYPE_UV, STEAL_ANIMATION_OVERLAY, STRING_GHOST_UV, STRING_UV, UNDO_UV, UNHELD_SCROLLBAR_UV, UNKNOWN_NBT_GHOST_UV, UNKNOWN_NBT_UV, ZLIB_FILE_TYPE_UV}; use crate::elements::chunk::NbtRegion; use crate::elements::compound::NbtCompound; use crate::elements::element::NbtElement; @@ -224,12 +224,12 @@ impl Tab { None }; for (idx, (selected, unselected, name)) in [ - (BYTE_UV, BYTE_GHOST_UV, "Byte"), - (SHORT_UV, SHORT_GHOST_UV, "Short"), - (INT_UV, INT_GHOST_UV, "Int"), - (LONG_UV, LONG_GHOST_UV, "Long"), - (FLOAT_UV, FLOAT_GHOST_UV, "Float"), - (DOUBLE_UV, DOUBLE_GHOST_UV, "Double"), + (BYTE_UV, BYTE_GRAYSCALE_UV, "Byte"), + (SHORT_UV, SHORT_GRAYSCALE_UV, "Short"), + (INT_UV, INT_GRAYSCALE_UV, "Int"), + (LONG_UV, LONG_GRAYSCALE_UV, "Long"), + (FLOAT_UV, FLOAT_GRAYSCALE_UV, "Float"), + (DOUBLE_UV, DOUBLE_GRAYSCALE_UV, "Double"), (BYTE_ARRAY_UV, BYTE_ARRAY_GHOST_UV, "Byte Array"), (INT_ARRAY_UV, INT_ARRAY_GHOST_UV, "Int Array"), (LONG_ARRAY_UV, LONG_ARRAY_GHOST_UV, "Long Array"), diff --git a/src/window.rs b/src/window.rs index f94b72b..aed779e 100644 --- a/src/window.rs +++ b/src/window.rs @@ -127,7 +127,7 @@ pub struct State<'window> { impl<'window> State<'window> { #[allow(clippy::too_many_lines)] // yeah, but.... what am I supposed to do? - async fn new(window: &'window Window, size: PhysicalSize) -> Self { + async fn new(window: &'window Window, size: PhysicalSize) -> State<'window> { let instance = Instance::new(InstanceDescriptor { backends: Backends::all(), flags: Default::default(), @@ -161,9 +161,9 @@ impl<'window> State<'window> { ) .await .expect("Could obtain device"); - let format = dbg!(surface + let format = surface .get_capabilities(&adapter) - .formats) + .formats .into_iter() .find(|format| !format.is_srgb()) .expect("An SRGB format exists"); diff --git a/src/workbench.rs b/src/workbench.rs index 803722a..76a217c 100644 --- a/src/workbench.rs +++ b/src/workbench.rs @@ -2311,7 +2311,6 @@ impl Workbench { x.id(), ((self.mouse_x + horizontal_scroll - left_margin) & !0b1111) + left_margin, ((self.mouse_y - HEADER_SIZE) & !0b0111) + HEADER_SIZE, - x.true_height(), ) }) } else {