mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
[FancyZones] Template layout settings reset fix (#16628)
This commit is contained in:
@@ -1338,16 +1338,8 @@ void FancyZones::ApplyQuickLayout(int key) noexcept
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto uuidStr = FancyZonesUtils::GuidToString(layoutId.value());
|
|
||||||
if (!uuidStr)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FancyZonesDataTypes::ZoneSetData data{ .uuid = uuidStr.value(), .type = FancyZonesDataTypes::ZoneSetLayoutType::Custom };
|
|
||||||
|
|
||||||
auto workArea = m_workAreaHandler.GetWorkAreaFromCursor(m_currentDesktopId);
|
auto workArea = m_workAreaHandler.GetWorkAreaFromCursor(m_currentDesktopId);
|
||||||
AppliedLayouts::instance().ApplyLayout(workArea->UniqueId(), data);
|
AppliedLayouts::instance().ApplyLayout(workArea->UniqueId(), layout.value());
|
||||||
AppliedLayouts::instance().SaveData();
|
AppliedLayouts::instance().SaveData();
|
||||||
UpdateZoneSets();
|
UpdateZoneSets();
|
||||||
FlashZones();
|
FlashZones();
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include <FancyZonesLib/GuidUtils.h>
|
#include <FancyZonesLib/GuidUtils.h>
|
||||||
#include <FancyZonesLib/FancyZonesData/CustomLayouts.h>
|
#include <FancyZonesLib/FancyZonesData/CustomLayouts.h>
|
||||||
#include <FancyZonesLib/FancyZonesData/LayoutDefaults.h>
|
#include <FancyZonesLib/FancyZonesData/LayoutDefaults.h>
|
||||||
#include <FancyZonesLib/FancyZonesData/LayoutTemplates.h>
|
|
||||||
#include <FancyZonesLib/FancyZonesWinHookEventIDs.h>
|
#include <FancyZonesLib/FancyZonesWinHookEventIDs.h>
|
||||||
#include <FancyZonesLib/JsonHelpers.h>
|
#include <FancyZonesLib/JsonHelpers.h>
|
||||||
#include <FancyZonesLib/util.h>
|
#include <FancyZonesLib/util.h>
|
||||||
@@ -320,59 +319,9 @@ bool AppliedLayouts::IsLayoutApplied(const FancyZonesDataTypes::DeviceIdData& id
|
|||||||
return iter != m_layouts.end();
|
return iter != m_layouts.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AppliedLayouts::ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, const FancyZonesDataTypes::ZoneSetData& layout)
|
bool AppliedLayouts::ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, Layout layout)
|
||||||
{
|
{
|
||||||
auto uuid = FancyZonesUtils::GuidFromString(layout.uuid);
|
m_layouts[deviceId] = std::move(layout);
|
||||||
if (!uuid)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Layout layoutToApply {
|
|
||||||
.uuid = uuid.value(),
|
|
||||||
.type = layout.type,
|
|
||||||
.showSpacing = DefaultValues::ShowSpacing,
|
|
||||||
.spacing = DefaultValues::Spacing,
|
|
||||||
.zoneCount = DefaultValues::ZoneCount,
|
|
||||||
.sensitivityRadius = DefaultValues::SensitivityRadius,
|
|
||||||
};
|
|
||||||
|
|
||||||
// copy layouts properties to the applied-layout
|
|
||||||
auto customLayout = CustomLayouts::instance().GetLayout(layoutToApply.uuid);
|
|
||||||
if (customLayout)
|
|
||||||
{
|
|
||||||
if (customLayout.value().type == FancyZonesDataTypes::CustomLayoutType::Grid)
|
|
||||||
{
|
|
||||||
auto layoutInfo = std::get<FancyZonesDataTypes::GridLayoutInfo>(customLayout.value().info);
|
|
||||||
layoutToApply.sensitivityRadius = layoutInfo.sensitivityRadius();
|
|
||||||
layoutToApply.showSpacing = layoutInfo.showSpacing();
|
|
||||||
layoutToApply.spacing = layoutInfo.spacing();
|
|
||||||
layoutToApply.zoneCount = layoutInfo.zoneCount();
|
|
||||||
}
|
|
||||||
else if (customLayout.value().type == FancyZonesDataTypes::CustomLayoutType::Canvas)
|
|
||||||
{
|
|
||||||
auto layoutInfo = std::get<FancyZonesDataTypes::CanvasLayoutInfo>(customLayout.value().info);
|
|
||||||
layoutToApply.sensitivityRadius = layoutInfo.sensitivityRadius;
|
|
||||||
layoutToApply.zoneCount = (int)layoutInfo.zones.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// check templates only if it wasn't a custom layout, since templates don't have ids yet
|
|
||||||
auto templateLayout = LayoutTemplates::instance().GetLayout(layout.type);
|
|
||||||
if (templateLayout)
|
|
||||||
{
|
|
||||||
auto layoutInfo = templateLayout.value();
|
|
||||||
layoutToApply.sensitivityRadius = layoutInfo.sensitivityRadius;
|
|
||||||
layoutToApply.showSpacing = layoutInfo.showSpacing;
|
|
||||||
layoutToApply.spacing = layoutInfo.spacing;
|
|
||||||
layoutToApply.zoneCount = layoutInfo.zoneCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
m_layouts[deviceId] = std::move(layoutToApply);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public:
|
|||||||
|
|
||||||
bool IsLayoutApplied(const FancyZonesDataTypes::DeviceIdData& id) const noexcept;
|
bool IsLayoutApplied(const FancyZonesDataTypes::DeviceIdData& id) const noexcept;
|
||||||
|
|
||||||
bool ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, const FancyZonesDataTypes::ZoneSetData& layout);
|
bool ApplyLayout(const FancyZonesDataTypes::DeviceIdData& deviceId, Layout layout);
|
||||||
bool ApplyDefaultLayout(const FancyZonesDataTypes::DeviceIdData& deviceId);
|
bool ApplyDefaultLayout(const FancyZonesDataTypes::DeviceIdData& deviceId);
|
||||||
bool CloneLayout(const FancyZonesDataTypes::DeviceIdData& srcId, const FancyZonesDataTypes::DeviceIdData& dstId);
|
bool CloneLayout(const FancyZonesDataTypes::DeviceIdData& srcId, const FancyZonesDataTypes::DeviceIdData& dstId);
|
||||||
|
|
||||||
|
|||||||
@@ -216,7 +216,43 @@ void CustomLayouts::LoadData()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<FancyZonesDataTypes::CustomLayoutData> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
std::optional<Layout> CustomLayouts::GetLayout(const GUID& id) const noexcept
|
||||||
|
{
|
||||||
|
auto iter = m_layouts.find(id);
|
||||||
|
if (iter == m_layouts.end())
|
||||||
|
{
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
FancyZonesDataTypes::CustomLayoutData customLayout = iter->second;
|
||||||
|
Layout layout{
|
||||||
|
.uuid = id,
|
||||||
|
.type = FancyZonesDataTypes::ZoneSetLayoutType::Custom,
|
||||||
|
.showSpacing = DefaultValues::ShowSpacing,
|
||||||
|
.spacing = DefaultValues::Spacing,
|
||||||
|
.zoneCount = DefaultValues::ZoneCount,
|
||||||
|
.sensitivityRadius = DefaultValues::SensitivityRadius
|
||||||
|
};
|
||||||
|
|
||||||
|
if (customLayout.type == FancyZonesDataTypes::CustomLayoutType::Grid)
|
||||||
|
{
|
||||||
|
auto layoutInfo = std::get<FancyZonesDataTypes::GridLayoutInfo>(customLayout.info);
|
||||||
|
layout.sensitivityRadius = layoutInfo.sensitivityRadius();
|
||||||
|
layout.showSpacing = layoutInfo.showSpacing();
|
||||||
|
layout.spacing = layoutInfo.spacing();
|
||||||
|
layout.zoneCount = layoutInfo.zoneCount();
|
||||||
|
}
|
||||||
|
else if (customLayout.type == FancyZonesDataTypes::CustomLayoutType::Canvas)
|
||||||
|
{
|
||||||
|
auto layoutInfo = std::get<FancyZonesDataTypes::CanvasLayoutInfo>(customLayout.info);
|
||||||
|
layout.sensitivityRadius = layoutInfo.sensitivityRadius;
|
||||||
|
layout.zoneCount = (int)layoutInfo.zones.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
return layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::optional<FancyZonesDataTypes::CustomLayoutData> CustomLayouts::GetCustomLayoutData(const GUID& id) const noexcept
|
||||||
{
|
{
|
||||||
auto iter = m_layouts.find(id);
|
auto iter = m_layouts.find(id);
|
||||||
if (iter != m_layouts.end())
|
if (iter != m_layouts.end())
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
|
#include <FancyZonesLib/FancyZonesData/Layout.h>
|
||||||
#include <FancyZonesLib/FancyZonesDataTypes.h>
|
#include <FancyZonesLib/FancyZonesDataTypes.h>
|
||||||
#include <FancyZonesLib/GuidUtils.h>
|
#include <FancyZonesLib/GuidUtils.h>
|
||||||
#include <FancyZonesLib/ModuleConstants.h>
|
#include <FancyZonesLib/ModuleConstants.h>
|
||||||
@@ -63,7 +64,8 @@ public:
|
|||||||
|
|
||||||
void LoadData();
|
void LoadData();
|
||||||
|
|
||||||
std::optional<FancyZonesDataTypes::CustomLayoutData> GetLayout(const GUID& id) const noexcept;
|
std::optional<Layout> GetLayout(const GUID& id) const noexcept;
|
||||||
|
std::optional<FancyZonesDataTypes::CustomLayoutData> GetCustomLayoutData(const GUID& id) const noexcept;
|
||||||
const TCustomLayoutMap& GetAllLayouts() const noexcept;
|
const TCustomLayoutMap& GetAllLayouts() const noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -527,20 +527,6 @@ void WorkArea::CalculateZoneSet(OverlappingZonesAlgorithm overlappingAlgorithm)
|
|||||||
void WorkArea::UpdateActiveZoneSet(_In_opt_ IZoneSet* zoneSet) noexcept
|
void WorkArea::UpdateActiveZoneSet(_In_opt_ IZoneSet* zoneSet) noexcept
|
||||||
{
|
{
|
||||||
m_zoneSet.copy_from(zoneSet);
|
m_zoneSet.copy_from(zoneSet);
|
||||||
|
|
||||||
if (m_zoneSet)
|
|
||||||
{
|
|
||||||
wil::unique_cotaskmem_string zoneSetId;
|
|
||||||
if (SUCCEEDED_LOG(StringFromCLSID(m_zoneSet->Id(), &zoneSetId)))
|
|
||||||
{
|
|
||||||
FancyZonesDataTypes::ZoneSetData data{
|
|
||||||
.uuid = zoneSetId.get(),
|
|
||||||
.type = m_zoneSet->LayoutType()
|
|
||||||
};
|
|
||||||
|
|
||||||
AppliedLayouts::instance().ApplyLayout(m_uniqueId, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT WorkArea::WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept
|
LRESULT WorkArea::WndProc(UINT message, WPARAM wparam, LPARAM lparam) noexcept
|
||||||
|
|||||||
@@ -875,7 +875,7 @@ bool ZoneSet::CalculateUniquePriorityGridLayout(Rect workArea, int zoneCount, in
|
|||||||
|
|
||||||
bool ZoneSet::CalculateCustomLayout(Rect workArea, int spacing) noexcept
|
bool ZoneSet::CalculateCustomLayout(Rect workArea, int spacing) noexcept
|
||||||
{
|
{
|
||||||
const auto zoneSetSearchResult = CustomLayouts::instance().GetLayout(m_config.Id);
|
const auto zoneSetSearchResult = CustomLayouts::instance().GetCustomLayoutData(m_config.Id);
|
||||||
if (!zoneSetSearchResult.has_value())
|
if (!zoneSetSearchResult.has_value())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -279,15 +279,26 @@ namespace FancyZonesUnitTests
|
|||||||
};
|
};
|
||||||
|
|
||||||
// test
|
// test
|
||||||
FancyZonesDataTypes::ZoneSetData expectedZoneSetData {
|
Layout expectedLayout {
|
||||||
.uuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}",
|
.uuid = FancyZonesUtils::GuidFromString(L"{33A2B101-06E0-437B-A61E-CDBECF502906}").value(),
|
||||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus
|
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus,
|
||||||
|
.showSpacing = true,
|
||||||
|
.spacing = 10,
|
||||||
|
.zoneCount = 15,
|
||||||
|
.sensitivityRadius = 30
|
||||||
};
|
};
|
||||||
|
|
||||||
AppliedLayouts::instance().ApplyLayout(deviceId, expectedZoneSetData);
|
AppliedLayouts::instance().ApplyLayout(deviceId, expectedLayout);
|
||||||
|
|
||||||
Assert::IsFalse(AppliedLayouts::instance().GetAppliedLayoutMap().empty());
|
Assert::IsFalse(AppliedLayouts::instance().GetAppliedLayoutMap().empty());
|
||||||
Assert::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
|
Assert::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
|
||||||
|
|
||||||
|
auto actual = AppliedLayouts::instance().GetAppliedLayoutMap().find(deviceId)->second;
|
||||||
|
Assert::IsTrue(expectedLayout.type == actual.type);
|
||||||
|
Assert::AreEqual(expectedLayout.showSpacing, actual.showSpacing);
|
||||||
|
Assert::AreEqual(expectedLayout.spacing, actual.spacing);
|
||||||
|
Assert::AreEqual(expectedLayout.zoneCount, actual.zoneCount);
|
||||||
|
Assert::AreEqual(expectedLayout.sensitivityRadius, actual.sensitivityRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_METHOD (ApplyLayoutReplace)
|
TEST_METHOD (ApplyLayoutReplace)
|
||||||
@@ -322,19 +333,27 @@ namespace FancyZonesUnitTests
|
|||||||
AppliedLayouts::instance().LoadData();
|
AppliedLayouts::instance().LoadData();
|
||||||
|
|
||||||
// test
|
// test
|
||||||
FancyZonesDataTypes::ZoneSetData expectedZoneSetData {
|
Layout expectedLayout{
|
||||||
.uuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}",
|
.uuid = FancyZonesUtils::GuidFromString(L"{33A2B101-06E0-437B-A61E-CDBECF502906}").value(),
|
||||||
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus
|
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus,
|
||||||
|
.showSpacing = true,
|
||||||
|
.spacing = 10,
|
||||||
|
.zoneCount = 15,
|
||||||
|
.sensitivityRadius = 30
|
||||||
};
|
};
|
||||||
|
|
||||||
AppliedLayouts::instance().ApplyLayout(deviceId, expectedZoneSetData);
|
AppliedLayouts::instance().ApplyLayout(deviceId, expectedLayout);
|
||||||
|
|
||||||
Assert::AreEqual((size_t)1, AppliedLayouts::instance().GetAppliedLayoutMap().size());
|
Assert::AreEqual((size_t)1, AppliedLayouts::instance().GetAppliedLayoutMap().size());
|
||||||
Assert::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
|
Assert::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
|
||||||
|
|
||||||
auto actual = AppliedLayouts::instance().GetAppliedLayoutMap().find(deviceId)->second;
|
auto actual = AppliedLayouts::instance().GetAppliedLayoutMap().find(deviceId)->second;
|
||||||
Assert::AreEqual(expectedZoneSetData.uuid.c_str(), FancyZonesUtils::GuidToString(actual.uuid).value().c_str());
|
Assert::AreEqual(FancyZonesUtils::GuidToString(expectedLayout.uuid).value().c_str(), FancyZonesUtils::GuidToString(actual.uuid).value().c_str());
|
||||||
Assert::IsTrue(expectedZoneSetData.type == actual.type);
|
Assert::IsTrue(expectedLayout.type == actual.type);
|
||||||
|
Assert::AreEqual(expectedLayout.showSpacing, actual.showSpacing);
|
||||||
|
Assert::AreEqual(expectedLayout.spacing, actual.spacing);
|
||||||
|
Assert::AreEqual(expectedLayout.zoneCount, actual.zoneCount);
|
||||||
|
Assert::AreEqual(expectedLayout.sensitivityRadius, actual.sensitivityRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_METHOD (ApplyDefaultLayout)
|
TEST_METHOD (ApplyDefaultLayout)
|
||||||
|
|||||||
Reference in New Issue
Block a user