feat(market): portfolio groups as a draggable/resizable dashboard grid
Turn the portfolio group area into a dashboard grid: - Responsive column count (1-4 by width); each 1x1 cell is one card. - Drag a card to move it to another cell; drag its bottom-right corner to resize (span multiple cells). Both snap to the grid. - A subtle dot grid appears while rearranging (dragging or resizing), with a highlighted drop-target / resize footprint. - Click (no drag past a 4px threshold) still opens the group editor. - Grid placement (col/row) and span (w/h) persist per group in settings.json; positions are resolved each frame — stored placement when it fits, else auto-placed row-major into free cells. Dropping onto an occupied cell swaps. PortfolioEntry gains grid_col/grid_row/grid_w/grid_h. The card render was refactored into a drawCard() lambda reused for the in-grid, dragged, and resizing states. Full-node + Lite build clean; ctest 1/1; hygiene clean. This is an interactive feature I can't verify without the GUI — needs drag/resize testing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -332,6 +332,14 @@ bool Settings::load(const std::string& path)
|
||||
entry.show24h = e["show_24h"].get<bool>();
|
||||
if (e.contains("show_sparkline") && e["show_sparkline"].is_boolean())
|
||||
entry.showSparkline = e["show_sparkline"].get<bool>();
|
||||
if (e.contains("grid_col") && e["grid_col"].is_number_integer())
|
||||
entry.gridCol = e["grid_col"].get<int>();
|
||||
if (e.contains("grid_row") && e["grid_row"].is_number_integer())
|
||||
entry.gridRow = e["grid_row"].get<int>();
|
||||
if (e.contains("grid_w") && e["grid_w"].is_number_integer())
|
||||
entry.gridW = e["grid_w"].get<int>();
|
||||
if (e.contains("grid_h") && e["grid_h"].is_number_integer())
|
||||
entry.gridH = e["grid_h"].get<int>();
|
||||
if (!entry.label.empty()) portfolio_entries_.push_back(std::move(entry));
|
||||
}
|
||||
}
|
||||
@@ -490,6 +498,10 @@ bool Settings::save(const std::string& path)
|
||||
entry["show_value"] = e.showValue;
|
||||
entry["show_24h"] = e.show24h;
|
||||
entry["show_sparkline"] = e.showSparkline;
|
||||
entry["grid_col"] = e.gridCol;
|
||||
entry["grid_row"] = e.gridRow;
|
||||
entry["grid_w"] = e.gridW;
|
||||
entry["grid_h"] = e.gridH;
|
||||
j["portfolio_entries"].push_back(std::move(entry));
|
||||
}
|
||||
j["font_scale"] = font_scale_;
|
||||
|
||||
Reference in New Issue
Block a user