#pragma once #include "data/wallet_state.h" #include #include namespace dragonx { namespace ui { struct AddressListInput { const AddressInfo* info = nullptr; bool isZ = false; bool hidden = false; bool favorite = false; bool mining = false; std::string label; std::string icon; int sortOrder = -1; }; struct AddressListRow { const AddressInfo* info = nullptr; bool isZ = false; bool hidden = false; bool favorite = false; bool mining = false; std::string label; std::string icon; int sortOrder = -1; }; struct AddressRowRect { float x = 0.0f; float y = 0.0f; float width = 0.0f; float height = 0.0f; }; struct AddressRowLayout { float contentStartX = 0.0f; float contentStartY = 0.0f; float labelX = 0.0f; float contentRight = 0.0f; float buttonSize = 0.0f; AddressRowRect favoriteButton; AddressRowRect visibilityButton; }; bool AddressListMatchesFilter(const AddressListInput& input, const std::string& filter); std::vector BuildAddressListRows(const std::vector& inputs, const std::string& filter, bool hideZeroBalances, bool showHidden); AddressRowLayout ComputeAddressRowLayout(float rowX, float rowY, float rowWidth, float rowHeight, float rowPadLeft, float rowIconSize, float spacingMd, float spacingSm, float spacingXs); std::string FormatAddressUsdValue(double balance, double priceUsd); // ---- Overview address-list clipping (fixed row pitch rowH from startY) ---- // [begin, end) = the rows intersecting [clipMinY, clipMaxY) plus ONE guard row on each side (a row draws its // divider / AA fringe just past its own slot), clamped to [0, rowCount). Non-finite input -> every row. struct AddressRowWindow { int begin = 0; int end = 0; }; AddressRowWindow ComputeAddressRowWindow(float clipMinY, float clipMaxY, float startY, float rowH, int rowCount); // Cursor y the unclipped row loop had when row i's body ran: row 0 = startY; row i > 0 = where ImGui::ItemSize // (imgui 1.92.6) leaves it after row i-1's InvisibleButton(h = rowH) placed at startY + (i-1)*rowH, i.e. // IM_TRUNC(top + rowH + ItemSpacing.y). Replaying it keeps the cursor-dependent Layout::spacing*() exact. float AddressRowEntryCursorY(int i, float startY, float rowH, float itemSpacingY); } // namespace ui } // namespace dragonx