[FancyZones] Template layout settings reset fix (#16628)

This commit is contained in:
Seraphima Zykova
2022-03-04 08:12:25 +03:00
committed by GitHub
parent 5881469855
commit 3a8218be44
8 changed files with 74 additions and 90 deletions

View File

@@ -1338,16 +1338,8 @@ void FancyZones::ApplyQuickLayout(int key) noexcept
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);
AppliedLayouts::instance().ApplyLayout(workArea->UniqueId(), data);
AppliedLayouts::instance().ApplyLayout(workArea->UniqueId(), layout.value());
AppliedLayouts::instance().SaveData();
UpdateZoneSets();
FlashZones();

View File

@@ -7,7 +7,6 @@
#include <FancyZonesLib/GuidUtils.h>
#include <FancyZonesLib/FancyZonesData/CustomLayouts.h>
#include <FancyZonesLib/FancyZonesData/LayoutDefaults.h>
#include <FancyZonesLib/FancyZonesData/LayoutTemplates.h>
#include <FancyZonesLib/FancyZonesWinHookEventIDs.h>
#include <FancyZonesLib/JsonHelpers.h>
#include <FancyZonesLib/util.h>
@@ -320,59 +319,9 @@ bool AppliedLayouts::IsLayoutApplied(const FancyZonesDataTypes::DeviceIdData& id
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);
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);
m_layouts[deviceId] = std::move(layout);
return true;
}

View File

@@ -54,7 +54,7 @@ public:
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 CloneLayout(const FancyZonesDataTypes::DeviceIdData& srcId, const FancyZonesDataTypes::DeviceIdData& dstId);

View File

@@ -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);
if (iter != m_layouts.end())

View File

@@ -5,6 +5,7 @@
#include <memory>
#include <optional>
#include <FancyZonesLib/FancyZonesData/Layout.h>
#include <FancyZonesLib/FancyZonesDataTypes.h>
#include <FancyZonesLib/GuidUtils.h>
#include <FancyZonesLib/ModuleConstants.h>
@@ -63,7 +64,8 @@ public:
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;
private:

View File

@@ -527,20 +527,6 @@ void WorkArea::CalculateZoneSet(OverlappingZonesAlgorithm overlappingAlgorithm)
void WorkArea::UpdateActiveZoneSet(_In_opt_ IZoneSet* zoneSet) noexcept
{
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

View File

@@ -875,7 +875,7 @@ bool ZoneSet::CalculateUniquePriorityGridLayout(Rect workArea, int zoneCount, in
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())
{
return false;

View File

@@ -279,15 +279,26 @@ namespace FancyZonesUnitTests
};
// test
FancyZonesDataTypes::ZoneSetData expectedZoneSetData {
.uuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}",
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus
Layout expectedLayout {
.uuid = FancyZonesUtils::GuidFromString(L"{33A2B101-06E0-437B-A61E-CDBECF502906}").value(),
.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::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)
@@ -322,19 +333,27 @@ namespace FancyZonesUnitTests
AppliedLayouts::instance().LoadData();
// test
FancyZonesDataTypes::ZoneSetData expectedZoneSetData {
.uuid = L"{33A2B101-06E0-437B-A61E-CDBECF502906}",
.type = FancyZonesDataTypes::ZoneSetLayoutType::Focus
Layout expectedLayout{
.uuid = FancyZonesUtils::GuidFromString(L"{33A2B101-06E0-437B-A61E-CDBECF502906}").value(),
.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::IsTrue(AppliedLayouts::instance().GetDeviceLayout(deviceId).has_value());
auto actual = AppliedLayouts::instance().GetAppliedLayoutMap().find(deviceId)->second;
Assert::AreEqual(expectedZoneSetData.uuid.c_str(), FancyZonesUtils::GuidToString(actual.uuid).value().c_str());
Assert::IsTrue(expectedZoneSetData.type == actual.type);
Assert::AreEqual(FancyZonesUtils::GuidToString(expectedLayout.uuid).value().c_str(), FancyZonesUtils::GuidToString(actual.uuid).value().c_str());
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)