diff --git a/src/config/server/Config.cpp b/src/config/server/Config.cpp index cdd9c8e..0017b6e 100644 --- a/src/config/server/Config.cpp +++ b/src/config/server/Config.cpp @@ -74,6 +74,7 @@ namespace config::server cfg.style.hostblock.disks.font.size = std::stoi(ini.get("style", "hostblock.disks.font.size", "5")); cfg.style.hostblock.disks.font.padding = std::stoi(ini.get("style", "hostblock.disks.font.padding", "8")); + cfg.style.hostblock.networks.label_width = std::stoi(ini.get("style", "hostblock.networks.label_width", "8")); cfg.style.hostblock.networks.width = std::stoi(ini.get("style", "hostblock.networks.width", "8")); cfg.style.hostblock.networks.height = std::stoi(ini.get("style", "hostblock.networks.height", "16")); cfg.style.hostblock.networks.gap_h = std::stoi(ini.get("style", "hostblock.networks.gap_h", "4")); diff --git a/src/config/server/StyleConfig.h b/src/config/server/StyleConfig.h index 5f7ad43..b159168 100644 --- a/src/config/server/StyleConfig.h +++ b/src/config/server/StyleConfig.h @@ -67,8 +67,9 @@ namespace config::server struct { - int width = 8; - int height = 16; + int label_width = 20; + int width = 20; + int height = 11; int gap_h = 4; int gap_v = 4; int max_per_row = 4; diff --git a/src/display/ui/hostblock/HostBlock.cpp b/src/display/ui/hostblock/HostBlock.cpp index 6fa2d86..153c79b 100644 --- a/src/display/ui/hostblock/HostBlock.cpp +++ b/src/display/ui/hostblock/HostBlock.cpp @@ -8,6 +8,7 @@ #include "display/ui/theme/Theme.h" #include "display/ui/text/Helpers.h" #include "display/graphics/Color.h" +#include "display/ui/text/Arrow.h" namespace display::ui::hostblock { @@ -58,14 +59,14 @@ namespace display::ui::hostblock cursorY, config.hostblock.width - config.hostblock.padding * 2, config.hostblock.header.height, - online ? display::ui::theme::hostblock::HEADER : display::graphics::Red()); + display::ui::theme::hostblock::HEADER); text.drawTextOutlined( fb, x + config.hostblock.padding + 2, cursorY + config.hostblock.header.height - 1, hostname, - online ? display::ui::theme::text::TEXT : display::ui::theme::text::OFFLINE, + online ? display::ui::theme::text::TEXT : display::graphics::Red(), display::ui::theme::text::OUTLINE, display::ui::text::Font{config.hostblock.header.font.name, config.hostblock.header.font.size}); @@ -95,8 +96,10 @@ namespace display::ui::hostblock cpuTempBar.draw(fb, bx + config.hostblock.cpu.width - 1, by, value, 0, online); } - cursorY += config.hostblock.cpu.rows * config.hostblock.cpu.height + - (config.hostblock.cpu.rows - 1) * config.hostblock.cpu.gap_v + + int rowsUsed = (cpuCount + config.hostblock.cpu.max_per_row - 1) / config.hostblock.cpu.max_per_row; + + cursorY += rowsUsed * config.hostblock.cpu.height + + (rowsUsed > 0 ? (rowsUsed - 1) * config.hostblock.cpu.gap_v : 0) + config.hostblock.gap; // ===== Memory bar ===== @@ -176,16 +179,17 @@ namespace display::ui::hostblock int col = i % config.hostblock.networks.max_per_row; int bx = x + config.hostblock.padding + - col * (config.hostblock.networks.width * 2 + config.hostblock.networks.gap_h); + col * (config.hostblock.networks.label_width + config.hostblock.networks.width * 2 + config.hostblock.networks.gap_h); int by = cursorY + row * (config.hostblock.networks.height + config.hostblock.networks.gap_v); - float value_rx = std::clamp(network.rxBps / std::max(network.rxMaxBps, 1048576.0f), 0.0f, 1.0f); - float value_tx = std::clamp(network.txBps / std::max(network.txMaxBps, 1048576.0f), 0.0f, 1.0f); + float value_rx = std::clamp(network.rxBps / quantizeScale(network.rxMaxBps), 0.0f, 1.0f); + float value_tx = std::clamp(network.txBps / quantizeScale(network.txMaxBps), 0.0f, 1.0f); - netBar.draw(fb, bx, by, value_rx, 0, network.online && online, true); - netBar.draw(fb, bx + config.hostblock.networks.width, by, value_tx, 0, network.online && online); + fb.drawRect(bx, by, config.hostblock.networks.label_width, config.hostblock.networks.height, display::ui::theme::bar::BORDER); + netBar.draw(fb, bx + config.hostblock.networks.label_width, by, value_rx, 0, network.online && online, true); + netBar.draw(fb, bx + config.hostblock.networks.width + config.hostblock.networks.label_width, by, value_tx, 0, network.online && online); text.drawTextOutlined(fb, bx + config.hostblock.networks.font.padding, @@ -194,6 +198,27 @@ namespace display::ui::hostblock network.online && online ? display::ui::theme::text::TEXT : display::ui::theme::text::OFFLINE, display::ui::theme::text::OUTLINE, display::ui::text::Font{config.hostblock.networks.font.name, config.hostblock.networks.font.size}); + text.drawBitmapOutlined(fb, + bx + config.hostblock.networks.label_width + config.hostblock.networks.width / 2 - 3, + by + 3, + display::ui::text::ARROW_DOWN, + network.online && online ? display::ui::theme::text::TEXT : display::ui::theme::text::OFFLINE, + display::ui::theme::text::OUTLINE); + text.drawBitmapOutlined(fb, + bx + config.hostblock.networks.width + config.hostblock.networks.label_width + config.hostblock.networks.width / 2 - 2, + by + 3, + display::ui::text::ARROW_UP, + network.online && online ? display::ui::theme::text::TEXT : display::ui::theme::text::OFFLINE, + display::ui::theme::text::OUTLINE); } } + + float HostBlock::quantizeScale(float v) + { + if (v < 1024.0f) + return 1024.0f; + if (v < 1048576.0f) + return 1048576.0f; + return v; + } } diff --git a/src/display/ui/hostblock/HostBlock.h b/src/display/ui/hostblock/HostBlock.h index b624aa6..98704a0 100644 --- a/src/display/ui/hostblock/HostBlock.h +++ b/src/display/ui/hostblock/HostBlock.h @@ -30,5 +30,6 @@ namespace display::ui::hostblock display::ui::bar::Bar cpuTempBar; display::ui::bar::Bar memBar; display::ui::bar::Bar netBar; + float quantizeScale(float v); }; } diff --git a/src/display/ui/text/Arrow.h b/src/display/ui/text/Arrow.h new file mode 100644 index 0000000..1b9b4ac --- /dev/null +++ b/src/display/ui/text/Arrow.h @@ -0,0 +1,20 @@ +#pragma once + +namespace display::ui::text +{ + constexpr uint8_t ARROW_UP[5][5] = { + {0, 0, 1, 0, 0}, + {0, 1, 1, 1, 0}, + {1, 0, 1, 0, 1}, + {0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0}, + }; + + constexpr uint8_t ARROW_DOWN[5][5] = { + {0, 0, 1, 0, 0}, + {0, 0, 1, 0, 0}, + {1, 0, 1, 0, 1}, + {0, 1, 1, 1, 0}, + {0, 0, 1, 0, 0}, + }; +} // namespace display::ui::text diff --git a/src/display/ui/text/Renderer.cpp b/src/display/ui/text/Renderer.cpp index 527ceaa..944ce85 100644 --- a/src/display/ui/text/Renderer.cpp +++ b/src/display/ui/text/Renderer.cpp @@ -82,5 +82,25 @@ namespace display::ui::text return height; } */ + void Renderer::drawBitmapOutlined(display::graphics::Framebuffer &fb, int x, int y, + const uint8_t bitmap[5][5], + const display::graphics::Color &color, + const display::graphics::Color &outline) + { + // outline + for (int dx = -1; dx <= 1; ++dx) + for (int dy = -1; dy <= 1; ++dy) + if (dx != 0 || dy != 0) + for (int row = 0; row < 5; ++row) + for (int col = 0; col < 5; ++col) + if (bitmap[row][col]) + fb.setPixel(x + col + dx, y + row + dy, outline); + + // main + for (int row = 0; row < 5; ++row) + for (int col = 0; col < 5; ++col) + if (bitmap[row][col]) + fb.setPixel(x + col, y + row, color); + } } // namespace display::ui::text \ No newline at end of file diff --git a/src/display/ui/text/Renderer.h b/src/display/ui/text/Renderer.h index 2de7526..f4013d9 100644 --- a/src/display/ui/text/Renderer.h +++ b/src/display/ui/text/Renderer.h @@ -16,7 +16,7 @@ namespace display::ui::text public: void drawText(display::graphics::Framebuffer &fb, int x, int y, const std::string &text, const display::graphics::Color &color = display::graphics::Color{255, 255, 255}, const Font &font = {"LiberationSans-Regular", 12}); void drawTextOutlined(display::graphics::Framebuffer &fb, int x, int y, const std::string &text, const display::graphics::Color &colorText = display::graphics::Color{255, 255, 255}, const display::graphics::Color &colorOutline = display::graphics::Color{0, 0, 0}, const Font &font = {"LiberationSans-Regular", 12}); - + void drawBitmapOutlined(display::graphics::Framebuffer &fb, int x, int y, const uint8_t bitmap[5][5], const display::graphics::Color &color, const display::graphics::Color &outline); // int measureWidth(const std::string &text); // int measureHeight(const std::string &text);