feat(addresses): improve address labeling and view-only handling
- Add expanded address icon picker with search, bottom-aligned actions, and improved modal sizing - Embed a pickaxe icon font subset and wire it into typography/address icon rendering - Track view-only shielded addresses and prevent sends from non-spendable z-addresses - Improve address transfer dialog sizing, max amount handling, and text clipping - Tune main header layout values in ui.toml - Update README, codebase overview, and third-party license documentation
This commit is contained in:
@@ -101,6 +101,7 @@ bool Typography::reload(ImGuiIO& io, float dpiScale)
|
||||
loaded_ = false;
|
||||
for (int i = 0; i < kNumStyles; ++i) fonts_[i] = nullptr;
|
||||
for (int i = 0; i < kNumIconSizes; ++i) iconFonts_[i] = nullptr;
|
||||
for (int i = 0; i < kNumIconSizes; ++i) pickaxeFonts_[i] = nullptr;
|
||||
return load(io, dpiScale);
|
||||
}
|
||||
|
||||
@@ -190,6 +191,13 @@ bool Typography::load(ImGuiIO& io, float dpiScale)
|
||||
iconFonts_[2] = loadIconFont(io, 24.0f * scale, "IconLarge");
|
||||
iconFonts_[3] = loadIconFont(io, 40.0f * scale, "IconXL");
|
||||
|
||||
// Load a one-glyph MDI subset for pickaxe. The glyph is remapped onto a
|
||||
// BMP private-use codepoint so it remains renderable with 16-bit ImWchar.
|
||||
pickaxeFonts_[0] = loadPickaxeFont(io, 14.0f * scale, "PickaxeSmall");
|
||||
pickaxeFonts_[1] = loadPickaxeFont(io, 18.0f * scale, "PickaxeMed");
|
||||
pickaxeFonts_[2] = loadPickaxeFont(io, 24.0f * scale, "PickaxeLarge");
|
||||
pickaxeFonts_[3] = loadPickaxeFont(io, 40.0f * scale, "PickaxeXL");
|
||||
|
||||
// Verify all fonts loaded
|
||||
bool allLoaded = true;
|
||||
for (int i = 0; i < kNumStyles; ++i) {
|
||||
@@ -346,6 +354,51 @@ ImFont* Typography::loadIconFont(ImGuiIO& io, float size, const char* name)
|
||||
return font;
|
||||
}
|
||||
|
||||
ImFont* Typography::loadPickaxeFont(ImGuiIO& io, float size, const char* name)
|
||||
{
|
||||
if (g_mdi_pickaxe_subset_size == 0) {
|
||||
DEBUG_LOGF("Typography: Pickaxe subset font is empty\n");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void* fontDataCopy = IM_ALLOC(g_mdi_pickaxe_subset_size);
|
||||
memcpy(fontDataCopy, g_mdi_pickaxe_subset_data, g_mdi_pickaxe_subset_size);
|
||||
|
||||
ImFontConfig cfg;
|
||||
cfg.FontDataOwnedByAtlas = true;
|
||||
cfg.OversampleH = 2;
|
||||
cfg.OversampleV = 1;
|
||||
cfg.PixelSnapH = true;
|
||||
cfg.MergeMode = false;
|
||||
cfg.GlyphMinAdvanceX = size;
|
||||
|
||||
static const ImWchar pickaxeRange[] = {
|
||||
Typography::kPickaxeCodepoint,
|
||||
Typography::kPickaxeCodepoint,
|
||||
0,
|
||||
};
|
||||
cfg.GlyphRanges = pickaxeRange;
|
||||
|
||||
snprintf(cfg.Name, sizeof(cfg.Name), "MDIPickaxe %.0fpx", size);
|
||||
|
||||
ImFont* font = io.Fonts->AddFontFromMemoryTTF(fontDataCopy, g_mdi_pickaxe_subset_size, size, &cfg);
|
||||
if (font) {
|
||||
DEBUG_LOGF("Typography: Loaded pickaxe font %s (%.0fpx)\n", name, size);
|
||||
} else {
|
||||
DEBUG_LOGF("Typography: Failed to load pickaxe font %s\n", name);
|
||||
IM_FREE(fontDataCopy);
|
||||
}
|
||||
return font;
|
||||
}
|
||||
|
||||
ImFont* Typography::pickaxeFontForSize(float size) const
|
||||
{
|
||||
if (size <= 15.0f) return pickaxeSmall();
|
||||
if (size <= 20.0f) return pickaxeMed();
|
||||
if (size <= 32.0f) return pickaxeLarge();
|
||||
return pickaxeXL();
|
||||
}
|
||||
|
||||
ImFont* Typography::getFont(TypeStyle style) const
|
||||
{
|
||||
int index = static_cast<int>(style);
|
||||
|
||||
Reference in New Issue
Block a user