From 4051c335573962dacf3cd3737160e9b6349fcbdf Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Fri, 20 Feb 2026 00:45:39 -0600 Subject: [PATCH] RGBController API changes and segment configuration updates * Make the Get/Set RGBControler descriptor functions static * Add functions for getting the matrix_map_type for zone and segment matrix maps * Rename zone resize dialog to zone editor dialog * Add additional segment types * Add option to import segments configuration from JSON file in zone editor dialog * Update device view to be able to display matrix segment types * Add matrix map editor dialog for creating/editing segment matrix maps * Add option to export segments configuration to JSON file in zone editor dialog --- NetworkClient.cpp | 6 +- NetworkServer.cpp | 14 +- ProfileManager.cpp | 12 +- RGBController/RGBController.cpp | 1058 +++++++++-------- RGBController/RGBController.h | 141 +-- RGBController/RGBController_Network.cpp | 4 +- qt/DeviceView.cpp | 96 +- qt/DeviceView.h | 2 + qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp | 5 +- .../OpenRGBMatrixMapEditorDialog.cpp | 136 +++ .../OpenRGBMatrixMapEditorDialog.h | 43 + .../OpenRGBMatrixMapEditorDialog.ui | 97 ++ .../OpenRGBSegmentExportDialog.cpp | 86 ++ .../OpenRGBSegmentExportDialog.h | 44 + .../OpenRGBSegmentExportDialog.ui | 126 ++ .../OpenRGBZoneEditorDialog.cpp | 477 ++++++++ .../OpenRGBZoneEditorDialog.h} | 40 +- .../OpenRGBZoneEditorDialog.ui | 173 +++ .../OpenRGBZoneResizeDialog.cpp | 283 ----- .../OpenRGBZoneResizeDialog.ui | 145 --- qt/i18n/OpenRGB_be_BY.ts | 2 +- qt/i18n/OpenRGB_de_DE.ts | 2 +- qt/i18n/OpenRGB_el_GR.ts | 2 +- qt/i18n/OpenRGB_en_AU.ts | 2 +- qt/i18n/OpenRGB_en_GB.ts | 2 +- qt/i18n/OpenRGB_en_US.ts | 2 +- qt/i18n/OpenRGB_es_ES.ts | 2 +- qt/i18n/OpenRGB_fr_FR.ts | 2 +- qt/i18n/OpenRGB_hr_HR.ts | 2 +- qt/i18n/OpenRGB_it_IT.ts | 2 +- qt/i18n/OpenRGB_ja_JP.ts | 2 +- qt/i18n/OpenRGB_ko_KR.ts | 2 +- qt/i18n/OpenRGB_ms_MY.ts | 2 +- qt/i18n/OpenRGB_nb_NO.ts | 2 +- qt/i18n/OpenRGB_pl_PL.ts | 2 +- qt/i18n/OpenRGB_pt_BR.ts | 2 +- qt/i18n/OpenRGB_ru_RU.ts | 2 +- qt/i18n/OpenRGB_tr_TR.ts | 2 +- qt/i18n/OpenRGB_uk_UA.ts | 2 +- qt/i18n/OpenRGB_zh_CN.ts | 2 +- qt/i18n/OpenRGB_zh_TW.ts | 2 +- 41 files changed, 1919 insertions(+), 1111 deletions(-) create mode 100644 qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.cpp create mode 100644 qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.h create mode 100644 qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.ui create mode 100644 qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.cpp create mode 100644 qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.h create mode 100644 qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.ui create mode 100644 qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.cpp rename qt/{OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.h => OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.h} (59%) create mode 100644 qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.ui delete mode 100644 qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp delete mode 100644 qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.ui diff --git a/NetworkClient.cpp b/NetworkClient.cpp index f1d7159dc..13c879a15 100644 --- a/NetworkClient.cpp +++ b/NetworkClient.cpp @@ -1194,7 +1194,7 @@ void NetworkClient::ProcessReply_ControllerData(unsigned int data_size, char * d \*-------------------------------------------------*/ RGBController_Network * new_controller = new RGBController_Network(this, dev_id); - new_controller->SetDeviceDescription((unsigned char *)data, GetProtocolVersion()); + RGBController::SetDeviceDescription((unsigned char *)data, new_controller, GetProtocolVersion()); /*-------------------------------------------------*\ | Mark this controller as remote owned | @@ -1459,7 +1459,7 @@ void NetworkClient::ProcessRequest_RGBController_SignalUpdate(unsigned int data_ | UpdateLEDs() sends color description | \*-------------------------------------------------*/ case RGBCONTROLLER_UPDATE_REASON_UPDATELEDS: - controller->SetColorDescription((unsigned char *)data_ptr, GetProtocolVersion()); + RGBController::SetColorDescription((unsigned char *)data_ptr, controller, GetProtocolVersion()); break; /*-------------------------------------------------*\ @@ -1474,7 +1474,7 @@ void NetworkClient::ProcessRequest_RGBController_SignalUpdate(unsigned int data_ case RGBCONTROLLER_UPDATE_REASON_HIDDEN: case RGBCONTROLLER_UPDATE_REASON_UNHIDDEN: default: - controller->SetDeviceDescription((unsigned char *)data_ptr, GetProtocolVersion()); + RGBController::SetDeviceDescription((unsigned char *)data_ptr, controller, GetProtocolVersion()); break; } diff --git a/NetworkServer.cpp b/NetworkServer.cpp index 3050fc78a..84892b794 100644 --- a/NetworkServer.cpp +++ b/NetworkServer.cpp @@ -1818,7 +1818,7 @@ void NetworkServer::ProcessRequest_RGBController_UpdateLEDs(unsigned int control /*-----------------------------------------------------*\ | Update colors | \*-----------------------------------------------------*/ - controllers[controller_idx]->SetColorDescription(data_ptr, protocol_version); + RGBController::SetColorDescription(data_ptr, controllers[controller_idx], protocol_version); /*-----------------------------------------------------*\ | Unlock access mutex | @@ -2199,7 +2199,7 @@ void NetworkServer::SendReply_ControllerData(SOCKET client_sock, unsigned int de | Get data size | \*-----------------------------------------------------*/ reply_size = sizeof(reply_size); - reply_size += controllers[dev_idx]->GetDeviceDescriptionSize(protocol_version); + reply_size += RGBController::GetDeviceDescriptionSize(controllers[dev_idx], protocol_version); /*-----------------------------------------------------*\ | Create data buffer | @@ -2216,7 +2216,7 @@ void NetworkServer::SendReply_ControllerData(SOCKET client_sock, unsigned int de /*-----------------------------------------------------*\ | Copy in data | \*-----------------------------------------------------*/ - data_ptr = controllers[dev_idx]->GetDeviceDescriptionData(data_ptr, protocol_version); + data_ptr = RGBController::GetDeviceDescriptionData(data_ptr, controllers[dev_idx], protocol_version); /*-----------------------------------------------------*\ | Unlock controller's access mutex | @@ -2736,7 +2736,7 @@ void NetworkServer::SendRequest_RGBController_SignalUpdate(RGBController * contr | UpdateLEDs() sends color description | \*-------------------------------------*/ case RGBCONTROLLER_UPDATE_REASON_UPDATELEDS: - reply_size += controller_ptr->GetColorDescriptionSize(protocol_version); + reply_size += RGBController::GetColorDescriptionSize(controller_ptr, protocol_version); break; /*-------------------------------------*\ @@ -2751,7 +2751,7 @@ void NetworkServer::SendRequest_RGBController_SignalUpdate(RGBController * contr case RGBCONTROLLER_UPDATE_REASON_HIDDEN: case RGBCONTROLLER_UPDATE_REASON_UNHIDDEN: default: - reply_size += controller_ptr->GetDeviceDescriptionSize(protocol_version); + reply_size += RGBController::GetDeviceDescriptionSize(controller_ptr, protocol_version); break; } @@ -2782,7 +2782,7 @@ void NetworkServer::SendRequest_RGBController_SignalUpdate(RGBController * contr | UpdateLEDs() sends color description | \*-------------------------------------*/ case RGBCONTROLLER_UPDATE_REASON_UPDATELEDS: - data_ptr = controller_ptr->GetColorDescriptionData(data_ptr, protocol_version); + data_ptr = RGBController::GetColorDescriptionData(data_ptr, controller_ptr, protocol_version); break; /*-------------------------------------*\ @@ -2797,7 +2797,7 @@ void NetworkServer::SendRequest_RGBController_SignalUpdate(RGBController * contr case RGBCONTROLLER_UPDATE_REASON_HIDDEN: case RGBCONTROLLER_UPDATE_REASON_UNHIDDEN: default: - data_ptr = controller_ptr->GetDeviceDescriptionData(data_ptr, protocol_version); + data_ptr = RGBController::GetDeviceDescriptionData(data_ptr, controller_ptr, protocol_version); break; } diff --git a/ProfileManager.cpp b/ProfileManager.cpp index 03ed325d0..d1abacd7b 100644 --- a/ProfileManager.cpp +++ b/ProfileManager.cpp @@ -285,7 +285,7 @@ std::vector ProfileManager::GetControllerListFromProfileJson(nlo { RGBController_Dummy * profile_controller = new RGBController_Dummy(); - profile_controller->SetDeviceDescriptionJSON(profile_json["controllers"][controller_idx]); + RGBController::SetDeviceDescriptionJSON(profile_json["controllers"][controller_idx], profile_controller); profile_controllers.push_back(profile_controller); } @@ -590,7 +590,7 @@ bool ProfileManager::SaveProfile(std::string profile_name) | Read the controller data for this | | controller into the profile json | \*-----------------------------------------*/ - profile_json["controllers"][new_profile_controller_index] = controllers[controller_index]->GetDeviceDescriptionJSON(); + profile_json["controllers"][new_profile_controller_index] = RGBController::GetDeviceDescriptionJSON(controllers[controller_index]); new_profile_controller_index++; } @@ -618,7 +618,7 @@ bool ProfileManager::SaveProfile(std::string profile_name) | Read the controller data for this | | controller into the profile json | \*-----------------------------------------*/ - profile_json["controllers"][new_profile_controller_index] = manually_configured_rgb_controllers[existing_controller_index]->GetDeviceDescriptionJSON(); + profile_json["controllers"][new_profile_controller_index] = RGBController::GetDeviceDescriptionJSON(manually_configured_rgb_controllers[existing_controller_index]); new_profile_controller_index++; } } @@ -709,7 +709,7 @@ bool ProfileManager::SaveProfileCustom(std::string profile_name, std::vectorGetDeviceDescriptionJSON(); + profile_json["controllers"][controller_index] = RGBController::GetDeviceDescriptionJSON(controllers[controller_index]); } /*-------------------------------------------------*\ @@ -834,7 +834,7 @@ bool ProfileManager::SaveSizes() | Read the controller data for this controller | | into the profile json if manually configured | \*---------------------------------------------*/ - profile_json["controllers"][new_saved_controller_index] = controllers[controller_index]->GetDeviceDescriptionJSON(); + profile_json["controllers"][new_saved_controller_index] = RGBController::GetDeviceDescriptionJSON(controllers[controller_index]); new_saved_controller_index++; break; @@ -866,7 +866,7 @@ bool ProfileManager::SaveSizes() | Read the controller data for this controller | | into the profile json | \*---------------------------------------------*/ - profile_json["controllers"][new_saved_controller_index] = manually_configured_rgb_controllers[old_saved_controller_index]->GetDeviceDescriptionJSON(); + profile_json["controllers"][new_saved_controller_index] = RGBController::GetDeviceDescriptionJSON(manually_configured_rgb_controllers[old_saved_controller_index]); new_saved_controller_index++; } } diff --git a/RGBController/RGBController.cpp b/RGBController/RGBController.cpp index 43e03549f..ea68fdbb8 100644 --- a/RGBController/RGBController.cpp +++ b/RGBController/RGBController.cpp @@ -359,6 +359,38 @@ unsigned int RGBController::GetZoneLEDsMin(unsigned int zone) return(leds_min); } +matrix_map_type RGBController::GetZoneMatrixMap(unsigned int zone) +{ + matrix_map_type matrix_map; + + AccessMutex.lock_shared(); + if(zone < zones.size()) + { + matrix_map = zones[zone].matrix_map; + } + AccessMutex.unlock_shared(); + + return(matrix_map); +} + +const unsigned int* RGBController::GetZoneMatrixMapData(unsigned int zone) +{ + unsigned int* map; + + AccessMutex.lock_shared(); + if(zone < zones.size()) + { + map = zones[zone].matrix_map.map.data(); + } + else + { + map = 0; + } + AccessMutex.unlock_shared(); + + return(map); +} + unsigned int RGBController::GetZoneMatrixMapHeight(unsigned int zone) { unsigned int height; @@ -377,24 +409,6 @@ unsigned int RGBController::GetZoneMatrixMapHeight(unsigned int zone) return(height); } -const unsigned int* RGBController::GetZoneMatrixMap(unsigned int zone) -{ - unsigned int* map; - - AccessMutex.lock_shared(); - if(zone < zones.size()) - { - map = zones[zone].matrix_map.map.data(); - } - else - { - map = 0; - } - AccessMutex.unlock_shared(); - - return(map); -} - unsigned int RGBController::GetZoneMatrixMapWidth(unsigned int zone) { unsigned int width; @@ -755,33 +769,25 @@ unsigned int RGBController::GetZoneSegmentLEDsCount(unsigned int zone, unsigned return(leds_count); } -unsigned int RGBController::GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment) +matrix_map_type RGBController::GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) { - unsigned int height; + matrix_map_type matrix_map; - if(zone < zones.size()) + AccessMutex.lock_shared(); + if((zone < zones.size()) && (segment < zones[zone].segments.size())) { - if(segment < zones[zone].segments.size()) - { - height = zones[zone].segments[segment].matrix_map.height; - } - else - { - height = 0; - } - } - else - { - height = 0; + matrix_map = zones[zone].segments[segment].matrix_map; } + AccessMutex.unlock_shared(); - return(height); + return(matrix_map); } -const unsigned int * RGBController::GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) +const unsigned int * RGBController::GetZoneSegmentMatrixMapData(unsigned int zone, unsigned int segment) { unsigned int* map; + AccessMutex.lock_shared(); if(zone < zones.size()) { if(segment < zones[zone].segments.size()) @@ -797,14 +803,41 @@ const unsigned int * RGBController::GetZoneSegmentMatrixMap(unsigned int zone, u { map = 0; } + AccessMutex.unlock_shared(); return(map); } +unsigned int RGBController::GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment) +{ + unsigned int height; + + AccessMutex.lock_shared(); + if(zone < zones.size()) + { + if(segment < zones[zone].segments.size()) + { + height = zones[zone].segments[segment].matrix_map.height; + } + else + { + height = 0; + } + } + else + { + height = 0; + } + AccessMutex.unlock_shared(); + + return(height); +} + unsigned int RGBController::GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment) { unsigned int width; + AccessMutex.lock_shared(); if(zone < zones.size()) { if(segment < zones[zone].segments.size()) @@ -820,6 +853,7 @@ unsigned int RGBController::GetZoneSegmentMatrixMapWidth(unsigned int zone, unsi { width = 0; } + AccessMutex.unlock_shared(); return(width); } @@ -1586,14 +1620,350 @@ void RGBController::SetAllZoneColors(int zone, RGBColor color) } /*---------------------------------------------------------*\ -| Serialized Description Functions | +| Update Callback Functions | \*---------------------------------------------------------*/ -unsigned char * RGBController::GetColorDescriptionData(unsigned char* data_ptr, unsigned int /*protocol_version*/) +void RGBController::RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg) +{ + UpdateMutex.lock(); + + /*-----------------------------------------------------*\ + | Check to see if this is already registered to avoid | + | registering the same callback multiple times | + \*-----------------------------------------------------*/ + for(unsigned int callback_idx = 0; callback_idx < UpdateCallbackArgs.size(); callback_idx++ ) + { + if((UpdateCallbacks[callback_idx] == new_callback) && (UpdateCallbackArgs[callback_idx] == new_callback_arg)) + { + UpdateMutex.unlock(); + return; + } + } + + UpdateCallbacks.push_back(new_callback); + UpdateCallbackArgs.push_back(new_callback_arg); + UpdateMutex.unlock(); +} + +void RGBController::UnregisterUpdateCallback(void * callback_arg) +{ + UpdateMutex.lock(); + for(unsigned int callback_idx = 0; callback_idx < UpdateCallbackArgs.size(); callback_idx++ ) + { + if(UpdateCallbackArgs[callback_idx] == callback_arg) + { + UpdateCallbackArgs.erase(UpdateCallbackArgs.begin() + callback_idx); + UpdateCallbacks.erase(UpdateCallbacks.begin() + callback_idx); + } + } + UpdateMutex.unlock(); +} + +void RGBController::ClearCallbacks() +{ + UpdateMutex.lock(); + UpdateCallbacks.clear(); + UpdateCallbackArgs.clear(); + UpdateMutex.unlock(); +} + +void RGBController::SignalUpdate(unsigned int update_reason) +{ + UpdateMutex.lock(); + + /*-----------------------------------------------------*\ + | Client info has changed, call the callbacks | + \*-----------------------------------------------------*/ + for(unsigned int callback_idx = 0; callback_idx < UpdateCallbacks.size(); callback_idx++) + { + UpdateCallbacks[callback_idx](UpdateCallbackArgs[callback_idx], update_reason, this); + } + + UpdateMutex.unlock(); +} + +/*---------------------------------------------------------*\ +| Device Update Functions | +\*---------------------------------------------------------*/ +void RGBController::Shutdown() +{ + /*-----------------------------------------------------*\ + | Stop device thread | + \*-----------------------------------------------------*/ + DeviceThreadRunning = false; + DeviceCallThread->join(); + delete DeviceCallThread; + + /*-----------------------------------------------------*\ + | Lock the access mutex | + \*-----------------------------------------------------*/ + AccessMutex.lock(); +} + +void RGBController::UpdateLEDs() +{ + CallFlag_UpdateLEDs = true; + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); +} + +void RGBController::UpdateZoneLEDs(int zone) +{ + AccessMutex.lock_shared(); + DeviceUpdateZoneLEDs(zone); + AccessMutex.unlock_shared(); +} + +void RGBController::UpdateSingleLED(int led) +{ + AccessMutex.lock_shared(); + DeviceUpdateSingleLED(led); + AccessMutex.unlock_shared(); +} + +void RGBController::UpdateMode() +{ + CallFlag_UpdateMode = true; + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATEMODE); +} + +void RGBController::UpdateZoneMode(int zone) +{ + AccessMutex.lock_shared(); + DeviceUpdateZoneMode(zone); + AccessMutex.unlock_shared(); +} + +void RGBController::SaveMode() +{ + AccessMutex.lock_shared(); + DeviceSaveMode(); + AccessMutex.unlock_shared(); + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_SAVEMODE); +} + +void RGBController::DeviceCallThreadFunction() +{ + CallFlag_UpdateLEDs = false; + CallFlag_UpdateMode = false; + + while(DeviceThreadRunning.load() == true) + { + if(CallFlag_UpdateMode.load() == true) + { + if(flags & CONTROLLER_FLAG_RESET_BEFORE_UPDATE) + { + AccessMutex.lock_shared(); + CallFlag_UpdateMode = false; + DeviceUpdateMode(); + AccessMutex.unlock_shared(); + } + else + { + AccessMutex.lock_shared(); + DeviceUpdateMode(); + CallFlag_UpdateMode = false; + AccessMutex.unlock_shared(); + } + } + if(CallFlag_UpdateLEDs.load() == true) + { + if(flags & CONTROLLER_FLAG_RESET_BEFORE_UPDATE) + { + AccessMutex.lock_shared(); + CallFlag_UpdateLEDs = false; + DeviceUpdateLEDs(); + AccessMutex.unlock_shared(); + } + else + { + AccessMutex.lock_shared(); + DeviceUpdateLEDs(); + CallFlag_UpdateLEDs = false; + AccessMutex.unlock_shared(); + } + } + else + { + std::this_thread::sleep_for(1ms); + } + } +} + +void RGBController::ClearSegments(int zone) +{ + AccessMutex.lock(); + zones[zone].segments.clear(); + AccessMutex.unlock(); + + zones[zone].flags |= ZONE_FLAG_MANUALLY_CONFIGURED; + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_CLEARSEGMENTS); +} + +void RGBController::AddSegment(int zone, segment new_segment) +{ + AccessMutex.lock(); + zones[zone].segments.push_back(new_segment); + AccessMutex.unlock(); + + zones[zone].flags |= ZONE_FLAG_MANUALLY_CONFIGURED; + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_ADDSEGMENT); +} + +void RGBController::ResizeZone(int zone, int new_size) +{ + AccessMutex.lock(); + DeviceResizeZone(zone, new_size); + AccessMutex.unlock(); + + zones[zone].flags |= ZONE_FLAG_MANUALLY_CONFIGURED; + + SignalUpdate(RGBCONTROLLER_UPDATE_REASON_RESIZEZONE); +} + +/*---------------------------------------------------------*\ +| Functions not part of interface for internal use only | +\*---------------------------------------------------------*/ +unsigned int RGBController::LEDsInZone(unsigned int zone) +{ + unsigned int leds_count; + + leds_count = zones[zone].leds_count; + + if(zones[zone].flags & ZONE_FLAG_RESIZE_EFFECTS_ONLY) + { + if(leds_count > 1) + { + leds_count = 1; + } + } + + return(leds_count); +} + +void RGBController::SetupColors() +{ + unsigned int total_led_count; + unsigned int zone_led_count; + + /*-----------------------------------------------------*\ + | Determine total number of LEDs on the device | + \*-----------------------------------------------------*/ + total_led_count = 0; + + for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) + { + total_led_count += LEDsInZone((unsigned int)zone_idx); + } + + /*-----------------------------------------------------*\ + | Set the size of the color buffer to the number of LEDs| + \*-----------------------------------------------------*/ + colors.resize(total_led_count); + + /*-----------------------------------------------------*\ + | Set the color buffer pointers on each zone | + \*-----------------------------------------------------*/ + total_led_count = 0; + + for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) + { + zones[zone_idx].start_idx = total_led_count; + zone_led_count = LEDsInZone((unsigned int)zone_idx); + + if((colors.size() > 0) && (zone_led_count > 0)) + { + zones[zone_idx].colors = &colors[total_led_count]; + } + else + { + zones[zone_idx].colors = NULL; + } + + if((leds.size() > 0) && (zone_led_count > 0)) + { + zones[zone_idx].leds = &leds[total_led_count]; + } + else + { + zones[zone_idx].leds = NULL; + } + + + total_led_count += zone_led_count; + } +} + +void RGBController::UpdateLEDsInternal() +{ + CallFlag_UpdateLEDs = true; +} + +/*---------------------------------------------------------*\ +| Functions to be implemented in device implementation | +\*---------------------------------------------------------*/ +void RGBController::DeviceResizeZone(int /*zone*/, int /*new_size*/) +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + +void RGBController::DeviceUpdateLEDs() +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + +void RGBController::DeviceUpdateZoneLEDs(int /*zone*/) +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + +void RGBController::DeviceUpdateSingleLED(int /*led*/) +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + +void RGBController::DeviceUpdateMode() +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + +void RGBController::DeviceUpdateZoneMode(int /*zone*/) +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + +void RGBController::DeviceSaveMode() +{ + /*-----------------------------------------------------*\ + | If not implemented by controller, does nothing | + \*-----------------------------------------------------*/ +} + + +/*---------------------------------------------------------*\ +| Static Serialized Description Functions | +\*---------------------------------------------------------*/ +unsigned char * RGBController::GetColorDescriptionData(unsigned char* data_ptr, RGBController* controller, unsigned int /*protocol_version*/) { /*-----------------------------------------------------*\ | Initialize variables | \*-----------------------------------------------------*/ - unsigned short num_colors = (unsigned short)colors.size(); + unsigned short num_colors = (unsigned short)controller->colors.size(); /*-----------------------------------------------------*\ | Copy in number of colors | @@ -1606,20 +1976,20 @@ unsigned char * RGBController::GetColorDescriptionData(unsigned char* data_ptr, \*-----------------------------------------------------*/ for(int color_index = 0; color_index < num_colors; color_index++) { - memcpy(data_ptr, &colors[color_index], sizeof(colors[color_index])); - data_ptr += sizeof(colors[color_index]); + memcpy(data_ptr, &controller->colors[color_index], sizeof(controller->colors[color_index])); + data_ptr += sizeof(controller->colors[color_index]); } return(data_ptr); } -unsigned int RGBController::GetColorDescriptionSize(unsigned int /*protocol_version*/) +unsigned int RGBController::GetColorDescriptionSize(RGBController* controller, unsigned int /*protocol_version*/) { /*-----------------------------------------------------*\ | Initialize variables | \*-----------------------------------------------------*/ unsigned int data_size = 0; - unsigned short num_colors = (unsigned short)colors.size(); + unsigned short num_colors = (unsigned short)controller->colors.size(); /*-----------------------------------------------------*\ | Calculate data size | @@ -1630,26 +2000,26 @@ unsigned int RGBController::GetColorDescriptionSize(unsigned int /*protocol_vers return(data_size); } -unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, unsigned int protocol_version) +unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, RGBController* controller, unsigned int protocol_version) { /*-----------------------------------------------------*\ | Calculate data size | \*-----------------------------------------------------*/ - unsigned short name_len = (unsigned short)strlen(name.c_str()) + 1; - unsigned short vendor_len = (unsigned short)strlen(vendor.c_str()) + 1; - unsigned short description_len = (unsigned short)strlen(description.c_str()) + 1; - unsigned short version_len = (unsigned short)strlen(version.c_str()) + 1; - unsigned short serial_len = (unsigned short)strlen(serial.c_str()) + 1; - unsigned short location_len = (unsigned short)strlen(location.c_str()) + 1; - unsigned short num_modes = (unsigned short)modes.size(); - unsigned short num_zones = (unsigned short)zones.size(); - unsigned short num_leds = (unsigned short)leds.size(); - unsigned short num_led_alt_names = (unsigned short)led_alt_names.size(); + unsigned short name_len = (unsigned short)strlen(controller->name.c_str()) + 1; + unsigned short vendor_len = (unsigned short)strlen(controller->vendor.c_str()) + 1; + unsigned short description_len = (unsigned short)strlen(controller->description.c_str()) + 1; + unsigned short version_len = (unsigned short)strlen(controller->version.c_str()) + 1; + unsigned short serial_len = (unsigned short)strlen(controller->serial.c_str()) + 1; + unsigned short location_len = (unsigned short)strlen(controller->location.c_str()) + 1; + unsigned short num_modes = (unsigned short)controller->modes.size(); + unsigned short num_zones = (unsigned short)controller->zones.size(); + unsigned short num_leds = (unsigned short)controller->leds.size(); + unsigned short num_led_alt_names = (unsigned short)controller->led_alt_names.size(); /*-----------------------------------------------------*\ | Copy in type | \*-----------------------------------------------------*/ - memcpy(data_ptr, &type, sizeof(device_type)); + memcpy(data_ptr, &controller->type, sizeof(device_type)); data_ptr += sizeof(device_type); /*-----------------------------------------------------*\ @@ -1658,7 +2028,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &name_len, sizeof(name_len)); data_ptr += sizeof(name_len); - strcpy((char *)data_ptr, name.c_str()); + strcpy((char *)data_ptr, controller->name.c_str()); data_ptr += name_len; /*-----------------------------------------------------*\ @@ -1669,7 +2039,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &vendor_len, sizeof(vendor_len)); data_ptr += sizeof(vendor_len); - strcpy((char *)data_ptr, vendor.c_str()); + strcpy((char *)data_ptr, controller->vendor.c_str()); data_ptr += vendor_len; } @@ -1679,7 +2049,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &description_len, sizeof(description_len)); data_ptr += sizeof(description_len); - strcpy((char *)data_ptr, description.c_str()); + strcpy((char *)data_ptr, controller->description.c_str()); data_ptr += description_len; /*-----------------------------------------------------*\ @@ -1688,7 +2058,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &version_len, sizeof(version_len)); data_ptr += sizeof(version_len); - strcpy((char *)data_ptr, version.c_str()); + strcpy((char *)data_ptr, controller->version.c_str()); data_ptr += version_len; /*-----------------------------------------------------*\ @@ -1697,7 +2067,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &serial_len, sizeof(serial_len)); data_ptr += sizeof(serial_len); - strcpy((char *)data_ptr, serial.c_str()); + strcpy((char *)data_ptr, controller->serial.c_str()); data_ptr += serial_len; /*-----------------------------------------------------*\ @@ -1706,7 +2076,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &location_len, sizeof(location_len)); data_ptr += sizeof(location_len); - strcpy((char *)data_ptr, location.c_str()); + strcpy((char *)data_ptr, controller->location.c_str()); data_ptr += location_len; /*-----------------------------------------------------*\ @@ -1718,7 +2088,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, /*-----------------------------------------------------*\ | Copy in active mode | \*-----------------------------------------------------*/ - memcpy(data_ptr, &active_mode, sizeof(active_mode)); + memcpy(data_ptr, &controller->active_mode, sizeof(active_mode)); data_ptr += sizeof(active_mode); /*-----------------------------------------------------*\ @@ -1726,7 +2096,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, \*-----------------------------------------------------*/ for(int mode_index = 0; mode_index < num_modes; mode_index++) { - data_ptr = GetModeDescriptionData(data_ptr, modes[mode_index], protocol_version); + data_ptr = GetModeDescriptionData(data_ptr, controller->modes[mode_index], protocol_version); } /*-----------------------------------------------------*\ @@ -1740,7 +2110,7 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, \*-----------------------------------------------------*/ for(int zone_index = 0; zone_index < num_zones; zone_index++) { - data_ptr = GetZoneDescriptionData(data_ptr, zones[zone_index], protocol_version); + data_ptr = GetZoneDescriptionData(data_ptr, controller->zones[zone_index], protocol_version); } /*-----------------------------------------------------*\ @@ -1754,13 +2124,13 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, \*-----------------------------------------------------*/ for(int led_index = 0; led_index < num_leds; led_index++) { - data_ptr = GetLEDDescriptionData(data_ptr, leds[led_index], protocol_version); + data_ptr = GetLEDDescriptionData(data_ptr, controller->leds[led_index], protocol_version); } /*-----------------------------------------------------*\ | Copy in colors | \*-----------------------------------------------------*/ - data_ptr = GetColorDescriptionData(data_ptr, protocol_version); + data_ptr = GetColorDescriptionData(data_ptr, controller, protocol_version); /*-----------------------------------------------------*\ | Copy in LED alternate names | @@ -1773,17 +2143,17 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, memcpy(data_ptr, &num_led_alt_names, sizeof(num_led_alt_names)); data_ptr += sizeof(num_led_alt_names); - for(std::size_t led_idx = 0; led_idx < led_alt_names.size(); led_idx++) + for(std::size_t led_idx = 0; led_idx < controller->led_alt_names.size(); led_idx++) { /*---------------------------------------------*\ | Copy in LED alternate name (size+data) | \*---------------------------------------------*/ - unsigned short string_length = (unsigned short)strlen(led_alt_names[led_idx].c_str()) + 1; + unsigned short string_length = (unsigned short)strlen(controller->led_alt_names[led_idx].c_str()) + 1; memcpy(data_ptr, &string_length, sizeof(string_length)); data_ptr += sizeof(string_length); - strcpy((char *)data_ptr, led_alt_names[led_idx].c_str()); + strcpy((char *)data_ptr, controller->led_alt_names[led_idx].c_str()); data_ptr += string_length; } } @@ -1793,14 +2163,14 @@ unsigned char * RGBController::GetDeviceDescriptionData(unsigned char* data_ptr, \*-----------------------------------------------------*/ if(protocol_version >= 5) { - memcpy(data_ptr, &flags, sizeof(flags)); + memcpy(data_ptr, &controller->flags, sizeof(flags)); data_ptr += sizeof(flags); } return(data_ptr); } -unsigned int RGBController::GetDeviceDescriptionSize(unsigned int protocol_version) +unsigned int RGBController::GetDeviceDescriptionSize(RGBController* controller, unsigned int protocol_version) { /*-----------------------------------------------------*\ | Initialize variables | @@ -1810,16 +2180,16 @@ unsigned int RGBController::GetDeviceDescriptionSize(unsigned int protocol_versi /*-----------------------------------------------------*\ | Calculate data size | \*-----------------------------------------------------*/ - unsigned short name_len = (unsigned short)strlen(name.c_str()) + 1; - unsigned short vendor_len = (unsigned short)strlen(vendor.c_str()) + 1; - unsigned short description_len = (unsigned short)strlen(description.c_str()) + 1; - unsigned short version_len = (unsigned short)strlen(version.c_str()) + 1; - unsigned short serial_len = (unsigned short)strlen(serial.c_str()) + 1; - unsigned short location_len = (unsigned short)strlen(location.c_str()) + 1; - unsigned short num_modes = (unsigned short)modes.size(); - unsigned short num_zones = (unsigned short)zones.size(); - unsigned short num_leds = (unsigned short)leds.size(); - unsigned short num_led_alt_names = (unsigned short)led_alt_names.size(); + unsigned short name_len = (unsigned short)strlen(controller->name.c_str()) + 1; + unsigned short vendor_len = (unsigned short)strlen(controller->vendor.c_str()) + 1; + unsigned short description_len = (unsigned short)strlen(controller->description.c_str()) + 1; + unsigned short version_len = (unsigned short)strlen(controller->version.c_str()) + 1; + unsigned short serial_len = (unsigned short)strlen(controller->serial.c_str()) + 1; + unsigned short location_len = (unsigned short)strlen(controller->location.c_str()) + 1; + unsigned short num_modes = (unsigned short)controller->modes.size(); + unsigned short num_zones = (unsigned short)controller->zones.size(); + unsigned short num_leds = (unsigned short)controller->leds.size(); + unsigned short num_led_alt_names = (unsigned short)controller->led_alt_names.size(); data_size += sizeof(device_type); data_size += sizeof(name_len); @@ -1845,33 +2215,33 @@ unsigned int RGBController::GetDeviceDescriptionSize(unsigned int protocol_versi for(int mode_index = 0; mode_index < num_modes; mode_index++) { - data_size += GetModeDescriptionSize(modes[mode_index], protocol_version); + data_size += GetModeDescriptionSize(controller->modes[mode_index], protocol_version); } data_size += sizeof(num_zones); for(int zone_index = 0; zone_index < num_zones; zone_index++) { - data_size += GetZoneDescriptionSize(zones[zone_index], protocol_version); + data_size += GetZoneDescriptionSize(controller->zones[zone_index], protocol_version); } data_size += sizeof(num_leds); for(int led_index = 0; led_index < num_leds; led_index++) { - data_size += GetLEDDescriptionSize(leds[led_index], protocol_version); + data_size += GetLEDDescriptionSize(controller->leds[led_index], protocol_version); } - data_size += GetColorDescriptionSize(protocol_version); + data_size += GetColorDescriptionSize(controller, protocol_version); if(protocol_version >= 5) { data_size += sizeof(num_led_alt_names); - for(std::size_t led_idx = 0; led_idx < led_alt_names.size(); led_idx++) + for(std::size_t led_idx = 0; led_idx < controller->led_alt_names.size(); led_idx++) { data_size += sizeof(unsigned short); - data_size += (unsigned int)strlen(led_alt_names[led_idx].c_str()) + 1; + data_size += (unsigned int)strlen(controller->led_alt_names[led_idx].c_str()) + 1; } } @@ -2417,17 +2787,17 @@ unsigned int RGBController::GetZoneDescriptionSize(zone zone, unsigned int proto return(data_size); } -unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsigned int protocol_version) +unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, RGBController* controller, unsigned int protocol_version) { /*-----------------------------------------------------*\ | Lock access mutex | \*-----------------------------------------------------*/ - AccessMutex.lock(); + controller->AccessMutex.lock(); /*-----------------------------------------------------*\ | Copy in type | \*-----------------------------------------------------*/ - memcpy(&type, data_ptr, sizeof(device_type)); + memcpy(&controller->type, data_ptr, sizeof(device_type)); data_ptr += sizeof(device_type); /*-----------------------------------------------------*\ @@ -2437,8 +2807,8 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi memcpy(&name_len, data_ptr, sizeof(name_len)); data_ptr += sizeof(name_len); - name.assign((char *)data_ptr, name_len); - name = StringUtils::remove_null_terminating_chars(name); + controller->name.assign((char *)data_ptr, name_len); + controller->name = StringUtils::remove_null_terminating_chars(controller->name); data_ptr += name_len; /*-----------------------------------------------------*\ @@ -2450,7 +2820,8 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi memcpy(&vendor_len, data_ptr, sizeof(vendor_len)); data_ptr += sizeof(vendor_len); - vendor = (char *)data_ptr; + controller->vendor.assign((char *)data_ptr, vendor_len); + controller->vendor = StringUtils::remove_null_terminating_chars(controller->vendor); data_ptr += vendor_len; } @@ -2461,8 +2832,8 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi memcpy(&description_len, data_ptr, sizeof(description_len)); data_ptr += sizeof(description_len); - description.assign((char *)data_ptr, description_len); - description = StringUtils::remove_null_terminating_chars(description); + controller->description.assign((char *)data_ptr, description_len); + controller->description = StringUtils::remove_null_terminating_chars(controller->description); data_ptr += description_len; /*-----------------------------------------------------*\ @@ -2472,8 +2843,8 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi memcpy(&version_len, data_ptr, sizeof(version_len)); data_ptr += sizeof(version_len); - version.assign((char *)data_ptr, version_len); - version = StringUtils::remove_null_terminating_chars(version); + controller->version.assign((char *)data_ptr, version_len); + controller->version = StringUtils::remove_null_terminating_chars(controller->version); data_ptr += version_len; /*-----------------------------------------------------*\ @@ -2483,8 +2854,8 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi memcpy(&serial_len, data_ptr, sizeof(serial_len)); data_ptr += sizeof(serial_len); - serial.assign((char *)data_ptr, serial_len); - serial = StringUtils::remove_null_terminating_chars(serial); + controller->serial.assign((char *)data_ptr, serial_len); + controller->serial = StringUtils::remove_null_terminating_chars(controller->serial); data_ptr += serial_len; /*-----------------------------------------------------*\ @@ -2494,8 +2865,8 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi memcpy(&location_len, data_ptr, sizeof(location_len)); data_ptr += sizeof(location_len); - location.assign((char *)data_ptr, location_len); - location = StringUtils::remove_null_terminating_chars(location); + controller->location.assign((char *)data_ptr, location_len); + controller->location = StringUtils::remove_null_terminating_chars(controller->location); data_ptr += location_len; /*-----------------------------------------------------*\ @@ -2508,17 +2879,17 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi /*-----------------------------------------------------*\ | Copy in active mode | \*-----------------------------------------------------*/ - memcpy(&active_mode, data_ptr, sizeof(active_mode)); - data_ptr += sizeof(active_mode); + memcpy(&controller->active_mode, data_ptr, sizeof(controller->active_mode)); + data_ptr += sizeof(controller->active_mode); /*-----------------------------------------------------*\ | Copy in modes | \*-----------------------------------------------------*/ - modes.resize(num_modes); + controller->modes.resize(num_modes); for(int mode_index = 0; mode_index < num_modes; mode_index++) { - data_ptr = SetModeDescription(data_ptr, &modes[mode_index], protocol_version); + data_ptr = SetModeDescription(data_ptr, &controller->modes[mode_index], protocol_version); } /*-----------------------------------------------------*\ @@ -2531,11 +2902,11 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi /*-----------------------------------------------------*\ | Copy in zones | \*-----------------------------------------------------*/ - zones.resize(num_zones); + controller->zones.resize(num_zones); for(int zone_index = 0; zone_index < num_zones; zone_index++) { - data_ptr = SetZoneDescription(data_ptr, &zones[zone_index], protocol_version); + data_ptr = SetZoneDescription(data_ptr, &controller->zones[zone_index], protocol_version); } /*-----------------------------------------------------*\ @@ -2548,17 +2919,17 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi /*-----------------------------------------------------*\ | Copy in LEDs | \*-----------------------------------------------------*/ - leds.resize(num_leds); + controller->leds.resize(num_leds); for(int led_index = 0; led_index < num_leds; led_index++) { - data_ptr = SetLEDDescription(data_ptr, &leds[led_index], protocol_version); + data_ptr = SetLEDDescription(data_ptr, &controller->leds[led_index], protocol_version); } /*-----------------------------------------------------*\ | Copy in colors | \*-----------------------------------------------------*/ - data_ptr = SetColorDescription(data_ptr, protocol_version, true); + data_ptr = SetColorDescription(data_ptr, controller, protocol_version, true); /*-----------------------------------------------------*\ | Copy in LED alternate names data | @@ -2586,7 +2957,7 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi std::string new_name((char *)data_ptr, string_length); new_name = StringUtils::remove_null_terminating_chars(new_name); - led_alt_names.push_back(new_name); + controller->led_alt_names.push_back(new_name); data_ptr += string_length; } } @@ -2596,24 +2967,24 @@ unsigned char* RGBController::SetDeviceDescription(unsigned char* data_ptr, unsi \*-----------------------------------------------------*/ if(protocol_version >= 5) { - memcpy(&flags, data_ptr, sizeof(flags)); - data_ptr += sizeof(flags); + memcpy(&controller->flags, data_ptr, sizeof(controller->flags)); + data_ptr += sizeof(controller->flags); } /*-----------------------------------------------------*\ | Unlock access mutex | \*-----------------------------------------------------*/ - AccessMutex.unlock(); + controller->AccessMutex.unlock(); /*-----------------------------------------------------*\ | Setup colors | \*-----------------------------------------------------*/ - SetupColors(); + controller->SetupColors(); return(data_ptr); } -unsigned char* RGBController::SetColorDescription(unsigned char* data_ptr, unsigned int /*protocol_version*/, bool resize) +unsigned char* RGBController::SetColorDescription(unsigned char* data_ptr, RGBController* controller, unsigned int /*protocol_version*/, bool resize) { /*-----------------------------------------------------*\ | Copy in number of colors (data) | @@ -2624,7 +2995,7 @@ unsigned char* RGBController::SetColorDescription(unsigned char* data_ptr, unsig if(resize) { - colors.resize(num_colors); + controller->colors.resize(num_colors); } else { @@ -2632,7 +3003,7 @@ unsigned char* RGBController::SetColorDescription(unsigned char* data_ptr, unsig | Check if we aren't reading beyond the list of | | colors. | \*-------------------------------------------------*/ - if(((size_t)num_colors) > colors.size()) + if(((size_t)num_colors) > controller->colors.size()) { data_ptr += (num_colors * sizeof(RGBColor)); return(data_ptr); @@ -2644,8 +3015,8 @@ unsigned char* RGBController::SetColorDescription(unsigned char* data_ptr, unsig \*-----------------------------------------------------*/ for(int color_index = 0; color_index < num_colors; color_index++) { - memcpy(&colors[color_index], data_ptr, sizeof(colors[color_index])); - data_ptr += sizeof(colors[color_index]); + memcpy(&controller->colors[color_index], data_ptr, sizeof(controller->colors[color_index])); + data_ptr += sizeof(controller->colors[color_index]); } return(data_ptr); @@ -2977,78 +3348,78 @@ unsigned char* RGBController::SetZoneDescription(unsigned char* data_ptr, zone* } /*---------------------------------------------------------*\ -| JSON Description Functions | +| Static JSON Description Functions | \*---------------------------------------------------------*/ -nlohmann::json RGBController::GetDeviceDescriptionJSON() +nlohmann::json RGBController::GetDeviceDescriptionJSON(RGBController* controller) { nlohmann::json controller_json; /*-----------------------------------------------------*\ | Lock access mutex | \*-----------------------------------------------------*/ - AccessMutex.lock_shared(); + controller->AccessMutex.lock_shared(); /*-----------------------------------------------------*\ | Controller information strings | \*-----------------------------------------------------*/ - controller_json["description"] = description; - controller_json["location"] = location; - controller_json["name"] = name; - controller_json["serial"] = serial; - controller_json["vendor"] = vendor; - controller_json["version"] = version; + controller_json["description"] = controller->description; + controller_json["location"] = controller->location; + controller_json["name"] = controller->name; + controller_json["serial"] = controller->serial; + controller_json["vendor"] = controller->vendor; + controller_json["version"] = controller->version; /*-----------------------------------------------------*\ | Controller variables | \*-----------------------------------------------------*/ - controller_json["active_mode"] = active_mode; - controller_json["flags"] = flags; - controller_json["type"] = type; + controller_json["active_mode"] = controller->active_mode; + controller_json["flags"] = controller->flags; + controller_json["type"] = controller->type; /*-----------------------------------------------------*\ | Colors | \*-----------------------------------------------------*/ - for(std::size_t color_idx = 0; color_idx < colors.size(); color_idx++) + for(std::size_t color_idx = 0; color_idx < controller->colors.size(); color_idx++) { - controller_json["colors"][color_idx] = colors[color_idx]; + controller_json["colors"][color_idx] = controller->colors[color_idx]; } /*-----------------------------------------------------*\ | LEDs | \*-----------------------------------------------------*/ - for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++) + for(std::size_t led_idx = 0; led_idx < controller->leds.size(); led_idx++) { - controller_json["leds"][led_idx] = GetLEDDescriptionJSON(leds[led_idx]); + controller_json["leds"][led_idx] = GetLEDDescriptionJSON(controller->leds[led_idx]); } /*-----------------------------------------------------*\ | LED alternate names | \*-----------------------------------------------------*/ - for(std::size_t led_alt_name_idx = 0; led_alt_name_idx < led_alt_names.size(); led_alt_name_idx++) + for(std::size_t led_alt_name_idx = 0; led_alt_name_idx < controller->led_alt_names.size(); led_alt_name_idx++) { - controller_json["led_alt_names"][led_alt_name_idx] = led_alt_names[led_alt_name_idx]; + controller_json["led_alt_names"][led_alt_name_idx] = controller->led_alt_names[led_alt_name_idx]; } /*-----------------------------------------------------*\ | Modes | \*-----------------------------------------------------*/ - for(std::size_t mode_idx = 0; mode_idx < modes.size(); mode_idx++) + for(std::size_t mode_idx = 0; mode_idx < controller->modes.size(); mode_idx++) { - controller_json["modes"][mode_idx] = GetModeDescriptionJSON(modes[mode_idx]); + controller_json["modes"][mode_idx] = GetModeDescriptionJSON(controller->modes[mode_idx]); } /*-----------------------------------------------------*\ | Zones | \*-----------------------------------------------------*/ - for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) + for(std::size_t zone_idx = 0; zone_idx < controller->zones.size(); zone_idx++) { - controller_json["zones"][zone_idx] = GetZoneDescriptionJSON(zones[zone_idx]); + controller_json["zones"][zone_idx] = GetZoneDescriptionJSON(controller->zones[zone_idx]); } /*-----------------------------------------------------*\ | Unlock access mutex | \*-----------------------------------------------------*/ - AccessMutex.unlock_shared(); + controller->AccessMutex.unlock_shared(); return(controller_json); } @@ -3164,44 +3535,44 @@ nlohmann::json RGBController::GetZoneDescriptionJSON(zone zone) return(zone_json); } -void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) +void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json, RGBController* controller) { /*-----------------------------------------------------*\ | Lock access mutex | \*-----------------------------------------------------*/ - AccessMutex.lock(); + controller->AccessMutex.lock(); /*-----------------------------------------------------*\ | Controller information strings | \*-----------------------------------------------------*/ if(controller_json.contains("description")) { - description = controller_json["description"]; + controller->description = controller_json["description"]; } if(controller_json.contains("location")) { - location = controller_json["location"]; + controller->location = controller_json["location"]; } if(controller_json.contains("name")) { - name = controller_json["name"]; + controller->name = controller_json["name"]; } if(controller_json.contains("serial")) { - serial = controller_json["serial"]; + controller->serial = controller_json["serial"]; } if(controller_json.contains("vendor")) { - vendor = controller_json["vendor"]; + controller->vendor = controller_json["vendor"]; } if(controller_json.contains("version")) { - version = controller_json["version"]; + controller->version = controller_json["version"]; } /*-----------------------------------------------------*\ @@ -3209,17 +3580,17 @@ void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) \*-----------------------------------------------------*/ if(controller_json.contains("active_mode")) { - active_mode = controller_json["active_mode"]; + controller->active_mode = controller_json["active_mode"]; } if(controller_json.contains("flags")) { - flags = controller_json["flags"]; + controller->flags = controller_json["flags"]; } if(controller_json.contains("type")) { - type = controller_json["type"]; + controller->type = controller_json["type"]; } /*-----------------------------------------------------*\ @@ -3227,11 +3598,11 @@ void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) \*-----------------------------------------------------*/ if(controller_json.contains("colors")) { - colors.resize(controller_json["colors"].size()); + controller->colors.resize(controller_json["colors"].size()); - for(std::size_t color_idx = 0; color_idx < colors.size(); color_idx++) + for(std::size_t color_idx = 0; color_idx < controller->colors.size(); color_idx++) { - colors[color_idx] = controller_json["colors"][color_idx]; + controller->colors[color_idx] = controller_json["colors"][color_idx]; } } @@ -3240,11 +3611,11 @@ void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) \*-----------------------------------------------------*/ if(controller_json.contains("leds")) { - leds.resize(controller_json["leds"].size()); + controller->leds.resize(controller_json["leds"].size()); - for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++) + for(std::size_t led_idx = 0; led_idx < controller->leds.size(); led_idx++) { - leds[led_idx] = SetLEDDescriptionJSON(controller_json["leds"][led_idx]); + controller->leds[led_idx] = SetLEDDescriptionJSON(controller_json["leds"][led_idx]); } } @@ -3253,11 +3624,11 @@ void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) \*-----------------------------------------------------*/ if(controller_json.contains("led_alt_names")) { - led_alt_names.resize(controller_json["led_alt_names"].size()); + controller->led_alt_names.resize(controller_json["led_alt_names"].size()); - for(std::size_t led_alt_name_idx = 0; led_alt_name_idx < led_alt_names.size(); led_alt_name_idx++) + for(std::size_t led_alt_name_idx = 0; led_alt_name_idx < controller->led_alt_names.size(); led_alt_name_idx++) { - led_alt_names[led_alt_name_idx] = controller_json["led_alt_names"][led_alt_name_idx]; + controller->led_alt_names[led_alt_name_idx] = controller_json["led_alt_names"][led_alt_name_idx]; } } @@ -3266,11 +3637,11 @@ void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) \*-----------------------------------------------------*/ if(controller_json.contains("modes")) { - modes.resize(controller_json["modes"].size()); + controller->modes.resize(controller_json["modes"].size()); - for(std::size_t mode_idx = 0; mode_idx < modes.size(); mode_idx++) + for(std::size_t mode_idx = 0; mode_idx < controller->modes.size(); mode_idx++) { - modes[mode_idx] = SetModeDescriptionJSON(controller_json["modes"][mode_idx]); + controller->modes[mode_idx] = SetModeDescriptionJSON(controller_json["modes"][mode_idx]); } } @@ -3279,23 +3650,23 @@ void RGBController::SetDeviceDescriptionJSON(nlohmann::json controller_json) \*-----------------------------------------------------*/ if(controller_json.contains("zones")) { - zones.resize(controller_json["zones"].size()); + controller->zones.resize(controller_json["zones"].size()); - for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) + for(std::size_t zone_idx = 0; zone_idx < controller->zones.size(); zone_idx++) { - zones[zone_idx] = SetZoneDescriptionJSON(controller_json["zones"][zone_idx]); + controller->zones[zone_idx] = SetZoneDescriptionJSON(controller_json["zones"][zone_idx]); } } /*-----------------------------------------------------*\ | Unlock access mutex | \*-----------------------------------------------------*/ - AccessMutex.unlock(); + controller->AccessMutex.unlock(); /*-----------------------------------------------------*\ | Setup colors | \*-----------------------------------------------------*/ - SetupColors(); + controller->SetupColors(); } led RGBController::SetLEDDescriptionJSON(nlohmann::json led_json) @@ -3322,18 +3693,18 @@ matrix_map_type RGBController::SetMatrixMapDescriptionJSON(nlohmann::json matrix { matrix_map_type matrix_map; - if(matrix_map_json["matrix_map"].contains("width") && - matrix_map_json["matrix_map"].contains("height") && - matrix_map_json["matrix_map"].contains("map")) + if(matrix_map_json.contains("width") && + matrix_map_json.contains("height") && + matrix_map_json.contains("map")) { - matrix_map.width = matrix_map_json["matrix_map"]["width"]; - matrix_map.height = matrix_map_json["matrix_map"]["height"]; + matrix_map.width = matrix_map_json["width"]; + matrix_map.height = matrix_map_json["height"]; matrix_map.map.resize(matrix_map.width * matrix_map.height); for(unsigned int matrix_map_idx = 0; matrix_map_idx < matrix_map.width * matrix_map.height; matrix_map_idx++) { - matrix_map.map[matrix_map_idx] = matrix_map_json["matrix_map"]["map"][matrix_map_idx]; + matrix_map.map[matrix_map_idx] = matrix_map_json["map"][matrix_map_idx]; } } @@ -3533,341 +3904,6 @@ zone RGBController::SetZoneDescriptionJSON(nlohmann::json zone_json) return(new_zone); } -/*---------------------------------------------------------*\ -| Update Callback Functions | -\*---------------------------------------------------------*/ -void RGBController::RegisterUpdateCallback(RGBControllerCallback new_callback, void * new_callback_arg) -{ - UpdateMutex.lock(); - - /*-----------------------------------------------------*\ - | Check to see if this is already registered to avoid | - | registering the same callback multiple times | - \*-----------------------------------------------------*/ - for(unsigned int callback_idx = 0; callback_idx < UpdateCallbackArgs.size(); callback_idx++ ) - { - if((UpdateCallbacks[callback_idx] == new_callback) && (UpdateCallbackArgs[callback_idx] == new_callback_arg)) - { - UpdateMutex.unlock(); - return; - } - } - - UpdateCallbacks.push_back(new_callback); - UpdateCallbackArgs.push_back(new_callback_arg); - UpdateMutex.unlock(); -} - -void RGBController::UnregisterUpdateCallback(void * callback_arg) -{ - UpdateMutex.lock(); - for(unsigned int callback_idx = 0; callback_idx < UpdateCallbackArgs.size(); callback_idx++ ) - { - if(UpdateCallbackArgs[callback_idx] == callback_arg) - { - UpdateCallbackArgs.erase(UpdateCallbackArgs.begin() + callback_idx); - UpdateCallbacks.erase(UpdateCallbacks.begin() + callback_idx); - } - } - UpdateMutex.unlock(); -} - -void RGBController::ClearCallbacks() -{ - UpdateMutex.lock(); - UpdateCallbacks.clear(); - UpdateCallbackArgs.clear(); - UpdateMutex.unlock(); -} - -void RGBController::SignalUpdate(unsigned int update_reason) -{ - UpdateMutex.lock(); - - /*-----------------------------------------------------*\ - | Client info has changed, call the callbacks | - \*-----------------------------------------------------*/ - for(unsigned int callback_idx = 0; callback_idx < UpdateCallbacks.size(); callback_idx++) - { - UpdateCallbacks[callback_idx](UpdateCallbackArgs[callback_idx], update_reason, this); - } - - UpdateMutex.unlock(); -} - -/*---------------------------------------------------------*\ -| Device Update Functions | -\*---------------------------------------------------------*/ -void RGBController::Shutdown() -{ - /*-----------------------------------------------------*\ - | Stop device thread | - \*-----------------------------------------------------*/ - DeviceThreadRunning = false; - DeviceCallThread->join(); - delete DeviceCallThread; - - /*-----------------------------------------------------*\ - | Lock the access mutex | - \*-----------------------------------------------------*/ - AccessMutex.lock(); -} - -void RGBController::UpdateLEDs() -{ - CallFlag_UpdateLEDs = true; - - SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATELEDS); -} - -void RGBController::UpdateZoneLEDs(int zone) -{ - AccessMutex.lock_shared(); - DeviceUpdateZoneLEDs(zone); - AccessMutex.unlock_shared(); -} - -void RGBController::UpdateSingleLED(int led) -{ - AccessMutex.lock_shared(); - DeviceUpdateSingleLED(led); - AccessMutex.unlock_shared(); -} - -void RGBController::UpdateMode() -{ - CallFlag_UpdateMode = true; - - SignalUpdate(RGBCONTROLLER_UPDATE_REASON_UPDATEMODE); -} - -void RGBController::UpdateZoneMode(int zone) -{ - AccessMutex.lock_shared(); - DeviceUpdateZoneMode(zone); - AccessMutex.unlock_shared(); -} - -void RGBController::SaveMode() -{ - AccessMutex.lock_shared(); - DeviceSaveMode(); - AccessMutex.unlock_shared(); - - SignalUpdate(RGBCONTROLLER_UPDATE_REASON_SAVEMODE); -} - -void RGBController::DeviceCallThreadFunction() -{ - CallFlag_UpdateLEDs = false; - CallFlag_UpdateMode = false; - - while(DeviceThreadRunning.load() == true) - { - if(CallFlag_UpdateMode.load() == true) - { - if(flags & CONTROLLER_FLAG_RESET_BEFORE_UPDATE) - { - AccessMutex.lock_shared(); - CallFlag_UpdateMode = false; - DeviceUpdateMode(); - AccessMutex.unlock_shared(); - } - else - { - AccessMutex.lock_shared(); - DeviceUpdateMode(); - CallFlag_UpdateMode = false; - AccessMutex.unlock_shared(); - } - } - if(CallFlag_UpdateLEDs.load() == true) - { - if(flags & CONTROLLER_FLAG_RESET_BEFORE_UPDATE) - { - AccessMutex.lock_shared(); - CallFlag_UpdateLEDs = false; - DeviceUpdateLEDs(); - AccessMutex.unlock_shared(); - } - else - { - AccessMutex.lock_shared(); - DeviceUpdateLEDs(); - CallFlag_UpdateLEDs = false; - AccessMutex.unlock_shared(); - } - } - else - { - std::this_thread::sleep_for(1ms); - } - } -} - -void RGBController::ClearSegments(int zone) -{ - AccessMutex.lock(); - zones[zone].segments.clear(); - AccessMutex.unlock(); - - zones[zone].flags |= ZONE_FLAG_MANUALLY_CONFIGURED; - - SignalUpdate(RGBCONTROLLER_UPDATE_REASON_CLEARSEGMENTS); -} - -void RGBController::AddSegment(int zone, segment new_segment) -{ - AccessMutex.lock(); - zones[zone].segments.push_back(new_segment); - AccessMutex.unlock(); - - zones[zone].flags |= ZONE_FLAG_MANUALLY_CONFIGURED; - - SignalUpdate(RGBCONTROLLER_UPDATE_REASON_ADDSEGMENT); -} - -void RGBController::ResizeZone(int zone, int new_size) -{ - AccessMutex.lock(); - DeviceResizeZone(zone, new_size); - AccessMutex.unlock(); - - zones[zone].flags |= ZONE_FLAG_MANUALLY_CONFIGURED; - - SignalUpdate(RGBCONTROLLER_UPDATE_REASON_RESIZEZONE); -} - -/*---------------------------------------------------------*\ -| Functions not part of interface for internal use only | -\*---------------------------------------------------------*/ -unsigned int RGBController::LEDsInZone(unsigned int zone) -{ - unsigned int leds_count; - - leds_count = zones[zone].leds_count; - - if(zones[zone].flags & ZONE_FLAG_RESIZE_EFFECTS_ONLY) - { - if(leds_count > 1) - { - leds_count = 1; - } - } - - return(leds_count); -} - -void RGBController::SetupColors() -{ - unsigned int total_led_count; - unsigned int zone_led_count; - - /*-----------------------------------------------------*\ - | Determine total number of LEDs on the device | - \*-----------------------------------------------------*/ - total_led_count = 0; - - for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) - { - total_led_count += LEDsInZone((unsigned int)zone_idx); - } - - /*-----------------------------------------------------*\ - | Set the size of the color buffer to the number of LEDs| - \*-----------------------------------------------------*/ - colors.resize(total_led_count); - - /*-----------------------------------------------------*\ - | Set the color buffer pointers on each zone | - \*-----------------------------------------------------*/ - total_led_count = 0; - - for(std::size_t zone_idx = 0; zone_idx < zones.size(); zone_idx++) - { - zones[zone_idx].start_idx = total_led_count; - zone_led_count = LEDsInZone((unsigned int)zone_idx); - - if((colors.size() > 0) && (zone_led_count > 0)) - { - zones[zone_idx].colors = &colors[total_led_count]; - } - else - { - zones[zone_idx].colors = NULL; - } - - if((leds.size() > 0) && (zone_led_count > 0)) - { - zones[zone_idx].leds = &leds[total_led_count]; - } - else - { - zones[zone_idx].leds = NULL; - } - - - total_led_count += zone_led_count; - } -} - -void RGBController::UpdateLEDsInternal() -{ - CallFlag_UpdateLEDs = true; -} - -/*---------------------------------------------------------*\ -| Functions to be implemented in device implementation | -\*---------------------------------------------------------*/ -void RGBController::DeviceResizeZone(int /*zone*/, int /*new_size*/) -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - -void RGBController::DeviceUpdateLEDs() -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - -void RGBController::DeviceUpdateZoneLEDs(int /*zone*/) -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - -void RGBController::DeviceUpdateSingleLED(int /*led*/) -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - -void RGBController::DeviceUpdateMode() -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - -void RGBController::DeviceUpdateZoneMode(int /*zone*/) -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - -void RGBController::DeviceSaveMode() -{ - /*-----------------------------------------------------*\ - | If not implemented by controller, does nothing | - \*-----------------------------------------------------*/ -} - /*---------------------------------------------------------*\ | Non-class functions | \*---------------------------------------------------------*/ diff --git a/RGBController/RGBController.h b/RGBController/RGBController.h index 7e6ed52ea..09de0949e 100644 --- a/RGBController/RGBController.h +++ b/RGBController/RGBController.h @@ -319,8 +319,9 @@ public: virtual unsigned int GetZoneLEDsCount(unsigned int zone) = 0; virtual unsigned int GetZoneLEDsMax(unsigned int zone) = 0; virtual unsigned int GetZoneLEDsMin(unsigned int zone) = 0; + virtual matrix_map_type GetZoneMatrixMap(unsigned int zone) = 0; + virtual const unsigned int* GetZoneMatrixMapData(unsigned int zone) = 0; virtual unsigned int GetZoneMatrixMapHeight(unsigned int zone) = 0; - virtual const unsigned int * GetZoneMatrixMap(unsigned int zone) = 0; virtual unsigned int GetZoneMatrixMapWidth(unsigned int zone) = 0; virtual std::size_t GetZoneModeCount(unsigned int zone) = 0; virtual unsigned int GetZoneModeBrightness(unsigned int zone, unsigned int mode) = 0; @@ -341,8 +342,9 @@ public: virtual std::string GetZoneName(unsigned int zone) = 0; virtual std::size_t GetZoneSegmentCount(unsigned int zone) = 0; virtual unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment) = 0; + virtual matrix_map_type GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) = 0; + virtual const unsigned int * GetZoneSegmentMatrixMapData(unsigned int zone, unsigned int segment) = 0; virtual unsigned int GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment) = 0; - virtual const unsigned int * GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment) = 0; virtual unsigned int GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment) = 0; virtual std::string GetZoneSegmentName(unsigned int zone, unsigned int segment) = 0; virtual unsigned int GetZoneSegmentStartIndex(unsigned int zone, unsigned int segment) = 0; @@ -413,49 +415,6 @@ public: virtual void SetAllColors(RGBColor color) = 0; virtual void SetAllZoneColors(int zone, RGBColor color) = 0; - /*-----------------------------------------------------*\ - | Serialized Description Functions | - \*-----------------------------------------------------*/ - virtual unsigned char * GetColorDescriptionData(unsigned char* data_ptr, unsigned int protocol_version) = 0; - virtual unsigned int GetColorDescriptionSize(unsigned int protocol_version) = 0; - virtual unsigned char * GetDeviceDescriptionData(unsigned char* data_ptr, unsigned int protocol_version) = 0; - virtual unsigned int GetDeviceDescriptionSize(unsigned int protocol_version) = 0; - virtual unsigned char * GetLEDDescriptionData(unsigned char* data_ptr, led led, unsigned int protocol_version) = 0; - virtual unsigned int GetLEDDescriptionSize(led led, unsigned int protocol_version) = 0; - virtual unsigned char * GetMatrixMapDescriptionData(unsigned char* data_ptr, matrix_map_type matrix_map, unsigned int protocol_version) = 0; - virtual unsigned int GetMatrixMapDescriptionSize(matrix_map_type matrix_map, unsigned int protocol_version) = 0; - virtual unsigned char * GetModeDescriptionData(unsigned char* data_ptr, mode mode, unsigned int protocol_version) = 0; - virtual unsigned int GetModeDescriptionSize(mode mode, unsigned int protocol_version) = 0; - virtual unsigned char * GetSegmentDescriptionData(unsigned char* data_ptr, segment segment, unsigned int protocol_version) = 0; - virtual unsigned int GetSegmentDescriptionSize(segment segment, unsigned int protocol_version) = 0; - virtual unsigned char * GetZoneDescriptionData(unsigned char* data_ptr, zone zone, unsigned int protocol_version) = 0; - virtual unsigned int GetZoneDescriptionSize(zone zone, unsigned int protocol_version) = 0; - - virtual unsigned char* SetColorDescription(unsigned char* data_ptr, unsigned int protocol_version, bool resize = false) = 0; - virtual unsigned char* SetDeviceDescription(unsigned char* data_ptr, unsigned int protocol_version) = 0; - virtual unsigned char* SetLEDDescription(unsigned char* data_ptr, led* led, unsigned int protocol_version) = 0; - virtual unsigned char* SetMatrixMapDescription(unsigned char* data_ptr, matrix_map_type* matrix_map, unsigned int protocol_version) = 0; - virtual unsigned char* SetModeDescription(unsigned char* data_ptr, mode* mode, unsigned int protocol_version) = 0; - virtual unsigned char* SetSegmentDescription(unsigned char* data_ptr, segment* segment, unsigned int protocol_version) = 0; - virtual unsigned char* SetZoneDescription(unsigned char* data_ptr, zone* zone, unsigned int protocol_version) = 0; - - /*-----------------------------------------------------*\ - | JSON Description Functions | - \*-----------------------------------------------------*/ - virtual nlohmann::json GetDeviceDescriptionJSON() = 0; - virtual nlohmann::json GetLEDDescriptionJSON(led led) = 0; - virtual nlohmann::json GetMatrixMapDescriptionJSON(matrix_map_type matrix_map) = 0; - virtual nlohmann::json GetModeDescriptionJSON(mode mode) = 0; - virtual nlohmann::json GetSegmentDescriptionJSON(segment segment) = 0; - virtual nlohmann::json GetZoneDescriptionJSON(zone zone) = 0; - - virtual void SetDeviceDescriptionJSON(nlohmann::json controller_json) = 0; - virtual led SetLEDDescriptionJSON(nlohmann::json led_json) = 0; - virtual matrix_map_type SetMatrixMapDescriptionJSON(nlohmann::json matrix_map_json) = 0; - virtual mode SetModeDescriptionJSON(nlohmann::json mode_json) = 0; - virtual segment SetSegmentDescriptionJSON(nlohmann::json segment_json) = 0; - virtual zone SetZoneDescriptionJSON(nlohmann::json zone_json) = 0; - /*-----------------------------------------------------*\ | Update Callback Functions | \*-----------------------------------------------------*/ @@ -520,8 +479,9 @@ public: unsigned int GetZoneLEDsCount(unsigned int zone); unsigned int GetZoneLEDsMax(unsigned int zone); unsigned int GetZoneLEDsMin(unsigned int zone); + matrix_map_type GetZoneMatrixMap(unsigned int zone); + const unsigned int* GetZoneMatrixMapData(unsigned int zone); unsigned int GetZoneMatrixMapHeight(unsigned int zone); - const unsigned int* GetZoneMatrixMap(unsigned int zone); unsigned int GetZoneMatrixMapWidth(unsigned int zone); std::size_t GetZoneModeCount(unsigned int zone); unsigned int GetZoneModeBrightness(unsigned int zone, unsigned int mode); @@ -542,8 +502,9 @@ public: std::string GetZoneName(unsigned int zone); std::size_t GetZoneSegmentCount(unsigned int zone); unsigned int GetZoneSegmentLEDsCount(unsigned int zone, unsigned int segment); + matrix_map_type GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment); + const unsigned int * GetZoneSegmentMatrixMapData(unsigned int zone, unsigned int segment); unsigned int GetZoneSegmentMatrixMapHeight(unsigned int zone, unsigned int segment); - const unsigned int * GetZoneSegmentMatrixMap(unsigned int zone, unsigned int segment); unsigned int GetZoneSegmentMatrixMapWidth(unsigned int zone, unsigned int segment); std::string GetZoneSegmentName(unsigned int zone, unsigned int segment); unsigned int GetZoneSegmentStartIndex(unsigned int zone, unsigned int segment); @@ -613,49 +574,6 @@ public: void SetAllColors(RGBColor color); void SetAllZoneColors(int zone, RGBColor color); - /*-----------------------------------------------------*\ - | Serialized Description Functions | - \*-----------------------------------------------------*/ - unsigned char * GetColorDescriptionData(unsigned char* data_ptr, unsigned int protocol_version); - unsigned int GetColorDescriptionSize(unsigned int protocol_version); - unsigned char * GetDeviceDescriptionData(unsigned char* data_ptr, unsigned int protocol_version); - unsigned int GetDeviceDescriptionSize(unsigned int protocol_version); - unsigned char * GetLEDDescriptionData(unsigned char* data_ptr, led led, unsigned int protocol_version); - unsigned int GetLEDDescriptionSize(led led, unsigned int protocol_version); - unsigned char * GetMatrixMapDescriptionData(unsigned char* data_ptr, matrix_map_type matrix_map, unsigned int protocol_version); - unsigned int GetMatrixMapDescriptionSize(matrix_map_type matrix_map, unsigned int protocol_version); - unsigned char * GetModeDescriptionData(unsigned char* data_ptr, mode mode, unsigned int protocol_version); - unsigned int GetModeDescriptionSize(mode mode, unsigned int protocol_version); - unsigned char * GetSegmentDescriptionData(unsigned char* data_ptr, segment segment, unsigned int protocol_version); - unsigned int GetSegmentDescriptionSize(segment segment, unsigned int protocol_version); - unsigned char * GetZoneDescriptionData(unsigned char* data_ptr, zone zone, unsigned int protocol_version); - unsigned int GetZoneDescriptionSize(zone zone, unsigned int protocol_version); - - unsigned char* SetColorDescription(unsigned char* data_ptr, unsigned int protocol_version, bool resize = false); - unsigned char* SetDeviceDescription(unsigned char* data_ptr, unsigned int protocol_version); - unsigned char* SetLEDDescription(unsigned char* data_ptr, led* led, unsigned int protocol_version); - unsigned char* SetMatrixMapDescription(unsigned char* data_ptr, matrix_map_type* matrix_map, unsigned int protocol_version); - unsigned char* SetModeDescription(unsigned char* data_ptr, mode* mode, unsigned int protocol_version); - unsigned char* SetSegmentDescription(unsigned char* data_ptr, segment* segment, unsigned int protocol_version); - unsigned char* SetZoneDescription(unsigned char* data_ptr, zone* zone, unsigned int protocol_version); - - /*-----------------------------------------------------*\ - | JSON Description Functions | - \*-----------------------------------------------------*/ - nlohmann::json GetDeviceDescriptionJSON(); - nlohmann::json GetLEDDescriptionJSON(led led); - nlohmann::json GetMatrixMapDescriptionJSON(matrix_map_type matrix_map); - nlohmann::json GetModeDescriptionJSON(mode mode); - nlohmann::json GetSegmentDescriptionJSON(segment segment); - nlohmann::json GetZoneDescriptionJSON(zone zone); - - void SetDeviceDescriptionJSON(nlohmann::json controller_json); - led SetLEDDescriptionJSON(nlohmann::json led_json); - matrix_map_type SetMatrixMapDescriptionJSON(nlohmann::json matrix_map_json); - mode SetModeDescriptionJSON(nlohmann::json mode_json); - segment SetSegmentDescriptionJSON(nlohmann::json segment_json); - zone SetZoneDescriptionJSON(nlohmann::json zone_json); - /*-----------------------------------------------------*\ | Update Callback Functions | \*-----------------------------------------------------*/ @@ -697,6 +615,49 @@ public: virtual void DeviceUpdateZoneMode(int zone); virtual void DeviceSaveMode(); + /*-----------------------------------------------------*\ + | Static Serialized Description Functions | + \*-----------------------------------------------------*/ + static unsigned char * GetColorDescriptionData(unsigned char* data_ptr, RGBController* controller, unsigned int protocol_version); + static unsigned int GetColorDescriptionSize(RGBController* controller, unsigned int protocol_version); + static unsigned char * GetDeviceDescriptionData(unsigned char* data_ptr, RGBController* controller, unsigned int protocol_version); + static unsigned int GetDeviceDescriptionSize(RGBController* controller, unsigned int protocol_version); + static unsigned char * GetLEDDescriptionData(unsigned char* data_ptr, led led, unsigned int protocol_version); + static unsigned int GetLEDDescriptionSize(led led, unsigned int protocol_version); + static unsigned char * GetMatrixMapDescriptionData(unsigned char* data_ptr, matrix_map_type matrix_map, unsigned int protocol_version); + static unsigned int GetMatrixMapDescriptionSize(matrix_map_type matrix_map, unsigned int protocol_version); + static unsigned char * GetModeDescriptionData(unsigned char* data_ptr, mode mode, unsigned int protocol_version); + static unsigned int GetModeDescriptionSize(mode mode, unsigned int protocol_version); + static unsigned char * GetSegmentDescriptionData(unsigned char* data_ptr, segment segment, unsigned int protocol_version); + static unsigned int GetSegmentDescriptionSize(segment segment, unsigned int protocol_version); + static unsigned char * GetZoneDescriptionData(unsigned char* data_ptr, zone zone, unsigned int protocol_version); + static unsigned int GetZoneDescriptionSize(zone zone, unsigned int protocol_version); + + static unsigned char* SetColorDescription(unsigned char* data_ptr, RGBController* controller, unsigned int protocol_version, bool resize = false); + static unsigned char* SetDeviceDescription(unsigned char* data_ptr, RGBController* controller, unsigned int protocol_version); + static unsigned char* SetLEDDescription(unsigned char* data_ptr, led* led, unsigned int protocol_version); + static unsigned char* SetMatrixMapDescription(unsigned char* data_ptr, matrix_map_type* matrix_map, unsigned int protocol_version); + static unsigned char* SetModeDescription(unsigned char* data_ptr, mode* mode, unsigned int protocol_version); + static unsigned char* SetSegmentDescription(unsigned char* data_ptr, segment* segment, unsigned int protocol_version); + static unsigned char* SetZoneDescription(unsigned char* data_ptr, zone* zone, unsigned int protocol_version); + + /*-----------------------------------------------------*\ + | Static JSON Description Functions | + \*-----------------------------------------------------*/ + static nlohmann::json GetDeviceDescriptionJSON(RGBController* controller); + static nlohmann::json GetLEDDescriptionJSON(led led); + static nlohmann::json GetMatrixMapDescriptionJSON(matrix_map_type matrix_map); + static nlohmann::json GetModeDescriptionJSON(mode mode); + static nlohmann::json GetSegmentDescriptionJSON(segment segment); + static nlohmann::json GetZoneDescriptionJSON(zone zone); + + static void SetDeviceDescriptionJSON(nlohmann::json controller_json, RGBController* controller); + static led SetLEDDescriptionJSON(nlohmann::json led_json); + static matrix_map_type SetMatrixMapDescriptionJSON(nlohmann::json matrix_map_json); + static mode SetModeDescriptionJSON(nlohmann::json mode_json); + static segment SetSegmentDescriptionJSON(nlohmann::json segment_json); + static zone SetZoneDescriptionJSON(nlohmann::json zone_json); + protected: /*-----------------------------------------------------*\ | Controller information strings | diff --git a/RGBController/RGBController_Network.cpp b/RGBController/RGBController_Network.cpp index 39f44a388..ff753b5aa 100644 --- a/RGBController/RGBController_Network.cpp +++ b/RGBController/RGBController_Network.cpp @@ -217,7 +217,7 @@ unsigned char * RGBController_Network::CreateUpdateLEDsPacket(unsigned int proto | Calculate data size | \*-----------------------------------------------------*/ data_size += sizeof(data_size); - data_size += GetColorDescriptionSize(protocol_version); + data_size += RGBController::GetColorDescriptionSize(this, protocol_version); /*-----------------------------------------------------*\ | Create data buffer | @@ -234,7 +234,7 @@ unsigned char * RGBController_Network::CreateUpdateLEDsPacket(unsigned int proto /*-----------------------------------------------------*\ | Copy in color data | \*-----------------------------------------------------*/ - data_ptr = GetColorDescriptionData(data_ptr, protocol_version); + data_ptr = RGBController::GetColorDescriptionData(data_ptr, this, protocol_version); /*-----------------------------------------------------*\ | Unlock access mutex | diff --git a/qt/DeviceView.cpp b/qt/DeviceView.cpp index 9cd8c1950..9ddf7ae24 100644 --- a/qt/DeviceView.cpp +++ b/qt/DeviceView.cpp @@ -34,6 +34,7 @@ DeviceView::DeviceView(QWidget *parent) : mouseDown(false) { controller = NULL; + changed = false; numerical_labels = false; per_led = true; setMouseTracking(1); @@ -231,6 +232,11 @@ static const std::map led_label_lookup = { KEY_BR_TILDE, { "~" , "~" }} }; +void DeviceView::setChanged() +{ + changed = true; +} + void DeviceView::setController(RGBController * controller_ptr) { /*-----------------------------------------------------*\ @@ -297,10 +303,17 @@ void DeviceView::InitDeviceView() { for(std::size_t segment_idx = 0; segment_idx < controller->GetZoneSegmentCount(zone_idx); segment_idx++) { - unsigned int count = controller->GetZoneSegmentLEDsCount(zone_idx, segment_idx); - zone_pos[zone_idx].matrix_w = std::min(count, (unsigned int)MAX_COLS); - totalHeight += (count / MAX_COLS) + ((count % MAX_COLS) > 0); - + if(controller->GetZoneSegmentType(zone_idx, segment_idx) == ZONE_TYPE_MATRIX) + { + totalHeight += controller->GetZoneSegmentMatrixMapHeight(zone_idx, segment_idx); + zone_pos[zone_idx].matrix_w = controller->GetZoneSegmentMatrixMapWidth(zone_idx, segment_idx); + } + else + { + unsigned int count = controller->GetZoneSegmentLEDsCount(zone_idx, segment_idx); + zone_pos[zone_idx].matrix_w = std::min(count, (unsigned int)MAX_COLS); + totalHeight += (count / MAX_COLS) + ((count % MAX_COLS) > 0); + } segment_count++; } } @@ -352,9 +365,9 @@ void DeviceView::InitDeviceView() for(unsigned int led_y = 0; led_y < controller->GetZoneMatrixMapHeight(zone_idx); led_y++) { unsigned int map_idx = led_y * controller->GetZoneMatrixMapWidth(zone_idx) + led_x; - unsigned int color_idx = controller->GetZoneMatrixMap(zone_idx)[map_idx] + controller->GetZoneStartIndex(zone_idx); + unsigned int color_idx = controller->GetZoneMatrixMapData(zone_idx)[map_idx] + controller->GetZoneStartIndex(zone_idx); - if(controller->GetZoneMatrixMap(zone_idx)[map_idx] != 0xFFFFFFFF && color_idx < led_pos.size()) + if(controller->GetZoneMatrixMapData(zone_idx)[map_idx] != 0xFFFFFFFF && color_idx < led_pos.size()) { led_pos[color_idx].matrix_x = (zone_pos[zone_idx].matrix_x + led_x + PAD_LED); led_pos[color_idx].matrix_y = current_y + (led_y + PAD_LED); @@ -385,7 +398,7 @@ void DeviceView::InitDeviceView() | Fill Wide: | | Space | \*-----------------------------------------------------*/ - if(led_x < controller->GetZoneMatrixMapWidth(zone_idx) - 1 && controller->GetZoneMatrixMap(zone_idx)[map_idx + 1] == 0xFFFFFFFF) + if(led_x < controller->GetZoneMatrixMapWidth(zone_idx) - 1 && controller->GetZoneMatrixMapData(zone_idx)[map_idx + 1] == 0xFFFFFFFF) { if( ( controller->GetLEDDisplayName(color_idx) == KEY_EN_TAB ) || ( controller->GetLEDDisplayName(color_idx) == KEY_EN_CAPS_LOCK ) @@ -400,12 +413,12 @@ void DeviceView::InitDeviceView() if( ( controller->GetLEDDisplayName(color_idx) == KEY_EN_NUMPAD_ENTER ) || ( controller->GetLEDDisplayName(color_idx) == KEY_EN_NUMPAD_PLUS ) ) { - if(led_y < controller->GetZoneMatrixMapHeight(zone_idx) - 1 && controller->GetZoneMatrixMap(zone_idx)[map_idx + controller->GetZoneMatrixMapWidth(zone_idx)] == 0xFFFFFFFF) + if(led_y < controller->GetZoneMatrixMapHeight(zone_idx) - 1 && controller->GetZoneMatrixMapData(zone_idx)[map_idx + controller->GetZoneMatrixMapWidth(zone_idx)] == 0xFFFFFFFF) { led_pos[color_idx].matrix_h += 1.0f; } /* TODO: check if there isn't another widened key above */ - else if(led_y > 0 && controller->GetZoneMatrixMap(zone_idx)[map_idx - controller->GetZoneMatrixMapWidth(zone_idx)] == 0xFFFFFFFF) + else if(led_y > 0 && controller->GetZoneMatrixMapData(zone_idx)[map_idx - controller->GetZoneMatrixMapWidth(zone_idx)] == 0xFFFFFFFF) { led_pos[color_idx].matrix_y -= 1.0f; led_pos[color_idx].matrix_h += 1.0f; @@ -413,12 +426,12 @@ void DeviceView::InitDeviceView() } else if(controller->GetLEDDisplayName(color_idx) == KEY_EN_SPACE) { - for(unsigned int map_idx2 = map_idx - 1; map_idx2 > led_y * controller->GetZoneMatrixMapWidth(zone_idx) && controller->GetZoneMatrixMap(zone_idx)[map_idx2] == 0xFFFFFFFF; map_idx2--) + for(unsigned int map_idx2 = map_idx - 1; map_idx2 > led_y * controller->GetZoneMatrixMapWidth(zone_idx) && controller->GetZoneMatrixMapData(zone_idx)[map_idx2] == 0xFFFFFFFF; map_idx2--) { led_pos[color_idx].matrix_x -= 1.0f; led_pos[color_idx].matrix_w += 1.0f; } - for(unsigned int map_idx2 = map_idx + 1; map_idx2 < (led_y + 1) * controller->GetZoneMatrixMapWidth(zone_idx) && controller->GetZoneMatrixMap(zone_idx)[map_idx2] == 0xFFFFFFFF; map_idx2++) + for(unsigned int map_idx2 = map_idx + 1; map_idx2 < (led_y + 1) * controller->GetZoneMatrixMapWidth(zone_idx) && controller->GetZoneMatrixMapData(zone_idx)[map_idx2] == 0xFFFFFFFF; map_idx2++) { led_pos[color_idx].matrix_w += 1.0f; } @@ -445,26 +458,54 @@ void DeviceView::InitDeviceView() segment_count++; - /*-----------------------------------------------------*\ - | Calculate LED box positions for segmented zones | - \*-----------------------------------------------------*/ - unsigned int leds_count = controller->GetZoneSegmentLEDsCount(zone_idx, segment_idx); - - for(unsigned int led_idx = 0; led_idx < leds_count; led_idx++) + if(controller->GetZoneSegmentType(zone_idx, segment_idx) == ZONE_TYPE_MATRIX) { - unsigned int led_pos_idx = controller->GetZoneStartIndex(zone_idx) + controller->GetZoneSegmentStartIndex(zone_idx, segment_idx) + led_idx; + for(unsigned int led_x = 0; led_x < controller->GetZoneSegmentMatrixMapWidth(zone_idx, segment_idx); led_x++) + { + for(unsigned int led_y = 0; led_y < controller->GetZoneSegmentMatrixMapHeight(zone_idx, segment_idx); led_y++) + { + unsigned int map_idx = led_y * controller->GetZoneSegmentMatrixMapWidth(zone_idx, segment_idx) + led_x; + unsigned int color_idx = controller->GetZoneSegmentMatrixMapData(zone_idx, segment_idx)[map_idx] + controller->GetZoneSegmentStartIndex(zone_idx, segment_idx); - led_pos[led_pos_idx].matrix_x = zone_pos[zone_idx].matrix_x + ((led_idx % MAX_COLS) + PAD_LED); - led_pos[led_pos_idx].matrix_y = current_y + ((led_idx / MAX_COLS) + PAD_LED); + if(controller->GetZoneSegmentMatrixMapData(zone_idx, segment_idx)[map_idx] != 0xFFFFFFFF && color_idx < led_pos.size()) + { + led_pos[color_idx].matrix_x = (segment_pos[zone_idx].matrix_x + led_x + PAD_LED); + led_pos[color_idx].matrix_y = current_y + (led_y + PAD_LED); - /*-----------------------------------------------------*\ - | LED is a 1x1 square, minus padding on all sides | - \*-----------------------------------------------------*/ - led_pos[led_pos_idx].matrix_w = (1.0f - (2.0f * PAD_LED)); - led_pos[led_pos_idx].matrix_h = (1.0f - (2.0f * PAD_LED)); + /*-----------------------------------------------------*\ + | LED is a 1x1 square, minus padding on all sides | + \*-----------------------------------------------------*/ + led_pos[color_idx].matrix_w = (1.0f - (2.0f * PAD_LED)); + led_pos[color_idx].matrix_h = (1.0f - (2.0f * PAD_LED)); + } + } + } + + current_y += controller->GetZoneSegmentMatrixMapHeight(zone_idx, segment_idx); } + else + { + /*-----------------------------------------------------*\ + | Calculate LED box positions for segmented zones | + \*-----------------------------------------------------*/ + unsigned int leds_count = controller->GetZoneSegmentLEDsCount(zone_idx, segment_idx); - current_y += (leds_count / MAX_COLS) + ((leds_count % MAX_COLS) > 0); + for(unsigned int led_idx = 0; led_idx < leds_count; led_idx++) + { + unsigned int led_pos_idx = controller->GetZoneStartIndex(zone_idx) + controller->GetZoneSegmentStartIndex(zone_idx, segment_idx) + led_idx; + + led_pos[led_pos_idx].matrix_x = zone_pos[zone_idx].matrix_x + ((led_idx % MAX_COLS) + PAD_LED); + led_pos[led_pos_idx].matrix_y = current_y + ((led_idx / MAX_COLS) + PAD_LED); + + /*-----------------------------------------------------*\ + | LED is a 1x1 square, minus padding on all sides | + \*-----------------------------------------------------*/ + led_pos[led_pos_idx].matrix_w = (1.0f - (2.0f * PAD_LED)); + led_pos[led_pos_idx].matrix_h = (1.0f - (2.0f * PAD_LED)); + } + + current_y += (leds_count / MAX_COLS) + ((leds_count % MAX_COLS) > 0); + } } } else @@ -734,9 +775,10 @@ void DeviceView::paintEvent(QPaintEvent* /* event */) /*-----------------------------------------------------*\ | If controller has resized, reinitialize local data | \*-----------------------------------------------------*/ - if(controller->GetLEDCount() != led_pos.size()) + if(changed || (controller->GetLEDCount() != led_pos.size())) { InitDeviceView(); + changed = false; } /*-----------------------------------------------------*\ diff --git a/qt/DeviceView.h b/qt/DeviceView.h index 6a455203f..c0760e707 100644 --- a/qt/DeviceView.h +++ b/qt/DeviceView.h @@ -32,6 +32,7 @@ public: virtual QSize sizeHint () const; virtual QSize minimumSizeHint () const; + void setChanged(); void setController(RGBController * controller_ptr); void setNumericalLabels(bool enable); void setPerLED(bool per_led_mode); @@ -48,6 +49,7 @@ private: bool mouseDown; bool ctrlDown; bool mouseMoved; + bool changed; int size; int offset_x; QRect selectionRect; diff --git a/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp b/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp index 0dd32481a..58fc36ec7 100644 --- a/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp +++ b/qt/OpenRGBDevicePage/OpenRGBDevicePage.cpp @@ -8,7 +8,7 @@ \*---------------------------------------------------------*/ #include "OpenRGBDevicePage.h" -#include "OpenRGBZoneResizeDialog.h" +#include "OpenRGBZoneEditorDialog.h" #include "ProfileManager.h" #include "ResourceManager.h" #include "SettingsManager.h" @@ -2002,6 +2002,7 @@ void OpenRGBDevicePage::UpdateInterface(unsigned int update_reason) case RGBCONTROLLER_UPDATE_REASON_CLEARSEGMENTS: case RGBCONTROLLER_UPDATE_REASON_RESIZEZONE: UpdateModeUi(); + ui->DeviceViewBox->setChanged(); ui->DeviceViewBox->repaint(); break; } @@ -2166,7 +2167,7 @@ void OpenRGBDevicePage::on_EditZoneButton_clicked() \*-----------------------------------------*/ if((device->GetZoneType(selected_zone) == ZONE_TYPE_LINEAR) || (device->GetZoneFlags(selected_zone) & ZONE_FLAG_RESIZE_EFFECTS_ONLY)) { - OpenRGBZoneResizeDialog dlg(device, selected_zone); + OpenRGBZoneEditorDialog dlg(device, selected_zone); int new_size = dlg.show(); diff --git a/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.cpp b/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.cpp new file mode 100644 index 000000000..2404caff2 --- /dev/null +++ b/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.cpp @@ -0,0 +1,136 @@ +/*---------------------------------------------------------*\ +| OpenRGBMatrixMapEditorDialog.cpp | +| | +| User interface for editing matrix maps | +| | +| Adam Honse 21 Feb 2026 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-or-later | +\*---------------------------------------------------------*/ + +#include +#include +#include +#include +#include "OpenRGBMatrixMapEditorDialog.h" +#include "ui_OpenRGBMatrixMapEditorDialog.h" + +OpenRGBMatrixMapEditorDialog::OpenRGBMatrixMapEditorDialog(QString name, matrix_map_type* edit_map_ptr, unsigned int led_count, QWidget *parent) : + QDialog(parent), + ui(new Ui::OpenRGBMatrixMapEditorDialog) +{ + ui->setupUi(this); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + /*-----------------------------------------------------*\ + | Save matrix map pointer | + \*-----------------------------------------------------*/ + edit_map = edit_map_ptr; + edit_led_count = led_count; + + /*-----------------------------------------------------*\ + | Append name to window title | + \*-----------------------------------------------------*/ + if(name != "") + { + QString currentTitle = windowTitle(); + + QString newTitle = currentTitle + " - " + name; + + setWindowTitle(newTitle); + } + + /*-----------------------------------------------------*\ + | Initialize matrix map table | + \*-----------------------------------------------------*/ + ui->LineEditHeight->setText(QString::number(edit_map->height)); + ui->LineEditWidth->setText(QString::number(edit_map->width)); + + ui->TableWidgetMatrixMap->setRowCount(edit_map->height); + ui->TableWidgetMatrixMap->setColumnCount(edit_map->width); + + for(int row = 0; row < ui->TableWidgetMatrixMap->rowCount(); row++) + { + for(int column = 0; column < ui->TableWidgetMatrixMap->columnCount(); column++) + { + unsigned int table_value = edit_map->map[(row * edit_map->width) + column]; + QTableWidgetItem* table_item = new QTableWidgetItem; + + if(table_value < edit_led_count) + { + table_item->setText(QString::number(table_value)); + } + + ui->TableWidgetMatrixMap->setItem(row, column, table_item); + } + } +} + +OpenRGBMatrixMapEditorDialog::~OpenRGBMatrixMapEditorDialog() +{ + delete ui; +} + +void OpenRGBMatrixMapEditorDialog::changeEvent(QEvent *event) +{ + if(event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + } +} + +int OpenRGBMatrixMapEditorDialog::show() +{ + int ret_val = 0; + + int result = this->exec(); + + if(result == QDialog::Rejected) + { + ret_val = -1; + } + else + { + edit_map->height = ui->LineEditHeight->text().toInt(); + edit_map->width = ui->LineEditWidth->text().toInt(); + + edit_map->map.resize(edit_map->height * edit_map->width); + + for(int row = 0; row < ui->TableWidgetMatrixMap->rowCount(); row++) + { + for(int column = 0; column < ui->TableWidgetMatrixMap->columnCount(); column++) + { + bool valid = false; + QTableWidgetItem* table_item = ui->TableWidgetMatrixMap->item(row, column); + QString table_string = ""; + unsigned int table_number = 0xFFFFFFFF; + + if(table_item) + { + table_string = table_item->text(); + table_number = table_string.toUInt(&valid); + } + + if(!valid || (table_number >= edit_led_count)) + { + table_number = 0xFFFFFFFF; + } + + edit_map->map[(row * edit_map->width) + column] = table_number; + } + } + } + + return(ret_val); +} + +void OpenRGBMatrixMapEditorDialog::on_LineEditHeight_textChanged(const QString &arg1) +{ + ui->TableWidgetMatrixMap->setRowCount(arg1.toInt()); +} + +void OpenRGBMatrixMapEditorDialog::on_LineEditWidth_textChanged(const QString &arg1) +{ + ui->TableWidgetMatrixMap->setColumnCount(arg1.toInt()); +} diff --git a/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.h b/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.h new file mode 100644 index 000000000..b09ff8cb2 --- /dev/null +++ b/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.h @@ -0,0 +1,43 @@ +/*---------------------------------------------------------*\ +| OpenRGBMatrixMapEditorDialog.h | +| | +| User interface for editing matrix maps | +| | +| Adam Honse 21 Feb 2026 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-or-later | +\*---------------------------------------------------------*/ + +#pragma once + +#include +#include "RGBController.h" + +namespace Ui +{ + class OpenRGBMatrixMapEditorDialog; +} + +class OpenRGBMatrixMapEditorDialog : public QDialog +{ + Q_OBJECT + +public: + explicit OpenRGBMatrixMapEditorDialog(QString name, matrix_map_type* edit_map_ptr, unsigned int led_count, QWidget *parent = nullptr); + ~OpenRGBMatrixMapEditorDialog(); + + int show(); + +private slots: + void changeEvent(QEvent *event); + + void on_LineEditHeight_textChanged(const QString &arg1); + + void on_LineEditWidth_textChanged(const QString &arg1); + +private: + Ui::OpenRGBMatrixMapEditorDialog* ui; + matrix_map_type* edit_map; + unsigned int edit_led_count; +}; diff --git a/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.ui b/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.ui new file mode 100644 index 000000000..bd4967a02 --- /dev/null +++ b/qt/OpenRGBMatrixMapEditorDialog/OpenRGBMatrixMapEditorDialog.ui @@ -0,0 +1,97 @@ + + + OpenRGBMatrixMapEditorDialog + + + + 0 + 0 + 450 + 250 + + + + Matrix Map Editor + + + + + + + 0 + 0 + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + + Height: + + + + + + + + + + Width: + + + + + + + + + + + + + + + + + ButtonBox + accepted() + OpenRGBMatrixMapEditorDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + ButtonBox + rejected() + OpenRGBMatrixMapEditorDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.cpp b/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.cpp new file mode 100644 index 000000000..9f3ab9346 --- /dev/null +++ b/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.cpp @@ -0,0 +1,86 @@ +/*---------------------------------------------------------*\ +| OpenRGBSegmentExportDialog.cpp | +| | +| User interface entry for OpenRGB segment export dialog | +| | +| Adam Honse 22 Feb 2026 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-or-later | +\*---------------------------------------------------------*/ + +#include +#include "OpenRGBSegmentExportDialog.h" +#include "ui_OpenRGBSegmentExportDialog.h" + +OpenRGBSegmentExportDialog::OpenRGBSegmentExportDialog(QWidget *parent) : + QDialog(parent), ui(new Ui::OpenRGBSegmentExportDialog) +{ + ui->setupUi(this); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); +} + +OpenRGBSegmentExportDialog::~OpenRGBSegmentExportDialog() +{ + delete ui; +} + +void OpenRGBSegmentExportDialog::changeEvent(QEvent *event) +{ + if(event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + } +} + +bool OpenRGBSegmentExportDialog::show() +{ + int result = this->exec(); + + if(result == QDialog::Rejected) + { + return(false); + } + else + { + filename = ui->LineEditFile->text(); + vendor = ui->LineEditVendor->text(); + device = ui->LineEditDevice->text(); + } + + return(true); +} + +QString OpenRGBSegmentExportDialog::GetDevice() +{ + return(device); +} + +QString OpenRGBSegmentExportDialog::GetFilename() +{ + return(filename); +} + +QString OpenRGBSegmentExportDialog::GetVendor() +{ + return(vendor); +} + +void OpenRGBSegmentExportDialog::on_ButtonChooseFile_clicked() +{ + QFileDialog file_dialog(this); + + file_dialog.setFileMode(QFileDialog::AnyFile); + file_dialog.setNameFilter("*.json"); + file_dialog.setDefaultSuffix(".json"); + file_dialog.setWindowTitle("Export Configuration"); + + if(file_dialog.exec()) + { + QStringList selected_files = file_dialog.selectedFiles(); + QString filename = selected_files[0]; + + ui->LineEditFile->setText(filename); + } +} + diff --git a/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.h b/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.h new file mode 100644 index 000000000..f8f52e4af --- /dev/null +++ b/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.h @@ -0,0 +1,44 @@ +/*---------------------------------------------------------*\ +| OpenRGBSegmentExportDialog.h | +| | +| User interface entry for OpenRGB segment export dialog | +| | +| Adam Honse 22 Feb 2026 | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-or-later | +\*---------------------------------------------------------*/ + +#pragma once + +#include + +namespace Ui +{ + class OpenRGBSegmentExportDialog; +} + +class OpenRGBSegmentExportDialog : public QDialog +{ + Q_OBJECT + +public: + explicit OpenRGBSegmentExportDialog(QWidget *parent = nullptr); + ~OpenRGBSegmentExportDialog(); + + bool show(); + + QString GetDevice(); + QString GetFilename(); + QString GetVendor(); + +private: + Ui::OpenRGBSegmentExportDialog* ui; + QString device; + QString filename; + QString vendor; + +private slots: + void changeEvent(QEvent *event); + void on_ButtonChooseFile_clicked(); +}; diff --git a/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.ui b/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.ui new file mode 100644 index 000000000..8677ca788 --- /dev/null +++ b/qt/OpenRGBSegmentExportDialog/OpenRGBSegmentExportDialog.ui @@ -0,0 +1,126 @@ + + + OpenRGBSegmentExportDialog + + + + 0 + 0 + 300 + 250 + + + + + 0 + 0 + + + + Export Segment Configuration + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + 8 + 0 + + + + ... + + + + + + + File: + + + + + + + Vendor Name (Optional): + + + + + + + + + + Device Name (Optional): + + + + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + + buttonBox + accepted() + OpenRGBSegmentExportDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + OpenRGBSegmentExportDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.cpp b/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.cpp new file mode 100644 index 000000000..bc115181d --- /dev/null +++ b/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.cpp @@ -0,0 +1,477 @@ +/*---------------------------------------------------------*\ +| OpenRGBZoneEditorDialog.cpp | +| | +| User interface for editing zones | +| | +| This file is part of the OpenRGB project | +| SPDX-License-Identifier: GPL-2.0-or-later | +\*---------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include "OpenRGBMatrixMapEditorDialog.h" +#include "OpenRGBSegmentExportDialog.h" +#include "OpenRGBZoneEditorDialog.h" +#include "ui_OpenRGBZoneEditorDialog.h" + +OpenRGBZoneEditorDialog::OpenRGBZoneEditorDialog(RGBController* edit_dev_ptr, unsigned int edit_zone_idx_val, QWidget *parent) : + QDialog(parent), + ui(new Ui::OpenRGBZoneEditorDialog) +{ + ui->setupUi(this); + setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + + /*-----------------------------------------------------*\ + | Save device and zone | + \*-----------------------------------------------------*/ + edit_dev = edit_dev_ptr; + edit_zone_idx = edit_zone_idx_val; + + /*-----------------------------------------------------*\ + | Append zone name to window title | + \*-----------------------------------------------------*/ + QString currentTitle = windowTitle(); + + QString newTitle = currentTitle + " - " + QString::fromStdString(edit_dev->GetZoneName(edit_zone_idx)); + + setWindowTitle(newTitle); + + /*-----------------------------------------------------*\ + | Set up zone size range | + \*-----------------------------------------------------*/ + unsigned int size_min = edit_dev->GetZoneLEDsMin(edit_zone_idx); + unsigned int size_max = edit_dev->GetZoneLEDsMax(edit_zone_idx); + unsigned int size_current = edit_dev->GetZoneLEDsCount(edit_zone_idx); + + /*-----------------------------------------------------*\ + | Initialize segment list | + \*-----------------------------------------------------*/ + QStringList header_labels; + header_labels << "Name" << "Type" << "Matrix Map" << "Size" << ""; + ui->SegmentsTreeWidget->setHeaderLabels(header_labels); + + ui->ResizeSlider->setRange(size_min, size_max); + ui->ResizeBox->setRange(size_min, size_max); + + ui->ResizeSlider->setValue(size_current); + ui->ResizeBox->setValue(size_current); + + for(unsigned int segment_idx = 0; segment_idx < edit_dev->GetZoneSegmentCount(edit_zone_idx); segment_idx++) + { + matrix_map_type new_matrix_map = edit_dev->GetZoneSegmentMatrixMap(edit_zone_idx, segment_idx); + AddSegmentRow(QString::fromStdString(edit_dev->GetZoneSegmentName(edit_zone_idx, segment_idx)), edit_dev->GetZoneSegmentLEDsCount(edit_zone_idx, segment_idx), edit_dev->GetZoneSegmentType(edit_zone_idx, segment_idx), new_matrix_map); + } +} + +OpenRGBZoneEditorDialog::~OpenRGBZoneEditorDialog() +{ + delete ui; +} + +void OpenRGBZoneEditorDialog::changeEvent(QEvent *event) +{ + if(event->type() == QEvent::LanguageChange) + { + ui->retranslateUi(this); + } +} + +void OpenRGBZoneEditorDialog::on_ResizeSlider_valueChanged(int value) +{ + ui->ResizeBox->blockSignals(true); + ui->ResizeBox->setValue(value); + ui->ResizeBox->blockSignals(false); + + /*-----------------------------------------------------*\ + | Set maximum value for all segment sliders to new zone | + | size | + \*-----------------------------------------------------*/ + for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) + { + ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 4))->setMaximum(value); + } + + CheckSegmentsValidity(); +} + +void OpenRGBZoneEditorDialog::on_segment_lineedit_textChanged() +{ + /*-----------------------------------------------------*\ + | Update the Slider with the LineEdit value for each | + | segment | + \*-----------------------------------------------------*/ + for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) + { + int lineedit_value = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->text().toInt(); + ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 4))->setValue(lineedit_value); + } + + CheckSegmentsValidity(); +} + +void SegmentTreeWidgetItem::on_button_matrix_map_clicked() +{ + QString segment_name = ((QLineEdit*)(treeWidget()->itemWidget(this, 0)))->text(); + unsigned int segment_led_count = ((QLineEdit*)(treeWidget()->itemWidget(this, 3)))->text().toInt(); + + OpenRGBMatrixMapEditorDialog dialog(segment_name, &matrix_map, segment_led_count); + + dialog.show(); + + ((QPushButton*)(treeWidget()->itemWidget(this, 2)))->setText(QString::number(matrix_map.height) + "x" + QString::number(matrix_map.width)); +} + +void OpenRGBZoneEditorDialog::on_segment_slider_valueChanged(int) +{ + /*-----------------------------------------------------*\ + | Update the LineEdit with the Slider value for each | + | segment | + \*-----------------------------------------------------*/ + for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) + { + int slider_value = ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 4))->value(); + ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->setText(QString::number(slider_value)); + } + + CheckSegmentsValidity(); +} + +void OpenRGBZoneEditorDialog::on_ResizeBox_valueChanged(int value) +{ + ui->ResizeSlider->blockSignals(true); + ui->ResizeSlider->setValue(value); + ui->ResizeSlider->blockSignals(false); + + /*-----------------------------------------------------*\ + | Set maximum value for all segment sliders to new zone | + | size | + \*-----------------------------------------------------*/ + for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) + { + ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 4))->setMaximum(value); + } + + CheckSegmentsValidity(); +} + +int OpenRGBZoneEditorDialog::show() +{ + int ret_val = 0; + + int result = this->exec(); + + if(result == QDialog::Rejected) + { + ret_val = -1; + } + else + { + ret_val = ui->ResizeBox->value(); + } + + if(ret_val >= 0 && edit_dev != NULL) + { + edit_dev->ResizeZone(edit_zone_idx, ret_val); + + edit_dev->ClearSegments(edit_zone_idx); + + unsigned int start_idx = 0; + + for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) + { + segment new_segment; + new_segment.type = ((QComboBox*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->currentIndex(); + new_segment.name = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 0))->text().toStdString(); + new_segment.start_idx = start_idx; + new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->text().toInt(); + new_segment.matrix_map = ((SegmentTreeWidgetItem*)(ui->SegmentsTreeWidget->topLevelItem(item_idx)))->matrix_map; + + edit_dev->AddSegment(edit_zone_idx, new_segment); + + start_idx += new_segment.leds_count; + } + } + + return(ret_val); +} + +void OpenRGBZoneEditorDialog::AddSegmentRow(QString name, unsigned int length, zone_type type, matrix_map_type matrix_map) +{ + /*---------------------------------------------------------*\ + | Create new line in segments list tree | + \*---------------------------------------------------------*/ + SegmentTreeWidgetItem* new_item = new SegmentTreeWidgetItem(ui->SegmentsTreeWidget); + + /*---------------------------------------------------------*\ + | Set the matrix map | + \*---------------------------------------------------------*/ + new_item->matrix_map = matrix_map; + + /*---------------------------------------------------------*\ + | Create new widgets for line | + \*---------------------------------------------------------*/ + QComboBox* combobox_type = new QComboBox(ui->SegmentsTreeWidget); + QLineEdit* lineedit_name = new QLineEdit(ui->SegmentsTreeWidget); + QLineEdit* lineedit_length = new QLineEdit(ui->SegmentsTreeWidget); + QSlider* slider_length = new QSlider(Qt::Horizontal, ui->SegmentsTreeWidget); + QPushButton* button_matrix_map = new QPushButton(); + + button_matrix_map->setText(QString::number(new_item->matrix_map.height) + "x" + QString::number(new_item->matrix_map.width)); + + /*---------------------------------------------------------*\ + | Fill in Name field | + \*---------------------------------------------------------*/ + lineedit_name->setText(name); + + /*---------------------------------------------------------*\ + | Set up segment type combo box | + \*---------------------------------------------------------*/ + combobox_type->addItem("Single"); + combobox_type->addItem("Linear"); + combobox_type->addItem("Matrix"); + combobox_type->addItem("Linear Loop"); + combobox_type->addItem("Matrix Loop X"); + combobox_type->addItem("Matrix Loop Y"); + combobox_type->addItem("Segmented"); + + combobox_type->setCurrentIndex(type); + + /*---------------------------------------------------------*\ + | Fill in Length field | + \*---------------------------------------------------------*/ + lineedit_length->setText(QString::number(length)); + + /*---------------------------------------------------------*\ + | Fill in slider length and maximum | + \*---------------------------------------------------------*/ + slider_length->setMaximum(edit_dev->GetZoneLEDsCount(edit_zone_idx)); + slider_length->setValue(length); + + /*---------------------------------------------------------*\ + | Add new widgets to tree | + \*---------------------------------------------------------*/ + ui->SegmentsTreeWidget->setItemWidget(new_item, 0, lineedit_name); + ui->SegmentsTreeWidget->setItemWidget(new_item, 1, combobox_type); + ui->SegmentsTreeWidget->setItemWidget(new_item, 2, button_matrix_map); + ui->SegmentsTreeWidget->setItemWidget(new_item, 3, lineedit_length); + ui->SegmentsTreeWidget->setItemWidget(new_item, 4, slider_length); + + /*---------------------------------------------------------*\ + | Connect signals for handling slider and line edits | + \*---------------------------------------------------------*/ + connect(lineedit_name, &QLineEdit::textChanged, this, &OpenRGBZoneEditorDialog::on_segment_lineedit_textChanged); + connect(slider_length, &QSlider::valueChanged, this, &OpenRGBZoneEditorDialog::on_segment_slider_valueChanged); + connect(lineedit_length, &QLineEdit::textChanged, this, &OpenRGBZoneEditorDialog::on_segment_lineedit_textChanged); + connect(button_matrix_map, SIGNAL(clicked()), new_item, SLOT(on_button_matrix_map_clicked())); +} + +void OpenRGBZoneEditorDialog::on_AddSegmentButton_clicked() +{ + /*---------------------------------------------------------*\ + | Create new empty row with name "Segment X" | + \*---------------------------------------------------------*/ + QString new_name = "Segment " + QString::number(ui->SegmentsTreeWidget->topLevelItemCount() + 1); + + matrix_map_type new_matrix_map; + AddSegmentRow(new_name, 0, ZONE_TYPE_LINEAR, new_matrix_map); + + CheckSegmentsValidity(); +} + +void OpenRGBZoneEditorDialog::CheckSegmentsValidity() +{ + bool segments_valid = true; + + /*---------------------------------------------------------*\ + | Only check validity if segments are configured | + \*---------------------------------------------------------*/ + if(ui->SegmentsTreeWidget->topLevelItemCount() != 0) + { + /*-----------------------------------------------------*\ + | Verify all segments add up to zone size | + \*-----------------------------------------------------*/ + int total_segment_leds = 0; + + for(int segment_idx = 0; segment_idx < ui->SegmentsTreeWidget->topLevelItemCount(); segment_idx++) + { + unsigned int segment_leds = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(segment_idx), 3))->text().toInt(); + + /*-------------------------------------------------*\ + | Zero-length segment is not allowed | + \*-------------------------------------------------*/ + if(segment_leds == 0) + { + segments_valid = false; + } + + total_segment_leds += segment_leds; + + /*-------------------------------------------------*\ + | Empty name is not allowed | + \*-------------------------------------------------*/ + if(((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(segment_idx), 0))->text().isEmpty()) + { + segments_valid = false; + } + } + + if(total_segment_leds != ui->ResizeBox->value()) + { + segments_valid = false; + } + } + + ui->ButtonBox->setEnabled(segments_valid); +} + +void OpenRGBZoneEditorDialog::on_RemoveSegmentButton_clicked() +{ + ui->SegmentsTreeWidget->takeTopLevelItem(ui->SegmentsTreeWidget->topLevelItemCount() - 1); + + CheckSegmentsValidity(); +} + +void OpenRGBZoneEditorDialog::on_ImportConfigurationButton_clicked() +{ + QFileDialog file_dialog(this); + + /*-----------------------------------------------------*\ + | Show the file chooser dialog | + \*-----------------------------------------------------*/ + file_dialog.setFileMode(QFileDialog::ExistingFile); + file_dialog.setNameFilter("*.json"); + file_dialog.setWindowTitle("Import Configuration"); + + if(file_dialog.exec()) + { + QStringList selected_files = file_dialog.selectedFiles(); + QString filename = selected_files[0]; + std::ifstream config_file(filename.toStdString(), std::ios::in); + nlohmann::json config_json; + + /*-------------------------------------------------*\ + | Import config file if a valid file was opened | + \*-------------------------------------------------*/ + if(config_file) + { + try + { + config_file >> config_json; + + /*-----------------------------------------*\ + | Read in all segments | + \*-----------------------------------------*/ + if(config_json.contains("segments")) + { + unsigned int total_leds_count = ui->ResizeSlider->value(); + + for(std::size_t segment_idx = 0; segment_idx < config_json["segments"].size(); segment_idx++) + { + unsigned int segment_leds_count = 0; + matrix_map_type segment_matrix_map; + QString segment_name = ""; + zone_type segment_type = ZONE_TYPE_LINEAR; + + if(config_json["segments"][segment_idx].contains("name")) + { + segment_name = QString::fromStdString(config_json["segments"][segment_idx]["name"]); + } + if(config_json["segments"][segment_idx].contains("leds_count")) + { + segment_leds_count = config_json["segments"][segment_idx]["leds_count"]; + } + if(config_json["segments"][segment_idx].contains("type")) + { + segment_type = config_json["segments"][segment_idx]["type"]; + } + + matrix_map_type new_matrix_map; + new_matrix_map = RGBController::SetMatrixMapDescriptionJSON(config_json["segments"][segment_idx]["matrix_map"]); + + AddSegmentRow(segment_name, segment_leds_count, segment_type, new_matrix_map); + + total_leds_count += segment_leds_count; + } + + + ui->ResizeSlider->setValue(total_leds_count); + ui->ResizeBox->setValue(total_leds_count); + } + } + catch(const std::exception& e) + { + } + } + } +} + +void OpenRGBZoneEditorDialog::on_ExportConfigurationButton_clicked() +{ + OpenRGBSegmentExportDialog dialog; + + /*-----------------------------------------------------*\ + | Show the segment export dialog | + \*-----------------------------------------------------*/ + if(dialog.show()) + { + std::ofstream config_file(dialog.GetFilename().toStdString(), std::ios::out); + nlohmann::json config_json; + + if(config_file) + { + QString device = dialog.GetDevice(); + QString vendor = dialog.GetVendor(); + + /*---------------------------------------------*\ + | Fill in device string in the JSON | + \*---------------------------------------------*/ + if(device != "") + { + config_json["device"] = device.toStdString(); + } + + + /*---------------------------------------------*\ + | Fill in vendor string in the JSON | + \*---------------------------------------------*/ + if(vendor != "") + { + config_json["vendor"] = vendor.toStdString(); + } + + + /*---------------------------------------------*\ + | Fill in segment data in the JSON | + \*---------------------------------------------*/ + unsigned int start_idx = 0; + + for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) + { + segment new_segment; + new_segment.type = ((QComboBox*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->currentIndex(); + new_segment.name = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 0))->text().toStdString(); + new_segment.start_idx = start_idx; + new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->text().toInt(); + new_segment.matrix_map = ((SegmentTreeWidgetItem*)(ui->SegmentsTreeWidget->topLevelItem(item_idx)))->matrix_map; + + config_json["segments"][item_idx] = RGBController::GetSegmentDescriptionJSON(new_segment); + + start_idx += new_segment.leds_count; + } + + /*---------------------------------------------*\ + | Write the JSON data to the file | + \*---------------------------------------------*/ + config_file << std::setw(4) << config_json << std::endl; + + /*---------------------------------------------*\ + | Close the file when done | + \*---------------------------------------------*/ + config_file.close(); + } + } +} + diff --git a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.h b/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.h similarity index 59% rename from qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.h rename to qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.h index 6661e5047..e6253283b 100644 --- a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.h +++ b/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.h @@ -1,7 +1,7 @@ /*---------------------------------------------------------*\ -| OpenRGBZoneResizeDialog.h | +| OpenRGBZoneEditorDialog.h | | | -| User interface for resizing zones | +| User interface for editing zones | | | | This file is part of the OpenRGB project | | SPDX-License-Identifier: GPL-2.0-or-later | @@ -10,43 +10,55 @@ #pragma once #include - +#include #include "RGBController.h" namespace Ui { - class OpenRGBZoneResizeDialog; + class OpenRGBZoneEditorDialog; } -class OpenRGBZoneResizeDialog : public QDialog + +class SegmentTreeWidgetItem : public QObject, public QTreeWidgetItem { Q_OBJECT public: - explicit OpenRGBZoneResizeDialog(RGBController* edit_dev_ptr, unsigned int edit_zone_idx_val, QWidget *parent = nullptr); - ~OpenRGBZoneResizeDialog(); + using QTreeWidgetItem::QTreeWidgetItem; + + matrix_map_type matrix_map; + +private slots: + void on_button_matrix_map_clicked(); +}; + +class OpenRGBZoneEditorDialog : public QDialog +{ + Q_OBJECT + +public: + explicit OpenRGBZoneEditorDialog(RGBController* edit_dev_ptr, unsigned int edit_zone_idx_val, QWidget *parent = nullptr); + ~OpenRGBZoneEditorDialog(); int show(); private slots: void changeEvent(QEvent *event); void on_ResizeSlider_valueChanged(int value); - void on_ResizeBox_valueChanged(int arg1); - void on_AddSegmentButton_clicked(); - void on_RemoveSegmentButton_clicked(); - void on_segment_slider_valueChanged(int); - void on_segment_lineedit_textChanged(); + void on_ImportConfigurationButton_clicked(); + + void on_ExportConfigurationButton_clicked(); private: - Ui::OpenRGBZoneResizeDialog *ui; + Ui::OpenRGBZoneEditorDialog *ui; RGBController* edit_dev; unsigned int edit_zone_idx; - void AddSegmentRow(QString name, unsigned int length, zone_type type); + void AddSegmentRow(QString name, unsigned int length, zone_type type, matrix_map_type matrix_map); void CheckSegmentsValidity(); }; diff --git a/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.ui b/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.ui new file mode 100644 index 000000000..6b63ac927 --- /dev/null +++ b/qt/OpenRGBZoneEditorDialog/OpenRGBZoneEditorDialog.ui @@ -0,0 +1,173 @@ + + + OpenRGBZoneEditorDialog + + + + 0 + 0 + 750 + 400 + + + + Zone Editor + + + + + + Zone Size + + + + + + + 0 + 0 + + + + Qt::Orientation::Horizontal + + + + + + + + 0 + 0 + + + + + + + + + + + Segments + + + + + + Add Segment + + + + + + + Remove Segment + + + + + + + 4 + + + + Name + + + + + Type + + + + + Length + + + + + + + + + + + + + Import Configuration + + + + + + + Export Configuration + + + + + + + + + + + 0 + 0 + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + QTooltipedSlider + QSlider +
QTooltipedSlider.h
+
+
+ + + + ButtonBox + accepted() + OpenRGBZoneEditorDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + ButtonBox + rejected() + OpenRGBZoneEditorDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp b/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp deleted file mode 100644 index 4c90d747d..000000000 --- a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/*---------------------------------------------------------*\ -| OpenRGBZoneResizeDialog.cpp | -| | -| User interface for resizing zones | -| | -| This file is part of the OpenRGB project | -| SPDX-License-Identifier: GPL-2.0-or-later | -\*---------------------------------------------------------*/ - -#include -#include -#include "OpenRGBZoneResizeDialog.h" -#include "ui_OpenRGBZoneResizeDialog.h" - -OpenRGBZoneResizeDialog::OpenRGBZoneResizeDialog(RGBController* edit_dev_ptr, unsigned int edit_zone_idx_val, QWidget *parent) : - QDialog(parent), - ui(new Ui::OpenRGBZoneResizeDialog) -{ - edit_dev = edit_dev_ptr; - edit_zone_idx = edit_zone_idx_val; - - unsigned int size_min = edit_dev->GetZoneLEDsMin(edit_zone_idx); - unsigned int size_max = edit_dev->GetZoneLEDsMax(edit_zone_idx); - unsigned int size_current = edit_dev->GetZoneLEDsCount(edit_zone_idx); - - ui->setupUi(this); - setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); - - QStringList header_labels; - header_labels << "Name" << "Type" << "Size" << ""; - ui->SegmentsTreeWidget->setHeaderLabels(header_labels); - - ui->ResizeSlider->setRange(size_min, size_max); - ui->ResizeBox->setRange(size_min, size_max); - - ui->ResizeSlider->setValue(size_current); - ui->ResizeBox->setValue(size_current); - - for(unsigned int segment_idx = 0; segment_idx < edit_dev->GetZoneSegmentCount(edit_zone_idx); segment_idx++) - { - AddSegmentRow(QString::fromStdString(edit_dev->GetZoneSegmentName(edit_zone_idx, segment_idx)), edit_dev->GetZoneSegmentLEDsCount(edit_zone_idx, segment_idx), edit_dev->GetZoneSegmentType(edit_zone_idx, segment_idx)); - } -} - -OpenRGBZoneResizeDialog::~OpenRGBZoneResizeDialog() -{ - delete ui; -} - -void OpenRGBZoneResizeDialog::changeEvent(QEvent *event) -{ - if(event->type() == QEvent::LanguageChange) - { - ui->retranslateUi(this); - } -} - -void OpenRGBZoneResizeDialog::on_ResizeSlider_valueChanged(int value) -{ - ui->ResizeBox->blockSignals(true); - ui->ResizeBox->setValue(value); - ui->ResizeBox->blockSignals(false); - - /*-----------------------------------------------------*\ - | Set maximum value for all segment sliders to new zone | - | size | - \*-----------------------------------------------------*/ - for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) - { - ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->setMaximum(value); - } - - CheckSegmentsValidity(); -} - -void OpenRGBZoneResizeDialog::on_segment_lineedit_textChanged() -{ - /*-----------------------------------------------------*\ - | Update the Slider with the LineEdit value for each | - | segment | - \*-----------------------------------------------------*/ - for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) - { - int lineedit_value = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->text().toInt(); - ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->setValue(lineedit_value); - } - - CheckSegmentsValidity(); -} - -void OpenRGBZoneResizeDialog::on_segment_slider_valueChanged(int) -{ - /*-----------------------------------------------------*\ - | Update the LineEdit with the Slider value for each | - | segment | - \*-----------------------------------------------------*/ - for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) - { - int slider_value = ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->value(); - ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->setText(QString::number(slider_value)); - } - - CheckSegmentsValidity(); -} - -void OpenRGBZoneResizeDialog::on_ResizeBox_valueChanged(int value) -{ - ui->ResizeSlider->blockSignals(true); - ui->ResizeSlider->setValue(value); - ui->ResizeSlider->blockSignals(false); - - /*-----------------------------------------------------*\ - | Set maximum value for all segment sliders to new zone | - | size | - \*-----------------------------------------------------*/ - for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) - { - ((QSlider*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 3))->setMaximum(value); - } - - CheckSegmentsValidity(); -} - -int OpenRGBZoneResizeDialog::show() -{ - int ret_val = 0; - - int result = this->exec(); - - if(result == QDialog::Rejected) - { - ret_val = -1; - } - else - { - ret_val = ui->ResizeBox->value(); - } - - if(ret_val >= 0 && edit_dev != NULL) - { - edit_dev->ResizeZone(edit_zone_idx, ret_val); - - edit_dev->ClearSegments(edit_zone_idx); - - unsigned int start_idx = 0; - - for(int item_idx = 0; item_idx < ui->SegmentsTreeWidget->topLevelItemCount(); item_idx++) - { - segment new_segment; - new_segment.type = ((QComboBox*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 1))->currentIndex(); - new_segment.name = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 0))->text().toStdString(); - new_segment.start_idx = start_idx; - new_segment.leds_count = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(item_idx), 2))->text().toInt(); - - edit_dev->AddSegment(edit_zone_idx, new_segment); - - start_idx += new_segment.leds_count; - } - } - - return(ret_val); -} - -void OpenRGBZoneResizeDialog::AddSegmentRow(QString name, unsigned int length, zone_type type) -{ - /*---------------------------------------------------------*\ - | Create new line in segments list tree | - \*---------------------------------------------------------*/ - QTreeWidgetItem* new_item = new QTreeWidgetItem(ui->SegmentsTreeWidget); - - /*---------------------------------------------------------*\ - | Create new widgets for line | - \*---------------------------------------------------------*/ - QComboBox* combobox_type = new QComboBox(ui->SegmentsTreeWidget); - QLineEdit* lineedit_name = new QLineEdit(ui->SegmentsTreeWidget); - QLineEdit* lineedit_length = new QLineEdit(ui->SegmentsTreeWidget); - QSlider* slider_length = new QSlider(Qt::Horizontal, ui->SegmentsTreeWidget); - - /*---------------------------------------------------------*\ - | Fill in Name field | - \*---------------------------------------------------------*/ - lineedit_name->setText(name); - - /*---------------------------------------------------------*\ - | Set up segment type combo box | - \*---------------------------------------------------------*/ - combobox_type->addItem("Single"); - combobox_type->addItem("Linear"); - //combobox_type->addItem("Matrix"); - - combobox_type->setCurrentIndex(type); - - /*---------------------------------------------------------*\ - | Fill in Length field | - \*---------------------------------------------------------*/ - lineedit_length->setText(QString::number(length)); - - /*---------------------------------------------------------*\ - | Fill in slider length and maximum | - \*---------------------------------------------------------*/ - slider_length->setMaximum(edit_dev->GetZoneLEDsCount(edit_zone_idx)); - slider_length->setValue(length); - - /*---------------------------------------------------------*\ - | Add new widgets to tree | - \*---------------------------------------------------------*/ - ui->SegmentsTreeWidget->setItemWidget(new_item, 0, lineedit_name); - ui->SegmentsTreeWidget->setItemWidget(new_item, 1, combobox_type); - ui->SegmentsTreeWidget->setItemWidget(new_item, 2, lineedit_length); - ui->SegmentsTreeWidget->setItemWidget(new_item, 3, slider_length); - - /*---------------------------------------------------------*\ - | Connect signals for handling slider and line edits | - \*---------------------------------------------------------*/ - connect(lineedit_name, &QLineEdit::textChanged, this, &OpenRGBZoneResizeDialog::on_segment_lineedit_textChanged); - connect(slider_length, &QSlider::valueChanged, this, &OpenRGBZoneResizeDialog::on_segment_slider_valueChanged); - connect(lineedit_length, &QLineEdit::textChanged, this, &OpenRGBZoneResizeDialog::on_segment_lineedit_textChanged); -} - -void OpenRGBZoneResizeDialog::on_AddSegmentButton_clicked() -{ - /*---------------------------------------------------------*\ - | Create new empty row with name "Segment X" | - \*---------------------------------------------------------*/ - QString new_name = "Segment " + QString::number(ui->SegmentsTreeWidget->topLevelItemCount() + 1); - - AddSegmentRow(new_name, 0, ZONE_TYPE_LINEAR); - - CheckSegmentsValidity(); -} - -void OpenRGBZoneResizeDialog::CheckSegmentsValidity() -{ - bool segments_valid = true; - - /*---------------------------------------------------------*\ - | Only check validity if segments are configured | - \*---------------------------------------------------------*/ - if(ui->SegmentsTreeWidget->topLevelItemCount() != 0) - { - /*-----------------------------------------------------*\ - | Verify all segments add up to zone size | - \*-----------------------------------------------------*/ - int total_segment_leds = 0; - - for(int segment_idx = 0; segment_idx < ui->SegmentsTreeWidget->topLevelItemCount(); segment_idx++) - { - unsigned int segment_leds = ((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(segment_idx), 2))->text().toInt(); - - /*-------------------------------------------------*\ - | Zero-length segment is not allowed | - \*-------------------------------------------------*/ - if(segment_leds == 0) - { - segments_valid = false; - } - - total_segment_leds += segment_leds; - - /*-------------------------------------------------*\ - | Empty name is not allowed | - \*-------------------------------------------------*/ - if(((QLineEdit*)ui->SegmentsTreeWidget->itemWidget(ui->SegmentsTreeWidget->topLevelItem(segment_idx), 0))->text().isEmpty()) - { - segments_valid = false; - } - } - - if(total_segment_leds != ui->ResizeBox->value()) - { - segments_valid = false; - } - } - - ui->ButtonBox->setEnabled(segments_valid); -} - -void OpenRGBZoneResizeDialog::on_RemoveSegmentButton_clicked() -{ - ui->SegmentsTreeWidget->takeTopLevelItem(ui->SegmentsTreeWidget->topLevelItemCount() - 1); - - CheckSegmentsValidity(); -} diff --git a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.ui b/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.ui deleted file mode 100644 index 1a94866bc..000000000 --- a/qt/OpenRGBZoneResizeDialog/OpenRGBZoneResizeDialog.ui +++ /dev/null @@ -1,145 +0,0 @@ - - - OpenRGBZoneResizeDialog - - - - 0 - 0 - 450 - 250 - - - - Resize Zone - - - - - - - - Add Segment - - - - - - - Remove Segment - - - - - - - - - - 0 - 0 - - - - Qt::Orientation::Horizontal - - - - - - - 4 - - - - Name - - - - - Type - - - - - Length - - - - - - - - - - - - - - 0 - 0 - - - - Qt::Orientation::Horizontal - - - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok - - - - - - - - 0 - 0 - - - - - - - - - QTooltipedSlider - QSlider -
QTooltipedSlider.h
-
-
- - - - ButtonBox - accepted() - OpenRGBZoneResizeDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - ButtonBox - rejected() - OpenRGBZoneResizeDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - -
diff --git a/qt/i18n/OpenRGB_be_BY.ts b/qt/i18n/OpenRGB_be_BY.ts index 43e4efc28..1387cb842 100644 --- a/qt/i18n/OpenRGB_be_BY.ts +++ b/qt/i18n/OpenRGB_be_BY.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Змяніць памер зоны diff --git a/qt/i18n/OpenRGB_de_DE.ts b/qt/i18n/OpenRGB_de_DE.ts index 93a47669b..21dc2eb91 100644 --- a/qt/i18n/OpenRGB_de_DE.ts +++ b/qt/i18n/OpenRGB_de_DE.ts @@ -1477,7 +1477,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Größe der Zone ändern diff --git a/qt/i18n/OpenRGB_el_GR.ts b/qt/i18n/OpenRGB_el_GR.ts index 96f1b880a..57ae3807c 100644 --- a/qt/i18n/OpenRGB_el_GR.ts +++ b/qt/i18n/OpenRGB_el_GR.ts @@ -1477,7 +1477,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Επαναπροσδιορισμός μεγέθους ζώνης diff --git a/qt/i18n/OpenRGB_en_AU.ts b/qt/i18n/OpenRGB_en_AU.ts index b7cbb33a4..5bae7649d 100644 --- a/qt/i18n/OpenRGB_en_AU.ts +++ b/qt/i18n/OpenRGB_en_AU.ts @@ -1175,7 +1175,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone diff --git a/qt/i18n/OpenRGB_en_GB.ts b/qt/i18n/OpenRGB_en_GB.ts index 8fa190596..3def67567 100644 --- a/qt/i18n/OpenRGB_en_GB.ts +++ b/qt/i18n/OpenRGB_en_GB.ts @@ -1175,7 +1175,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone diff --git a/qt/i18n/OpenRGB_en_US.ts b/qt/i18n/OpenRGB_en_US.ts index d9948d181..a39633579 100644 --- a/qt/i18n/OpenRGB_en_US.ts +++ b/qt/i18n/OpenRGB_en_US.ts @@ -1175,7 +1175,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone diff --git a/qt/i18n/OpenRGB_es_ES.ts b/qt/i18n/OpenRGB_es_ES.ts index 934fb10a2..a14fbf074 100644 --- a/qt/i18n/OpenRGB_es_ES.ts +++ b/qt/i18n/OpenRGB_es_ES.ts @@ -1478,7 +1478,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Redimensionar zona diff --git a/qt/i18n/OpenRGB_fr_FR.ts b/qt/i18n/OpenRGB_fr_FR.ts index a8f69fbaa..4be8c1f66 100644 --- a/qt/i18n/OpenRGB_fr_FR.ts +++ b/qt/i18n/OpenRGB_fr_FR.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Changer la taille de la zone diff --git a/qt/i18n/OpenRGB_hr_HR.ts b/qt/i18n/OpenRGB_hr_HR.ts index aa0230a49..a01f1365c 100644 --- a/qt/i18n/OpenRGB_hr_HR.ts +++ b/qt/i18n/OpenRGB_hr_HR.ts @@ -1478,7 +1478,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Zona prilagodljivih veličina diff --git a/qt/i18n/OpenRGB_it_IT.ts b/qt/i18n/OpenRGB_it_IT.ts index 47b11ebf5..2897aae25 100644 --- a/qt/i18n/OpenRGB_it_IT.ts +++ b/qt/i18n/OpenRGB_it_IT.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Ridimensiona Zona diff --git a/qt/i18n/OpenRGB_ja_JP.ts b/qt/i18n/OpenRGB_ja_JP.ts index 3039a8393..72aa875bb 100644 --- a/qt/i18n/OpenRGB_ja_JP.ts +++ b/qt/i18n/OpenRGB_ja_JP.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone ゾーンリサイズ diff --git a/qt/i18n/OpenRGB_ko_KR.ts b/qt/i18n/OpenRGB_ko_KR.ts index f7845a522..1f961a477 100644 --- a/qt/i18n/OpenRGB_ko_KR.ts +++ b/qt/i18n/OpenRGB_ko_KR.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone 구역 크기 조절 diff --git a/qt/i18n/OpenRGB_ms_MY.ts b/qt/i18n/OpenRGB_ms_MY.ts index bd0fe6223..0ceb4d426 100644 --- a/qt/i18n/OpenRGB_ms_MY.ts +++ b/qt/i18n/OpenRGB_ms_MY.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Ubah saiz Zon diff --git a/qt/i18n/OpenRGB_nb_NO.ts b/qt/i18n/OpenRGB_nb_NO.ts index f632793e1..30a427f63 100644 --- a/qt/i18n/OpenRGB_nb_NO.ts +++ b/qt/i18n/OpenRGB_nb_NO.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Endre størrelse på sone diff --git a/qt/i18n/OpenRGB_pl_PL.ts b/qt/i18n/OpenRGB_pl_PL.ts index 6d5b93812..5456afa74 100644 --- a/qt/i18n/OpenRGB_pl_PL.ts +++ b/qt/i18n/OpenRGB_pl_PL.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Zmien rozmiar strefy diff --git a/qt/i18n/OpenRGB_pt_BR.ts b/qt/i18n/OpenRGB_pt_BR.ts index b57aecd97..c8f0ca39b 100644 --- a/qt/i18n/OpenRGB_pt_BR.ts +++ b/qt/i18n/OpenRGB_pt_BR.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Redimensionar zona diff --git a/qt/i18n/OpenRGB_ru_RU.ts b/qt/i18n/OpenRGB_ru_RU.ts index 577b952b2..158aff27f 100644 --- a/qt/i18n/OpenRGB_ru_RU.ts +++ b/qt/i18n/OpenRGB_ru_RU.ts @@ -1177,7 +1177,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Изменить размер области diff --git a/qt/i18n/OpenRGB_tr_TR.ts b/qt/i18n/OpenRGB_tr_TR.ts index 1a63c7c1b..135b37ed7 100644 --- a/qt/i18n/OpenRGB_tr_TR.ts +++ b/qt/i18n/OpenRGB_tr_TR.ts @@ -1175,7 +1175,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Bölgeyi Yeniden Boyutlandır diff --git a/qt/i18n/OpenRGB_uk_UA.ts b/qt/i18n/OpenRGB_uk_UA.ts index c03ec842f..9be21deb2 100644 --- a/qt/i18n/OpenRGB_uk_UA.ts +++ b/qt/i18n/OpenRGB_uk_UA.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone Змінити розмір зони diff --git a/qt/i18n/OpenRGB_zh_CN.ts b/qt/i18n/OpenRGB_zh_CN.ts index 4f65e2846..a0c6c52bc 100644 --- a/qt/i18n/OpenRGB_zh_CN.ts +++ b/qt/i18n/OpenRGB_zh_CN.ts @@ -1476,7 +1476,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone 调整区域大小 diff --git a/qt/i18n/OpenRGB_zh_TW.ts b/qt/i18n/OpenRGB_zh_TW.ts index b1f3523ac..4f39fbefe 100644 --- a/qt/i18n/OpenRGB_zh_TW.ts +++ b/qt/i18n/OpenRGB_zh_TW.ts @@ -1480,7 +1480,7 @@ - OpenRGBZoneResizeDialog + OpenRGBZoneEditorDialog Resize Zone 調整區域大小