From 3c1d8d734a7f3f125a6499db4a9f1c87be6ac1e8 Mon Sep 17 00:00:00 2001 From: Fela Date: Tue, 10 Feb 2026 19:00:40 +0400 Subject: [PATCH 01/67] Zoom instant view --- Telegram/Controls/ZoomBox.cs | 104 +++++++++++++++++++++++++++++ Telegram/Telegram.csproj | 1 + Telegram/Themes/Generic.xaml | 18 +++++ Telegram/Views/InstantPage.xaml | 87 ++++++++++++------------ Telegram/Views/InstantPage.xaml.cs | 58 ++++++++++++++++ 5 files changed, 226 insertions(+), 42 deletions(-) create mode 100644 Telegram/Controls/ZoomBox.cs diff --git a/Telegram/Controls/ZoomBox.cs b/Telegram/Controls/ZoomBox.cs new file mode 100644 index 0000000000..272fd84cbc --- /dev/null +++ b/Telegram/Controls/ZoomBox.cs @@ -0,0 +1,104 @@ +// +// Copyright (c) Fela Ameghino 2015-2026 +// +// Distributed under the GNU General Public License v3.0. (See accompanying +// file LICENSE or copy at https://www.gnu.org/licenses/gpl-3.0.txt) +// + +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; + +namespace Telegram.Controls +{ + [TemplatePart(Name = "ContentPresenter", Type = typeof(UIElement))] + public class ZoomBox : ContentControl + { + private readonly ScaleTransform _transform = new() + { + ScaleX = 1.0, + ScaleY = 1.0 + }; + + private UIElement ContentPresenter; + + #region ZoomFactor + + + public double ZoomFactor + { + get { return (double)GetValue(ZoomFactorProperty); } + set { SetValue(ZoomFactorProperty, value); } + } + + public static readonly DependencyProperty ZoomFactorProperty = + DependencyProperty.Register(nameof(ZoomFactor), typeof(double), typeof(ZoomBox), new PropertyMetadata(1.0, OnZoomFactorChanged)); + + private static void OnZoomFactorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + ((ZoomBox)d).InvalidateMeasure(); + } + + #endregion + + public ZoomBox() + { + DefaultStyleKey = typeof(ZoomBox); + } + + protected override void OnApplyTemplate() + { + if (ContentPresenter != null) + { + ContentPresenter.RenderTransform = null; + } + + ContentPresenter = null; + base.OnApplyTemplate(); + + ContentPresenter = GetTemplateChild(nameof(ContentPresenter)) as ContentPresenter; + + if (ContentPresenter != null && ZoomFactor != 1.0) + { + ContentPresenter.RenderTransform = _transform; + } + } + + protected override Size ArrangeOverride(Size finalSizeInHostCoordinates) + { + double zoomFactor = ZoomFactor; + Size val = finalSizeInHostCoordinates.Scale(zoomFactor); + Size size = base.ArrangeOverride(val); + Size result = size.Scale(1.0 / zoomFactor); + if (zoomFactor != 1.0) + { + _transform.ScaleX = _transform.ScaleY = 1.0 / zoomFactor; + ContentPresenter.RenderTransform = _transform; + } + else + { + ContentPresenter.RenderTransform = null; + } + return result; + } + + protected override Size MeasureOverride(Size availableSizeInHostCoordinates) + { + double zoomFactor = ZoomFactor; + Size val = availableSizeInHostCoordinates.Scale(ZoomFactor); + Size size = base.MeasureOverride(val); + return size.Scale(1.0 / zoomFactor); + } + } + + public static class SizeEx + { + public static Size Scale(this Size size, double scaleFactor) + { + return new Size( + double.IsInfinity(size.Width) ? size.Width : (size.Width * scaleFactor), + double.IsInfinity(size.Height) ? size.Height : (size.Height * scaleFactor)); + } + } +} diff --git a/Telegram/Telegram.csproj b/Telegram/Telegram.csproj index face207b82..d09e727968 100644 --- a/Telegram/Telegram.csproj +++ b/Telegram/Telegram.csproj @@ -421,6 +421,7 @@ RecentChatsView.xaml + diff --git a/Telegram/Themes/Generic.xaml b/Telegram/Themes/Generic.xaml index 1e92537675..3cd4264361 100644 --- a/Telegram/Themes/Generic.xaml +++ b/Telegram/Themes/Generic.xaml @@ -3851,6 +3851,24 @@ + + - - - -