mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 18:57:19 +02:00
[FancyZones] Editor multi monitor support (#6562)
Co-authored-by: Enrico Giordani <enrico.giordani@gmail.com> Co-authored-by: Enrico Giordani <enricogior@users.noreply.github.com>
This commit is contained in:
@@ -15,12 +15,14 @@
|
||||
namespace NonLocalizable
|
||||
{
|
||||
const wchar_t ActiveZoneSetStr[] = L"active-zoneset";
|
||||
const wchar_t AppliedZonesets[] = L"applied-zonesets";
|
||||
const wchar_t AppPathStr[] = L"app-path";
|
||||
const wchar_t AppZoneHistoryStr[] = L"app-zone-history";
|
||||
const wchar_t CanvasStr[] = L"canvas";
|
||||
const wchar_t CellChildMapStr[] = L"cell-child-map";
|
||||
const wchar_t ColumnsPercentageStr[] = L"columns-percentage";
|
||||
const wchar_t ColumnsStr[] = L"columns";
|
||||
const wchar_t CreatedCustomZoneSets[] = L"created-custom-zone-sets";
|
||||
const wchar_t CustomZoneSetsStr[] = L"custom-zone-sets";
|
||||
const wchar_t DeletedCustomZoneSetsStr[] = L"deleted-custom-zone-sets";
|
||||
const wchar_t DeviceIdStr[] = L"device-id";
|
||||
@@ -445,6 +447,64 @@ namespace JSONHelpers
|
||||
}
|
||||
}
|
||||
|
||||
json::JsonObject AppliedZonesetsJSON::ToJson(const TDeviceInfoMap& deviceInfoMap)
|
||||
{
|
||||
json::JsonObject result{};
|
||||
|
||||
json::JsonArray array;
|
||||
for (const auto& info : deviceInfoMap)
|
||||
{
|
||||
JSONHelpers::DeviceInfoJSON deviceInfoJson{ info.first, info.second };
|
||||
array.Append(JSONHelpers::DeviceInfoJSON::ToJson(deviceInfoJson));
|
||||
}
|
||||
|
||||
result.SetNamedValue(NonLocalizable::AppliedZonesets, array);
|
||||
return result;
|
||||
}
|
||||
|
||||
json::JsonObject AppliedZonesetsJSON::ToJson(const TDeviceInfoMap& deviceInfoMap, const GUID& currentVirtualDesktop)
|
||||
{
|
||||
json::JsonObject result{};
|
||||
|
||||
json::JsonArray array;
|
||||
for (const auto& info : deviceInfoMap)
|
||||
{
|
||||
std::optional<FancyZonesDataTypes::DeviceIdData> id = FancyZonesUtils::ParseDeviceId(info.first);
|
||||
if (id.has_value() && id->virtualDesktopId == currentVirtualDesktop)
|
||||
{
|
||||
JSONHelpers::DeviceInfoJSON deviceInfoJson{ info.first, info.second };
|
||||
array.Append(JSONHelpers::DeviceInfoJSON::ToJson(deviceInfoJson));
|
||||
}
|
||||
}
|
||||
|
||||
result.SetNamedValue(NonLocalizable::AppliedZonesets, array);
|
||||
return result;
|
||||
}
|
||||
|
||||
std::optional<TDeviceInfoMap> AppliedZonesetsJSON::FromJson(const json::JsonObject& json)
|
||||
{
|
||||
try
|
||||
{
|
||||
std::unordered_map<std::wstring, FancyZonesDataTypes::DeviceInfoData> appliedZonesets;
|
||||
|
||||
auto zonesets = json.GetNamedArray(NonLocalizable::AppliedZonesets);
|
||||
for (const auto& zoneset : zonesets)
|
||||
{
|
||||
std::optional<DeviceInfoJSON> device = DeviceInfoJSON::FromJson(zoneset.GetObjectW());
|
||||
if (device.has_value())
|
||||
{
|
||||
appliedZonesets.insert(std::make_pair(device->deviceId, device->data));
|
||||
}
|
||||
}
|
||||
|
||||
return appliedZonesets;
|
||||
}
|
||||
catch (const winrt::hresult_error&)
|
||||
{
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
json::JsonObject GetPersistFancyZonesJSON(const std::wstring& zonesSettingsFileName, const std::wstring& appZoneHistoryFileName)
|
||||
{
|
||||
auto result = json::from_file(zonesSettingsFileName);
|
||||
@@ -603,20 +663,34 @@ namespace JSONHelpers
|
||||
return customZoneSetsJSON;
|
||||
}
|
||||
|
||||
void SerializeDeviceInfoToTmpFile(const JSONHelpers::DeviceInfoJSON& deviceInfo, std::wstring_view tmpFilePath)
|
||||
void SerializeDeviceInfoToTmpFile(const TDeviceInfoMap& deviceInfoMap, const GUID& currentVirtualDesktop, std::wstring_view tmpFilePath)
|
||||
{
|
||||
json::JsonObject deviceInfoJson = JSONHelpers::DeviceInfoJSON::ToJson(deviceInfo);
|
||||
json::to_file(tmpFilePath, deviceInfoJson);
|
||||
json::to_file(tmpFilePath, JSONHelpers::AppliedZonesetsJSON::ToJson(deviceInfoMap, currentVirtualDesktop));
|
||||
}
|
||||
|
||||
std::optional<DeviceInfoJSON> ParseDeviceInfoFromTmpFile(std::wstring_view tmpFilePath)
|
||||
void SerializeCustomZoneSetsToTmpFile(const TCustomZoneSetsMap& customZoneSetsMap, std::wstring_view tmpFilePath)
|
||||
{
|
||||
std::optional<DeviceInfoJSON> result{ std::nullopt };
|
||||
json::JsonObject result{};
|
||||
|
||||
json::JsonArray array;
|
||||
for (const auto& zoneSet : customZoneSetsMap)
|
||||
{
|
||||
CustomZoneSetJSON json{ zoneSet.first, zoneSet.second };
|
||||
array.Append(JSONHelpers::CustomZoneSetJSON::ToJson(json));
|
||||
}
|
||||
|
||||
result.SetNamedValue(NonLocalizable::CreatedCustomZoneSets, array);
|
||||
json::to_file(tmpFilePath, result);
|
||||
}
|
||||
|
||||
std::optional<TDeviceInfoMap> ParseDeviceInfoFromTmpFile(std::wstring_view tmpFilePath)
|
||||
{
|
||||
std::optional<TDeviceInfoMap> result{ std::nullopt };
|
||||
if (std::filesystem::exists(tmpFilePath))
|
||||
{
|
||||
if (auto zoneSetJson = json::from_file(tmpFilePath); zoneSetJson.has_value())
|
||||
{
|
||||
if (auto deviceInfo = JSONHelpers::DeviceInfoJSON::FromJson(zoneSetJson.value()); deviceInfo.has_value())
|
||||
if (auto deviceInfo = JSONHelpers::AppliedZonesetsJSON::FromJson(zoneSetJson.value()); deviceInfo.has_value())
|
||||
{
|
||||
result = std::move(deviceInfo);
|
||||
}
|
||||
@@ -627,24 +701,27 @@ namespace JSONHelpers
|
||||
return result;
|
||||
}
|
||||
|
||||
std::optional<CustomZoneSetJSON> ParseCustomZoneSetFromTmpFile(std::wstring_view tmpFilePath)
|
||||
std::vector<CustomZoneSetJSON> ParseCustomZoneSetsFromTmpFile(std::wstring_view tmpFilePath)
|
||||
{
|
||||
std::optional<CustomZoneSetJSON> result{ std::nullopt };
|
||||
std::vector<CustomZoneSetJSON> result;
|
||||
if (std::filesystem::exists(tmpFilePath))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (auto customZoneSetJson = json::from_file(tmpFilePath); customZoneSetJson.has_value())
|
||||
{
|
||||
if (auto customZoneSet = JSONHelpers::CustomZoneSetJSON::FromJson(customZoneSetJson.value()); customZoneSet.has_value())
|
||||
auto zoneSetArray = customZoneSetJson.value().GetNamedArray(NonLocalizable::CreatedCustomZoneSets);
|
||||
for (const auto& zoneSet : zoneSetArray)
|
||||
{
|
||||
result = std::move(customZoneSet);
|
||||
if (auto customZoneSet = JSONHelpers::CustomZoneSetJSON::FromJson(zoneSet.GetObjectW()); customZoneSet.has_value())
|
||||
{
|
||||
result.emplace_back(std::move(*customZoneSet));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const winrt::hresult_error&)
|
||||
{
|
||||
result = std::nullopt;
|
||||
}
|
||||
|
||||
DeleteTmpFile(tmpFilePath);
|
||||
@@ -676,4 +753,4 @@ namespace JSONHelpers
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user