diff --git a/src/btop_config.cpp b/src/btop_config.cpp index 6010189..faf616d 100644 --- a/src/btop_config.cpp +++ b/src/btop_config.cpp @@ -268,6 +268,7 @@ namespace Config { {"lowcolor", false}, {"show_detailed", false}, {"proc_filtering", false}, + {"is_maximized", false}, }; unordered_flat_map boolsTmp; @@ -521,6 +522,20 @@ namespace Config { return true; } + void restore(const string& boxes) { + current_boxes.clear(); + current_boxes = ssplit(boxes); + Config::set("shown_boxes", boxes); + Config::set("is_maximized", false); + } + + void maximize_box(const string& box) { + current_boxes.clear(); + current_boxes.push_back(box); + Config::set("shown_boxes", box); + Config::set("is_maximized", true); + } + void toggle_box(const string& box) { auto old_boxes = current_boxes; auto box_pos = rng::find(current_boxes, box); @@ -543,6 +558,7 @@ namespace Config { } Config::set("shown_boxes", new_boxes); + ssplit(new_boxes).size() == 1 ? Config::set("is_maximized", true) : Config::set("is_maximized", false); } void load(const fs::path& conf_file, vector& load_warnings) { diff --git a/src/btop_config.hpp b/src/btop_config.hpp index e5f4ac1..265c58e 100644 --- a/src/btop_config.hpp +++ b/src/btop_config.hpp @@ -57,6 +57,12 @@ namespace Config { //* Toggle box and update config string shown_boxes void toggle_box(const string& box); + //* Maximize box and update config string shown_boxes + void maximize_box(const string& box); + + //* Restore boxes and update config string shown_boxes + void restore(const string& boxes); + //* Parse and setup config value presets bool presetsValid(const string& presets); diff --git a/src/btop_input.cpp b/src/btop_input.cpp index ebdee3b..00da166 100644 --- a/src/btop_input.cpp +++ b/src/btop_input.cpp @@ -22,6 +22,7 @@ tab-size = 4 #include #include #include +#include #include "btop_input.hpp" #include "btop_tools.hpp" @@ -260,11 +261,29 @@ namespace Input { Menu::show(Menu::Menus::Options); return; } - else if (is_in(key, "1", "2", "3", "4")) { + else if (is_in(key, "1", "2", "3", "4", "!", "@", "#", "$")) { atomic_wait(Runner::active); Config::current_preset = -1; static const array boxes = {"cpu", "mem", "net", "proc"}; - Config::toggle_box(boxes.at(std::stoi(key) - 1)); + if (std::isdigit(key[0])) + Config::toggle_box(boxes.at(std::stoi(key) - 1)); + else { + static const unordered_flat_map binding = { + {"!", boxes.at(0)}, + {"@", boxes.at(1)}, + {"#", boxes.at(2)}, + {"$", boxes.at(3)}, + }; + if (Config::getB("is_maximized") && Config::getS("shown_boxes") == binding.at(key)) { + string str_boxes; + for (const auto& b : boxes) str_boxes += b + ' '; + str_boxes.pop_back(); + + Config::restore(str_boxes); + } + else + Config::maximize_box(binding.at(key)); + } Draw::calcSizes(); Runner::run("all", false, true); return;