diff --git a/OpenRGB.pro b/OpenRGB.pro index 077fa94a..0a636467 100644 --- a/OpenRGB.pro +++ b/OpenRGB.pro @@ -52,6 +52,7 @@ SOURCES += \ i2c_tools/i2c_tools.cpp \ net_port/net_port.cpp \ qt/OpenRGBDialog2.cpp \ + qt/OpenRGBProfileSaveDialog.cpp \ qt/OpenRGBSystemInfoPage.cpp \ qt/hsv.cpp \ serial_port/serial_port.cpp \ @@ -138,6 +139,7 @@ HEADERS += \ i2c_tools/i2c_tools.h \ net_port/net_port.h \ qt/OpenRGBDialog2.h \ + qt/OpenRGBProfileSaveDialog.h \ qt/OpenRGBSystemInfoPage.h \ serial_port/find_usb_serial_port.h \ serial_port/serial_port.h \ @@ -199,6 +201,7 @@ FORMS += \ qt/OpenRGBDevicePage.ui \ qt/OpenRGBDialog.ui \ qt/OpenRGBDialog2.ui \ + qt/OpenRGBProfileSaveDialog.ui \ qt/OpenRGBSystemInfoPage.ui #----------------------------------------------- diff --git a/qt/OpenRGBDialog2.cpp b/qt/OpenRGBDialog2.cpp index cee0af1e..d36e9c57 100644 --- a/qt/OpenRGBDialog2.cpp +++ b/qt/OpenRGBDialog2.cpp @@ -3,6 +3,7 @@ #include "OpenRGBDevicePage.h" #include "OpenRGBDeviceInfoPage.h" #include "OpenRGBSystemInfoPage.h" +#include "OpenRGBProfileSaveDialog.h" #include "RGBController_Dummy.h" #include #include @@ -282,100 +283,171 @@ void OpenRGBDialog2::on_ShowHide() void Ui::OpenRGBDialog2::on_ButtonSaveProfile_clicked() { - for(int controller_index = 0; controller_index < controllers.size(); controller_index++) - { - char filename[128]; - snprintf(filename, 128, "controller_%d.bin", controller_index); + OpenRGBProfileSaveDialog dialog; + /*---------------------------------------------------------*\ + | Open Profile Name Dialog | + \*---------------------------------------------------------*/ + std::string profile_name = dialog.show(); + + /*---------------------------------------------------------*\ + | If a name was entered, save the profile file | + \*---------------------------------------------------------*/ + 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); - unsigned char *controller_data = controllers[controller_index]->GetDeviceDescription(); - unsigned int controller_size; + /*---------------------------------------------------------*\ + | Write header | + | 16 bytes - "OPENRGB_PROFILE" | + | 4 bytes - Version, unsigned int | + \*---------------------------------------------------------*/ + unsigned int profile_version = 1; + controller_file.write("OPENRGB_PROFILE", 16); + controller_file.write((char *)&profile_version, sizeof(unsigned int)); - memcpy(&controller_size, controller_data, sizeof(controller_size)); + /*---------------------------------------------------------*\ + | Write controller data for each controller | + \*---------------------------------------------------------*/ + for(int controller_index = 0; controller_index < controllers.size(); controller_index++) + { + unsigned char *controller_data = controllers[controller_index]->GetDeviceDescription(); + unsigned int controller_size; - controller_file.write((const char *)controller_data, controller_size); + memcpy(&controller_size, controller_data, sizeof(controller_size)); + controller_file.write((const char *)controller_data, controller_size); + } + + /*---------------------------------------------------------*\ + | Close the file when done | + \*---------------------------------------------------------*/ controller_file.close(); } } void Ui::OpenRGBDialog2::on_ButtonLoadProfile_clicked() { - for(int controller_index = 0; controller_index < controllers.size(); controller_index++) + std::vector temp_controllers; + unsigned int controller_size; + unsigned int controller_offset = 0; + + /*---------------------------------------------------------*\ + | Get the profile filename from the profiles list | + \*---------------------------------------------------------*/ + std::string filename = "test123.orp"; + + /*---------------------------------------------------------*\ + | Open input file in binary mode | + \*---------------------------------------------------------*/ + std::ifstream controller_file(filename, std::ios::in | std::ios::binary); + + /*---------------------------------------------------------*\ + | Read and verify file header | + \*---------------------------------------------------------*/ + char header_string[16]; + unsigned int header_version; + + controller_file.read(header_string, 16); + controller_file.read((char *)&header_version, sizeof(unsigned int)); + + controller_offset += 16 + sizeof(unsigned int); + controller_file.seekg(controller_offset); + + if(strcmp(header_string, "OPENRGB_PROFILE") == 0) { - char filename[128]; - snprintf(filename, 128, "controller_%d.bin", controller_index); - - std::ifstream controller_file(filename, std::ios::in | std::ios::binary); - unsigned int controller_size; - - controller_file.read((char *)&controller_size, sizeof(controller_size)); - - unsigned char *controller_data = new unsigned char[controller_size]; - - controller_file.seekg(0); - - controller_file.read((char *)controller_data, controller_size); - - RGBController_Dummy temp_controller; - - temp_controller.ReadDeviceDescription(controller_data); - - delete[] controller_data; - - RGBController *controller_ptr = controllers[controller_index]; - - /*---------------------------------------------------------*\ - | Test if saved controller data matches this controller | - \*---------------------------------------------------------*/ - if((temp_controller.type == controller_ptr->type ) - &&(temp_controller.name == controller_ptr->name ) - &&(temp_controller.description == controller_ptr->description) - &&(temp_controller.version == controller_ptr->version ) - &&(temp_controller.serial == controller_ptr->serial ) - &&(temp_controller.location == controller_ptr->location )) + if(header_version == 1) { /*---------------------------------------------------------*\ - | Update all modes | + | Read controller data from file until EOF | \*---------------------------------------------------------*/ - if(temp_controller.modes.size() == controller_ptr->modes.size()) + while(!(controller_file.peek() == EOF)) { - 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_file.read((char *)&controller_size, sizeof(controller_size)); - controller_ptr->modes[mode_index].colors.resize(temp_controller.modes[mode_index].colors.size()); + unsigned char *controller_data = new unsigned char[controller_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_file.seekg(controller_offset); - } + controller_file.read((char *)controller_data, controller_size); - controller_ptr->active_mode = temp_controller.active_mode; + RGBController_Dummy *temp_controller = new RGBController_Dummy(); + + temp_controller->ReadDeviceDescription(controller_data); + + temp_controllers.push_back(temp_controller); + + delete[] controller_data; + + controller_offset += controller_size; + controller_file.seekg(controller_offset); } - /*---------------------------------------------------------*\ - | Update all colors | - \*---------------------------------------------------------*/ - if(temp_controller.colors.size() == controller_ptr->colors.size()) + for(int controller_index = 0; controller_index < controllers.size(); controller_index++) { - for(int color_index = 0; color_index < temp_controller.colors.size(); color_index++) + RGBController *temp_controller = temp_controllers[controller_index]; + RGBController *controller_ptr = controllers[controller_index]; + + /*---------------------------------------------------------*\ + | Test if saved controller data matches this controller | + \*---------------------------------------------------------*/ + if((temp_controller->type == controller_ptr->type ) + &&(temp_controller->name == controller_ptr->name ) + &&(temp_controller->description == controller_ptr->description) + &&(temp_controller->version == controller_ptr->version ) + &&(temp_controller->serial == controller_ptr->serial ) + &&(temp_controller->location == controller_ptr->location )) { - controller_ptr->colors[color_index] = temp_controller.colors[color_index]; + /*---------------------------------------------------------*\ + | Update all modes | + \*---------------------------------------------------------*/ + if(temp_controller->modes.size() == controller_ptr->modes.size()) + { + 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]; + } + } } } } diff --git a/qt/OpenRGBDialog2.ui b/qt/OpenRGBDialog2.ui index 79bc498a..5aee2e72 100644 --- a/qt/OpenRGBDialog2.ui +++ b/qt/OpenRGBDialog2.ui @@ -15,14 +15,24 @@ - + + + + Load Profile + + + + Save Profile - + + + + QTabWidget::Rounded @@ -41,7 +51,7 @@ Devices - + QTabWidget::West @@ -86,13 +96,6 @@ - - - - Load Profile - - - diff --git a/qt/OpenRGBProfileSaveDialog.cpp b/qt/OpenRGBProfileSaveDialog.cpp new file mode 100644 index 00000000..bc0790af --- /dev/null +++ b/qt/OpenRGBProfileSaveDialog.cpp @@ -0,0 +1,31 @@ +#include "OpenRGBProfileSaveDialog.h" +#include "ui_OpenRGBProfileSaveDialog.h" + +Ui::OpenRGBProfileSaveDialog::OpenRGBProfileSaveDialog(QWidget *parent) : + QDialog(parent), ui(new Ui::OpenRGBProfileSaveDialogUi) +{ + ui->setupUi(this); +} + +Ui::OpenRGBProfileSaveDialog::~OpenRGBProfileSaveDialog() +{ + delete ui; +} + +std::string Ui::OpenRGBProfileSaveDialog::show() +{ + std::string return_string; + + int result = this->exec(); + + if(result == QDialog::Rejected) + { + return_string = ""; + } + else + { + return_string = ui->lineEdit->text().toStdString(); + } + + return(return_string); +} diff --git a/qt/OpenRGBProfileSaveDialog.h b/qt/OpenRGBProfileSaveDialog.h new file mode 100644 index 00000000..4b46a8ba --- /dev/null +++ b/qt/OpenRGBProfileSaveDialog.h @@ -0,0 +1,26 @@ +#ifndef OPENRGBPROFILESAVEDIALOG_H +#define OPENRGBPROFILESAVEDIALOG_H + +#include +#include "ui_OpenRGBProfileSaveDialog.h" + +namespace Ui +{ +class OpenRGBProfileSaveDialog; +} + +class Ui::OpenRGBProfileSaveDialog : public QDialog +{ + Q_OBJECT + +public: + explicit OpenRGBProfileSaveDialog(QWidget *parent = nullptr); + ~OpenRGBProfileSaveDialog(); + + std::string show(); + +private: + Ui::OpenRGBProfileSaveDialogUi *ui; +}; + +#endif // OPENRGBPROFILESAVEDIALOG_H diff --git a/qt/OpenRGBProfileSaveDialog.ui b/qt/OpenRGBProfileSaveDialog.ui new file mode 100644 index 00000000..b67236b4 --- /dev/null +++ b/qt/OpenRGBProfileSaveDialog.ui @@ -0,0 +1,91 @@ + + + OpenRGBProfileSaveDialogUi + + + + 0 + 0 + 400 + 160 + + + + Dialog + + + + + 30 + 120 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 30 + 70 + 341 + 20 + + + + + + + 30 + 20 + 341 + 16 + + + + New Profile Name: + + + + + + + buttonBox + accepted() + OpenRGBProfileSaveDialogUi + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + OpenRGBProfileSaveDialogUi + reject() + + + 316 + 260 + + + 286 + 274 + + + + +