Move CompareControllers to RGBController

This commit is contained in:
Adam Honse
2026-06-07 18:08:14 -05:00
parent 962754f379
commit 1afe65d206
5 changed files with 173 additions and 173 deletions

View File

@@ -154,144 +154,6 @@ void ProfileManager::ClearActiveProfile()
SetActiveProfile("");
}
bool ProfileManager::CompareControllers(RGBController* controller_1, RGBController* controller_2)
{
/*-----------------------------------------------------*\
| Do not compare location string for HID devices, as |
| the location string may change between runs as |
| devices are connected and disconnected. Also do not |
| compare the I2C bus number, since it is not |
| persistent across reboots on Linux - strip the I2C |
| number and compare only address. |
\*-----------------------------------------------------*/
bool location_check;
if(controller_1->GetLocation().find("HID: ") == 0)
{
location_check = true;
}
else if(controller_1->GetLocation().find("I2C: ") == 0)
{
std::size_t loc = controller_1->GetLocation().rfind(", ");
if(loc == std::string::npos)
{
location_check = false;
}
else
{
std::string i2c_address = controller_1->GetLocation().substr(loc + 2);
location_check = controller_2->GetLocation().find(i2c_address) != std::string::npos;
}
}
else
{
location_check = controller_2->GetLocation() == controller_1->GetLocation();
}
/*-----------------------------------------------------*\
| Compare top-level controller information |
\*-----------------------------------------------------*/
if((controller_1->GetDeviceType() != controller_2->GetDeviceType() )
|| (controller_1->GetName() != controller_2->GetName() )
|| (controller_1->GetDescription() != controller_2->GetDescription())
|| (controller_1->GetVersion() != controller_2->GetVersion() )
|| (controller_1->GetSerial() != controller_2->GetSerial() )
|| (location_check != true ))
{
return(false);
}
/*-----------------------------------------------------*\
| Compare modes |
\*-----------------------------------------------------*/
if(controller_1->modes.size() != controller_2->modes.size())
{
return(false);
}
else
{
for(std::size_t mode_index = 0; mode_index < controller_1->modes.size(); mode_index++)
{
if((controller_1->GetModeName(mode_index) != controller_2->GetModeName(mode_index) )
|| (controller_1->GetModeValue(mode_index) != controller_2->GetModeValue(mode_index) )
|| (controller_1->GetModeFlags(mode_index) != controller_2->GetModeFlags(mode_index) )
|| (controller_1->GetModeSpeedMin(mode_index) != controller_2->GetModeSpeedMin(mode_index) )
|| (controller_1->GetModeSpeedMax(mode_index) != controller_2->GetModeSpeedMax(mode_index) )
|| (controller_1->GetModeBrightnessMin(mode_index) != controller_2->GetModeBrightnessMin(mode_index))
|| (controller_1->GetModeBrightnessMax(mode_index) != controller_2->GetModeBrightnessMax(mode_index))
|| (controller_1->GetModeColorsMin(mode_index) != controller_2->GetModeColorsMin(mode_index) )
|| (controller_1->GetModeColorsMax(mode_index) != controller_2->GetModeColorsMax(mode_index) ))
{
return(false);
}
}
}
/*-----------------------------------------------------*\
| Compare zones |
\*-----------------------------------------------------*/
if(controller_1->zones.size() != controller_2->zones.size())
{
return(false);
}
else
{
for(std::size_t zone_index = 0; zone_index < controller_1->zones.size(); zone_index++)
{
bool check_zone_geometry = true;
bool check_zone_type = true;
/*---------------------------------------------*\
| Do not check zone type if manually configured |
\*---------------------------------------------*/
if((controller_1->GetZoneFlags(zone_index) & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE)
|| (controller_2->GetZoneFlags(zone_index) & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE))
{
check_zone_type = false;
}
if((controller_1->GetZoneFlags(zone_index) & ZONE_FLAG_ZONE_GEOMETRY_MAY_CHANGE)
|| (controller_2->GetZoneFlags(zone_index) & ZONE_FLAG_ZONE_GEOMETRY_MAY_CHANGE))
{
check_zone_geometry = false;
}
if(( (controller_1->GetZoneName(zone_index) != controller_2->GetZoneName(zone_index) ))
|| (check_zone_type && (controller_1->GetZoneType(zone_index) != controller_2->GetZoneType(zone_index) ))
|| (check_zone_geometry && ((controller_1->GetZoneLEDsMin(zone_index) != controller_2->GetZoneLEDsMin(zone_index) )
|| (controller_1->GetZoneLEDsMax(zone_index) != controller_2->GetZoneLEDsMax(zone_index) )))
|| (controller_1->GetZoneModeCount(zone_index) != controller_2->GetZoneModeCount(zone_index)))
{
return(false);
}
if(controller_1->GetZoneModeCount(zone_index) != controller_2->GetZoneModeCount(zone_index))
{
return(false);
}
else
{
for(std::size_t mode_index = 0; mode_index < controller_1->GetZoneModeCount(zone_index); mode_index++)
{
if((controller_1->GetZoneModeName(zone_index, mode_index) != controller_2->GetZoneModeName(zone_index, mode_index) )
|| (controller_1->GetZoneModeValue(zone_index, mode_index) != controller_2->GetZoneModeValue(zone_index, mode_index) )
|| (controller_1->GetZoneModeFlags(zone_index, mode_index) != controller_2->GetZoneModeFlags(zone_index, mode_index) )
|| (controller_1->GetZoneModeSpeedMin(zone_index, mode_index) != controller_2->GetZoneModeSpeedMin(zone_index, mode_index) )
|| (controller_1->GetZoneModeSpeedMax(zone_index, mode_index) != controller_2->GetZoneModeSpeedMax(zone_index, mode_index) )
|| (controller_1->GetZoneModeBrightnessMin(zone_index, mode_index) != controller_2->GetZoneModeBrightnessMin(zone_index, mode_index))
|| (controller_1->GetZoneModeBrightnessMax(zone_index, mode_index) != controller_2->GetZoneModeBrightnessMax(zone_index, mode_index))
|| (controller_1->GetZoneModeColorsMin(zone_index, mode_index) != controller_2->GetZoneModeColorsMin(zone_index, mode_index) )
|| (controller_1->GetZoneModeColorsMax(zone_index, mode_index) != controller_2->GetZoneModeColorsMax(zone_index, mode_index) ))
{
return(false);
}
}
}
}
}
return(true);
}
void ProfileManager::DeleteProfile(std::string profile_name)
{
if(ResourceManager::get()->IsLocalClient() && (ResourceManager::get()->GetLocalClient()->GetSupportsProfileManagerAPI()))
@@ -646,7 +508,7 @@ bool ProfileManager::SaveProfile(std::string profile_name)
for(std::size_t controller_index = 0; controller_index < controllers.size(); controller_index++)
{
if(ProfileManager::CompareControllers(existing_controllers[existing_controller_index], controllers[controller_index]))
if(RGBController::CompareControllers(existing_controllers[existing_controller_index], controllers[controller_index]))
{
found = true;
break;
@@ -905,7 +767,7 @@ bool ProfileManager::SaveConfiguration()
for(std::size_t controller_index = 0; controller_index < controllers.size(); controller_index++)
{
if(ProfileManager::CompareControllers(manually_configured_rgb_controllers[old_saved_controller_index], controllers[controller_index]))
if(RGBController::CompareControllers(manually_configured_rgb_controllers[old_saved_controller_index], controllers[controller_index]))
{
found = true;
break;

View File

@@ -79,7 +79,6 @@ public:
~ProfileManager();
void ClearActiveProfile();
static bool CompareControllers(RGBController* controller_1, RGBController* controller_2);
void DeleteProfile(std::string profile_name);

View File

@@ -4435,44 +4435,142 @@ zone RGBController::SetZoneDescriptionJSON(nlohmann::json zone_json)
return(new_zone);
}
bool RGBController::SetModeValuesFromMode(mode& destination, mode& source)
bool RGBController::CompareControllers(RGBController* controller_1, RGBController* controller_2)
{
/*-----------------------------------------------------*\
| Validate source mode before updating destination |
| Do not compare location string for HID devices, as |
| the location string may change between runs as |
| devices are connected and disconnected. Also do not |
| compare the I2C bus number, since it is not |
| persistent across reboots on Linux - strip the I2C |
| number and compare only address. |
\*-----------------------------------------------------*/
if((destination.name == source.name)
&& (destination.brightness_max == source.brightness_max)
&& (destination.brightness_min == source.brightness_min)
&& (((destination.brightness_max >= destination.brightness_min) && (source.brightness >= destination.brightness_min) && (source.brightness <= destination.brightness_max))
|| ((destination.brightness_max <= destination.brightness_min) && (source.brightness <= destination.brightness_min) && (source.brightness >= destination.brightness_max)))
&& ((((destination.flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR)) == 0) && (source.color_mode == MODE_COLORS_NONE))
|| ((destination.flags & MODE_FLAG_HAS_PER_LED_COLOR) && (source.color_mode == MODE_COLORS_PER_LED))
|| ((destination.flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) && (source.color_mode == MODE_COLORS_MODE_SPECIFIC))
|| ((destination.flags & MODE_FLAG_HAS_RANDOM_COLOR) && (source.color_mode == MODE_COLORS_RANDOM)))
&& (destination.colors_max == source.colors_max)
&& (destination.colors_min == source.colors_min)
&& ((source.colors.size() >= destination.colors_min) && (source.colors.size() <= destination.colors_max))
&& ((((destination.flags & (MODE_FLAG_HAS_DIRECTION_HV | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD)) == 0) && (source.direction == 0))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_HV) && ((source.direction == MODE_DIRECTION_HORIZONTAL) || (source.direction == MODE_DIRECTION_VERTICAL)))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_LR) && ((source.direction == MODE_DIRECTION_LEFT) || (source.direction == MODE_DIRECTION_RIGHT)))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_UD) && ((source.direction == MODE_DIRECTION_UP) || (source.direction == MODE_DIRECTION_DOWN))))
&& (destination.speed_max == source.speed_max)
&& (destination.speed_min == source.speed_min)
&& (((destination.speed_max >= destination.speed_min) && (source.speed >= destination.speed_min) && (source.speed <= destination.speed_max))
|| ((destination.speed_max <= destination.speed_min) && (source.speed <= destination.speed_min) && (source.speed >= destination.speed_max))))
{
destination.brightness = source.brightness;
destination.color_mode = source.color_mode;
destination.colors = source.colors;
destination.direction = source.direction;
destination.speed = source.speed;
bool location_check;
return(true);
if(controller_1->GetLocation().find("HID: ") == 0)
{
location_check = true;
}
else if(controller_1->GetLocation().find("I2C: ") == 0)
{
std::size_t loc = controller_1->GetLocation().rfind(", ");
if(loc == std::string::npos)
{
location_check = false;
}
else
{
std::string i2c_address = controller_1->GetLocation().substr(loc + 2);
location_check = controller_2->GetLocation().find(i2c_address) != std::string::npos;
}
}
else
{
location_check = controller_2->GetLocation() == controller_1->GetLocation();
}
/*-----------------------------------------------------*\
| Compare top-level controller information |
\*-----------------------------------------------------*/
if((controller_1->GetDeviceType() != controller_2->GetDeviceType() )
|| (controller_1->GetName() != controller_2->GetName() )
|| (controller_1->GetDescription() != controller_2->GetDescription())
|| (controller_1->GetVersion() != controller_2->GetVersion() )
|| (controller_1->GetSerial() != controller_2->GetSerial() )
|| (location_check != true ))
{
return(false);
}
/*-----------------------------------------------------*\
| Compare modes |
\*-----------------------------------------------------*/
if(controller_1->modes.size() != controller_2->modes.size())
{
return(false);
}
else
{
for(unsigned int mode_index = 0; mode_index < (unsigned int)controller_1->modes.size(); mode_index++)
{
if((controller_1->GetModeName(mode_index) != controller_2->GetModeName(mode_index) )
|| (controller_1->GetModeValue(mode_index) != controller_2->GetModeValue(mode_index) )
|| (controller_1->GetModeFlags(mode_index) != controller_2->GetModeFlags(mode_index) )
|| (controller_1->GetModeSpeedMin(mode_index) != controller_2->GetModeSpeedMin(mode_index) )
|| (controller_1->GetModeSpeedMax(mode_index) != controller_2->GetModeSpeedMax(mode_index) )
|| (controller_1->GetModeBrightnessMin(mode_index) != controller_2->GetModeBrightnessMin(mode_index))
|| (controller_1->GetModeBrightnessMax(mode_index) != controller_2->GetModeBrightnessMax(mode_index))
|| (controller_1->GetModeColorsMin(mode_index) != controller_2->GetModeColorsMin(mode_index) )
|| (controller_1->GetModeColorsMax(mode_index) != controller_2->GetModeColorsMax(mode_index) ))
{
return(false);
}
}
}
/*-----------------------------------------------------*\
| Compare zones |
\*-----------------------------------------------------*/
if(controller_1->zones.size() != controller_2->zones.size())
{
return(false);
}
else
{
for(unsigned int zone_index = 0; zone_index < (unsigned int)controller_1->zones.size(); zone_index++)
{
bool check_zone_geometry = true;
bool check_zone_type = true;
/*---------------------------------------------*\
| Do not check zone type if manually configured |
\*---------------------------------------------*/
if((controller_1->GetZoneFlags(zone_index) & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE)
|| (controller_2->GetZoneFlags(zone_index) & ZONE_FLAG_MANUALLY_CONFIGURED_TYPE))
{
check_zone_type = false;
}
if((controller_1->GetZoneFlags(zone_index) & ZONE_FLAG_ZONE_GEOMETRY_MAY_CHANGE)
|| (controller_2->GetZoneFlags(zone_index) & ZONE_FLAG_ZONE_GEOMETRY_MAY_CHANGE))
{
check_zone_geometry = false;
}
if(( (controller_1->GetZoneName(zone_index) != controller_2->GetZoneName(zone_index) ))
|| (check_zone_type && (controller_1->GetZoneType(zone_index) != controller_2->GetZoneType(zone_index) ))
|| (check_zone_geometry && ((controller_1->GetZoneLEDsMin(zone_index) != controller_2->GetZoneLEDsMin(zone_index) )
|| (controller_1->GetZoneLEDsMax(zone_index) != controller_2->GetZoneLEDsMax(zone_index) )))
|| (controller_1->GetZoneModeCount(zone_index) != controller_2->GetZoneModeCount(zone_index)))
{
return(false);
}
if(controller_1->GetZoneModeCount(zone_index) != controller_2->GetZoneModeCount(zone_index))
{
return(false);
}
else
{
for(std::size_t mode_index = 0; mode_index < controller_1->GetZoneModeCount(zone_index); mode_index++)
{
if((controller_1->GetZoneModeName(zone_index, mode_index) != controller_2->GetZoneModeName(zone_index, mode_index) )
|| (controller_1->GetZoneModeValue(zone_index, mode_index) != controller_2->GetZoneModeValue(zone_index, mode_index) )
|| (controller_1->GetZoneModeFlags(zone_index, mode_index) != controller_2->GetZoneModeFlags(zone_index, mode_index) )
|| (controller_1->GetZoneModeSpeedMin(zone_index, mode_index) != controller_2->GetZoneModeSpeedMin(zone_index, mode_index) )
|| (controller_1->GetZoneModeSpeedMax(zone_index, mode_index) != controller_2->GetZoneModeSpeedMax(zone_index, mode_index) )
|| (controller_1->GetZoneModeBrightnessMin(zone_index, mode_index) != controller_2->GetZoneModeBrightnessMin(zone_index, mode_index))
|| (controller_1->GetZoneModeBrightnessMax(zone_index, mode_index) != controller_2->GetZoneModeBrightnessMax(zone_index, mode_index))
|| (controller_1->GetZoneModeColorsMin(zone_index, mode_index) != controller_2->GetZoneModeColorsMin(zone_index, mode_index) )
|| (controller_1->GetZoneModeColorsMax(zone_index, mode_index) != controller_2->GetZoneModeColorsMax(zone_index, mode_index) ))
{
return(false);
}
}
}
}
}
return(true);
}
std::string RGBController::DeviceTypeToString(device_type type)
@@ -4525,3 +4623,44 @@ std::string RGBController::DeviceTypeToString(device_type type)
return "Unknown";
}
}
bool RGBController::SetModeValuesFromMode(mode& destination, mode& source)
{
/*-----------------------------------------------------*\
| Validate source mode before updating destination |
\*-----------------------------------------------------*/
if((destination.name == source.name)
&& (destination.brightness_max == source.brightness_max)
&& (destination.brightness_min == source.brightness_min)
&& (((destination.brightness_max >= destination.brightness_min) && (source.brightness >= destination.brightness_min) && (source.brightness <= destination.brightness_max))
|| ((destination.brightness_max <= destination.brightness_min) && (source.brightness <= destination.brightness_min) && (source.brightness >= destination.brightness_max)))
&& ((((destination.flags & (MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_RANDOM_COLOR)) == 0) && (source.color_mode == MODE_COLORS_NONE))
|| ((destination.flags & MODE_FLAG_HAS_PER_LED_COLOR) && (source.color_mode == MODE_COLORS_PER_LED))
|| ((destination.flags & MODE_FLAG_HAS_MODE_SPECIFIC_COLOR) && (source.color_mode == MODE_COLORS_MODE_SPECIFIC))
|| ((destination.flags & MODE_FLAG_HAS_RANDOM_COLOR) && (source.color_mode == MODE_COLORS_RANDOM)))
&& (destination.colors_max == source.colors_max)
&& (destination.colors_min == source.colors_min)
&& ((source.colors.size() >= destination.colors_min) && (source.colors.size() <= destination.colors_max))
&& ((((destination.flags & (MODE_FLAG_HAS_DIRECTION_HV | MODE_FLAG_HAS_DIRECTION_LR | MODE_FLAG_HAS_DIRECTION_UD)) == 0) && (source.direction == 0))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_HV) && ((source.direction == MODE_DIRECTION_HORIZONTAL) || (source.direction == MODE_DIRECTION_VERTICAL)))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_LR) && ((source.direction == MODE_DIRECTION_LEFT) || (source.direction == MODE_DIRECTION_RIGHT)))
|| ((destination.flags & MODE_FLAG_HAS_DIRECTION_UD) && ((source.direction == MODE_DIRECTION_UP) || (source.direction == MODE_DIRECTION_DOWN))))
&& (destination.speed_max == source.speed_max)
&& (destination.speed_min == source.speed_min)
&& (((destination.speed_max >= destination.speed_min) && (source.speed >= destination.speed_min) && (source.speed <= destination.speed_max))
|| ((destination.speed_max <= destination.speed_min) && (source.speed <= destination.speed_min) && (source.speed >= destination.speed_max))))
{
destination.brightness = source.brightness;
destination.color_mode = source.color_mode;
destination.colors = source.colors;
destination.direction = source.direction;
destination.speed = source.speed;
return(true);
}
else
{
return(false);
}
}

View File

@@ -259,9 +259,9 @@ public:
static segment SetSegmentDescriptionJSON(nlohmann::json segment_json);
static zone SetZoneDescriptionJSON(nlohmann::json zone_json);
static bool SetModeValuesFromMode(mode& destination, mode& source);
static bool CompareControllers(RGBController* controller_1, RGBController* controller_2);
static std::string DeviceTypeToString(device_type type);
static bool SetModeValuesFromMode(mode& destination, mode& source);
protected:
/*-----------------------------------------------------*\

View File

@@ -121,7 +121,7 @@ OpenRGBProfileEditorDialog::OpenRGBProfileEditorDialog(std::string name, QWidget
{
for(std::size_t old_controller_idx = 0; old_controller_idx < old_controllers.size(); old_controller_idx++)
{
if(ProfileManager::CompareControllers(new_controllers[new_controller_idx], old_controllers[old_controller_idx]))
if(RGBController::CompareControllers(new_controllers[new_controller_idx], old_controllers[old_controller_idx]))
{
/*-----------------------------------------*\
| Controllers match, copy from new list to |