From 18c18e3999320a71402df94355d5c6e1f71dbbbe Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Thu, 19 Mar 2020 14:24:39 -0500 Subject: [PATCH] Automatically save a sizes.ors profile when resizing a zone, then automatically load zone sizes from sizes.ors on start --- ProfileManager.cpp | 107 ++++++++++++++++++++++++++------------- ProfileManager.h | 7 +++ main.cpp | 2 + qt/OpenRGBDevicePage.cpp | 5 ++ qt/OpenRGBDevicePage.h | 1 + qt/OpenRGBDialog2.cpp | 23 ++++++++- qt/OpenRGBDialog2.h | 1 + 7 files changed, 110 insertions(+), 36 deletions(-) diff --git a/ProfileManager.cpp b/ProfileManager.cpp index e46568506..7a9c047b7 100644 --- a/ProfileManager.cpp +++ b/ProfileManager.cpp @@ -25,15 +25,10 @@ bool ProfileManager::SaveProfile(std::string profile_name) \*---------------------------------------------------------*/ if(profile_name != "") { - /*---------------------------------------------------------*\ - | Extension .orp - OpenRgb Profile | - \*---------------------------------------------------------*/ - std::string filename = profile_name + ".orp"; - /*---------------------------------------------------------*\ | Open an output file in binary mode | \*---------------------------------------------------------*/ - std::ofstream controller_file(filename, std::ios::out | std::ios::binary); + std::ofstream controller_file(profile_name, std::ios::out | std::ios::binary); /*---------------------------------------------------------*\ | Write header | @@ -76,6 +71,21 @@ bool ProfileManager::SaveProfile(std::string profile_name) } bool ProfileManager::LoadProfile(std::string profile_name) +{ + return(LoadProfileWithOptions(profile_name, false, true)); +} + +bool ProfileManager::LoadSizeFromProfile(std::string profile_name) +{ + return(LoadProfileWithOptions(profile_name, true, false)); +} + +bool ProfileManager::LoadProfileWithOptions + ( + std::string profile_name, + bool load_size, + bool load_settings + ) { std::vector temp_controllers; std::vector temp_controller_used; @@ -158,51 +168,78 @@ bool ProfileManager::LoadProfile(std::string profile_name) &&(temp_controller->location == controller_ptr->location )) { /*---------------------------------------------------------*\ - | Update all modes | + | Update zone sizes if requested | \*---------------------------------------------------------*/ - if(temp_controller->modes.size() == controller_ptr->modes.size()) + if(load_size) { - for(int mode_index = 0; mode_index < temp_controller->modes.size(); mode_index++) + if(temp_controller->zones.size() == controller_ptr->zones.size()) { - if((temp_controller->modes[mode_index].name == controller_ptr->modes[mode_index].name ) - &&(temp_controller->modes[mode_index].value == controller_ptr->modes[mode_index].value ) - &&(temp_controller->modes[mode_index].flags == controller_ptr->modes[mode_index].flags ) - &&(temp_controller->modes[mode_index].speed_min == controller_ptr->modes[mode_index].speed_min ) - &&(temp_controller->modes[mode_index].speed_max == controller_ptr->modes[mode_index].speed_max ) - &&(temp_controller->modes[mode_index].colors_min == controller_ptr->modes[mode_index].colors_min) - &&(temp_controller->modes[mode_index].colors_max == controller_ptr->modes[mode_index].colors_max)) + for(int zone_idx = 0; zone_idx < temp_controller->zones.size(); zone_idx++) { - controller_ptr->modes[mode_index].speed = temp_controller->modes[mode_index].speed; - controller_ptr->modes[mode_index].direction = temp_controller->modes[mode_index].direction; - controller_ptr->modes[mode_index].color_mode = temp_controller->modes[mode_index].color_mode; - - controller_ptr->modes[mode_index].colors.resize(temp_controller->modes[mode_index].colors.size()); - - for(int mode_color_index = 0; mode_color_index < temp_controller->modes[mode_index].colors.size(); mode_color_index++) + if((temp_controller->zones[zone_idx].name == controller_ptr->zones[zone_idx].name ) + &&(temp_controller->zones[zone_idx].type == controller_ptr->zones[zone_idx].type ) + &&(temp_controller->zones[zone_idx].leds_min == controller_ptr->zones[zone_idx].leds_min ) + &&(temp_controller->zones[zone_idx].leds_max == controller_ptr->zones[zone_idx].leds_max ) + &&(temp_controller->zones[zone_idx].leds_count != controller_ptr->zones[zone_idx].leds_count)) { - controller_ptr->modes[mode_index].colors[mode_color_index] = temp_controller->modes[mode_index].colors[mode_color_index]; + controller_ptr->ResizeZone(zone_idx, temp_controller->zones[zone_idx].leds_count); } } - } - - controller_ptr->active_mode = temp_controller->active_mode; } /*---------------------------------------------------------*\ - | Update all colors | + | Update settings if requested | \*---------------------------------------------------------*/ - if(temp_controller->colors.size() == controller_ptr->colors.size()) + if(load_settings) { - for(int color_index = 0; color_index < temp_controller->colors.size(); color_index++) + /*---------------------------------------------------------*\ + | Update all modes | + \*---------------------------------------------------------*/ + if(temp_controller->modes.size() == controller_ptr->modes.size()) { - controller_ptr->colors[color_index] = temp_controller->colors[color_index]; + for(int mode_index = 0; mode_index < temp_controller->modes.size(); mode_index++) + { + if((temp_controller->modes[mode_index].name == controller_ptr->modes[mode_index].name ) + &&(temp_controller->modes[mode_index].value == controller_ptr->modes[mode_index].value ) + &&(temp_controller->modes[mode_index].flags == controller_ptr->modes[mode_index].flags ) + &&(temp_controller->modes[mode_index].speed_min == controller_ptr->modes[mode_index].speed_min ) + &&(temp_controller->modes[mode_index].speed_max == controller_ptr->modes[mode_index].speed_max ) + &&(temp_controller->modes[mode_index].colors_min == controller_ptr->modes[mode_index].colors_min) + &&(temp_controller->modes[mode_index].colors_max == controller_ptr->modes[mode_index].colors_max)) + { + controller_ptr->modes[mode_index].speed = temp_controller->modes[mode_index].speed; + controller_ptr->modes[mode_index].direction = temp_controller->modes[mode_index].direction; + controller_ptr->modes[mode_index].color_mode = temp_controller->modes[mode_index].color_mode; + + controller_ptr->modes[mode_index].colors.resize(temp_controller->modes[mode_index].colors.size()); + + for(int mode_color_index = 0; mode_color_index < temp_controller->modes[mode_index].colors.size(); mode_color_index++) + { + controller_ptr->modes[mode_index].colors[mode_color_index] = temp_controller->modes[mode_index].colors[mode_color_index]; + } + } + + } + + controller_ptr->active_mode = temp_controller->active_mode; } + + /*---------------------------------------------------------*\ + | Update all colors | + \*---------------------------------------------------------*/ + if(temp_controller->colors.size() == controller_ptr->colors.size()) + { + for(int color_index = 0; color_index < temp_controller->colors.size(); color_index++) + { + controller_ptr->colors[color_index] = temp_controller->colors[color_index]; + } + } + + temp_controller_used[temp_index] = true; + + break; } - - temp_controller_used[temp_index] = true; - - break; } } } diff --git a/ProfileManager.h b/ProfileManager.h index 57e5bf144..6479fbcb0 100644 --- a/ProfileManager.h +++ b/ProfileManager.h @@ -10,6 +10,7 @@ public: bool SaveProfile(std::string profile_name); bool LoadProfile(std::string profile_name); + bool LoadSizeFromProfile(std::string profile_name); void DeleteProfile(std::string profile_name); std::vector profile_list; @@ -19,4 +20,10 @@ protected: private: void UpdateProfileList(); + bool LoadProfileWithOptions + ( + std::string profile_name, + bool load_size, + bool load_settings + ); }; diff --git a/main.cpp b/main.cpp index 8ec28b419..5836b1d03 100644 --- a/main.cpp +++ b/main.cpp @@ -42,6 +42,8 @@ int main(int argc, char* argv[]) DetectRGBControllers(); + profile_manager.LoadSizeFromProfile("sizes.ors"); + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QApplication a(argc, argv); diff --git a/qt/OpenRGBDevicePage.cpp b/qt/OpenRGBDevicePage.cpp index b02f17aac..d822abec1 100644 --- a/qt/OpenRGBDevicePage.cpp +++ b/qt/OpenRGBDevicePage.cpp @@ -959,6 +959,11 @@ void Ui::OpenRGBDevicePage::on_ResizeButton_clicked() | Update color picker with color of first LED | \*-----------------------------------------------------*/ on_LEDBox_currentIndexChanged(0); + + /*-----------------------------------------------------*\ + | Save the size profile | + \*-----------------------------------------------------*/ + SaveSizeProfile(); } } } diff --git a/qt/OpenRGBDevicePage.h b/qt/OpenRGBDevicePage.h index 3a692c0fe..b0b55442a 100644 --- a/qt/OpenRGBDevicePage.h +++ b/qt/OpenRGBDevicePage.h @@ -71,6 +71,7 @@ private: signals: void SetAllDevices(unsigned char red, unsigned char green, unsigned char blue); + void SaveSizeProfile(); }; #endif // OPENRGBDEVICEPAGE_H diff --git a/qt/OpenRGBDialog2.cpp b/qt/OpenRGBDialog2.cpp index 7b85ab1b0..e3878710a 100644 --- a/qt/OpenRGBDialog2.cpp +++ b/qt/OpenRGBDialog2.cpp @@ -97,6 +97,14 @@ OpenRGBDialog2::OpenRGBDialog2(std::vector& bus, std::vec this, SLOT(on_SetAllDevices(unsigned char, unsigned char, unsigned char))); + /*-----------------------------------------------------*\ + | Connect the page's Resize signal to the Save Size slot| + \*-----------------------------------------------------*/ + connect(NewPage, + SIGNAL(SaveSizeProfile()), + this, + SLOT(on_SaveSizeProfile())); + /*-----------------------------------------------------*\ | Use Qt's HTML capabilities to display both icon and | | text in the tab label. Choose icon based on device | @@ -319,6 +327,14 @@ void OpenRGBDialog2::on_SetAllDevices(unsigned char red, unsigned char green, un } } +void OpenRGBDialog2::on_SaveSizeProfile() +{ + /*---------------------------------------------------------*\ + | Save the profile | + \*---------------------------------------------------------*/ + profile_manager.SaveProfile("sizes.ors"); +} + void OpenRGBDialog2::on_ShowHide() { if(isHidden()) @@ -359,10 +375,15 @@ void Ui::OpenRGBDialog2::on_ButtonSaveProfile_clicked() \*---------------------------------------------------------*/ std::string profile_name = dialog.show(); + /*---------------------------------------------------------*\ + | Extension .orp - OpenRgb Profile | + \*---------------------------------------------------------*/ + std::string filename = profile_name + ".orp"; + /*---------------------------------------------------------*\ | Save the profile | \*---------------------------------------------------------*/ - if(profile_manager.SaveProfile(profile_name)) + if(profile_manager.SaveProfile(filename)) { RefreshProfileList(); } diff --git a/qt/OpenRGBDialog2.h b/qt/OpenRGBDialog2.h index 9932df6bf..87b913659 100644 --- a/qt/OpenRGBDialog2.h +++ b/qt/OpenRGBDialog2.h @@ -51,6 +51,7 @@ private slots: void on_QuickMagenta(); void on_QuickWhite(); void on_SetAllDevices(unsigned char red, unsigned char green, unsigned char blue); + void on_SaveSizeProfile(); void on_ShowHide(); void on_ProfileSelected(); void on_ButtonSaveProfile_clicked();