From d1d6f12f05619eb46131094e5a1167e72df95be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Sun, 10 Nov 2024 23:28:25 +0100 Subject: [PATCH] Ground work for Wino Calendar. (#475) Wino Calendar abstractions. --- .../AccountManagementViewModel.cs | 37 ++ Wino.Calendar.ViewModels/AppShellViewModel.cs | 237 ++++++++++ .../CalendarPageViewModel.cs | 436 ++++++++++++++++++ .../CalendarSettingsPageViewModel.cs | 127 +++++ .../Wino.Calendar.ViewModels.csproj | 20 + .../Activation/DefaultActivationHandler.cs | 24 + Wino.Calendar/App.xaml | 33 +- Wino.Calendar/App.xaml.cs | 145 +++--- .../Args/TimelineCellSelectedArgs.cs | 41 ++ .../Args/TimelineCellUnselectedArgs.cs | 9 + Wino.Calendar/Assets/LargeTile.scale-100.png | Bin 0 -> 6351 bytes Wino.Calendar/Assets/LargeTile.scale-125.png | Bin 0 -> 8022 bytes Wino.Calendar/Assets/LargeTile.scale-150.png | Bin 0 -> 9805 bytes Wino.Calendar/Assets/LargeTile.scale-200.png | Bin 0 -> 17024 bytes Wino.Calendar/Assets/LargeTile.scale-400.png | Bin 0 -> 45230 bytes Wino.Calendar/Assets/SmallTile.scale-100.png | Bin 0 -> 2108 bytes Wino.Calendar/Assets/SmallTile.scale-125.png | Bin 0 -> 2596 bytes Wino.Calendar/Assets/SmallTile.scale-150.png | Bin 0 -> 3092 bytes Wino.Calendar/Assets/SmallTile.scale-200.png | Bin 0 -> 3958 bytes Wino.Calendar/Assets/SmallTile.scale-400.png | Bin 0 -> 8075 bytes .../Assets/SplashScreen.scale-100.png | Bin 0 -> 6789 bytes .../Assets/SplashScreen.scale-125.png | Bin 0 -> 8513 bytes .../Assets/SplashScreen.scale-150.png | Bin 0 -> 10508 bytes .../Assets/SplashScreen.scale-200.png | Bin 7700 -> 17762 bytes .../Assets/SplashScreen.scale-400.png | Bin 0 -> 51234 bytes .../Assets/Square150x150Logo.scale-100.png | Bin 0 -> 3053 bytes .../Assets/Square150x150Logo.scale-125.png | Bin 0 -> 3774 bytes .../Assets/Square150x150Logo.scale-150.png | Bin 0 -> 4529 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 2937 -> 6191 bytes .../Assets/Square150x150Logo.scale-400.png | Bin 0 -> 16111 bytes ...go.altform-lightunplated_targetsize-16.png | Bin 0 -> 809 bytes ...go.altform-lightunplated_targetsize-24.png | Bin 0 -> 1244 bytes ...o.altform-lightunplated_targetsize-256.png | Bin 0 -> 19909 bytes ...go.altform-lightunplated_targetsize-32.png | Bin 0 -> 1615 bytes ...go.altform-lightunplated_targetsize-48.png | Bin 0 -> 2485 bytes ...x44Logo.altform-unplated_targetsize-16.png | Bin 0 -> 809 bytes ...44Logo.altform-unplated_targetsize-256.png | Bin 0 -> 19909 bytes ...x44Logo.altform-unplated_targetsize-32.png | Bin 0 -> 1615 bytes ...x44Logo.altform-unplated_targetsize-48.png | Bin 0 -> 2485 bytes .../Assets/Square44x44Logo.scale-100.png | Bin 0 -> 1682 bytes .../Assets/Square44x44Logo.scale-125.png | Bin 0 -> 2221 bytes .../Assets/Square44x44Logo.scale-150.png | Bin 0 -> 2568 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 1647 -> 3297 bytes .../Assets/Square44x44Logo.scale-400.png | Bin 0 -> 6668 bytes .../Assets/Square44x44Logo.targetsize-16.png | Bin 0 -> 596 bytes .../Assets/Square44x44Logo.targetsize-24.png | Bin 0 -> 920 bytes ...x44Logo.targetsize-24_altform-unplated.png | Bin 1255 -> 1244 bytes .../Assets/Square44x44Logo.targetsize-256.png | Bin 0 -> 12616 bytes .../Assets/Square44x44Logo.targetsize-32.png | Bin 0 -> 1281 bytes .../Assets/Square44x44Logo.targetsize-48.png | Bin 0 -> 1918 bytes .../{StoreLogo.png => StoreLogo.backup.png} | Bin Wino.Calendar/Assets/StoreLogo.scale-100.png | Bin 0 -> 2455 bytes Wino.Calendar/Assets/StoreLogo.scale-125.png | Bin 0 -> 3123 bytes Wino.Calendar/Assets/StoreLogo.scale-150.png | Bin 0 -> 3588 bytes Wino.Calendar/Assets/StoreLogo.scale-200.png | Bin 0 -> 4820 bytes Wino.Calendar/Assets/StoreLogo.scale-400.png | Bin 0 -> 12580 bytes .../Assets/Wide310x150Logo.scale-100.png | Bin 0 -> 3278 bytes .../Assets/Wide310x150Logo.scale-125.png | Bin 0 -> 4090 bytes .../Assets/Wide310x150Logo.scale-150.png | Bin 0 -> 4897 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 3204 -> 6789 bytes .../Assets/Wide310x150Logo.scale-400.png | Bin 0 -> 17762 bytes .../Controls/CalendarDayItemsControl.cs | 132 ++++++ Wino.Calendar/Controls/CalendarItemControl.cs | 42 ++ .../Controls/CustomCalendarFlipView.cs | 42 ++ Wino.Calendar/Controls/DayColumnControl.cs | 65 +++ Wino.Calendar/Controls/DayHeaderControl.cs | 57 +++ Wino.Calendar/Controls/WinoCalendarControl.cs | 144 ++++++ .../Controls/WinoCalendarFlipView.cs | 91 ++++ Wino.Calendar/Controls/WinoCalendarPanel.cs | 254 ++++++++++ .../WinoCalendarTypeSelectorControl.cs | 92 ++++ Wino.Calendar/Controls/WinoCalendarView.cs | 145 ++++++ .../Controls/WinoDayTimelineCanvas.cs | 277 +++++++++++ Wino.Calendar/MainPage.xaml | 10 +- .../Models/CalendarItemMeasurement.cs | 17 + Wino.Calendar/Package.appxmanifest | 4 +- Wino.Calendar/Properties/Default.rd.xml | 23 +- .../Services/ApplicationResourceManager.cs | 12 + Wino.Calendar/Services/DialogService.cs | 15 + Wino.Calendar/Services/NavigationService.cs | 51 ++ .../Services/SettingsBuilderService.cs | 20 + .../Styles/CalendarDayItemsControl.xaml | 21 + .../Styles/CalendarItemControlResources.xaml | 29 ++ .../CalendarItemControlResources.xaml.cs | 12 + .../Styles/CalendarRenderStyles.xaml | 26 ++ Wino.Calendar/Styles/DayColumnControl.xaml | 93 ++++ Wino.Calendar/Styles/DayHeaderControl.xaml | 23 + .../Styles/WinoCalendarResources.xaml | 128 +++++ .../Styles/WinoCalendarResources.xaml.cs | 12 + .../WinoCalendarTypeSelectorControl.xaml | 64 +++ Wino.Calendar/Styles/WinoCalendarView.xaml | 46 ++ .../Styles/WinoDayTimelineCanvas.xaml | 19 + .../Abstract/AccountManagementPageAbstract.cs | 7 + .../Views/Abstract/AppShellAbstract.cs | 7 + .../Views/Abstract/CalendarPageAbstract.cs | 7 + .../Abstract/CalendarSettingsPageAbstract.cs | 7 + .../Views/Account/AccountManagementPage.xaml | 12 + .../Account/AccountManagementPage.xaml.cs | 12 + Wino.Calendar/Views/AppShell.xaml | 251 ++++++++++ Wino.Calendar/Views/AppShell.xaml.cs | 57 +++ Wino.Calendar/Views/CalendarPage.xaml | 75 +++ Wino.Calendar/Views/CalendarPage.xaml.cs | 77 ++++ .../Views/Settings/CalendarSettingsPage.xaml | 197 ++++++++ .../Settings/CalendarSettingsPage.xaml.cs | 13 + Wino.Calendar/Wino.Calendar.csproj | 180 +++++++- .../Entities/Calendar/AccountCalendar.cs | 16 + .../Entities/Calendar/Attendee.cs | 16 + .../Entities/Calendar/CalendarItem.cs | 24 + .../Entities/Calendar/RecurrenceRule.cs | 20 + .../Entities/Calendar/Reminder.cs | 16 + .../Entities/{ => Mail}/AccountSignature.cs | 2 +- .../Entities/{ => Mail}/MailAccountAlias.cs | 2 +- .../Entities/{ => Mail}/MailCopy.cs | 3 +- .../Entities/{ => Mail}/MailItemFolder.cs | 2 +- .../Entities/{ => Mail}/MergedInbox.cs | 2 +- .../Entities/{ => Shared}/AccountContact.cs | 2 +- .../{ => Shared}/CustomServerInformation.cs | 2 +- .../Entities/{ => Shared}/MailAccount.cs | 3 +- .../{ => Shared}/MailAccountPreferences.cs | 2 +- .../Entities/{ => Shared}/TokenInformation.cs | 2 +- Wino.Core.Domain/Enums/AttendeeStatus.cs | 9 + Wino.Core.Domain/Enums/CalendarDisplayType.cs | 11 + .../Enums/CalendarInitInitiative.cs | 11 + .../Enums/CalendarItemRecurrenceFrequency.cs | 10 + .../Enums/CalendarItemReminderType.cs | 8 + Wino.Core.Domain/Enums/CalendarItemStatus.cs | 9 + .../Enums/CalendarItemVisibility.cs | 8 + .../Enums/CalendarLoadDirection.cs | 12 + .../Enums/DayHeaderDisplayType.cs | 8 + Wino.Core.Domain/Enums/WinoPage.cs | 6 +- .../AuthenticationAttentionException.cs | 2 +- .../Interfaces/IAccountMenuItem.cs | 3 +- .../Interfaces/IAccountProviderDetails.cs | 2 +- .../Interfaces/IAccountService.cs | 3 +- .../Interfaces/IApplicationResourceManager.cs | 1 + Wino.Core.Domain/Interfaces/IAuthenticator.cs | 2 +- .../Interfaces/IBaseSynchronizer.cs | 4 +- .../Interfaces/ICalendarDialogService.cs | 6 + Wino.Core.Domain/Interfaces/ICalendarItem.cs | 14 + .../Interfaces/ICreateAccountAliasDialog.cs | 2 +- .../ICustomServerAccountCreationDialog.cs | 2 +- .../Interfaces/IDialogServiceBase.cs | 25 + .../Interfaces/IFolderMenuItem.cs | 2 +- Wino.Core.Domain/Interfaces/IFolderService.cs | 3 +- .../Interfaces/IImapTestService.cs | 2 +- ...DialogService.cs => IMailDialogService.cs} | 24 +- Wino.Core.Domain/Interfaces/IMailService.cs | 3 +- .../Interfaces/IPreferencesService.cs | 72 ++- Wino.Core.Domain/Interfaces/IRequestBundle.cs | 2 +- .../Interfaces/ISettingsBuilderService.cs | 10 + .../Interfaces/ISignatureService.cs | 2 +- .../Interfaces/IStatePersistenceService.cs | 11 + .../Interfaces/ISynchronizerFactory.cs | 2 +- .../Interfaces/IThreadingStrategy.cs | 2 +- .../Interfaces/IWinoNavigationService.cs | 12 +- .../Models/Accounts/ProviderDetail.cs | 2 +- .../AutoDiscovery/AutoDiscoverySettings.cs | 2 +- .../Models/Calendar/CalendarDayModel.cs | 26 ++ .../Models/Calendar/CalendarItem.cs | 24 + .../Calendar/CalendarPageNavigationArgs.cs | 10 + .../Models/Calendar/CalendarRenderOptions.cs | 14 + .../Models/Calendar/CalendarSettings.cs | 15 + .../BaseCalendarTypeDrawingStrategy.cs | 38 ++ .../DayCalendarDrawingStrategy.cs | 36 ++ .../WeekCalendarDrawingStrategy.cs | 35 ++ .../CalendarViewDayClickedEventArgs.cs | 10 + Wino.Core.Domain/Models/Calendar/DateRange.cs | 42 ++ .../Models/Calendar/DayHeaderRenderModel.cs | 14 + .../Models/Calendar/DayRangeRenderModel.cs | 50 ++ .../Models/Comparers/FolderNameComparer.cs | 2 +- .../Connectivity/ImapClientPoolOptions.cs | 2 +- .../Models/Folders/AccountFolderTree.cs | 2 +- .../FolderOperationPreperationRequest.cs | 2 +- .../Folders}/SystemFolderConfiguration.cs | 6 +- .../Models/MailItem/DraftCreationOptions.cs | 2 +- .../MailItem/DraftPreparationRequest.cs | 3 +- Wino.Core.Domain/Models/MailItem/IMailItem.cs | 3 +- .../Models/MailItem/MailInsertPackage.cs | 2 +- .../MailOperationPreperationRequest.cs | 2 +- .../MailItem/SendDraftPreparationRequest.cs | 3 +- .../Models/MailItem/ThreadMailItem.cs | 3 +- .../Navigation/NavigationTransitionType.cs | 3 +- .../Models/Requests/RequestBase.cs | 2 +- .../Models/Settings/SettingOption.cs | 6 + .../Translations/WinoTranslationDictionary.cs | 2 +- .../Translations/en_US/resources.json | 2 + Wino.Core.Domain/Wino.Core.Domain.csproj | 7 +- .../Activation/ActivationHandler.cs | 6 +- .../AppThemes/Acrylic.xaml | 0 .../AppThemes/Clouds.xaml | 0 .../AppThemes/Custom.xaml | 0 .../AppThemes/Forest.xaml | 0 .../AppThemes/Garden.xaml | 0 .../AppThemes/Mica.xaml | 0 .../AppThemes/Nighty.xaml | 0 .../AppThemes/Snowflake.xaml | 0 .../AppThemes/TestTheme.xaml | 0 .../Assets/FileTypes/type_archive.png | Bin .../Assets/FileTypes/type_audio.png | Bin .../Assets/FileTypes/type_executable.png | Bin .../Assets/FileTypes/type_html.png | Bin .../Assets/FileTypes/type_image.png | Bin .../Assets/FileTypes/type_none.png | Bin .../Assets/FileTypes/type_other.png | Bin .../Assets/FileTypes/type_pdf.png | Bin .../Assets/FileTypes/type_rar.png | Bin .../Assets/FileTypes/type_video.png | Bin .../Assets/Providers/Gmail.png | Bin .../Assets/Providers/IMAP4.png | Bin .../Assets/Providers/Office 365.png | Bin .../Assets/Providers/Outlook.png | Bin .../Assets/Providers/Yahoo.png | Bin .../BackgroundImages/Acrylic.jpg | Bin .../BackgroundImages/Clouds.jpg | Bin .../BackgroundImages/Forest.jpg | Bin .../BackgroundImages/Garden.jpg | Bin .../BackgroundImages/Mica.jpg | Bin .../BackgroundImages/Nighty.jpg | Bin .../BackgroundImages/Snowflake.jpg | Bin {Wino.Mail => Wino.Core.UWP}/BasePage.cs | 26 +- .../Controls/ControlConstants.cs | 2 +- Wino.Core.UWP/Controls/WinoAppTitleBar.xaml | 189 ++++++++ .../Controls}/WinoAppTitleBar.xaml.cs | 49 +- .../Controls/WinoFontIcon.cs | 2 +- .../Controls/WinoFontIconSource.cs | 1 + .../Controls/WinoInfoBar.cs | 2 +- .../Controls/WinoNavigationViewItem.cs | 4 +- .../Converters/GridLengthConverter.cs | 0 .../Converters/ReverseBooleanConverter.cs | 0 .../ReverseBooleanToVisibilityConverter.cs | 0 Wino.Core.UWP/CoreGeneric.xaml | 99 ++++ Wino.Core.UWP/CoreGeneric.xaml.cs | 9 + Wino.Core.UWP/CoreUWPContainerSetup.cs | 17 + .../Dialogs/AccountCreationDialog.xaml | 0 .../Dialogs/AccountCreationDialog.xaml.cs | 3 +- .../Dialogs/AccountEditDialog.xaml | 10 +- .../Dialogs/AccountEditDialog.xaml.cs | 2 +- .../Dialogs/AccountPickerDialog.xaml | 18 +- .../Dialogs/AccountPickerDialog.xaml.cs | 2 +- .../Dialogs/BaseAccountCreationDialog.cs | 0 ...CustomMessageDialogInformationContainer.cs | 0 .../Dialogs/CustomThemeBuilderDialog.xaml | 40 +- .../Dialogs/CustomThemeBuilderDialog.xaml.cs | 6 +- .../Dialogs/TextInputDialog.xaml | 14 +- .../Dialogs/TextInputDialog.xaml.cs | 0 .../Extensions/AnimationExtensions.cs | 0 .../Extensions/CompositionEnums.cs | 0 .../CompositionExtensions.Implicit.cs | 0 .../Extensions/CompositionExtensions.Size.cs | 0 .../Extensions/UIExtensions.cs | 0 .../Extensions/UtilExtensions.cs | 4 +- .../Helpers/WinoVisualTreeHelper.cs | 26 +- .../Helpers/XamlHelpers.cs | 2 +- .../AppThemePreviewTemplateSelector.cs | 2 +- .../CustomWinoMessageDialogIconSelector.cs | 2 +- .../Selectors/FileAttachmentTypeSelector.cs | 9 +- .../NavigationMenuTemplateSelector.cs | 4 +- .../Services/ApplicationResourceManager.cs | 27 ++ .../Services/ConfigurationService.cs | 5 + Wino.Core.UWP/Services/DialogServiceBase.cs | 205 ++++++++ .../Services/NavigationServiceBase.cs | 28 ++ Wino.Core.UWP/Services/NotificationBuilder.cs | 2 +- Wino.Core.UWP/Services/PreferencesService.cs | 76 +++ .../Services/StatePersistenceService.cs | 42 +- Wino.Core.UWP/Services/StoreRatingService.cs | 4 +- .../Styles/Colors.xaml | 4 + .../Styles/ContentPresenters.xaml | 2 +- .../Styles/Converters.xaml | 0 .../Styles/CustomMessageDialogStyles.xaml | 4 +- .../Styles/CustomMessageDialogStyles.xaml.cs | 2 +- Wino.Core.UWP/Styles/DataTemplates.xaml | 69 +++ Wino.Core.UWP/Styles/DataTemplates.xaml.cs | 12 + .../Styles/FontIcons.xaml | 0 Wino.Core.UWP/Styles/IconTemplates.xaml | 61 +++ .../Styles/WinoInfoBar.xaml | 6 +- .../Abstract/SettingOptionsPageAbstract.cs | 2 +- .../Views/Abstract/SettingsPageAbstract.cs | 3 +- .../Views/Abstract/SettingsPageBase.cs | 5 +- Wino.Core.UWP/Views/SettingOptionsPage.xaml | 37 ++ .../Views}/SettingOptionsPage.xaml.cs | 0 .../Views/SettingsPage.xaml | 0 .../Views/SettingsPage.xaml.cs | 18 +- Wino.Core.UWP/Wino.Core.UWP.csproj | 247 +++++++++- Wino.Core.UWP/WinoApplication.cs | 250 ++++++++++ .../AboutPageViewModel.cs | 18 +- .../AccountManagementPageViewModelBase.cs | 124 +++++ Wino.Core.ViewModels/CalendarBaseViewModel.cs | 13 + Wino.Core.ViewModels/CoreBaseViewModel.cs | 55 +++ .../Data/AccountProviderDetailViewModel.cs | 2 +- .../Data/AppColorViewModel.cs | 2 +- .../Data/BreadcrumbNavigationItemViewModel.cs | 0 .../MergedAccountProviderDetailViewModel.cs | 5 +- .../NewAccountManagementPageViewModel.cs | 11 + .../PersonalizationPageViewModel.cs | 25 +- .../SettingOptionsPageViewModel.cs | 33 +- Wino.Core.ViewModels/SettingsPageViewModel.cs | 14 + Wino.Core.ViewModels/SettingsViewModel.cs | 11 + .../Wino.Core.ViewModels.csproj | 23 + .../{ => Base}/BaseAuthenticator.cs | 4 +- .../Base/GmailAuthenticatorBase.cs | 21 + .../Base/OutlookAuthenticatorBase.cs | 20 + .../Calendar/OutlookAuthenticator.cs | 30 ++ .../{ => Mail}/GmailAuthenticator.cs | 15 +- .../{ => Mail}/Office365Authenticator.cs | 2 +- .../{ => Mail}/OutlookAuthenticator.cs | 15 +- Wino.Core/CoreContainerSetup.cs | 3 +- Wino.Core/Extensions/DateTimeExtensions.cs | 35 ++ .../Extensions/GoogleIntegratorExtensions.cs | 2 +- .../Extensions/MailkitClientExtensions.cs | 2 +- Wino.Core/Extensions/MailkitExtensions.cs | 2 +- .../Extensions/OutlookIntegratorExtensions.cs | 2 +- .../Extensions/TokenizationExtensions.cs | 2 +- Wino.Core/Http/GmailClientMessageHandler.cs | 2 +- Wino.Core/Http/MicrosoftTokenProvider.cs | 2 +- .../Integration/BaseCalendarIntegrator.cs | 9 + Wino.Core/Integration/ImapClientPool.cs | 2 +- .../Json/ServerRequestTypeInfoResolver.cs | 2 +- .../Processors/DefaultChangeProcessor.cs | 3 +- .../Threading/APIThreadingStrategy.cs | 2 +- .../Threading/ImapThreadStrategy.cs | 2 +- Wino.Core/MenuItems/AccountMenuItem.cs | 2 +- .../MenuItems/FixAccountIssuesMenuItem.cs | 2 +- Wino.Core/MenuItems/FolderMenuItem.cs | 2 +- .../MenuItems/MergedAccountFolderMenuItem.cs | 2 +- Wino.Core/MenuItems/MergedAccountMenuItem.cs | 3 +- .../MenuItems/ObservableRangeCollection.cs | 10 + Wino.Core/Requests/AlwaysMoveToRequest.cs | 2 +- Wino.Core/Requests/ArchiveRequest.cs | 2 +- Wino.Core/Requests/Bundles/RequestBundle.cs | 2 +- .../Requests/Bundles/ServerRequestPackage.cs | 2 +- Wino.Core/Requests/ChangeFlagRequest.cs | 2 +- Wino.Core/Requests/DeleteRequest.cs | 2 +- Wino.Core/Requests/EmptyFolderRequest.cs | 2 +- Wino.Core/Requests/MarkFolderAsReadRequest.cs | 2 +- Wino.Core/Requests/MarkReadRequest.cs | 2 +- Wino.Core/Requests/MoveRequest.cs | 2 +- Wino.Core/Requests/MoveToFocusedRequest.cs | 2 +- Wino.Core/Requests/RenameFolderRequest.cs | 2 +- Wino.Core/Services/AccountService.cs | 3 +- Wino.Core/Services/AuthenticationProvider.cs | 2 +- Wino.Core/Services/ContactService.cs | 2 +- Wino.Core/Services/DatabaseService.cs | 3 +- Wino.Core/Services/FolderService.cs | 3 +- Wino.Core/Services/ImapTestService.cs | 2 +- Wino.Core/Services/MailService.cs | 3 +- Wino.Core/Services/SignatureService.cs | 2 +- Wino.Core/Services/SynchronizerFactory.cs | 12 +- Wino.Core/Services/TokenService.cs | 2 +- Wino.Core/Services/WinoRequestDelegator.cs | 4 +- Wino.Core/Services/WinoRequestProcessor.cs | 6 +- ...ynchronizer.cs => BaseMailSynchronizer.cs} | 9 +- .../Calendar/BaseCalendarSynchronizer.cs | 9 + .../Calendar/OutlookCalendarSynchronizer.cs | 23 + .../{ => Mail}/GmailSynchronizer.cs | 9 +- .../{ => Mail}/ImapSynchronizer.cs | 27 +- .../{ => Mail}/OutlookSynchronizer.cs | 12 +- Wino.Core/Wino.Core.csproj | 24 +- .../AccountDetailsPageViewModel.cs | 18 +- .../AccountManagementViewModel.cs | 149 ++---- .../AliasManagementPageViewModel.cs | 26 +- .../AppPreferencesPageViewModel.cs | 20 +- Wino.Mail.ViewModels/AppShellViewModel.cs | 51 +- .../Collections/WinoMailCollection.cs | 2 +- Wino.Mail.ViewModels/ComposePageViewModel.cs | 31 +- .../Data/MailItemViewModel.cs | 3 +- .../Data/ThreadMailItemViewModel.cs | 3 +- Wino.Mail.ViewModels/IdlePageViewModel.cs | 5 +- .../LanguageTimePageViewModel.cs | 4 +- ...{BaseViewModel.cs => MailBaseViewModel.cs} | 59 +-- Wino.Mail.ViewModels/MailListPageViewModel.cs | 13 +- .../MailRenderingPageViewModel.cs | 63 +-- .../MergedAccountDetailsPageViewModel.cs | 13 +- .../MessageListPageViewModel.cs | 6 +- .../NewAccountManagementPageViewModel.cs | 11 - .../ReadComposePanePageViewModel.cs | 6 +- Wino.Mail.ViewModels/SettingsPageViewModel.cs | 11 - Wino.Mail.ViewModels/SettingsViewModel.cs | 11 - .../SignatureManagementPageViewModel.cs | 14 +- Wino.Mail.ViewModels/WelcomePageViewModel.cs | 9 +- .../Wino.Mail.ViewModels.csproj | 3 +- Wino.Mail/Activation/FileActivationHandler.cs | 7 +- Wino.Mail/App.xaml | 239 +--------- Wino.Mail/App.xaml.cs | 411 ++++------------- Wino.Mail/AppShell.xaml | 137 ++---- Wino.Mail/AppShell.xaml.cs | 14 +- .../Behaviors/BindableCommandBarBehavior.cs | 1 + .../CreateMailNavigationItemBehavior.cs | 2 +- Wino.Mail/Controls/AccountNavigationItem.cs | 1 + .../Controls/Advanced/WinoAppTitleBar.xaml | 173 ------- .../MailItemDisplayInformationControl.xaml | 7 +- .../MailItemDisplayInformationControl.xaml.cs | 2 +- Wino.Mail/Dialogs/AccountReorderDialog.xaml | 47 +- .../Dialogs/CreateAccountAliasDialog.xaml | 24 +- .../Dialogs/CreateAccountAliasDialog.xaml.cs | 2 +- Wino.Mail/Dialogs/MoveMailDialog.xaml | 25 +- Wino.Mail/Dialogs/NewImapSetupDialog.xaml | 14 +- Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs | 2 +- Wino.Mail/Dialogs/SignatureEditorDialog.xaml | 5 +- .../Dialogs/SignatureEditorDialog.xaml.cs | 2 +- .../SystemFolderConfigurationDialog.xaml | 63 +-- .../SystemFolderConfigurationDialog.xaml.cs | 3 +- .../MenuFlyouts/AccountSelectorFlyout.cs | 3 +- Wino.Mail/MenuFlyouts/FilterMenuFlyout.cs | 1 + Wino.Mail/MenuFlyouts/MoveButtonFlyout.cs | 2 +- .../MenuFlyouts/WinoOperationFlyoutItem.cs | 2 +- ...ccountProviderViewModelTemplateSelector.cs | 2 +- .../AccountReorderTemplateSelector.cs | 2 +- .../Services/ApplicationResourceManager.cs | 23 - Wino.Mail/Services/DialogService.cs | 211 +-------- ...igationService.cs => NavigationService.cs} | 81 ++-- Wino.Mail/Services/SettingsBuilderService.cs | 23 + Wino.Mail/Styles/ItemContainerStyles.xaml | 10 - Wino.Mail/Views/{Settings => }/AboutPage.xaml | 10 +- .../Views/{Settings => }/AboutPage.xaml.cs | 0 Wino.Mail/Views/Abstract/AboutPageAbstract.cs | 3 +- .../Abstract/AccountDetailsPageAbstract.cs | 3 +- .../Abstract/AccountManagementPageAbstract.cs | 4 +- .../Abstract/AliasManagementPageAbstract.cs | 3 +- .../Abstract/AppPreferencesPageAbstract.cs | 3 +- Wino.Mail/Views/Abstract/AppShellAbstract.cs | 3 +- .../Views/Abstract/ComposePageAbstract.cs | 3 +- Wino.Mail/Views/Abstract/IdlePageAbstract.cs | 3 +- .../Abstract/LanguageTimePageAbstract.cs | 3 +- .../Views/Abstract/MailListPageAbstract.cs | 3 +- .../Abstract/MailRenderingPageAbstract.cs | 1 + .../MergedAccountDetailsPageAbstract.cs | 3 +- .../Views/Abstract/MessageListPageAbstract.cs | 3 +- .../NewAccountManagementPageAbstract.cs | 3 +- .../Abstract/PersonalizationPageAbstract.cs | 5 +- .../Abstract/ReadComposePanePageAbstract.cs | 3 +- .../SignatureManagementPageAbstract.cs | 3 +- .../Views/Abstract/WelcomePageAbstract.cs | 3 +- .../Views/Account/AccountDetailsPage.xaml | 3 +- .../Views/Account/AccountManagementPage.xaml | 289 ++++++------ .../Account/MergedAccountDetailsPage.xaml | 99 ++-- Wino.Mail/Views/ComposePage.xaml | 11 +- Wino.Mail/Views/ComposePage.xaml.cs | 2 +- Wino.Mail/Views/IdlePage.xaml | 8 +- .../ImapSetup/AdvancedImapSetupPage.xaml.cs | 2 +- .../ImapSetup/ImapConnectionFailedPage.xaml | 24 +- .../ImapConnectionFailedPage.xaml.cs | 2 +- .../ImapSetup/PreparingImapFoldersPage.xaml | 16 +- .../ImapSetup/TestingImapConnectionPage.xaml | 3 +- .../TestingImapConnectionPage.xaml.cs | 2 +- .../Views/ImapSetup/WelcomeImapSetupPage.xaml | 54 +-- .../ImapSetup/WelcomeImapSetupPage.xaml.cs | 2 +- Wino.Mail/Views/MailListPage.xaml | 15 +- Wino.Mail/Views/MailListPage.xaml.cs | 4 +- Wino.Mail/Views/MailRenderingPage.xaml | 2 +- Wino.Mail/Views/MailRenderingPage.xaml.cs | 2 +- .../{Settings => }/PersonalizationPage.xaml | 9 +- .../PersonalizationPage.xaml.cs | 0 .../Views/Settings/AliasManagementPage.xaml | 174 +++---- .../Views/Settings/AppPreferencesPage.xaml | 32 +- .../Views/Settings/LanguageTimePage.xaml | 8 +- .../Views/Settings/SettingOptionsPage.xaml | 97 ---- .../Settings/SignatureManagementPage.xaml | 2 +- Wino.Mail/Wino.Mail.csproj | 227 ++------- .../CalendarEnableStatusChangedMessage.cs | 4 + .../Client/Calendar/CalendarEventAdded.cs | 9 + .../Calendar/CalendarInitializeMessage.cs | 13 + .../Calendar/CalendarInitializedMessage.cs | 7 + .../CalendarSettingsUpdatedMessage.cs | 7 + .../Calendar/GoNextDayRequestedMessage.cs | 7 + .../Calendar/GoPreviousDayRequestedMessage.cs | 7 + .../Client/Calendar/GoToCalendarDayMessage.cs | 10 + .../Client/Calendar/ScrollToDateMessage.cs | 10 + .../VisibleDateRangeChangedMessage.cs | 11 + .../Client/Mails/ImapSetupDismissRequested.cs | 2 +- .../NavigateManageAccountsRequested.cs | 7 + .../Navigation/NavigateSettingsRequested.cs | 7 - ...ateNewMailWithMultipleAccountsRequested.cs | 2 +- .../Server/AuthorizationRequested.cs | 2 +- .../Server/ImapConnectivityTestRequested.cs | 2 +- Wino.Messages/UI/AccountCreatedMessage.cs | 2 +- Wino.Messages/UI/AccountRemovedMessage.cs | 2 +- Wino.Messages/UI/AccountUpdatedMessage.cs | 2 +- Wino.Messages/UI/DraftCreated.cs | 3 +- Wino.Messages/UI/DraftFailed.cs | 3 +- Wino.Messages/UI/MailAddedMessage.cs | 2 +- Wino.Messages/UI/MailDownloadedMessage.cs | 2 +- Wino.Messages/UI/MailRemovedMessage.cs | 2 +- Wino.Messages/UI/MailUpdatedMessage.cs | 2 +- Wino.Messages/Wino.Messaging.csproj | 2 +- .../MessageHandlers/AuthenticationHandler.cs | 2 +- Wino.Server/Wino.Server.csproj | 4 +- Wino.sln | 170 +++++++ 486 files changed, 7969 insertions(+), 2708 deletions(-) create mode 100644 Wino.Calendar.ViewModels/AccountManagementViewModel.cs create mode 100644 Wino.Calendar.ViewModels/AppShellViewModel.cs create mode 100644 Wino.Calendar.ViewModels/CalendarPageViewModel.cs create mode 100644 Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs create mode 100644 Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj create mode 100644 Wino.Calendar/Activation/DefaultActivationHandler.cs create mode 100644 Wino.Calendar/Args/TimelineCellSelectedArgs.cs create mode 100644 Wino.Calendar/Args/TimelineCellUnselectedArgs.cs create mode 100644 Wino.Calendar/Assets/LargeTile.scale-100.png create mode 100644 Wino.Calendar/Assets/LargeTile.scale-125.png create mode 100644 Wino.Calendar/Assets/LargeTile.scale-150.png create mode 100644 Wino.Calendar/Assets/LargeTile.scale-200.png create mode 100644 Wino.Calendar/Assets/LargeTile.scale-400.png create mode 100644 Wino.Calendar/Assets/SmallTile.scale-100.png create mode 100644 Wino.Calendar/Assets/SmallTile.scale-125.png create mode 100644 Wino.Calendar/Assets/SmallTile.scale-150.png create mode 100644 Wino.Calendar/Assets/SmallTile.scale-200.png create mode 100644 Wino.Calendar/Assets/SmallTile.scale-400.png create mode 100644 Wino.Calendar/Assets/SplashScreen.scale-100.png create mode 100644 Wino.Calendar/Assets/SplashScreen.scale-125.png create mode 100644 Wino.Calendar/Assets/SplashScreen.scale-150.png create mode 100644 Wino.Calendar/Assets/SplashScreen.scale-400.png create mode 100644 Wino.Calendar/Assets/Square150x150Logo.scale-100.png create mode 100644 Wino.Calendar/Assets/Square150x150Logo.scale-125.png create mode 100644 Wino.Calendar/Assets/Square150x150Logo.scale-150.png create mode 100644 Wino.Calendar/Assets/Square150x150Logo.scale-400.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-16.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-256.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-32.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-48.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.scale-100.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.scale-125.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.scale-150.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.scale-400.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.targetsize-16.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.targetsize-24.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.targetsize-256.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.targetsize-32.png create mode 100644 Wino.Calendar/Assets/Square44x44Logo.targetsize-48.png rename Wino.Calendar/Assets/{StoreLogo.png => StoreLogo.backup.png} (100%) create mode 100644 Wino.Calendar/Assets/StoreLogo.scale-100.png create mode 100644 Wino.Calendar/Assets/StoreLogo.scale-125.png create mode 100644 Wino.Calendar/Assets/StoreLogo.scale-150.png create mode 100644 Wino.Calendar/Assets/StoreLogo.scale-200.png create mode 100644 Wino.Calendar/Assets/StoreLogo.scale-400.png create mode 100644 Wino.Calendar/Assets/Wide310x150Logo.scale-100.png create mode 100644 Wino.Calendar/Assets/Wide310x150Logo.scale-125.png create mode 100644 Wino.Calendar/Assets/Wide310x150Logo.scale-150.png create mode 100644 Wino.Calendar/Assets/Wide310x150Logo.scale-400.png create mode 100644 Wino.Calendar/Controls/CalendarDayItemsControl.cs create mode 100644 Wino.Calendar/Controls/CalendarItemControl.cs create mode 100644 Wino.Calendar/Controls/CustomCalendarFlipView.cs create mode 100644 Wino.Calendar/Controls/DayColumnControl.cs create mode 100644 Wino.Calendar/Controls/DayHeaderControl.cs create mode 100644 Wino.Calendar/Controls/WinoCalendarControl.cs create mode 100644 Wino.Calendar/Controls/WinoCalendarFlipView.cs create mode 100644 Wino.Calendar/Controls/WinoCalendarPanel.cs create mode 100644 Wino.Calendar/Controls/WinoCalendarTypeSelectorControl.cs create mode 100644 Wino.Calendar/Controls/WinoCalendarView.cs create mode 100644 Wino.Calendar/Controls/WinoDayTimelineCanvas.cs create mode 100644 Wino.Calendar/Models/CalendarItemMeasurement.cs create mode 100644 Wino.Calendar/Services/ApplicationResourceManager.cs create mode 100644 Wino.Calendar/Services/DialogService.cs create mode 100644 Wino.Calendar/Services/NavigationService.cs create mode 100644 Wino.Calendar/Services/SettingsBuilderService.cs create mode 100644 Wino.Calendar/Styles/CalendarDayItemsControl.xaml create mode 100644 Wino.Calendar/Styles/CalendarItemControlResources.xaml create mode 100644 Wino.Calendar/Styles/CalendarItemControlResources.xaml.cs create mode 100644 Wino.Calendar/Styles/CalendarRenderStyles.xaml create mode 100644 Wino.Calendar/Styles/DayColumnControl.xaml create mode 100644 Wino.Calendar/Styles/DayHeaderControl.xaml create mode 100644 Wino.Calendar/Styles/WinoCalendarResources.xaml create mode 100644 Wino.Calendar/Styles/WinoCalendarResources.xaml.cs create mode 100644 Wino.Calendar/Styles/WinoCalendarTypeSelectorControl.xaml create mode 100644 Wino.Calendar/Styles/WinoCalendarView.xaml create mode 100644 Wino.Calendar/Styles/WinoDayTimelineCanvas.xaml create mode 100644 Wino.Calendar/Views/Abstract/AccountManagementPageAbstract.cs create mode 100644 Wino.Calendar/Views/Abstract/AppShellAbstract.cs create mode 100644 Wino.Calendar/Views/Abstract/CalendarPageAbstract.cs create mode 100644 Wino.Calendar/Views/Abstract/CalendarSettingsPageAbstract.cs create mode 100644 Wino.Calendar/Views/Account/AccountManagementPage.xaml create mode 100644 Wino.Calendar/Views/Account/AccountManagementPage.xaml.cs create mode 100644 Wino.Calendar/Views/AppShell.xaml create mode 100644 Wino.Calendar/Views/AppShell.xaml.cs create mode 100644 Wino.Calendar/Views/CalendarPage.xaml create mode 100644 Wino.Calendar/Views/CalendarPage.xaml.cs create mode 100644 Wino.Calendar/Views/Settings/CalendarSettingsPage.xaml create mode 100644 Wino.Calendar/Views/Settings/CalendarSettingsPage.xaml.cs create mode 100644 Wino.Core.Domain/Entities/Calendar/AccountCalendar.cs create mode 100644 Wino.Core.Domain/Entities/Calendar/Attendee.cs create mode 100644 Wino.Core.Domain/Entities/Calendar/CalendarItem.cs create mode 100644 Wino.Core.Domain/Entities/Calendar/RecurrenceRule.cs create mode 100644 Wino.Core.Domain/Entities/Calendar/Reminder.cs rename Wino.Core.Domain/Entities/{ => Mail}/AccountSignature.cs (87%) rename Wino.Core.Domain/Entities/{ => Mail}/MailAccountAlias.cs (97%) rename Wino.Core.Domain/Entities/{ => Mail}/MailCopy.cs (98%) rename Wino.Core.Domain/Entities/{ => Mail}/MailItemFolder.cs (98%) rename Wino.Core.Domain/Entities/{ => Mail}/MergedInbox.cs (81%) rename Wino.Core.Domain/Entities/{ => Shared}/AccountContact.cs (98%) rename Wino.Core.Domain/Entities/{ => Shared}/CustomServerInformation.cs (97%) rename Wino.Core.Domain/Entities/{ => Shared}/MailAccount.cs (97%) rename Wino.Core.Domain/Entities/{ => Shared}/MailAccountPreferences.cs (97%) rename Wino.Core.Domain/Entities/{ => Shared}/TokenInformation.cs (95%) create mode 100644 Wino.Core.Domain/Enums/AttendeeStatus.cs create mode 100644 Wino.Core.Domain/Enums/CalendarDisplayType.cs create mode 100644 Wino.Core.Domain/Enums/CalendarInitInitiative.cs create mode 100644 Wino.Core.Domain/Enums/CalendarItemRecurrenceFrequency.cs create mode 100644 Wino.Core.Domain/Enums/CalendarItemReminderType.cs create mode 100644 Wino.Core.Domain/Enums/CalendarItemStatus.cs create mode 100644 Wino.Core.Domain/Enums/CalendarItemVisibility.cs create mode 100644 Wino.Core.Domain/Enums/CalendarLoadDirection.cs create mode 100644 Wino.Core.Domain/Enums/DayHeaderDisplayType.cs create mode 100644 Wino.Core.Domain/Interfaces/ICalendarDialogService.cs create mode 100644 Wino.Core.Domain/Interfaces/ICalendarItem.cs create mode 100644 Wino.Core.Domain/Interfaces/IDialogServiceBase.cs rename Wino.Core.Domain/Interfaces/{IDialogService.cs => IMailDialogService.cs} (63%) create mode 100644 Wino.Core.Domain/Interfaces/ISettingsBuilderService.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarDayModel.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarItem.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarPageNavigationArgs.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarRenderOptions.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarSettings.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarTypeStrategies/BaseCalendarTypeDrawingStrategy.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarTypeStrategies/DayCalendarDrawingStrategy.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarTypeStrategies/WeekCalendarDrawingStrategy.cs create mode 100644 Wino.Core.Domain/Models/Calendar/CalendarViewDayClickedEventArgs.cs create mode 100644 Wino.Core.Domain/Models/Calendar/DateRange.cs create mode 100644 Wino.Core.Domain/Models/Calendar/DayHeaderRenderModel.cs create mode 100644 Wino.Core.Domain/Models/Calendar/DayRangeRenderModel.cs rename Wino.Core.Domain/{Entities => Models/Folders}/SystemFolderConfiguration.cs (77%) create mode 100644 Wino.Core.Domain/Models/Settings/SettingOption.cs rename {Wino.Mail => Wino.Core.UWP}/Activation/ActivationHandler.cs (78%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Acrylic.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Clouds.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Custom.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Forest.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Garden.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Mica.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Nighty.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/Snowflake.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/AppThemes/TestTheme.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_archive.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_audio.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_executable.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_html.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_image.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_none.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_other.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_pdf.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_rar.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/FileTypes/type_video.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/Providers/Gmail.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/Providers/IMAP4.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/Providers/Office 365.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/Providers/Outlook.png (100%) rename {Wino.Mail => Wino.Core.UWP}/Assets/Providers/Yahoo.png (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Acrylic.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Clouds.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Forest.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Garden.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Mica.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Nighty.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BackgroundImages/Snowflake.jpg (100%) rename {Wino.Mail => Wino.Core.UWP}/BasePage.cs (70%) rename {Wino.Mail => Wino.Core.UWP}/Controls/ControlConstants.cs (99%) create mode 100644 Wino.Core.UWP/Controls/WinoAppTitleBar.xaml rename {Wino.Mail/Controls/Advanced => Wino.Core.UWP/Controls}/WinoAppTitleBar.xaml.cs (84%) rename {Wino.Mail => Wino.Core.UWP}/Controls/WinoFontIcon.cs (98%) rename {Wino.Mail => Wino.Core.UWP}/Controls/WinoFontIconSource.cs (97%) rename {Wino.Mail => Wino.Core.UWP}/Controls/WinoInfoBar.cs (99%) rename {Wino.Mail => Wino.Core.UWP}/Controls/WinoNavigationViewItem.cs (95%) rename {Wino.Mail => Wino.Core.UWP}/Converters/GridLengthConverter.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Converters/ReverseBooleanConverter.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Converters/ReverseBooleanToVisibilityConverter.cs (100%) create mode 100644 Wino.Core.UWP/CoreGeneric.xaml create mode 100644 Wino.Core.UWP/CoreGeneric.xaml.cs rename {Wino.Mail => Wino.Core.UWP}/Dialogs/AccountCreationDialog.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/AccountCreationDialog.xaml.cs (91%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/AccountEditDialog.xaml (78%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/AccountEditDialog.xaml.cs (92%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/AccountPickerDialog.xaml (88%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/AccountPickerDialog.xaml.cs (94%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/BaseAccountCreationDialog.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/CustomMessageDialogInformationContainer.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/CustomThemeBuilderDialog.xaml (94%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/CustomThemeBuilderDialog.xaml.cs (89%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/TextInputDialog.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/Dialogs/TextInputDialog.xaml.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Extensions/AnimationExtensions.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Extensions/CompositionEnums.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Extensions/CompositionExtensions.Implicit.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Extensions/CompositionExtensions.Size.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Extensions/UIExtensions.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Extensions/UtilExtensions.cs (97%) rename {Wino.Mail => Wino.Core.UWP}/Helpers/WinoVisualTreeHelper.cs (55%) rename {Wino.Mail => Wino.Core.UWP}/Helpers/XamlHelpers.cs (99%) rename {Wino.Mail => Wino.Core.UWP}/Selectors/AppThemePreviewTemplateSelector.cs (95%) rename {Wino.Mail => Wino.Core.UWP}/Selectors/CustomWinoMessageDialogIconSelector.cs (97%) rename {Wino.Mail => Wino.Core.UWP}/Selectors/FileAttachmentTypeSelector.cs (91%) rename {Wino.Mail => Wino.Core.UWP}/Selectors/NavigationMenuTemplateSelector.cs (95%) create mode 100644 Wino.Core.UWP/Services/ApplicationResourceManager.cs create mode 100644 Wino.Core.UWP/Services/DialogServiceBase.cs create mode 100644 Wino.Core.UWP/Services/NavigationServiceBase.cs rename {Wino.Mail => Wino.Core.UWP}/Styles/Colors.xaml (80%) rename {Wino.Mail => Wino.Core.UWP}/Styles/ContentPresenters.xaml (95%) rename {Wino.Mail => Wino.Core.UWP}/Styles/Converters.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/Styles/CustomMessageDialogStyles.xaml (99%) rename {Wino.Mail => Wino.Core.UWP}/Styles/CustomMessageDialogStyles.xaml.cs (86%) create mode 100644 Wino.Core.UWP/Styles/DataTemplates.xaml create mode 100644 Wino.Core.UWP/Styles/DataTemplates.xaml.cs rename {Wino.Mail => Wino.Core.UWP}/Styles/FontIcons.xaml (100%) create mode 100644 Wino.Core.UWP/Styles/IconTemplates.xaml rename {Wino.Mail => Wino.Core.UWP}/Styles/WinoInfoBar.xaml (99%) rename {Wino.Mail => Wino.Core.UWP}/Views/Abstract/SettingOptionsPageAbstract.cs (82%) rename {Wino.Mail => Wino.Core.UWP}/Views/Abstract/SettingsPageAbstract.cs (69%) rename {Wino.Mail => Wino.Core.UWP}/Views/Abstract/SettingsPageBase.cs (76%) create mode 100644 Wino.Core.UWP/Views/SettingOptionsPage.xaml rename {Wino.Mail/Views/Settings => Wino.Core.UWP/Views}/SettingOptionsPage.xaml.cs (100%) rename {Wino.Mail => Wino.Core.UWP}/Views/SettingsPage.xaml (100%) rename {Wino.Mail => Wino.Core.UWP}/Views/SettingsPage.xaml.cs (80%) create mode 100644 Wino.Core.UWP/WinoApplication.cs rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/AboutPageViewModel.cs (82%) create mode 100644 Wino.Core.ViewModels/AccountManagementPageViewModelBase.cs create mode 100644 Wino.Core.ViewModels/CalendarBaseViewModel.cs create mode 100644 Wino.Core.ViewModels/CoreBaseViewModel.cs rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/Data/AccountProviderDetailViewModel.cs (95%) rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/Data/AppColorViewModel.cs (92%) rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/Data/BreadcrumbNavigationItemViewModel.cs (100%) rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/Data/MergedAccountProviderDetailViewModel.cs (91%) create mode 100644 Wino.Core.ViewModels/NewAccountManagementPageViewModel.cs rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/PersonalizationPageViewModel.cs (91%) rename {Wino.Mail.ViewModels => Wino.Core.ViewModels}/SettingOptionsPageViewModel.cs (55%) create mode 100644 Wino.Core.ViewModels/SettingsPageViewModel.cs create mode 100644 Wino.Core.ViewModels/SettingsViewModel.cs create mode 100644 Wino.Core.ViewModels/Wino.Core.ViewModels.csproj rename Wino.Core/Authenticators/{ => Base}/BaseAuthenticator.cs (87%) create mode 100644 Wino.Core/Authenticators/Base/GmailAuthenticatorBase.cs create mode 100644 Wino.Core/Authenticators/Base/OutlookAuthenticatorBase.cs create mode 100644 Wino.Core/Authenticators/Calendar/OutlookAuthenticator.cs rename Wino.Core/Authenticators/{ => Mail}/GmailAuthenticator.cs (93%) rename Wino.Core/Authenticators/{ => Mail}/Office365Authenticator.cs (92%) rename Wino.Core/Authenticators/{ => Mail}/OutlookAuthenticator.cs (89%) create mode 100644 Wino.Core/Extensions/DateTimeExtensions.cs create mode 100644 Wino.Core/Integration/BaseCalendarIntegrator.cs rename Wino.Core/Synchronizers/{BaseSynchronizer.cs => BaseMailSynchronizer.cs} (98%) create mode 100644 Wino.Core/Synchronizers/Calendar/BaseCalendarSynchronizer.cs create mode 100644 Wino.Core/Synchronizers/Calendar/OutlookCalendarSynchronizer.cs rename Wino.Core/Synchronizers/{ => Mail}/GmailSynchronizer.cs (99%) rename Wino.Core/Synchronizers/{ => Mail}/ImapSynchronizer.cs (97%) rename Wino.Core/Synchronizers/{ => Mail}/OutlookSynchronizer.cs (99%) rename Wino.Mail.ViewModels/{BaseViewModel.cs => MailBaseViewModel.cs} (52%) delete mode 100644 Wino.Mail.ViewModels/NewAccountManagementPageViewModel.cs delete mode 100644 Wino.Mail.ViewModels/SettingsPageViewModel.cs delete mode 100644 Wino.Mail.ViewModels/SettingsViewModel.cs delete mode 100644 Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml delete mode 100644 Wino.Mail/Services/ApplicationResourceManager.cs rename Wino.Mail/Services/{WinoNavigationService.cs => NavigationService.cs} (71%) create mode 100644 Wino.Mail/Services/SettingsBuilderService.cs rename Wino.Mail/Views/{Settings => }/AboutPage.xaml (98%) rename Wino.Mail/Views/{Settings => }/AboutPage.xaml.cs (100%) rename Wino.Mail/Views/{Settings => }/PersonalizationPage.xaml (99%) rename Wino.Mail/Views/{Settings => }/PersonalizationPage.xaml.cs (100%) delete mode 100644 Wino.Mail/Views/Settings/SettingOptionsPage.xaml create mode 100644 Wino.Messages/Client/Calendar/CalendarEnableStatusChangedMessage.cs create mode 100644 Wino.Messages/Client/Calendar/CalendarEventAdded.cs create mode 100644 Wino.Messages/Client/Calendar/CalendarInitializeMessage.cs create mode 100644 Wino.Messages/Client/Calendar/CalendarInitializedMessage.cs create mode 100644 Wino.Messages/Client/Calendar/CalendarSettingsUpdatedMessage.cs create mode 100644 Wino.Messages/Client/Calendar/GoNextDayRequestedMessage.cs create mode 100644 Wino.Messages/Client/Calendar/GoPreviousDayRequestedMessage.cs create mode 100644 Wino.Messages/Client/Calendar/GoToCalendarDayMessage.cs create mode 100644 Wino.Messages/Client/Calendar/ScrollToDateMessage.cs create mode 100644 Wino.Messages/Client/Calendar/VisibleDateRangeChangedMessage.cs create mode 100644 Wino.Messages/Client/Navigation/NavigateManageAccountsRequested.cs delete mode 100644 Wino.Messages/Client/Navigation/NavigateSettingsRequested.cs diff --git a/Wino.Calendar.ViewModels/AccountManagementViewModel.cs b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs new file mode 100644 index 00000000..24e46b47 --- /dev/null +++ b/Wino.Calendar.ViewModels/AccountManagementViewModel.cs @@ -0,0 +1,37 @@ +using System.Threading.Tasks; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Domain.Models.Store; +using Wino.Core.ViewModels; + +namespace Wino.Calendar.ViewModels +{ + public partial class AccountManagementViewModel : AccountManagementPageViewModelBase + { + public AccountManagementViewModel(ICalendarDialogService dialogService, + IWinoServerConnectionManager winoServerConnectionManager, + INavigationService navigationService, + IAccountService accountService, + IProviderService providerService, + IStoreManagementService storeManagementService, + IAuthenticationProvider authenticationProvider, + IPreferencesService preferencesService) : base(dialogService, winoServerConnectionManager, navigationService, accountService, providerService, storeManagementService, authenticationProvider, preferencesService) + { + CalendarDialogService = dialogService; + } + + public ICalendarDialogService CalendarDialogService { get; } + + public override Task InitializeAccountsAsync() + { + return Task.CompletedTask; + } + + public override async void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + var t = await StoreManagementService.HasProductAsync(StoreProductType.UnlimitedAccounts); + } + } +} diff --git a/Wino.Calendar.ViewModels/AppShellViewModel.cs b/Wino.Calendar.ViewModels/AppShellViewModel.cs new file mode 100644 index 00000000..83ac3e0a --- /dev/null +++ b/Wino.Calendar.ViewModels/AppShellViewModel.cs @@ -0,0 +1,237 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Calendar; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.Extensions; +using Wino.Core.MenuItems; +using Wino.Core.ViewModels; +using Wino.Messaging.Client.Calendar; +using Wino.Messaging.Client.Navigation; + +namespace Wino.Calendar.ViewModels +{ + public partial class AppShellViewModel : CalendarBaseViewModel, + IRecipient, + IRecipient, + IRecipient, + IRecipient + { + public event EventHandler DisplayTypeChanged; + public IPreferencesService PreferencesService { get; } + public IStatePersistanceService StatePersistenceService { get; } + public INavigationService NavigationService { get; } + public IWinoServerConnectionManager ServerConnectionManager { get; } + public MenuItemCollection FooterItems { get; set; } + public MenuItemCollection MenuItems { get; set; } + + [ObservableProperty] + private IMenuItem _selectedMenuItem; + + [ObservableProperty] + private bool isCalendarEnabled; + + /// + /// Gets or sets the active connection status of the Wino server. + /// + [ObservableProperty] + private WinoServerConnectionStatus activeConnectionStatus; + + /// + /// Gets or sets the display date of the calendar. + /// + [ObservableProperty] + private DateTimeOffset _displayDate; + + /// + /// Gets or sets the highlighted range in the CalendarView and displayed date range in FlipView. + /// + [ObservableProperty] + private DateRange highlightedDateRange; + + [ObservableProperty] + private ObservableRangeCollection dateNavigationHeaderItems = []; + + [ObservableProperty] + private int _selectedDateNavigationHeaderIndex; + + public bool IsVerticalCalendar => StatePersistenceService.CalendarDisplayType == CalendarDisplayType.Month; + + public AppShellViewModel(IPreferencesService preferencesService, + IStatePersistanceService statePersistanceService, + INavigationService navigationService, + IWinoServerConnectionManager serverConnectionManager) + { + NavigationService = navigationService; + ServerConnectionManager = serverConnectionManager; + PreferencesService = preferencesService; + + StatePersistenceService = statePersistanceService; + StatePersistenceService.StatePropertyChanged += PrefefencesChanged; + } + + private void PrefefencesChanged(object sender, string e) + { + if (e == nameof(StatePersistenceService.CalendarDisplayType)) + { + DisplayTypeChanged?.Invoke(this, StatePersistenceService.CalendarDisplayType); + OnPropertyChanged(nameof(IsVerticalCalendar)); + + // Change the calendar. + DateClicked(new CalendarViewDayClickedEventArgs(GetDisplayTypeSwitchDate())); + } + } + + public override void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + CreateFooterItems(); + UpdateDateNavigationHeaderItems(); + } + + partial void OnSelectedMenuItemChanged(IMenuItem oldValue, IMenuItem newValue) + { + if (newValue is SettingsItem) + { + NavigationService.Navigate(WinoPage.SettingsPage); + } + else if (newValue is ManageAccountsMenuItem) + { + NavigationService.Navigate(WinoPage.AccountManagementPage); + } + } + + /// + /// When calendar type switches, we need to navigate to the most ideal date. + /// This method returns that date. + /// + private DateTime GetDisplayTypeSwitchDate() + { + switch (StatePersistenceService.CalendarDisplayType) + { + case CalendarDisplayType.Day: + if (HighlightedDateRange.IsInRange(DateTime.Now)) return DateTime.Now.Date; + + return HighlightedDateRange.StartDate; + case CalendarDisplayType.Week: + // TODO: From settings + if (HighlightedDateRange.IsInRange(DateTime.Now)) return DateTime.Now.Date.GetWeekStartDateForDate(DayOfWeek.Monday); + + return HighlightedDateRange.StartDate.GetWeekStartDateForDate(DayOfWeek.Monday); + case CalendarDisplayType.WorkWeek: + break; + case CalendarDisplayType.Month: + break; + case CalendarDisplayType.Year: + break; + default: + break; + } + + return DateTime.Today.Date; + } + + protected override void OnDispatcherAssigned() + { + base.OnDispatcherAssigned(); + + MenuItems = new MenuItemCollection(Dispatcher); + FooterItems = new MenuItemCollection(Dispatcher); + } + + public override void OnPageLoaded() + { + base.OnPageLoaded(); + + NavigationService.Navigate(WinoPage.CalendarPage, new CalendarPageNavigationArgs() + { + RequestDefaultNavigation = true + }); + } + + private void CreateFooterItems() + { + FooterItems.Clear(); + FooterItems.Add(new ManageAccountsMenuItem()); + FooterItems.Add(new SettingsItem()); + } + + #region Commands + + [RelayCommand] + private void TodayClicked() => Messenger.Send(new GoToCalendarDayMessage(DateTime.Now.Date)); + + [RelayCommand] + public void ManageAccounts() => NavigationService.Navigate(WinoPage.AccountManagementPage); + + [RelayCommand] + private Task ReconnectServerAsync() => ServerConnectionManager.ConnectAsync(); + + [RelayCommand] + private void DateClicked(CalendarViewDayClickedEventArgs clickedDate) + => Messenger.Send(new CalendarInitializeMessage(clickedDate.ClickedDate, CalendarInitInitiative.User)); + + #endregion + + public void Receive(VisibleDateRangeChangedMessage message) => HighlightedDateRange = message.DateRange; + + /// + /// Sets the header navigation items based on visible date range and calendar type. + /// + private void UpdateDateNavigationHeaderItems() + { + DateNavigationHeaderItems.Clear(); + + // TODO: From settings + var testInfo = new CultureInfo("en-US"); + + switch (StatePersistenceService.CalendarDisplayType) + { + case CalendarDisplayType.Day: + case CalendarDisplayType.Week: + case CalendarDisplayType.WorkWeek: + case CalendarDisplayType.Month: + DateNavigationHeaderItems.ReplaceRange(testInfo.DateTimeFormat.MonthNames); + break; + case CalendarDisplayType.Year: + break; + default: + break; + } + + SetDateNavigationHeaderItems(); + } + + partial void OnHighlightedDateRangeChanged(DateRange value) => SetDateNavigationHeaderItems(); + + private void SetDateNavigationHeaderItems() + { + if (HighlightedDateRange == null) return; + + if (DateNavigationHeaderItems.Count == 0) + { + UpdateDateNavigationHeaderItems(); + } + + // TODO: Year view + var monthIndex = HighlightedDateRange.GetMostVisibleMonthIndex(); + + SelectedDateNavigationHeaderIndex = Math.Max(monthIndex - 1, -1); + } + + public async void Receive(CalendarEnableStatusChangedMessage message) + => await ExecuteUIThread(() => IsCalendarEnabled = message.IsEnabled); + + // Calendar page is loaded and calendar is ready to recieve render requests. + public void Receive(CalendarInitializedMessage message) => Messenger.Send(new GoToCalendarDayMessage(DateTime.Now.Date)); + + public void Receive(NavigateManageAccountsRequested message) => SelectedMenuItem = FooterItems.FirstOrDefault(a => a is ManageAccountsMenuItem); + } +} diff --git a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs new file mode 100644 index 00000000..7552de6e --- /dev/null +++ b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs @@ -0,0 +1,436 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Diagnostics; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Calendar.Models.CalendarTypeStrategies; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Calendar; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.MenuItems; +using Wino.Core.ViewModels; +using Wino.Messaging.Client.Calendar; + +namespace Wino.Calendar.ViewModels +{ + public partial class CalendarPageViewModel : CalendarBaseViewModel, + IRecipient + { + [ObservableProperty] + private ObservableRangeCollection _dayRanges = []; + + [ObservableProperty] + private int _selectedDateRangeIndex; + + [ObservableProperty] + private DayRangeRenderModel _selectedDayRange; + + [ObservableProperty] + private bool _isCalendarEnabled = true; + + // Get rid of some of the items if we have too many. + private const int maxDayRangeSize = 10; + private readonly IPreferencesService _preferencesService; + + // Store latest rendered options. + private CalendarDisplayType _currentDisplayType; + private int _displayDayCount; + + private SemaphoreSlim _calendarLoadingSemaphore = new(1); + private bool isLoadMoreBlocked = false; + private CalendarSettings _currentSettings = null; + + public IStatePersistanceService StatePersistanceService { get; } + + public CalendarPageViewModel(IStatePersistanceService statePersistanceService, + IPreferencesService preferencesService) + { + StatePersistanceService = statePersistanceService; + _preferencesService = preferencesService; + + _currentSettings = _preferencesService.GetCurrentCalendarSettings(); + } + + public override void OnNavigatedTo(NavigationMode mode, object parameters) + { + base.OnNavigatedTo(mode, parameters); + + Messenger.Send(new CalendarInitializedMessage()); + } + + // TODO: Replace when calendar settings are updated. + // Should be a field ideally. + private BaseCalendarTypeDrawingStrategy GetDrawingStrategy(CalendarDisplayType displayType) + { + return displayType switch + { + CalendarDisplayType.Day => new DayCalendarDrawingStrategy(_currentSettings), + CalendarDisplayType.Week => new WeekCalendarDrawingStrategy(_currentSettings), + _ => throw new NotImplementedException(), + }; + } + + partial void OnIsCalendarEnabledChanging(bool oldValue, bool newValue) => Messenger.Send(new CalendarEnableStatusChangedMessage(newValue)); + + private bool ShouldResetDayRanges(CalendarInitializeMessage message) + { + // Never reset if the initiative is from the app. + if (message.CalendarInitInitiative == CalendarInitInitiative.App) return false; + + // 1. Display type is different. + // 2. Day display count is different. + // 3. Display date is not in the visible range. + + return + (_currentDisplayType != StatePersistanceService.CalendarDisplayType || + _displayDayCount != StatePersistanceService.DayDisplayCount || + (DayRanges != null && !DayRanges.Select(a => a.CalendarRenderOptions).Any(b => b.DateRange.IsInRange(message.DisplayDate)))); + } + + public async void Receive(CalendarInitializeMessage message) + { + await _calendarLoadingSemaphore.WaitAsync(); + + try + { + await ExecuteUIThread(() => IsCalendarEnabled = false); + + if (ShouldResetDayRanges(message)) + { + DayRanges.Clear(); + + Debug.WriteLine("Will reset day ranges."); + } + else if (ShouldScrollToItem(message)) + { + // Scroll to the selected date. + + Messenger.Send(new ScrollToDateMessage(message.DisplayDate)); + Debug.WriteLine("Scrolling to selected date."); + return; + } + + // This will replace the whole collection because the user initiated a new render. + await RenderDatesAsync(message.CalendarInitInitiative, + message.DisplayDate, + CalendarLoadDirection.Replace); + } + catch (Exception ex) + { + Debugger.Break(); + } + finally + { + _calendarLoadingSemaphore.Release(); + + await ExecuteUIThread(() => IsCalendarEnabled = true); + } + } + + private async Task RenderDatesAsync(CalendarInitInitiative calendarInitInitiative, + DateTime? loadingDisplayDate = null, + CalendarLoadDirection calendarLoadDirection = CalendarLoadDirection.Replace) + { + // This is the part we arrange the flip view calendar logic. + + /* Loading for a month of the selected date is fine. + * If the selected date is in the loaded range, we'll just change the selected flip index to scroll. + * If the selected date is not in the loaded range: + * 1. Detect the direction of the scroll. + * 2. Load the next month. + * 3. Replace existing month with the new month. + */ + + // 2 things are important: How many items should 1 flip have, and, where we should start loading? + + // User initiated renders must always have a date to start with. + if (calendarInitInitiative == CalendarInitInitiative.User) Guard.IsNotNull(loadingDisplayDate, nameof(loadingDisplayDate)); + + var strategy = GetDrawingStrategy(StatePersistanceService.CalendarDisplayType); + var displayDate = loadingDisplayDate.GetValueOrDefault(); + + // How many days should be placed in 1 flip view item? + int eachFlipItemCount = strategy.GetRenderDayCount(displayDate, StatePersistanceService.DayDisplayCount); + + DateRange flipLoadRange = null; + + if (calendarInitInitiative == CalendarInitInitiative.User) + { + flipLoadRange = strategy.GetRenderDateRange(displayDate, StatePersistanceService.DayDisplayCount); + } + else + { + var minimumLoadedDate = DayRanges[0].CalendarRenderOptions.DateRange.StartDate; + var maximumLoadedDate = DayRanges[DayRanges.Count - 1].CalendarRenderOptions.DateRange.EndDate; + + var currentInitializedDateRange = new DateRange(minimumLoadedDate, maximumLoadedDate); + + // App is trying to load. + // This should be based on direction. We'll load the next or previous range. + // DisplayDate is either the start or end date of the current visible range. + + if (calendarLoadDirection == CalendarLoadDirection.Previous) + { + flipLoadRange = strategy.GetPreviousDateRange(currentInitializedDateRange, StatePersistanceService.DayDisplayCount); + } + else + { + flipLoadRange = strategy.GetNextDateRange(currentInitializedDateRange, StatePersistanceService.DayDisplayCount); + } + } + + // Create day ranges for each flip item until we reach the total days to load. + int totalFlipItemCount = (int)Math.Ceiling((double)flipLoadRange.TotalDays / eachFlipItemCount); + + List renderModels = new(); + + for (int i = 0; i < totalFlipItemCount; i++) + { + var startDate = flipLoadRange.StartDate.AddDays(i * eachFlipItemCount); + var endDate = startDate.AddDays(eachFlipItemCount); + + var range = new DateRange(startDate, endDate); + var renderOptions = new CalendarRenderOptions(range, _currentSettings); + + renderModels.Add(new DayRangeRenderModel(renderOptions)); + } + + CalendarLoadDirection animationDirection = calendarLoadDirection; + + bool removeCurrent = calendarLoadDirection == CalendarLoadDirection.Replace; + + if (calendarLoadDirection == CalendarLoadDirection.Replace) + { + // New date ranges are being replaced. + // We must preserve existing selection if any, add the items before/after the current one, remove the current one. + // This will make sure the new dates are animated in the correct direction. + + isLoadMoreBlocked = true; + + // Remove all other dates except this one. + + await ExecuteUIThread(() => + { + DayRanges.RemoveRange(DayRanges.Where(a => a != SelectedDayRange).ToList()); + }); + + animationDirection = displayDate <= SelectedDayRange?.CalendarRenderOptions.DateRange.StartDate ? + CalendarLoadDirection.Previous : CalendarLoadDirection.Next; + } + + if (animationDirection == CalendarLoadDirection.Next) + { + await ExecuteUIThread(() => + { + foreach (var item in renderModels) + { + DayRanges.Add(item); + } + }); + } + else if (animationDirection == CalendarLoadDirection.Previous) + { + // Wait for the animation to finish. + // Otherwise it somehow shutters a little, which is annoying. + + if (!removeCurrent) await Task.Delay(500); + + // Insert each render model in reverse order. + for (int i = renderModels.Count - 1; i >= 0; i--) + { + await ExecuteUIThread(() => + { + DayRanges.Insert(0, renderModels[i]); + }); + } + } + + Debug.WriteLine($"Flip count: ({DayRanges.Count})"); + + foreach (var item in DayRanges) + { + Debug.WriteLine($"- {item.CalendarRenderOptions.DateRange.ToString()}"); + } + + if (removeCurrent) + { + await ExecuteUIThread(() => + { + DayRanges.Remove(SelectedDayRange); + }); + } + + // TODO... + // await TryConsolidateItemsAsync(); + + isLoadMoreBlocked = false; + + // Only scroll if the render is initiated by user. + // Otherwise we'll scroll to the app rendered invisible date range. + if (calendarInitInitiative == CalendarInitInitiative.User) + { + // Save the current settings for the page for later comparison. + _currentDisplayType = StatePersistanceService.CalendarDisplayType; + _displayDayCount = StatePersistanceService.DayDisplayCount; + + Messenger.Send(new ScrollToDateMessage(displayDate)); + } + } + + private async Task TryConsolidateItemsAsync() + { + // Check if trimming is necessary + if (DayRanges.Count > maxDayRangeSize) + { + Debug.WriteLine("Trimming items."); + + isLoadMoreBlocked = true; + + var removeCount = DayRanges.Count - maxDayRangeSize; + + await Task.Delay(500); + + // Right shifted, remove from the start. + if (SelectedDateRangeIndex > DayRanges.Count / 2) + { + DayRanges.RemoveRange(DayRanges.Take(removeCount).ToList()); + } + else + { + // Left shifted, remove from the end. + DayRanges.RemoveRange(DayRanges.Skip(DayRanges.Count - removeCount).Take(removeCount)); + } + + SelectedDateRangeIndex = DayRanges.IndexOf(SelectedDayRange); + } + } + + private bool ShouldScrollToItem(CalendarInitializeMessage message) + { + // Never scroll if the initiative is from the app. + if (message.CalendarInitInitiative == CalendarInitInitiative.App) return false; + + // Nothing to scroll. + if (DayRanges.Count == 0) return false; + + var minimumLoadedDate = DayRanges[0].CalendarRenderOptions.DateRange.StartDate; + var maximumLoadedDate = DayRanges[DayRanges.Count - 1].CalendarRenderOptions.DateRange.EndDate; + + var selectedDate = message.DisplayDate; + + return selectedDate >= minimumLoadedDate && selectedDate <= maximumLoadedDate; + } + + partial void OnSelectedDayRangeChanged(DayRangeRenderModel value) + { + if (DayRanges.Count == 0 || SelectedDateRangeIndex < 0) return; + + if (isLoadMoreBlocked) return; + + var selectedRange = DayRanges[SelectedDateRangeIndex]; + + if (selectedRange != null) + { + // Send the loading message initiated by the app. + if (SelectedDateRangeIndex == DayRanges.Count - 1) + { + // Load next, starting from the end date. + _ = LoadMoreAsync(CalendarLoadDirection.Next); + } + else if (SelectedDateRangeIndex == 0) + { + // Load previous, starting from the start date. + + _ = LoadMoreAsync(CalendarLoadDirection.Previous); + } + } + } + + private async Task LoadMoreAsync(CalendarLoadDirection direction) + { + Debug.WriteLine($"Loading {direction} items."); + + try + { + await _calendarLoadingSemaphore.WaitAsync(); + await RenderDatesAsync(CalendarInitInitiative.App, calendarLoadDirection: direction); + } + catch (Exception) + { + Debugger.Break(); + } + finally + { + _calendarLoadingSemaphore.Release(); + } + } + + protected override async void OnCalendarEventAdded(ICalendarItem calendarItem) + { + base.OnCalendarEventAdded(calendarItem); + + // Test + var eventDays = DayRanges.SelectMany(a => a.CalendarDays).Where(b => b.Period.Start.Date == calendarItem.StartTime.Date); + + var beforeAllDay = new CalendarItem(calendarItem.StartTime.Date.AddHours(0), calendarItem.StartTime.Date.AddMinutes(30)) + { + Name = "kj" + }; + + var allday = new CalendarItem(calendarItem.StartTime.Date.AddHours(1), calendarItem.StartTime.Date.AddHours(10).AddMinutes(59)) + { + Name = "All day" + }; + + var test = new CalendarItem(calendarItem.StartTime.Date.AddHours(4), calendarItem.StartTime.Date.AddHours(4).AddMinutes(30)) + { + Name = "test" + }; + + var hour = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8)) + { + Name = "1 h" + }; + + var hourandhalf = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) + { + Name = "1.5 h" + }; + var halfhour1 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7), calendarItem.StartTime.Date.AddHours(7).AddMinutes(30)) + { + Name = "30 min" + }; + + var halfhour2 = new CalendarItem(calendarItem.StartTime.Date.AddHours(7).AddMinutes(30), calendarItem.StartTime.Date.AddHours(8)) + { + Name = "30 min" + }; + var halfhour3 = new CalendarItem(calendarItem.StartTime.Date.AddHours(8), calendarItem.StartTime.Date.AddHours(8).AddMinutes(30)) + { + Name = "30 min" + }; + + foreach (var day in eventDays) + { + await ExecuteUIThread(() => + { + day.Events.Add(beforeAllDay); + day.Events.Add(allday); + day.Events.Add(hourandhalf); + day.Events.Add(hour); + day.Events.Add(halfhour1); + day.Events.Add(halfhour2); + day.Events.Add(halfhour3); + day.Events.Add(test); + }); + } + + return; + } + } +} diff --git a/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs new file mode 100644 index 00000000..b9c21f97 --- /dev/null +++ b/Wino.Calendar.ViewModels/CalendarSettingsPageViewModel.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Messaging; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Translations; +using Wino.Core.ViewModels; +using Wino.Messaging.Client.Calendar; + +namespace Wino.Calendar.ViewModels +{ + public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel + { + [ObservableProperty] + private double _cellHourHeight; + + [ObservableProperty] + private int _selectedFirstDayOfWeekIndex; + + [ObservableProperty] + private bool _is24HourHeaders; + + [ObservableProperty] + private TimeSpan _workingHourStart; + + [ObservableProperty] + private TimeSpan _workingHourEnd; + + [ObservableProperty] + private List _dayNames = []; + + [ObservableProperty] + private int _workingDayStartIndex; + + [ObservableProperty] + private int _workingDayEndIndex; + + public IPreferencesService PreferencesService { get; } + + private readonly bool _isLoaded = false; + + public CalendarSettingsPageViewModel(IPreferencesService preferencesService) + { + PreferencesService = preferencesService; + + var currentLanguageLanguageCode = WinoTranslationDictionary.GetLanguageFileNameRelativePath(preferencesService.CurrentLanguage); + + var cultureInfo = new CultureInfo(currentLanguageLanguageCode); + + // Populate the day names list + for (var i = 0; i < 7; i++) + { + _dayNames.Add(cultureInfo.DateTimeFormat.DayNames[i]); + } + + var cultureFirstDayName = cultureInfo.DateTimeFormat.GetDayName(preferencesService.FirstDayOfWeek); + + _selectedFirstDayOfWeekIndex = _dayNames.IndexOf(cultureFirstDayName); + _is24HourHeaders = preferencesService.Prefer24HourTimeFormat; + _workingHourStart = preferencesService.WorkingHourStart; + _workingHourEnd = preferencesService.WorkingHourEnd; + _cellHourHeight = preferencesService.HourHeight; + + _workingDayStartIndex = _dayNames.IndexOf(cultureInfo.DateTimeFormat.GetDayName(preferencesService.WorkingDayStart)); + _workingDayEndIndex = _dayNames.IndexOf(cultureInfo.DateTimeFormat.GetDayName(preferencesService.WorkingDayEnd)); + + _isLoaded = true; + } + + partial void OnCellHourHeightChanged(double oldValue, double newValue) => SaveSettings(); + partial void OnIs24HourHeadersChanged(bool value) => SaveSettings(); + partial void OnSelectedFirstDayOfWeekIndexChanged(int value) => SaveSettings(); + partial void OnWorkingHourStartChanged(TimeSpan value) => SaveSettings(); + partial void OnWorkingHourEndChanged(TimeSpan value) => SaveSettings(); + partial void OnWorkingDayStartIndexChanged(int value) => SaveSettings(); + partial void OnWorkingDayEndIndexChanged(int value) => SaveSettings(); + + public void SaveSettings() + { + if (!_isLoaded) return; + + PreferencesService.FirstDayOfWeek = SelectedFirstDayOfWeekIndex switch + { + 0 => DayOfWeek.Sunday, + 1 => DayOfWeek.Monday, + 2 => DayOfWeek.Tuesday, + 3 => DayOfWeek.Wednesday, + 4 => DayOfWeek.Thursday, + 5 => DayOfWeek.Friday, + 6 => DayOfWeek.Saturday, + _ => throw new ArgumentOutOfRangeException() + }; + + PreferencesService.WorkingDayStart = WorkingDayStartIndex switch + { + 0 => DayOfWeek.Sunday, + 1 => DayOfWeek.Monday, + 2 => DayOfWeek.Tuesday, + 3 => DayOfWeek.Wednesday, + 4 => DayOfWeek.Thursday, + 5 => DayOfWeek.Friday, + 6 => DayOfWeek.Saturday, + _ => throw new ArgumentOutOfRangeException() + }; + + PreferencesService.WorkingDayEnd = WorkingDayEndIndex switch + { + 0 => DayOfWeek.Sunday, + 1 => DayOfWeek.Monday, + 2 => DayOfWeek.Tuesday, + 3 => DayOfWeek.Wednesday, + 4 => DayOfWeek.Thursday, + 5 => DayOfWeek.Friday, + 6 => DayOfWeek.Saturday, + _ => throw new ArgumentOutOfRangeException() + }; + + PreferencesService.Prefer24HourTimeFormat = Is24HourHeaders; + PreferencesService.WorkingHourStart = WorkingHourStart; + PreferencesService.WorkingHourEnd = WorkingHourEnd; + PreferencesService.HourHeight = CellHourHeight; + + Messenger.Send(new CalendarSettingsUpdatedMessage()); + } + } +} diff --git a/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj b/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj new file mode 100644 index 00000000..8a6621ff --- /dev/null +++ b/Wino.Calendar.ViewModels/Wino.Calendar.ViewModels.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.0 + 12 + AnyCPU;x64;x86 + + + + + + + + + + + + + + diff --git a/Wino.Calendar/Activation/DefaultActivationHandler.cs b/Wino.Calendar/Activation/DefaultActivationHandler.cs new file mode 100644 index 00000000..52e8fcfd --- /dev/null +++ b/Wino.Calendar/Activation/DefaultActivationHandler.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media.Animation; +using Wino.Activation; +using Wino.Calendar.Views; + +namespace Wino.Calendar.Activation +{ + public class DefaultActivationHandler : ActivationHandler + { + protected override Task HandleInternalAsync(IActivatedEventArgs args) + { + (Window.Current.Content as Frame).Navigate(typeof(AppShell), null, new DrillInNavigationTransitionInfo()); + + return Task.CompletedTask; + } + + // Only navigate if Frame content doesn't exist. + protected override bool CanHandleInternal(IActivatedEventArgs args) + => (Window.Current?.Content as Frame)?.Content == null; + } +} diff --git a/Wino.Calendar/App.xaml b/Wino.Calendar/App.xaml index 5707d1ac..7d679b49 100644 --- a/Wino.Calendar/App.xaml +++ b/Wino.Calendar/App.xaml @@ -1,7 +1,34 @@ - + xmlns:controls="using:Microsoft.UI.Xaml.Controls" + xmlns:core="using:Wino.Core.UWP" + xmlns:coreStyles="using:Wino.Core.UWP.Styles" + xmlns:local="using:Wino.Calendar" + xmlns:styles="using:Wino.Calendar.Styles"> + + + + + + + + + + + + + + + + + + + + + + + + - diff --git a/Wino.Calendar/App.xaml.cs b/Wino.Calendar/App.xaml.cs index 971e694b..7ff40a35 100644 --- a/Wino.Calendar/App.xaml.cs +++ b/Wino.Calendar/App.xaml.cs @@ -1,100 +1,89 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices.WindowsRuntime; -using Windows.ApplicationModel; +using Microsoft.Extensions.DependencyInjection; using Windows.ApplicationModel.Activation; -using Windows.Foundation; -using Windows.Foundation.Collections; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Controls.Primitives; -using Windows.UI.Xaml.Data; -using Windows.UI.Xaml.Input; -using Windows.UI.Xaml.Media; -using Windows.UI.Xaml.Navigation; +using Windows.UI.Core.Preview; +using Wino.Activation; +using Wino.Calendar.Activation; +using Wino.Calendar.Services; +using Wino.Calendar.ViewModels; +using Wino.Core; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP; namespace Wino.Calendar { - /// - /// Provides application-specific behavior to supplement the default Application class. - /// - sealed partial class App : Application + public sealed partial class App : WinoApplication { - /// - /// Initializes the singleton application object. This is the first line of authored code - /// executed, and as such is the logical equivalent of main() or WinMain(). - /// + public override string AppCenterKey => "dfdad6ab-95f9-44cc-9112-45ec6730c49e"; + public App() { - this.InitializeComponent(); - this.Suspending += OnSuspending; + InitializeComponent(); } - /// - /// Invoked when the application is launched normally by the end user. Other entry points - /// will be used such as when the application is launched to open a specific file. - /// - /// Details about the launch request and process. - protected override void OnLaunched(LaunchActivatedEventArgs e) + public override IServiceProvider ConfigureServices() { - Frame rootFrame = Window.Current.Content as Frame; + var services = new ServiceCollection(); - // Do not repeat app initialization when the Window already has content, - // just ensure that the window is active - if (rootFrame == null) + services.RegisterCoreServices(); + services.RegisterCoreUWPServices(); + services.RegisterCoreViewModels(); + + RegisterUWPServices(services); + RegisterViewModels(services); + RegisterActivationHandlers(services); + + return services.BuildServiceProvider(); + } + + #region Dependency Injection + + private void RegisterActivationHandlers(IServiceCollection services) + { + //services.AddTransient(); + //services.AddTransient(); + //services.AddTransient(); + } + + private void RegisterUWPServices(IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(); + services.AddTransient(); + } + + private void RegisterViewModels(IServiceCollection services) + { + services.AddSingleton(typeof(AppShellViewModel)); + services.AddTransient(typeof(CalendarPageViewModel)); + services.AddTransient(typeof(CalendarSettingsPageViewModel)); + services.AddTransient(typeof(AccountManagementViewModel)); + } + + #endregion + + protected override void OnApplicationCloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) + { + // TODO: Check server running. + } + + protected override async void OnLaunched(LaunchActivatedEventArgs args) + { + LogActivation($"OnLaunched -> {args.GetType().Name}, Kind -> {args.Kind}, PreviousExecutionState -> {args.PreviousExecutionState}, IsPrelaunch -> {args.PrelaunchActivated}"); + + if (!args.PrelaunchActivated) { - // Create a Frame to act as the navigation context and navigate to the first page - rootFrame = new Frame(); - - rootFrame.NavigationFailed += OnNavigationFailed; - - if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) - { - //TODO: Load state from previously suspended application - } - - // Place the frame in the current Window - Window.Current.Content = rootFrame; - } - - if (e.PrelaunchActivated == false) - { - if (rootFrame.Content == null) - { - // When the navigation stack isn't restored navigate to the first page, - // configuring the new page by passing required information as a navigation - // parameter - rootFrame.Navigate(typeof(MainPage), e.Arguments); - } - // Ensure the current window is active - Window.Current.Activate(); + await ActivateWinoAsync(args); } } - /// - /// Invoked when Navigation to a certain page fails - /// - /// The Frame which failed navigation - /// Details about the navigation failure - void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + protected override IEnumerable GetActivationHandlers() { - throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + return null; } - /// - /// Invoked when application execution is being suspended. Application state is saved - /// without knowing whether the application will be terminated or resumed with the contents - /// of memory still intact. - /// - /// The source of the suspend request. - /// Details about the suspend request. - private void OnSuspending(object sender, SuspendingEventArgs e) - { - var deferral = e.SuspendingOperation.GetDeferral(); - //TODO: Save application state and stop any background activity - deferral.Complete(); - } + protected override ActivationHandler GetDefaultActivationHandler() + => new DefaultActivationHandler(); } } diff --git a/Wino.Calendar/Args/TimelineCellSelectedArgs.cs b/Wino.Calendar/Args/TimelineCellSelectedArgs.cs new file mode 100644 index 00000000..31f9e270 --- /dev/null +++ b/Wino.Calendar/Args/TimelineCellSelectedArgs.cs @@ -0,0 +1,41 @@ +using System; +using Windows.Foundation; + +namespace Wino.Calendar.Args +{ + /// + /// When a new timeline cell is selected. + /// + public class TimelineCellSelectedArgs : EventArgs + { + public TimelineCellSelectedArgs(DateTime clickedDate, Point canvasPoint, Point positionerPoint, Size cellSize) + { + ClickedDate = clickedDate; + CanvasPoint = canvasPoint; + PositionerPoint = positionerPoint; + CellSize = cellSize; + } + + /// + /// Clicked date and time information for the cell. + /// + public DateTime ClickedDate { get; set; } + + /// + /// Position relative to the cell drawing part of the canvas. + /// Used to detect clicked cell from the position. + /// + public Point CanvasPoint { get; } + + /// + /// Position relative to the main root positioner element of the drawing canvas. + /// Used to show the create event dialog teaching tip in correct position. + /// + public Point PositionerPoint { get; } + + /// + /// Size of the cell. + /// + public Size CellSize { get; } + } +} diff --git a/Wino.Calendar/Args/TimelineCellUnselectedArgs.cs b/Wino.Calendar/Args/TimelineCellUnselectedArgs.cs new file mode 100644 index 00000000..7541a831 --- /dev/null +++ b/Wino.Calendar/Args/TimelineCellUnselectedArgs.cs @@ -0,0 +1,9 @@ +using System; + +namespace Wino.Calendar.Args +{ + /// + /// When selected timeline cell is unselected. + /// + public class TimelineCellUnselectedArgs : EventArgs { } +} diff --git a/Wino.Calendar/Assets/LargeTile.scale-100.png b/Wino.Calendar/Assets/LargeTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..42334872ed2e39b9749064eb79bf7e2cb6734aa8 GIT binary patch literal 6351 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 MX&Y%(YCezrKdsAY5dZ)H literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/LargeTile.scale-150.png b/Wino.Calendar/Assets/LargeTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..e29aa6e006927c94283ad3ee793e8e2959151c21 GIT binary patch literal 9805 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 XaWl)18inzH7?a^6V?DTz)7$?6vrduE literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/LargeTile.scale-200.png b/Wino.Calendar/Assets/LargeTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad110869777b0f57758b1b72346d3b48c7514d0 GIT binary patch literal 17024 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 ZWDJjek)x?N^R@<-NBX7@%5)vx{$Isi-5&q| literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/LargeTile.scale-400.png b/Wino.Calendar/Assets/LargeTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..af446cf41874f57353ec28d6d2d0939cfb35f060 GIT binary patch literal 45230 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 PBNS?D>T7&avwrb^w5!L= literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SmallTile.scale-100.png b/Wino.Calendar/Assets/SmallTile.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1167f739d93e85ef57936fe61ea56deaafad04 GIT binary patch literal 2108 zcmb7`c{~#i1I8!DoS)2&d_1p zfT4tbv1idHOY*nJhG$HE|2FbN@OXOy6feeeJXC@BMESL0JYZI2krM z)VTB?A0HbUu9w>VKn5>3w}b9At@!%RJ`C*)+Uprv+L~)alxdK*uB!*%o;$jFP#3p6 zDK|+nJgUX=vE$mmExd(l7iB~@9z`9WuG(K9Z47r$7&wv$XZWo-MAj#{2_m|mH`Ob7 z%4D1Z349kW(&Z;7FkKXVV)dm*|3bfCGqKaBu94S;5BXj3UQ3MkK*wWaH=S$ByCa>2 zyHrei>_F)d1xSL*?ekCUo^E#4XUB78zsA%oB^uI>o_$%#6gsuz9Rf16f* zis7}a3bY-C`UQ)#bO4uc=B8*mHJSHw+zWcJIxx1-(m*RxNO^uX3~TRH2ylIBE(3En zRawI+R|~=fZ$+?;5+66oI~G3~@Sbm|mXwc<-%gtakDE1Uxx&k;Hdme^L!=Owv}}@~ z|FO5OaLoU}Dd~rv-1%axL0e(_F+kg73fMJX))F?Ib=C7W_@G>tE|*^-3q=3AZHcsM{w!4Ycoe$ zG_ivAFXB$7iRwbw_>Wv%w@tPz`(920U#x150GXsXqPNnk^aeRI6@KAbw+T!l$gunq ztN&&SiJVx??W4fD8O%6SBBm1_`lML2qecv9-Anw;NY#j2yDTAM%)U5G^jbG!iBfN| z`eK9_xlt>$Ekq ztUr{*7Z&re}6o~*;(Z}6x3EqBa-@U zNm4pmZhP?pM_41Wx@frpzT%Z4t$2Dq5gp>Df zf+q$CTNtTakrk||;toHM<_Zi7^160~mu}7^7Fy}~=^n-kFP-75uPM7J`66-?RfCcm z!X^n}IjTf<# z;-b7yqn(#(2DAhj!?L4O2tITTVMR@4sgPc%V}!K$=ASxo&ck!0E2@{JZYw2Rxoz{U z%_2IJWf+8*NEWvXV$BzX~fENnC0x zqf7D~X;Z_~ zPt*^|E8AwUl-4#2t^))sYoFuil~AVJ1)j+UN|v4JtGSY171d_sEYHpAl%c4F@SLs} z)Df{VpdDNc`Ir}ToZQQ!CeS7kz#ui?+MwhK1OHJGud$Sd~j0;7Qpy7WE@_e>JzAcy_Kj=H29slED} zYvRU9rdL=q^5RopX`2?^>9hbFnvA-}?vT+6R~ zW_f%9#whNwSj!fH|2n4H>*P^hli;n>EqJJMr{^3t9U@imf?PiP{3LSzZUv2lsUATn zUALwud7=#rvKrefuW^5pNP}}j@!c!yjA}E4=1P9TTEm6;`UlW1>)lEBj3_zpz*V!O z)Vs6ItF|Rbh@E3MCzv(%+Z!24@#JuR#q6SYnko8JQ5}!GtYI~LS+M*ftf5YUZh@sd zU6Za5*$z>A*)w!w%P*Bf;^wor;2+SHeElpvX`6cG& z*RIKKW1R^D84@w;el7;w$2>B)$m!84rPH-TFUy+fc3Vw61nuI8Izxw(;j39xAw_`! zSC>n#v4}sDj0cn#-Chh~u8=h#cLQrLI p(@Tsw)IZ0g0{+!z{(t$m0FQ%eV$x^JrN4IoU}j`#SPQ$K^gl*F5W)Ze literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SmallTile.scale-125.png b/Wino.Calendar/Assets/SmallTile.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..d8bc11c5b9ae2786fcffec1a90046fde0e076321 GIT binary patch literal 2596 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SmallTile.scale-150.png b/Wino.Calendar/Assets/SmallTile.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..e124da4125b1518626dfeb4f1a7a9149eef1fafe GIT binary patch literal 3092 zcmb`JM?4&i7R8A&y6C-&7KGpOxmnS3SCLtzZ!i4!%76n`1p6{b_4OzC%Hw1D>}s29a_e_)Arn6`~sv z`5gxZ>GBil^9loLb$iow$g(v|8~D?s9(|%0O{n-^Mo`AN>~civHhc@@`?Yync8ORY zEq;VSin`Y~wXjk300f&R6>oUPcY`4F)w8|W0+iCd(7g@U&f@D`ymj?9@9>Sys@f-B zthqleAWJF9^dc5c_AT9CAtW44BE|O;l6MJ%bFLPxBR27-fPK{oZ^4}~y z*;RznwzACE{Z&`K{VdmwQkNey&Rpn*i0S7JMS2u--?i=T?%H16@eINoIT$qZP#%$_ z#G{SczBuDA(~-lz;BETJ1L?xCvWU2Gv7x_ZKqR9)FWTh)%1o%nCAek-P$#f>R}(B! z;_A4R%TTdxw>qyeK5h2$ZN@?37S2m_HS$3)bdDcmHiGux+Qel5j8J=& zk5wmke0CR{aycRReDJFx?qLbaToy6ZaLz^yiIEY>DRIxN)&h^R&Y??@*rspzjA`i=7f@`1oFR&~2rJ3H8Yf$nUxfN0cw11WGc>U*eo zd0ffdK_mh8KHn!UgTNvKPle&}$pk*#`=-E$A6&;VDmUl(@ME;4Kq=Sb_w5s_)?Cby z9Q!wUsWa1B^7hLLWc4;RYShZb+PUDC6^h5VQmY*_nMcJrd&fQS9F?Q@E`At2S)@>@83`N@l)~a3- z60Hd|1Ta(wpb|fA{cY(BQ|MeI-vREYO*_(Mdvu4dL}S@?1$5 zkw!|qxpjd7vBIYgzR zS)-tU*wu)>Wz5H3>aoUAIZY>f{QaEB!u-Ytn>%#>G47ju0CZ}qF6l4n3Utw zq;fDz>}ePsFLEE(EH;#pKk3-TM+&9QHi;YI`5dX(XJ1%DVj?OrIpSJZZIo5?ZT-ZT z+>WcNHKy7Gwpq85xhgQv2ie`w!qieP+_I?<4y6*LAvTQ9;k_DcrT9Rz=q+i}v{qF< zQ^q8~(n%>I3G_Y4`aWXOF%Ch53Z>4xKB$kn#>vkk8^w%_Kt-B)HIhJ9SMH4v!Uuv? zCVrzgr&D}G1V7YUG@nY)dZJXtxXg2iu*97*z0%;IMsV|M!Uy%`)ZntqOnt96cR zyXi$i>hoL~+0CW|Nh0G~XBW5_`5KgD0#VuWx;gPnmuw-6!Rc4FLJG%y*Q{>>Nyba5 zKzY0Kv9 z$BIzs;k!{!LGMomZ>`cF&HV%`XiqQlTW47Wx7e3eir0D9obvM76WoP z&oN;5C`EsVPtB-|yK}NC;TcW^rHN;XGFMA*cc&Qaeea}dy>QC!$lS4QmOkAIvCTz+ zqPtl1Dbfs?VDzCM$E9ACy3Zu{pI|YXdsC823_cHMO3Zr8ihL0hYb}_ml&86Ul1UCx zdD{%8z=Z7MZ($az*H!Z0(D`)_lGmA;Y*i{uUXrdb6)8ib2iX7I9Hw}R?YeLyB{uNh zMJ26eu^m>(B|!{2gV_ZU))zJ>ovM@Qfs9djO1##T6hTP%DMC18@A>A|E5>2JTp;i# z<@lHSQhHy5Ki|6stjhqjJc8k5xGv^L8o^@1y&M-&^;O&O1ZaD#D6R@duI8 zYv;0IYNJZsvELbe1s{><=i65VOe7X|Y&m*A*ZEKbViFt7)WBrv{4p7radQga7~l literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SmallTile.scale-200.png b/Wino.Calendar/Assets/SmallTile.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..3854c86c111757084d18739230877bf33b74a636 GIT binary patch literal 3958 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SmallTile.scale-400.png b/Wino.Calendar/Assets/SmallTile.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..f242a5800f66f61ef2f7d8d265324c7068ffdd77 GIT binary patch literal 8075 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SplashScreen.scale-100.png b/Wino.Calendar/Assets/SplashScreen.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..86ade338c71f4cd6d466c93c08cfea7ab9c4587a GIT binary patch literal 6789 zcmeHMXIGO;yAB&ShzM9fN+{b#hv=pR48j%=1f(dvND~PqbOym5^~~R=gavG=lwAAtTk)ath-$IHP=1Q6Dtd2ffEuZ004l1 z$t}aX0KgwG0Dw#RI1gtf{xbOo=ff9#%P|Z95bXLrxO##w?tU=za|Hc|P+dBk&A zq{q}R!t3ejc|;_+55&B6{^38VS6?*_yf?ofY#;E>>fP#%hlYOE8pZmTOAb@t*qO6$ z3BR=4lo`-d;ks#VcIMdM7fy{Coe1$<)bIGJpbD2t45*4@)zc1jsn;QD=(T=Ie;5=F zB_EOY*Df+hgZ-}w`3*>yxP3@EK_3A4%a7llUkXM(o zib|K)?@mN@o9@u|&(+>1Jf>`@qKaF{ky32c3{QzkMugSQLbul!>R6v}tX| z&81^mfg#(rR;B797o$*$YKt8^|C)A8RW~~NvFx1w@1|lXgak=510F^ z!M1KL
    }rnB(Utl*L_OiMg#Er&g8Oo-WhX555s-#4n_3d6ekHT(bivDr&ab}f(i zFqd_9Vr3iM!jIS2L-tzq1HhNiqFr?UmA2Q{&%oMU_%z)~ zs*mqB=DvtmA?G_?+%6}?!HAor@s4ql({w2^TJ6%tI%v`-sp_8TMCEQES0&()K<>;? zJQElh|7&A^d|+VU7jWFK7#>fF$jVw7sa&hhOd6%MQI>^b86f0QtV6xgk$7+GB&ChD zY+e>Q|K>S=ox0Kp4n>@V61JM;;wnv7qUtHs?tKJubw6Etg7n8^j{mZo>4JRRPVrhG zbD!bL9By%o`DI+@Tay2RFWV(fP9P0B*;(cm;kn0?79)T8dv(oF009fXoOJgA)8VR# zzlqjSzfsgu-soziSi=A{u>OFF8`29?V9|F+56D@U@)jGO0r!FN8)ij^BWA2q%ewuH^DEb8= zCQ1ThByTTA_NN2~QRgFf$s)3ZY!v~MhS*(OJ?iU}A=@u0MHxwP_?bVBs7hv z_HP7YAKa*kh=x3GvUk2~p&#*HqHYqdUlLCIYMDXY8jPtUY(YF$`m3!7Qb+O8eF1LM zx{q48KSy$~QMRkE;1aufw|=)XMk|8xy{c*4nQ*51uCsecwV>r6B8m-=OPWG zM@BD>P*_gCWcuN!_mXmh|^bo4AzEm|$EI*84rQ$nfDSbng$op}ha$qsz5(5&@AL+i(cxfu(Ng$Fq zu*ft=Rn=9Cn3^!8&zW~eDd~c%ZpBLI6Rw9-dMfmsgdlqSLlH<~;Mn{p+Iv>d&QzjI z5w$HScyg>3>G8OF_Tzm5fj$_=(D9rN4=z`p%GeG4G>Pqu0f<>vah+8mz-7zxKPTb5 z&%wsZwKd*~EBHdnXR0SyaSQZSWLhUY&5o>|sG{;*#HhLLp20xg^v7;@(=ID_k=d$K ziD{lzB1_d)p7R610#W0h2V_<>l6#$o3bWa-a*t~-I|b@+NN9#?h`EIHyz+Rej&6 zd>rB&Y~=|-QD#j~FI=IS-74Bu-90iEAv>Mm$k7nr!l8XU%QZHYdJV(RF>@abzR*4T z!5pN|pSHhb1N4pBQpxfzCu&&4`|OjPMVrJO=ip%AnzN;CrvT!s6Eq)-uM^G)^)~_` zVWt9F@*O-bw!Vv46WVx%=0{L|?ChPZ6Ow3MmKJ0m&)^yNo+>JsSxB4RlL)@TVSrc@ zhE8qu=;=1%*f5~RA~xrxuK31xm< zxYMw9+v>>yZ$_b*&J$Q=b&t+eP?(f@y_4um3(DmWQdgunc3fBc9C)Q-arGr=ql?=9xO%fv~=!@T=-A>Ie;n|s{mhy9Llw8r2kG03{ay>_K6jtxDZ znhvo;pjo9myOVut!p_m1EiL(?x*#Bm~3Pibp-B39B zx}8NQx(I)Q5dCqqdC2L0Rs1z290RmB&Kel+qI^%x<^wn^-G2gLHR#>`RI(@rqtMjMYCc_ zqk*Xgs_>KyN4dSAo}B&UeXb_=!}gGsJ#1~hQd)&Aa~YY@V8Ndu91Y%2`Guy#QprjR6^HPU#?+= zGL&$}YPtOyvs&MOpVc}Uh4OM|JR~4;cyCL~>wR@pbTJ!dZC_pD?tjMNxQtqIPj1S4 z!r6wGh>cQi_ZJ)j&GJ>vfK_lwbb7Z$v^w~xH`Z8HPu=u(q=;bJ>RP33#t2uo9=2}m z`278MiPo{nMJuKX$~li5!R~>-8Ji;W#H-P{ndA+ef0flso3rtC^PPV7j@m^6*?&nr zoZ}z20;$g7<6E+Cjyx&Pk3RrO1rEH0qOPTgA86tNkiuK4T#GQaR~NVP_}CjG13UYe7>Z0z zXD3f_)H}ykVse4e!S-}Pm6L*qs~;-^q_N+W9;8|1Huw&GCkhEgB{Ge5w=h}bGjfGf zVvY1b(pS$jx^&Dy@K|*y#k)SOGt{m-*iW@2t9ynVAE6>yc@mV91#;YPE1W;U-b^1# zfmkTlQqfg6X7I(a=e`tnFQKK~g!rci1qMx@YPh#?k^t^oIn^5D3y!77Vla3pln?E_ z@S%9tj7YE-HTCc~SY;3FFjiw!n7g8?A`=%>o{zh}E3NtH)4Kh`6TBUxI2|U61uhce zNGo$uJ^95S5=xoM@Pu0HzXpbe6!+# zlh}L8!{p=Jo9d1;Zw4SElF*$v)>bN27b2y_vzZ`Yh2)6!rYDYnle&x7coWfRHD^t? zi@LB%A@ND~0$PL0@hfs1a@ScJB)m~{&p5iD>ru#3LqB@sn|pOE0btE(ljfGsTF|qy zXE6`?kG)AzVF=w{MMoAm$R~%2k#b}6iAEBdWofNp6SxAQNFBWt6}^+Q@kl2zD0sFA z1Iur9Y&e}_Na>;fDcGaqUod^bxY%E+0C(HJp*YZXZyXf&~>Ad`RqG z+tXM`__vbNy@h0dbrm?3L>zr~A|u%yhaBWJ>A=xN$mkOLpN$v>hr#1$Wy zTH84ou(d{N;Dg+6TRP5mCA1{X@Zvr6~BVh;MUq&%{HaPGe`#xIwhVKR(0I}<^6U7p%W zM(BoXebyM6)w7KPL&WThpEDnlvjjCc4O)63UU3dvfh@n{KbF31 zr5JpiV?vhKQwotX5#2CzTqe%1OvKR_^f|`N6g9y3m{s%DSpnWXI^Qi{r7|G3U~XzTrwlWw%FvI(;}F9_g;Z_=A4_hdxwLN!8}f zIq67nVSu-wy96g2rev$dqyT-T84FEOtDqvGiRbTK%~5H!Se#E}FD$BDr`_X2)1KQx+kZC8(o& z;F<=V=U(vR2-0G4g!v816YkYPbu~XmeK+ogQ057(g)7H7cTaMtyc{Yt7x{D>+N^J3 zK87gZ2gpi3F2L{LHY5d0SCQE7`qORQ?S@A$0kTe}O6j&(uh9m;1o zgsv_lutRQwsNn{1k61Errmhz?!f1&j)P87^zj2M}#GsSN1zm5_I*5qM2=Zxg)dhV* zYq+#%rGtE-GB_$?ZQ<8k_z!p&8Q6%OTYx8{Gsp8ftBGq!b{Kmh!tz)G-!Whnx(&fd zV{hX{RX=B)J9jj)N`+_K)&iGD8O+wQ4Bwwpn=ka`b)ba2-*GxW^|VZ~7XO3)U2)zz z+*RoO^R&-Kj4R&1Hage#(_d24Y)@7j(db6BeUko(`;RKvmCAg5W@Z~DhslmOaVK+8gvqpx!+ah$2-p+#NK;w~-m|@J%8X_Ax}fzc@J3%ig9n$VY^XasDd-Om12je%5z?^gpOW;a&g$ literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SplashScreen.scale-125.png b/Wino.Calendar/Assets/SplashScreen.scale-125.png new file mode 100644 index 0000000000000000000000000000000000000000..55d0473d0bdca46b7017fd6fdf4afe5a90bf6bd6 GIT binary patch literal 8513 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/SplashScreen.scale-150.png b/Wino.Calendar/Assets/SplashScreen.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..80b9ed0de1f5be04c5e35256e60e28cbc974eab6 GIT binary patch literal 10508 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 literal 7700 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 diff --git a/Wino.Calendar/Assets/SplashScreen.scale-400.png b/Wino.Calendar/Assets/SplashScreen.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..7efc715b52803f3b7db267e55df3f69bb26ba1ba GIT binary patch literal 51234 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 TPJRHivu1kQ23p9ww*UMOC_#L5 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square150x150Logo.scale-100.png b/Wino.Calendar/Assets/Square150x150Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..37501fe7ddcdb0edab724f1226c67a655ca59c51 GIT binary patch literal 3053 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 LclAqexkmpN!u%>g literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square150x150Logo.scale-150.png b/Wino.Calendar/Assets/Square150x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..15dc07b54c6c597eeb809249ffe89f00f00803e7 GIT binary patch literal 4529 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 F`Y&0A&|m-n literal 2937 zcma)84OCO-8BSud5)jwMLRVKgX(S?$n?Ld|vrsm<$CF7)&zTbyy1FE5bU`Q17MRv`9ue$;R(@8kR;#vJ*IM0>cJIAOte!d7oRgdH zd%ySjdB6L9=gX^A6)VzH7p2l@v~3zJAMw|DFy#^)F@@F*`mqUn=Il>l)8_+ab;nOW{%+iPx z+s{Eu|&pIs)Z7{La9~?xKfyl z#43?gjEL15d4WbOZo#SiP%>DB^+BcnJ=7dHEe;r#G=tuw|ka z%q@}##Uh7;tc%L_64m(kHtw74ty%BJMb)_1)#S0j`)F8_1jF7vScpsnH=0V19bO8y zR`0SjIdCUo&=>JwMQF8KHA<{ODHTiQh}0^@5QRmCA?gOH6_H3K^-_sNB^RrdNuK-R zOO*vOrKCVvDwgUck`kF(E7j{I#iiN;b*ZdCt4m@HPA`EuEqGGf4%!K<;(=I=&Vyrw z%TwcWtxa}8mCZ%Cyf&ActJ6_$ox5z6-D!0-dvnRx6t7y3d+h6QYpKWO;8OdnvERo7 zuEf>ih5`wqY)~o@OeVt-wM?Q!>QzdGRj!bz6fzYrfw$hZfAKzr2-M+D+R>}~oT574c;_3zquHcElqKIsryILt3g8n3jcMb+j?i?-L3FpZJ z2WRVBRdDPc+G5aaYg#5hpE+6nQ|(VSoxT3|biF;BUq#==-27Xi=gihDPYP$7?=9cP zYKE$jeQ|3~_L0VG-(F~2ZPyD0=k{J4Q~h(t__{-mz_w8{JDY9{`1ouzz!Vr5!ECdE z6U~O1k8c}24V7~zzXWTV-Pe4)y}wQJS&q%H5`Fo_f_JvIU489aCX$;P`u#!I-=^4ijC2{&9!O&h>mi?9oYD=GC#%)6{GzN6nQYw+Fal50!#x^asjBBR50i`+mho*ttoqV)ubM2KD9S~k7+FR4>{29?6 z{!l6kDdyTN0YJ9LgkPWeXm|gyi@zM3?0@{&pXT12w|78&W-q!RRF)&iLCEZVH<|fR zN0fr2^t8H(>L?>K#>^+jWROLral(Qy-xoBq1U7A&DV||wClb)Otd9?(gZ|8znMF}D zf<1haWz^s0qgecz;RFGt0C-B4g`jNGHsFU+;{<%t65v^sjk^h$lmWn#B0#_)9ij&d z-~lc`A)YYExi^7sBuPM^Y|wA2g*5?`K?#7tzELQYNxGo$UB$4J8RJp1k(8Jj+~hMT zlN~>M@KTTh^--8y3PK_NZ@AC!{PT=CziBzGd+wTJ^@icH!Bd}%)g8V)%K?|c&WTUk zy}qv1C%(fjRoZ4ozC3{O%@5?)XzH35zHns$pgU*Q?fj4v?fp1Qbm+j;3l;9jam9Da zXVcKjPlQ73x78QPu|Ffm6x?`~e3oD=gl=4kYK?={kD5j~QCXU)`HSdduNNENzA*2$ zOm3PzF!lN5e*06-f1Uot67wY#{o-S1!KZ7E=!~7ynnk9_iJR#kFoNbAOT#^2Gd17F zMmvU6>lndZQGd|ax9kUoXXO+$N?|j@6qpsF&_j7YXvwo_C{JpmLw5&#e6k>atv%es z5)7r*Wvv_JkUpT}M!_o!nVlEk1Zbl=a*2hQ*<|%*K1Glj^FcF`6kTzGQ3lz~2tCc@ z&x|tj;aH&1&9HwcJBcT`;{?a+pnej;M1HO(6Z{#J!cZA04hnFl;NXA+&`=7bjW_^o zfC40u3LMG?NdPtwGl>Tq6u}*QG)}-y;)lu-_>ee3kibW(69n0$0Zy!}9rQz%*v1iO zT9_H>99yIrSPYVy6^);rR}7Yo=J_T@hi+qhTZXnVWyf;JDYm5#eYLTxr*?kiNn!+Y zQ+LUkBafNJ#rH#C(?d5^;gw9o#%daEI{mA*LHPIHPU`#|H$hD zwm>0&+kahQ)E#%~k>&5@&#Vg82H?s%71=)(soi@174pi9--2{w{1$}Sz4zGn3Du&x bht0Iza^2ykEt4(epJ78uh5nDlX8(TxzDYwP diff --git a/Wino.Calendar/Assets/Square150x150Logo.scale-400.png b/Wino.Calendar/Assets/Square150x150Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..cb218b688fd66472a955eec341480f460e1ef8a4 GIT binary patch literal 16111 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png b/Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c72b37db801b828c7f7386814292447d9600852 GIT binary patch literal 809 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png b/Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c0cb66a7564f2a5227ef8cc9cb75cb7c89700c GIT binary patch literal 1615 zcmV-V2C(^wP)pL0ZBwbRCt`lS6ysWMHD{w-o3Zo?QWr4Xp16R5)*}lCyWs_qC`my z{-8vYJ{aGT#ONEoXc|paUVQM$pM)1oG++QFK1c$h7=8pa#DLON#6q_}+uiN%-TOB) zo-;Fdf4c3qH6~1QduPv_Ip;g)d~@zJ0d2;P^QGQzHg`|A(^+h6J5$Uae{e;9q4mT< z3y+?iJ?O1UJ+bXKclYs4sRRGT`Qw)=J4JWrr(4gL&!5H*@0=K!8Bb)gV0(p| zlkY!ty$0Z}y(b596>*W-URE#@CMJAX6NDg&0?ISNma4E%TamRq0K$Osv=6D3KJYMv z$y{*Ai%c+F4~!rx^z1#oapt`(Hzfemw)%zXWV!Exh$4I}FbrIv2RQI30K;4!03I>9 zmuwhlOt27v1Yn{JeXX1=xT{e?17Ie@Rh$Xwm|^ssad1*L1TJQRqak4~3jp9A+G{73 zjmQsmKmw#M!ytsMBs5F|f@%m?j$ecBfeeganFPyTUi36*&y5RX5TdQwi86w~=&jZu z6o4Q=P?#K!84xOM`O!S&uT6vDU^#H3%mOaR(kwKL<|#S->*wpZ-vG-=$gIE|3=%;9 zrnMld7BC@{k{$v9kx0Gq;cCv~xqeet1?V}xV-rGd);5IxjR@#(sFfrDr>`Hn8Iu4+ z0|3rM?Gg0mYR)(jQ~i!X#b5}W!Ro-d42q0t9RffIkl6JSAUn~2O9pBHxB?KM(=g)l zHyN~aR3v8_4DuZ;ojpGWDOBcF>?&i;9GGv2=AYyQLG#OVH!R>IR%}a%`9AUf2EkRxS6s*Vf3Xeh+m3IgD1 zxmXN90V8|uzAkuuLzmR{(9tvBO~J2|0etdU7M>mKl=7=HNWz2T63o$E19cK!tH99L zK0zc?8I_OJWxa}`VDeFCL#6-EM11`iEEW$o+B_H z0E+&L(JCCfQB@qkX95XC$LsC0Mfl*Cq9msmVBIl%6OrvYJdV6EWaMR^K_+EM(mlNY zA4nLgTjpjX=twSsgp^W3Ux}bb!Z>LjQy&`DX6q4EsYNqYzZ%(a`Hwt)Wtjp%?ZaFu z3HRLJ1#jRZw9}`L5ea?xY-=w(zdkATu3#s8@~d0&8*uE!HL$VQk@6#dmSN~{4!MGD z8^fo2O#Q>Ogc6Vvo%y6DVJe|WNb(*$nkg+`g(ZnQA$7%+t>r|*RzG!FGY1zYA)iA+ z+Ec~}Z|sEH9+8kYk&wz(_aa&*Z2%AnzeEy#Kjx`VFh02|k*qUwZ|hE6zi zG^f%{%?HUxN7Y!waT5S;)O!>eE#YT#5}nG62s)z{LzySpSSV`u0Y?+-Z)A9+2}%WU zP$+doTi3-x znSp25_6tT71Mmu!5#faUMMwHx`M*JY&7xZpSB@ARM_dpQ)NV*TzVAuLymsVBD6w(P z4K0_~vqTc?pgMX_$BL25F@Q5Kuk-Nr>LS_t-v-?VFE^Ipc8=Q);9vX%|L={Nry&3U N002ovPDHLkV1lQz-QoZM literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png b/Wino.Calendar/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..56792258f1b4a9ed041e9c49f0b9973df488e28a GIT binary patch literal 2485 zcmV;m2}<^fP)pOXGugsRCt{2S!s+MM-_h6$IR^PG3)i(?AnQ<1jWQFEEG`eI1UaV zB}%v?6l5WR1b;047$PAA3it<#9Pxugi6SA6NE{YHNI}X0At51>jpA4vY$9V~FxZZF z?ai)t?Y-vcvx@h+tNNJkId(IMAW=I#JzZV(>V27A;X4kQ)Qn`Qg0mC$hE4uZAC*RXQ)2UBK0G~cB%-KfuxBBS79$)~= zm%Tj)g}C<+W1=@|heZehdr#DUu5T*t!=JG57QcW0W%2%>Y-Nph{W<~|x>1Z?Ia}Cc z&)UFr9k_ryK7;)Z0l2+WKhy;kzt5TXL3kd3X5L~Ciw#)cJ%I5CU-@#C_ucQ?b+k1H z&lB*}cTbik?z;t;rh&jZ-}j4m9-KT<_|g&2&{fhx`We!AMW$t zfA5W_3I~o@hC$%rLSFfaO}i1mU@QXcuvzmkQs;Nje|OBjQPHNY`cg_pi_6jvppzPN`b)D)fyVc3xV`X zcQmlu@W8G)P#GHx>}c0)uyJgy!#G_4aNz9G^Kiolu0z2BE=*2?=lY-Xvl98{8{ zyZ-Cwn{eap*Mo+#r%uj*U9~|s_4NawLISQ`T!O{vFn5u4bhCHLt3pbzT&cpTXU-5J z9EW#Qo=OD3#n|h+xXRJG46->&_#*UuynN43y<>^*=AZ2fYkI&)E!VNYNEm`hccAE= zu8RPSj1Plt8Q@rrTmT`8I8dm8Yz{CY@h<8M$v$CrPPHchMiG1jms!N) z+sCnQAGio0Gny18dbop3ETu}A%e3HSU1_Xlo6*Sg%GExB6>JCJeim1g;KQaR2eR|ZNI>&;@bwqwp2ylk7g+u0|&1CXw*os#a~=ADG|i>_@(DA}XV#!DFv2!H-TX$4L(VY;>VgL2DU8I|3lQ4IIe! zRaOlZG*Mhp3!^w$b=l^DLJ9!g2gpSdHoJlr=PI0%@1uz;1r}MG`d1s01*lkzRw)-) z9x><+0PQBX4H>YttVaMy_<3}PH&@Xmq>u02QiOhkMd_ci{fRjnmMtFC4I-Gkt}6#| zUb$J-;V?O4MLFQz8%($vFMyavOrcAina4drn@vqi03@T1f*;&503RAlhqousH()=; z`7)Zgg32AfXB38-V)f^rpNC)ny%s2Z_YM85^Ak0w8fk?EmAlbvQO>q&WHH6(;~johb`{^Y{{M#Kx)(S&kNQzf|hPoC6OXTMQGI z2xSuoy4v7i5;|1$@LyNMJPpGxe^H8Se2jRXRz9A)MlUH}^yH zI{wYs8oYYh3IuH%G2x>(l`~^JjBZ7gxu}pOl~yQ7`SrRG^{wU6TrZ}<^mYZUI9f_0 z2PS5axc1@r9-F&d1xn!a~*3VV_V9Q7vzlx!F*WpVkGFL|zTEsk1&|0(2 zZYH7a43NdDXr*g`#bd6o%Xj3%WWhPPuT@l(y0 zOM-+JC`U@OcqUW{6rp-d5Q2`%MR?qzGzzl1(Ub?eSfFW5Is)(wrs->u+FJB_OxdDS zHaZ17H_|)$!Gty?dw_1tEz~YZsYF)hPZ?00000NkvXXu0mjfM39%p literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-16.png b/Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c72b37db801b828c7f7386814292447d9600852 GIT binary patch literal 809 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-32.png b/Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-32.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c0cb66a7564f2a5227ef8cc9cb75cb7c89700c GIT binary patch literal 1615 zcmV-V2C(^wP)pL0ZBwbRCt`lS6ysWMHD{w-o3Zo?QWr4Xp16R5)*}lCyWs_qC`my z{-8vYJ{aGT#ONEoXc|paUVQM$pM)1oG++QFK1c$h7=8pa#DLON#6q_}+uiN%-TOB) zo-;Fdf4c3qH6~1QduPv_Ip;g)d~@zJ0d2;P^QGQzHg`|A(^+h6J5$Uae{e;9q4mT< z3y+?iJ?O1UJ+bXKclYs4sRRGT`Qw)=J4JWrr(4gL&!5H*@0=K!8Bb)gV0(p| zlkY!ty$0Z}y(b596>*W-URE#@CMJAX6NDg&0?ISNma4E%TamRq0K$Osv=6D3KJYMv z$y{*Ai%c+F4~!rx^z1#oapt`(Hzfemw)%zXWV!Exh$4I}FbrIv2RQI30K;4!03I>9 zmuwhlOt27v1Yn{JeXX1=xT{e?17Ie@Rh$Xwm|^ssad1*L1TJQRqak4~3jp9A+G{73 zjmQsmKmw#M!ytsMBs5F|f@%m?j$ecBfeeganFPyTUi36*&y5RX5TdQwi86w~=&jZu z6o4Q=P?#K!84xOM`O!S&uT6vDU^#H3%mOaR(kwKL<|#S->*wpZ-vG-=$gIE|3=%;9 zrnMld7BC@{k{$v9kx0Gq;cCv~xqeet1?V}xV-rGd);5IxjR@#(sFfrDr>`Hn8Iu4+ z0|3rM?Gg0mYR)(jQ~i!X#b5}W!Ro-d42q0t9RffIkl6JSAUn~2O9pBHxB?KM(=g)l zHyN~aR3v8_4DuZ;ojpGWDOBcF>?&i;9GGv2=AYyQLG#OVH!R>IR%}a%`9AUf2EkRxS6s*Vf3Xeh+m3IgD1 zxmXN90V8|uzAkuuLzmR{(9tvBO~J2|0etdU7M>mKl=7=HNWz2T63o$E19cK!tH99L zK0zc?8I_OJWxa}`VDeFCL#6-EM11`iEEW$o+B_H z0E+&L(JCCfQB@qkX95XC$LsC0Mfl*Cq9msmVBIl%6OrvYJdV6EWaMR^K_+EM(mlNY zA4nLgTjpjX=twSsgp^W3Ux}bb!Z>LjQy&`DX6q4EsYNqYzZ%(a`Hwt)Wtjp%?ZaFu z3HRLJ1#jRZw9}`L5ea?xY-=w(zdkATu3#s8@~d0&8*uE!HL$VQk@6#dmSN~{4!MGD z8^fo2O#Q>Ogc6Vvo%y6DVJe|WNb(*$nkg+`g(ZnQA$7%+t>r|*RzG!FGY1zYA)iA+ z+Ec~}Z|sEH9+8kYk&wz(_aa&*Z2%AnzeEy#Kjx`VFh02|k*qUwZ|hE6zi zG^f%{%?HUxN7Y!waT5S;)O!>eE#YT#5}nG62s)z{LzySpSSV`u0Y?+-Z)A9+2}%WU zP$+doTi3-x znSp25_6tT71Mmu!5#faUMMwHx`M*JY&7xZpSB@ARM_dpQ)NV*TzVAuLymsVBD6w(P z4K0_~vqTc?pgMX_$BL25F@Q5Kuk-Nr>LS_t-v-?VFE^Ipc8=Q);9vX%|L={Nry&3U N002ovPDHLkV1lQz-QoZM literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-48.png b/Wino.Calendar/Assets/Square44x44Logo.altform-unplated_targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..56792258f1b4a9ed041e9c49f0b9973df488e28a GIT binary patch literal 2485 zcmV;m2}<^fP)pOXGugsRCt{2S!s+MM-_h6$IR^PG3)i(?AnQ<1jWQFEEG`eI1UaV zB}%v?6l5WR1b;047$PAA3it<#9Pxugi6SA6NE{YHNI}X0At51>jpA4vY$9V~FxZZF z?ai)t?Y-vcvx@h+tNNJkId(IMAW=I#JzZV(>V27A;X4kQ)Qn`Qg0mC$hE4uZAC*RXQ)2UBK0G~cB%-KfuxBBS79$)~= zm%Tj)g}C<+W1=@|heZehdr#DUu5T*t!=JG57QcW0W%2%>Y-Nph{W<~|x>1Z?Ia}Cc z&)UFr9k_ryK7;)Z0l2+WKhy;kzt5TXL3kd3X5L~Ciw#)cJ%I5CU-@#C_ucQ?b+k1H z&lB*}cTbik?z;t;rh&jZ-}j4m9-KT<_|g&2&{fhx`We!AMW$t zfA5W_3I~o@hC$%rLSFfaO}i1mU@QXcuvzmkQs;Nje|OBjQPHNY`cg_pi_6jvppzPN`b)D)fyVc3xV`X zcQmlu@W8G)P#GHx>}c0)uyJgy!#G_4aNz9G^Kiolu0z2BE=*2?=lY-Xvl98{8{ zyZ-Cwn{eap*Mo+#r%uj*U9~|s_4NawLISQ`T!O{vFn5u4bhCHLt3pbzT&cpTXU-5J z9EW#Qo=OD3#n|h+xXRJG46->&_#*UuynN43y<>^*=AZ2fYkI&)E!VNYNEm`hccAE= zu8RPSj1Plt8Q@rrTmT`8I8dm8Yz{CY@h<8M$v$CrPPHchMiG1jms!N) z+sCnQAGio0Gny18dbop3ETu}A%e3HSU1_Xlo6*Sg%GExB6>JCJeim1g;KQaR2eR|ZNI>&;@bwqwp2ylk7g+u0|&1CXw*os#a~=ADG|i>_@(DA}XV#!DFv2!H-TX$4L(VY;>VgL2DU8I|3lQ4IIe! zRaOlZG*Mhp3!^w$b=l^DLJ9!g2gpSdHoJlr=PI0%@1uz;1r}MG`d1s01*lkzRw)-) z9x><+0PQBX4H>YttVaMy_<3}PH&@Xmq>u02QiOhkMd_ci{fRjnmMtFC4I-Gkt}6#| zUb$J-;V?O4MLFQz8%($vFMyavOrcAina4drn@vqi03@T1f*;&503RAlhqousH()=; z`7)Zgg32AfXB38-V)f^rpNC)ny%s2Z_YM85^Ak0w8fk?EmAlbvQO>q&WHH6(;~johb`{^Y{{M#Kx)(S&kNQzf|hPoC6OXTMQGI z2xSuoy4v7i5;|1$@LyNMJPpGxe^H8Se2jRXRz9A)MlUH}^yH zI{wYs8oYYh3IuH%G2x>(l`~^JjBZ7gxu}pOl~yQ7`SrRG^{wU6TrZ}<^mYZUI9f_0 z2PS5axc1@r9-F&d1xn!a~*3VV_V9Q7vzlx!F*WpVkGFL|zTEsk1&|0(2 zZYH7a43NdDXr*g`#bd6o%Xj3%WWhPPuT@l(y0 zOM-+JC`U@OcqUW{6rp-d5Q2`%MR?qzGzzl1(Ub?eSfFW5Is)(wrs->u+FJB_OxdDS zHaZ17H_|)$!Gty?dw_1tEz~YZsYF)hPZ?00000NkvXXu0mjfM39%p literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.scale-100.png b/Wino.Calendar/Assets/Square44x44Logo.scale-100.png new file mode 100644 index 0000000000000000000000000000000000000000..43b04c949d2e3b767cbd3f599f4e234132d44d00 GIT binary patch literal 1682 zcmV;D25tF?P)pLL`g(JRCt{2m|biXRTRh1%*)P`h zOkK~!8;=(=hwkpp$L$vz`2G_!d+epDhc^CP-F9egYIofJR37}XvPJZCzQ5sA`PAWc z-J9a{y(aLjuY9+%n8@7h&*Y(hsBZvF>nX13P%YToy0;%0O(f&3*{}IfEjcfDWl|Yt zn2)S__t!1sBhzDvbOubjaCzd*doHvLe9Mj_gSm=0%}hHhm=5FP4lH*)5JdsyX?J~1 zn8ys?hzBe*C{H<%TH*lrJebJ2du?9_t!jhj`h~t7$JR{0vHo&Pz`AJ+fNo{EQw8Ds zcp0E+_<%0pz?%S2@%;ttuYqADq}L%L^Sr1n`g9b(50?4H9cyU$dVLiChTNV)1 z@g5E#WanTE5&TAC`s+2#6C2p-AAlalB(P{2h%-^Y1l_r+GfqNOzr#g@@U$3>H5SUH z6KJrY4FMA|3b|!qK=mRousI&C19JuJBBbYY`I`WYz-we@0X*&pKoL){PPizcB0>2U zAiT8>e6=!XP-5&hHAr?CauGJd6lzSuWI7G7bdYcrmqXc6iyr7QBq+6^wzel`#rc8) zi#b0^2=e-UeelFkQX0HXsWyJ(;E3KgOib$$xZz!1H#-gh@MObV9Sy!MlIYKmUkNvy0j190?ejxH1Zl-A~9>d-rIYD{SpfiF{I|JEh(bG1Qy9NQJU-MZ?dPUZbbH1m{DG~54bh#i!0_i|QglaAbZJv5g z!LGw7y5s_jjy%(g0_skvfFqHSo|sUgBLFG`q3E;*@FGI~F>OQC@hX3=S~JE7=spTxZHgqwQkcqI-2*$<}>i826g=Y}sLuP8m{U_kR2rBs7%`b2C14 zB-R_YNZo^|WO4;(f-Xt!3{97JRflL9@_N})|bldOjf|u|T z0pz0xNpuc;uptXiu1d;wXED<~{Mi+GhB)~2a#)kKq<#PIWfJVU$WJa60cm1L}$RxlSO#vjLLMCrc5_{Ag5kG zB?}ZAZGBpcppk&N7Jm2$2~omh-~>X-gFC`eN}xy}+a*ub&%;(Aq(5;7@B=|oKv-y$ zZA43~*9JBW!F4MQdT@X@@s=Qw_>BWR-7O2x74@$WE*C>Yomcs6(u7*9M#M~gZK$|G z@8e!*It9&d71%CRMtBGNNLZ=c<^Lwa&mQ^;;R=k=_J$9H5A`n)9)7P$P+s4{$SBvs zgV+x2@^dMX1kpNUr9tkRCt{2T5E`1)fHa*ocn&vLo?AdnRN0)@l^{kC4bVGs=q|= zkBNZ_3L=6CBKX5vZE5-tN-YTf5b~o{h-ghk)QIn(q^U89kH#7$F-a$JCXe2^b06p4 zbI)V%uC>qeo|$^jJ#z;cnZ;br-S747z1FwZK6g^^J(kpWt-xZ+GPtEG%ixx(EQ4FB zk{H~hLa+}GHXh52l{WJkZRdN}m0uW?Qa}B$b~DcVps4Aetr;!+^4WE)lVqO6;6D9Y z{4Bky{2SW>usB>Vgm{TDW+t7_6P$-_KGb|sC`v)Sv~bgfrnMKV_avDs7Pxz!KA3v# zKYVM`R))dqfG|xs`SF=8D}THitOk~uk{bW>k%vnUd~kuON)kP!2%E$B6Q8Y|*m8Nn zth9lbvM_yQ`i|0ld&gNWjoM}*4ZL>4hT`ts+pg)kk+H!2{e=0Dmc8V0ZfkM@%Qm4_ zwP8#*NG17c=-C}DwG3)XO$?5M4N5zQ({TXC06GTLYOq~Xhqk9u2#%^UMR@ze>C3SD zj)8#VoL_6}2uz=qWzn%f7%(bhnu7I1QC-y$D65S(8aEu6cC+vliCxHZGR zBF=mSle#S^2@(F|yuYsmT}k_eoNrq{fn!M|Sp0?I3jFf%y|wuSz(05Ty# zwgrx)a`c^JaM2G(L94V7TocrEGCz(5PS^rnodZLk2uppc4)xPDfV3ikkz&08^lE2d z;E7FrI)&OPlAr_+xdeV^y!SdJvA~rsM)FWfNEp`KMiD&aS0RFGw@nD>>LlhFFXlAB z{C)FT#Fveuc06#aubTipH;OT>GG}p)J4riBn<*mSx$TvOBnS-9P9NcZ_ntf`gIE85 z`aymKcrKoq#tQ{#ZZ>L6%Ju^1l}VAHZ9w3toy$cB2hIc1Ux!{cmSC9}fEVGy~#N+V~lrQ)1wsL=K4~?`qOC&`J#9bd(`YKq0G!7Kx8=;8&iO zDPZFzS-5#^&N(bZ&_rdQ`lJRm1YArp_}!*a7|Jkktq}GcZ^7PEEm^qrvJzasHt%DY zZdmZ-M^%Zn-)J{baKZ(*c~utfy}H!Z_T141oNd~$rli8d8%O30eB)SCKDS<3hV54c zV`*caK0FIe3`412aU>!GJ~<)HQjZW%+Y;b~Dmp0*H=vkip?2;ci)MC{MOC*UV)(JO z84NfPd`S6hBwfm*DSDeuk1#Nj9JYJo3z4>wTsZ6T7K$ee1Q%sMCKZ48j1HJrIDR4= zl9*|8sW_3zqx)vi=Msz5op=m%L+aHR7O@+y$Uc)@!HePdQqynq#X1+ExL`N7*jpZW$*fX0!MKSDOm zc$SD7pGTr;7+lV?x}1WG#xj0e8wq8qZuZTTiNMi@lUw{{(=eu`NR-zv%t#Tm`=TdKIq*DEOb-@KV-^PB%K@oHVx9_ z+)TfXW6N}n!NMQ^S#{Damt|=j#duX=-IvzI07pW*Nb$UtaV9)X^*-+gF7O2J&Gfj3>6Ngi$n0FB#tT?*_d5Wm5)uMfxOj z!GRAlys>f5uYYj($>9pyCUVjY!;9`b+5`)IYQtC-Zkfn;jr-HVn)Ic$Wd-iMrrgyw zSu^3q&l?~jsn`6nh`FUVbpu&tC>_)jQAqaxmc&`^x}ci_rDDOx=vHu_={F1cHc8}j zw7wVDJfUP+xEWQHzVo3NDC1zHLt5<)WOMK(1e}O1=~nWKj~g(C{$sm7ccfy-;4M(^ z*D$ZFv~53ercglT5`v=VJ#SusGBK;mmiy1NA)i$u0R7iuiIFBUOESGzCUr2a;Dr#m zO94*+b6@xh)2zeiI>?kx-bo0^KPf9Ai~TER{)0Trc={*Ny%xH(=- zJI@vGO;`907n&#@Zw61I>y4NQ{E5PXQ)WIJ&PVkkAt+DcffFnZ^wX3Q@)h|*g>cO$ ze2H|vi%8kO!VqA^E%Q(x@9mNER>*$}7I_V&q{%mOg9FFK>#U=1Wr~{i-WfXT_mie~ zD=meE>b-m`+#MidGn9R|?V>8)F=DJ33*4bw$98Spefq#`eq|1LS05n)B4j3QPVWtrlU}tamDpTy-pt-mwYgz-{BlpOx=BPqRCt{2TitIQR~0|=xgYl0jqBhziBSqXkcvK}B>|O^(l!Z% zhDIP&swfc(ydd!ce?j35i3i|`*D9zj0uhQ+)Dl2MPL&pLDVS7l(v&2mcD(*x+q*lv zGjoS??!B`!`!QzLGfw)jC)%Bvd(Yl`&+ndl&hOrFbm$2e{caE7!y-K(r1XH0(gQ+D z4+tqeAf)twkkSJ}N@_qHeq;Sees|v?Wq#wrs|N=zrPXdHd1PYwf&897RWJ=4r2?$%z|wz~PUOCOVW*Z!Hw3vg2j;IWes=hi zBfKxqvZ1_G*`NR3#Lrb#6-rocm^s_@s%MHn`rKsPwquX;xjMx z2!DQ*b*O_jbaTD-5qwG)2p#7hn1fa;*rV4}rzpy%&uL1$zOW3(ir(VJZ8!0hdFUMs zF;X=ZT>Pi%c(vVDtkMw=c-tEGMT>*_WVkdvh80?}rV|4}6EgeG91QLr05fkud9eb; zEAt$Xv_&;kYrE4NDU&$E{yKa_*@`7+eXxI(uB z2=oAJtp-!$(=dQ(y0U6PWu?N$kW^BMW;Bp$$%687g?qwwfZz+YZ(9y5yuZYONdp9u z?tq}Rh~W~v_5h%&3VyUeFDx-*XDl^TLi<6>_yBYYMjrpyjl>3G&;5I$G+KqaqJhFX z1Y=JGPQu7zVkiU}lVt>s7uKOG6IXxC;dK%dbjbbb?kgojMH`)iom3p2i;|}B-gjXeOJpZuJeF#_x+H3*`nUzP(vkUXO zS{fcv2~1ZCV;w46jBYZ%1qcpSa1Sj&cumjIWzeb29}L}hL1$8Nry9Od| zA0a0NvSnXE=X(@Su5AacnOk?jm0Hy9z5$)<`UVnUw>KPcSkTtkpw10%#1L$67TcjM zPZDC^H4xE&cUT5^U&awWI+}rBJaI3CCznFQ*T(1J;!Kt69om(Fb6?#BVG2UFo;p{A zvsX5F`TijjE}q&8rmi$~_w93Y@Z#Gg$Yr+9Us7Be!72`8K?e633gq;5_^8~Kfv$k} z^xP_gSyj*%{N%B|(81UpS*;_t=|)ln!s~cT(#o%baEYlI8hZ{NP0jt zt&Ct`G*KO#fs4l1x=@N@<%Sxxt3|Y9$clDZv6g zo_M(!&~S8j7uSM~mgc3qTwQVC^DoWvH0V=w${IH66-;6HEd=G^=Wih>J{uM7QA*8X z>_`$O5&=Ob(Au^nW%l_2jWVkS?n-y1IurGhX%cbpL7+!+gtZ!L;t_Q1H-mPl$@Ll& zt`cIE84RLH30EQ@2!t&9?EUxXjhUvw)v@B*D&~Jr1jG#KjAR;n2pT`}h^x31>W&yb z#fZ;fn$@I5q(|+)w_Jy+Ew@rwcW8H(FP|{!y1G<{4Fvj*@`$jkBS-l1-W>eo;6Pj5 zldmqq74%EZFqii6|$H{x9Sy%fS^vZ5uu#Cz~2jHBF;`4I^VI3;_E0e+ldN>Q5>WjN$e4=n<8H{C5UH6gbt-e-)r;;9aA>68ISOF8iTqMo35~A zaPaS~IqQq3P6$QYiuD8+9GC%<*5}Zdk`NEF)Ixi9HAw%pnlRUYy~n*5?{@C0>ys9?{{v z=#BtELLOcBkKX)aGrVR(u1;CL#!t5d5%T0ND#K}{7qlY*@`0d_X#_liydv*=gDT^P z&qVKLup|mFh=k{{k*o-KOl+botauZb0$pja{bF?2t5w#B58*d_4H&)Tr&o!2#L2Nd{P@#_wz{WYTjXF6k2pM|2a zYN6d{l%$Y7Q+Np+qdb;QgpyzWp+3Cblt;*VihWTW!RHb573C48+Bq$z4N4*)C_Vlg zQ{!thwIC3J2$r`n)luf44z87K7{6ZS2Q>aU0%e-(B}dS2%(3s|HvBhN%Yt_Mf0l$O z{tNdjlwH~lPZx?rK;#LCRU5wb`l{du@|2pn;+%niU<&XP5eGq};> zo;jj`F|lEyFL4#xT+gpVW10LtK+uM-OJ8o|0Rl&4!S7h8BJ^{}=4@{$r<|QSeP1cA zeO<+fiDSd>;^hb3{N`@RhWvCRz5k{lr3ZwR9uQJ`KuGBUA*Ba|lpYXLdO%3&0U@Oa egp?i-QvL^kG|Gk+i-ElW00003A%iiN` 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 diff --git a/Wino.Calendar/Assets/Square44x44Logo.scale-400.png b/Wino.Calendar/Assets/Square44x44Logo.scale-400.png new file mode 100644 index 0000000000000000000000000000000000000000..b25cb5bc336ad34aed28dc19ac9996d11712bf7e GIT binary patch literal 6668 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 Mu9UqpbNZeC0BbUo^Z)<= diff --git a/Wino.Calendar/Assets/Square44x44Logo.targetsize-256.png b/Wino.Calendar/Assets/Square44x44Logo.targetsize-256.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6a53b24a4a6d31fbb7112dc4d7ac8c61c26747 GIT binary patch literal 12616 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Square44x44Logo.targetsize-48.png b/Wino.Calendar/Assets/Square44x44Logo.targetsize-48.png new file mode 100644 index 0000000000000000000000000000000000000000..47aea72767dfd8161c3cde16a7c342e0ba3e6876 GIT binary patch literal 1918 zcmV-^2Z8vBP)pMFiAu~RCt{2S!rw)RTMsVX5QBKTDkzWiJ(m+h6F^g#t?%9@rMLr zL`nL~_>064jZs{FkQfycG)m$hfAPZv6U7A@5fcJoiB?D`fmlTf%2GDF(Cu~JHp{)9 zb7y%=q3^w+q#AqL>CD{qeCK}W+;gWI{KrL`ZUydCW&ljL%mA2f2@GKU`mdFaj&?p3 zN(j7Iz`j)jSowQ@oabtHCTqisS8vf@JJgo=G2q-%R-7DP^<-_$XRGw=wWc|-_V4B^ zBh~b;8h~abR>Pdwb7VCu32)%-jsP&hwkS2qLa3=(I5Lo4g++U+(x+U5rni3CoPyYk zkky%G*wE8?xqiW_2S9KEp;&RRsmKs|m0R$j1ryq_T zg^=$i*XCJDbRMW02o?s*)Hg5P*!9Wj9gkXp0Myo^T8w3xnFg?P$QcWl+ytgD5Vin? zArLbI5D)-b!x;mG#-y>q!tqR85rO4gq)wL^qP!0X*E}?dsz7Qu4Q9@QXd(jR{W{VB zfv5qL2UCm9Wk4FoW`%TQOx(VAr2q;<)eyi?8oKwMg=k#_My`y48VbgL zIUe@Ca_TzhH&c+)4HzFxRXtu=0Nk{}7B(<$`(?@NW01TmfQ40uPPgexjyb6i{n4KW z&J9S*OXaz{wMaiJzs*bzpbenqL<<;d6nU8~s-h@FT51${Wl=(c zAxoYcGNI$olmxTk!8j~z3^~-pYu6v+aAC-RdlDLKeykq%0!QHsBPM*+JqD^$`KA&a zK!JtQNRQa{B;Zz zQTe_Y7(n3)(_~x}uX)D8Fv~z*S*y6t7LJA`T_A0WsyFmt07@pNoq&||mBzAUPWVm9 zH?npC7; z4DWOfJ7E?(4W?|Ujcd?@ez0UmukSah9EXU;?k)h!+bF>SLD>pf)4+W3;+W-!QL3y_ zac!_}AY+52b3ar@FxqHnb`w|NFLYdgm&4x}0;nK*Ru6zIl0zD7TUHB8{D>mp^iH%adlLkBxmAu+PKI`RL^N z2(IDXi$ZG2$V4CE-izC@TRzJ^e&6D9l`;p{uPT+Q0MK*?Zsgz^Iw4V(!r_e+mpkrt z?)P%J^3_AG@a)(j{Dkq>@k6{EdT}MR+jYbtn#8l`-AkTht zBcK0(>%^2BO*H@#+K-kZ&+Bm#a$p-3Jv(fIj^VEkbC@>dIdc=UfwTn|u#WUviaei# z3X@`#E1en4fsRI?6-p4u!Ze&$!JldX(69y$zU`4(SXSVy&mS0qeV5Yk%zZKV_UYMv z`B6+2*6i++8Ro@y#wHc$mixW#OKmOq8j`Z zIzg%eKo*LWXzE3wQi;$e=F&b~8oF*fK|cMcRH|~~5Ni7YI&lj+A#G3=(xV5Rmz?zs z@_p0MVc#Kpla_QyqV)U6N8tWC%{l1cdlzn4aqsXRgf~F|kkFhz_ZwiC+&_gS(7L4P z2s-i?Jt^tfq$mxH`xP3MK_~jdA=5pb(Lo2>%k%p!l&=;~1ptKKMo6VlVWt$Hdxf*X z)nja@FKu2vj3BOxtA{I*)Oy5b@a#fKk;x0OhCR|R=H!yN6RU2yMo3s9gk=SJKEW#xoKGnomw~h z1l~@RYd6(Gc(P?%{h$BE^lypONl8RORCt{2S>10OR~0|=xgYl0jqBhziBSrDAQgQ`O9Cn-rEL-j zghs7YsiH(E@Pfn(`~`(KBp!e#UaO$C2t+7OQA+?3IaOM~<-??Mlcr5VYRBvE^?G+_ zcV_Nz&Yih4cXoDm$FVIc#98gm%)MvsJ->TC?_C}KM@Y}gc=(O#k>c*YL(2U6g;x&_ zT-r{d9-dgfzqn`ME6Qqf`gafZ{W{A#nSgwLvienJu>S>H0dVtqIP$mpBY$|HII%f# zJJX|Y)gEwl{i17VMP;}MN8hS`_xBH$e%$N5Oh7zUJ*6Os=G;1%BmKZC-Vtox79fhD zozU+xi!_(Mqo3wJj?Ehb^6}^XdSKNtPB*QZ0iMU(T$@34vG&Q5Y2Yjhu$lu)?=PJw zeEY&qEtlCcGm+bLVE)?TXNEs9!sqfV8){4S{l)K0{8Uxd0I33oS+Gs7ai;u(&rT+Q zeDNo5mR`SM{njcBjDn^_gEIzp3!fdwZ?GM(TIzv@Ryv^TTMNX&IU1HU7hY{g8MD;V zw>Xdhiv@Wwt@UU3KX>Wg>F+f21e_i5xm?Gei-3srRjSYeZRlpT`4N1I1JQBqfjKC(f^T@S@fAhs`n;8tZ7ys> zSy5ZAXz9769%_dnMpaY6#gD4v)ppylZVh?B$JTHzGA^2vp=o;zJGAbv_5?x;GW+%% z4DKEPvuHqVu@2=c^BmAtlWM3q_5uulYzX>?`@nA4FnhV2>D`_{G(&@xTNU`n*~?HI zDnNC<2F)5;=ym`>4OnYUm>Qpk0Sxo?RSW7XbuL3M%H*vyP@`f&ZMn`hu^k`;(fGFI zz`}b=99R|*L~$Twi|Fp)B^^Lj75r)upG+BjKNA}=q5Pob1b|M?=<$zCA&@=y?S;x{ z16qm(3Ud>$(tG6igwbREPz0IZ_s|B!i#?~eL8rFJJYu$*IW;FNRhUMiQ?lL- zArbx4qp6w1q!+J{IvnoimX`1LIU?03KaAtd}?LBcnyw)+d-60UK<1JBpevI0^P`hplk1GYpv~irY4vDe@iCI=OFfCLE zWpL8Ct@})ARgIxW<7z467(qwU9wORw)FMI3bq3cej_)JEJhY1Qb(cFXwUuiwyt8bF zf)mj~{~H}yM;?-O*2%C>WTxOduf)3QBmSh)UuJUWcq^NLQoGqe+xm0YQP_lLUJB`r<j(_N*-{Qe-*Q{oUH=#dn$)?~3fLf3vX8i$6gHkq#~DXZr&2=q#r zU4amYJnH)N;9$y-&zPnoS99!m;UVq|8;&6Xzib>gnw1IU+lcl5w0gXHLsO zGWFC*dr>DyQzCyfQg|q=3a#lWJZ3OZw>%9AT-q|v`&0rg^o-_+PH$D+tB?yGLO0Dk2mVP+=(_* z0Mm<2+{-In&8sVrK74r+CwltAO0boUas&xP{^Q~J)0nVMzOoS8HBu-hphBqY80C)t z@^&a4kI;;&0?)6(uwf2?9D8wwhiZ{)=t_AdM|q^felHUcBC?2<*t&{sCth=ssZf+} z^4+DM$h@Em%<(ktMdJhj1rYk0MwCZLD@CCVHSix%32esMDFqB-!g_Qh?>j8>i$DuI z-b7QPD^1pq!aTO8=&xiD`zd2znzbmhr#3TJy^m@wXnX!auQIqv)0td}C0$0x1%ZRU5wX`l_EF zf>RRa`uhw5!W7_}s;`}2jE+t5>e60BQ^Gv*0Vc<1#>+vu5|#1=;=!oLdTeJm6}5zE z=>`Nq{3`^j8Wwvhg=tkfiBuB%4${_OusMp3OMUUgS@33PLpwy_2~pYOb?ldUGWAR4 z$ejWTfiM+wk!GmSe(swVp1OpsEKw{=PkU?lObHcb%`sI?oW}Px>NB3J-7t6V+{c>I z(vb6t6L_iK;#rj{00009a7bBm000id z000id0mpBsWB>pQfyBrrwjoi1;{;Y6W_PJ-ktmG zD&Fg}dZxR#d%Sjlj;{R~L*oVJlbElu>R145{~svbyCP z`^1t>D_Awz^1G*XhehgYrLkzLUktpQJ`hFEX*r)v+DcD}YWdm!#OiNG7WwlI~^ zQjHrW0LH+`H$Vt6|C!~&*pwVY*Yw-P04w*hCC#x005?F?%D^*OsO$R7B;#~|U-`q` zcb+QgUny1U8HDS$8+8sRhEIQZ_Q&ruftw^a2s}LU;-L)#PYsutrrZ>$I3!ve=KSDb z_O3Mxf#LiXG2rzUoY{Zo>$xX~A5wLB9V%opdM&4vwx0O@%2V=KKJd$5+BfxImm51O z>E3z3RNtg6)`DV11=eaxE8)NtC0#Olzf(qrDD2jQ=Zu5FGnN2c@OWvopj6e?l~^BW z%rDbYD-GpF^~nc*bl|?--@Wgm)9&k4uJBLQw1IiNcm-J7qyjlB>M2j^?hOH=n#WHC z#BGwi(0lM?4uHH$T$iYqaUJ8xlg`~->zg{`=%xH>JpHB9=Ido}rZZu5Jox`W!e~Oi z=Evp(&rCfM;Ul!GgVPq&ek&<#&I#7R7@BA4I+3;KErEMnRyAtGza|fTX3~k#Iyz-U z=0+G1f(xM7;MJ50g-Zn}jaDExy$=iotm!ITI(ikV`5Gwdt>5oNG*7KigX^cpVD8dc z&_Y|JrW7dOsKWS#0w|g~@gO$E22T=iR$Fjn``a*o*&N99>rl8-f^#DmEhBgvRi7Ae z@}FmLJxv&xor8L*0cUX?^-|pwQd~-;_6l;iI$ndLe|rZPz)ba{$>{uc5($DE98T^! zgOXP8T!4aYNq`e2j_qkOQ^9e2Df;bE^&lb!Xu4*tBN=9w{H_l7vC%N_XmqW`%>9?F zbK?2r2jVy=jz-dmaCNipo`KG;7aFDB=!u0rAN`{s$7!=q%wy0s*!_h(j_{8MLK++Y znAh(1lK_j5dqQfU1Ir9x{I5VI41C}GK^V{mp^;BTV>f{bD=KinaO=qB_Vyz^XZJHb zuG?-cl*`O<<^b>9VTi*}GrG0=2q8TS(tP%PhKUb|2+5PW8{AU+Zox-^?Eo+Qi*`Z~ zUz-Hp(;(qvNLU}?a)su_JS0l(6OjlxPx4Icm}KI~L_oW>W0=c;cIqB{$K>`gS&#+c z9I!Wgobf{XO!R1%;M<24zE)QXF&QBOE`lT(pE@-q$eVNrzTM;UK-nHH-yQ+Umq@-^LK<_0k8tVccX58HOCYH)_)`ikIl~n_C8l= z!SCNLLqAHigxaxct`09fGBvR8KhD=+)s_o@{2_;8eqMNVnh8FL_FSmJflD>$NwEo` zOq#)yiJ07sN-x`PDG|!nK(z9GIw#47k=r-eEcxh`fDf4~^j>7&fSX|+rNev57xC17 z0t$1vp|ef~Ii@jY*O)80C6cEJd$sVzrW7W*MO;Kga@dEPU9E2kC!}($hnJEE}Sa4U8?-;L5{j+FkUp-capC2t*z8zQ0ZQsrDge-Rt z0;M)$!Wp#wU;Lw0F87ieZil8MeTyk{U&rUZw`0_v%MOLO9TeeF$HB=h#)&k$R{N;I z>6QtO7DekmsB{HvTX#j z7*wotYe7ylBt?W7T`~849Q?7slUwbO zd773~J}4S1HvP_s&MOg77`=0F1Y>Tgh<6^OMY0g-yx0hSK)C;$R4ZEfZ&`#l5ycOK zMC{IPxi9AUlL+3iw#lQrCnS?xuuI04jYe@VaT@jUU5Od(Xkd#%~P|>Wn{G}$RUd^m#-aTc<5Tg z3V*S!7r`CG>y7*JUW6x!c^IvIN@Z?@N3>zr4On)EZZQR{{tR!9*9ynhDUhvsL)h$%hlW~LEbC2-y^f51`tPGs zfWxgiHu-tglC)jqF&X>Hp#r=z!u>wpmYa@#o(z4Q_r|fn)6k^y18M8Mm} z{V)}|&Lz&$J{-B;fM@sSaWHF<Sj7iwq(&z3Lc&t91YUzujdfFV=!T2Om3%%++%FD zcZ!EW?v9F(?fs)7ye9WYge@N4w~Sd&9MCN2#mofKpY%62?-d0~c`_tV6!oPm?^`L} zTh*vYuYH`TAji|R;PGyT>9N6+7Kbg8e6?Juw%k`ZA};ka$BuByWb`6-1>6k$Sl}s_ zzEC#cTW=O%O4_c_ND0Tg`IZTua%ggCWVL^Cs0hOs>%Qs?Q4Nvqxm-6xVq#Agt@u8? z{^sk~@Hxd-om*8J^4VDpd{G#Mth+AN zEkADuIZhp~9|3Fj8yIro6=cXJWR`PZ{vra^qns0js(nX$vZVGVUr~2XBw|e5^)8jLg_^$v zgZsb>rgryjLU%#!lRMXuE1u|9>`qCU>IYBX>@(9rC+dzEy&E7gLQdZ}lNLNsbf$r( z`F}*<1E1pBPAHAl)hRP{Xtp|s2uNq;(zNwbLfW?->1=16-Ob;Hq$Q3echGZ??n~!E z{oDJ{sgeS%KF;S(QTH7S1Hb*Tp))IAySk=ODL-DTS5?=1yXc*a&YFzAN#V@zGJrgQ z{R;^C7BsgPZ{6dr@e=Nd{bLsHfU%x69KceuXZX0g2DeBl-RJJ4w3QXe^!6D8sm80v z*5C7Q8BT}68(uqOm=5jj|I0)_j41}Rzh~9k{|5R1{QH$Y0RMia{{YhpEQVz#pyL1l N002ovPDHLkV1fvs5q|&x literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/StoreLogo.scale-150.png b/Wino.Calendar/Assets/StoreLogo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..6adf5536560c53e973b0d434e21ff7ecb474d737 GIT binary patch literal 3588 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
    W&c5`sLgJg! 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Assets/Wide310x150Logo.scale-150.png b/Wino.Calendar/Assets/Wide310x150Logo.scale-150.png new file mode 100644 index 0000000000000000000000000000000000000000..f969318feaf0e6bb68567e11b676730042d13488 GIT binary patch literal 4897 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 literal 3204 zcmbVPeQXow8NYmBd90>}0NP?GhXW~VaeThm=a0tV#EwJMI!)6M3}|c4_Bl3=Kd>G0 z(GHx1wl<7(tP?FsOQkTilSo*iIvF%uArExJ73~P zSv1xEy!U(Wd4A9D`FQV@W3@F^qJ@PEF$@z`Z!*BbFsS(^?B zyiAzJ+q})bkgiQHWqEb*jJD-coHYr1^iocg)l!Qa{Xqs-l~6J}p-|##ZHYofskQ3$ zI0;xzXyhazBeXhIsg5A=%ufo@f)1yy&ScKS0;HF^!r_2UE^lpZEom(+@duma3awTv zCrCL-%D_SvYWIcdHkmI}#50(fkUi)Qgx!80ju>g1za^}ff>JI8Z@^-iCiaCgg@TgF z+vtE?Q9{VQUX&MW9SYYmGcxA14%N2@7FwBTD4N<(2{nWgV8$e3?-F=L^&FrtWn~(U_Q~~^uYiyeY6-KoTnfh9AWz@ zIKje0)u!_Lw)E}G!#kEfwKVdNt(UAf9*f>tEL_(=xco-T%jTi@7YlC3hs2ik%Le0H ztj}RTeCF(5mwvi3_56>-yB?l;J>-1%!9~=fs|QcNG3J~a@JCu`4SB460s0ZO+##4fFUSGLcj_ja^fL4&BKALfb#$6$O?>P@qx2Agl^x0i&ugt zsy5Pyu=()`7HRMG3IB7F1@`_ z+-!J%#i6e^U$e#+C%Q>_qVRzWRsG^W_n+@OcX@vzI&z;mzHNb!GQ?LWA(wtpqHqTM z1OFw_{Zn?fD)p)`c`kOgv{de=v@suGRqY{N^U7gI1VF3*F=obwaXI6ob5__Yn zVTguS!%(NI09J8x#AO_aW!9W7k*UvB;IWDFC3srwftr{kHj%g)fvnAm;&h_dnl~

      MY- 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 literal 0 HcmV?d00001 diff --git a/Wino.Calendar/Controls/CalendarDayItemsControl.cs b/Wino.Calendar/Controls/CalendarDayItemsControl.cs new file mode 100644 index 00000000..d5d06971 --- /dev/null +++ b/Wino.Calendar/Controls/CalendarDayItemsControl.cs @@ -0,0 +1,132 @@ +using System.Collections.ObjectModel; +using System.Collections.Specialized; +using System.Linq; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Calendar; + +namespace Wino.Calendar.Controls +{ + public class CalendarDayItemsControl : Control + { + private const string PART_CalendarPanel = nameof(PART_CalendarPanel); + + private WinoCalendarPanel CalendarPanel; + + public CalendarDayModel DayModel + { + get { return (CalendarDayModel)GetValue(DayModelProperty); } + set { SetValue(DayModelProperty, value); } + } + + + public static readonly DependencyProperty DayModelProperty = DependencyProperty.Register(nameof(DayModel), typeof(CalendarDayModel), typeof(CalendarDayItemsControl), new PropertyMetadata(null, new PropertyChangedCallback(OnRepresentingDateChanged))); + + private static void OnRepresentingDateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is CalendarDayItemsControl control) + { + if (e.OldValue != null && e.OldValue is CalendarDayModel oldCalendarDayModel) + { + control.DetachCollection(oldCalendarDayModel.Events); + } + + if (e.NewValue != null && e.NewValue is CalendarDayModel newCalendarDayModel) + { + control.AttachCollection(newCalendarDayModel.Events); + } + + control.ResetItems(); + control.RenderEvents(); + } + } + + public CalendarDayItemsControl() + { + DefaultStyleKey = typeof(CalendarDayItemsControl); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + CalendarPanel = GetTemplateChild(PART_CalendarPanel) as WinoCalendarPanel; + + RenderEvents(); + } + + private void ResetItems() + { + if (CalendarPanel == null) return; + + CalendarPanel.Children.Clear(); + } + + private void RenderEvents() + { + if (CalendarPanel == null || CalendarPanel.DayModel == null) return; + + RenderCalendarItems(); + } + + private void AttachCollection(ObservableCollection newCollection) + => newCollection.CollectionChanged += CalendarItemsChanged; + + private void DetachCollection(ObservableCollection oldCollection) + => oldCollection.CollectionChanged -= CalendarItemsChanged; + + private void CalendarItemsChanged(object sender, NotifyCollectionChangedEventArgs e) + { + switch (e.Action) + { + case NotifyCollectionChangedAction.Add: + foreach (ICalendarItem item in e.NewItems) + { + AddItem(item); + } + break; + case NotifyCollectionChangedAction.Remove: + foreach (ICalendarItem item in e.OldItems) + { + var control = GetCalendarItemControl(item); + if (control != null) + { + CalendarPanel.Children.Remove(control); + } + } + break; + case NotifyCollectionChangedAction.Reset: + ResetItems(); + break; + default: + break; + } + } + + private CalendarItemControl GetCalendarItemControl(ICalendarItem item) + => CalendarPanel.Children.Where(c => c is CalendarItemControl calendarItemControl && calendarItemControl.Item == item).FirstOrDefault() as CalendarItemControl; + + private void RenderCalendarItems() + { + if (DayModel == null || DayModel.Events == null || DayModel.Events.Count == 0) + { + ResetItems(); + return; + } + + foreach (var item in DayModel.Events) + { + AddItem(item); + } + } + + private void AddItem(ICalendarItem item) + { + CalendarPanel.Children.Add(new CalendarItemControl() + { + Item = item + }); + } + } +} diff --git a/Wino.Calendar/Controls/CalendarItemControl.cs b/Wino.Calendar/Controls/CalendarItemControl.cs new file mode 100644 index 00000000..23a66563 --- /dev/null +++ b/Wino.Calendar/Controls/CalendarItemControl.cs @@ -0,0 +1,42 @@ +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Interfaces; + +namespace Wino.Calendar.Controls +{ + public class CalendarItemControl : Control + { + public ICalendarItem Item + { + get { return (ICalendarItem)GetValue(ItemProperty); } + set { SetValue(ItemProperty, value); } + } + + public static readonly DependencyProperty ItemProperty = DependencyProperty.Register(nameof(Item), typeof(ICalendarItem), typeof(CalendarItemControl), new PropertyMetadata(null, new PropertyChangedCallback(OnItemChanged))); + + public CalendarItemControl() + { + DefaultStyleKey = typeof(CalendarItemControl); + } + + private static void OnItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is CalendarItemControl control) + { + control.UpdateDateRendering(); + } + } + + private void UpdateDateRendering() + { + if (Item == null) return; + + UpdateLayout(); + } + + public override string ToString() + { + return Item?.Name ?? "NA"; + } + } +} diff --git a/Wino.Calendar/Controls/CustomCalendarFlipView.cs b/Wino.Calendar/Controls/CustomCalendarFlipView.cs new file mode 100644 index 00000000..e8a5b8e4 --- /dev/null +++ b/Wino.Calendar/Controls/CustomCalendarFlipView.cs @@ -0,0 +1,42 @@ +using Windows.UI.Xaml.Automation.Peers; +using Windows.UI.Xaml.Controls; + +namespace Wino.Calendar.Controls +{ + ///

      + /// FlipView that hides the navigation buttons and exposes methods to navigate to the next and previous items with animations. + /// + public class CustomCalendarFlipView : FlipView + { + private const string PART_PreviousButton = "PreviousButtonHorizontal"; + private const string PART_NextButton = "NextButtonHorizontal"; + + private Button PreviousButton; + private Button NextButton; + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + PreviousButton = GetTemplateChild(PART_PreviousButton) as Button; + NextButton = GetTemplateChild(PART_NextButton) as Button; + + // Hide navigation buttons + PreviousButton.Opacity = NextButton.Opacity = 0; + PreviousButton.IsHitTestVisible = NextButton.IsHitTestVisible = false; + } + + public void GoPreviousFlip() + { + var backPeer = new ButtonAutomationPeer(PreviousButton); + backPeer.Invoke(); + } + + public void GoNextFlip() + { + var nextPeer = new ButtonAutomationPeer(NextButton); + nextPeer.Invoke(); + } + + } +} diff --git a/Wino.Calendar/Controls/DayColumnControl.cs b/Wino.Calendar/Controls/DayColumnControl.cs new file mode 100644 index 00000000..43d17877 --- /dev/null +++ b/Wino.Calendar/Controls/DayColumnControl.cs @@ -0,0 +1,65 @@ +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Models.Calendar; + +namespace Wino.Calendar.Controls +{ + public class DayColumnControl : Control + { + private const string PART_HeaderDateDayText = nameof(PART_HeaderDateDayText); + private const string PART_IsTodayBorder = nameof(PART_IsTodayBorder); + private const string PART_ColumnHeaderText = nameof(PART_ColumnHeaderText); + + private const string TodayState = nameof(TodayState); + private const string NotTodayState = nameof(NotTodayState); + + private TextBlock HeaderDateDayText; + private TextBlock ColumnHeaderText; + private Border IsTodayBorder; + + public CalendarDayModel DayModel + { + get { return (CalendarDayModel)GetValue(DayModelProperty); } + set { SetValue(DayModelProperty, value); } + } + + public static readonly DependencyProperty DayModelProperty = DependencyProperty.Register(nameof(DayModel), typeof(CalendarDayModel), typeof(DayColumnControl), new PropertyMetadata(null, new PropertyChangedCallback(OnRenderingPropertiesChanged))); + + public DayColumnControl() + { + DefaultStyleKey = typeof(DayColumnControl); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + HeaderDateDayText = GetTemplateChild(PART_HeaderDateDayText) as TextBlock; + ColumnHeaderText = GetTemplateChild(PART_ColumnHeaderText) as TextBlock; + IsTodayBorder = GetTemplateChild(PART_IsTodayBorder) as Border; + + UpdateValues(); + } + + private static void OnRenderingPropertiesChanged(DependencyObject control, DependencyPropertyChangedEventArgs e) + { + if (control is DayColumnControl columnControl) + { + columnControl.UpdateValues(); + } + } + + private void UpdateValues() + { + if (HeaderDateDayText == null || ColumnHeaderText == null || IsTodayBorder == null || DayModel == null) return; + + HeaderDateDayText.Text = DayModel.RepresentingDate.Day.ToString(); + ColumnHeaderText.Text = DayModel.RepresentingDate.ToString("dddd", DayModel.CalendarRenderOptions.CalendarSettings.CultureInfo); + + bool isToday = DayModel.RepresentingDate.Date == DateTime.Now.Date; + + VisualStateManager.GoToState(this, isToday ? TodayState : NotTodayState, false); + } + } +} diff --git a/Wino.Calendar/Controls/DayHeaderControl.cs b/Wino.Calendar/Controls/DayHeaderControl.cs new file mode 100644 index 00000000..1a5d09f8 --- /dev/null +++ b/Wino.Calendar/Controls/DayHeaderControl.cs @@ -0,0 +1,57 @@ +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; + +namespace Wino.Calendar.Controls +{ + public class DayHeaderControl : Control + { + private const string PART_DayHeaderTextBlock = nameof(PART_DayHeaderTextBlock); + private TextBlock HeaderTextblock; + + public DayHeaderDisplayType DisplayType + { + get { return (DayHeaderDisplayType)GetValue(DisplayTypeProperty); } + set { SetValue(DisplayTypeProperty, value); } + } + + public DateTime Date + { + get { return (DateTime)GetValue(DateProperty); } + set { SetValue(DateProperty, value); } + } + + public static readonly DependencyProperty DateProperty = DependencyProperty.Register(nameof(Date), typeof(DateTime), typeof(DayHeaderControl), new PropertyMetadata(default(DateTime), new PropertyChangedCallback(OnHeaderPropertyChanged))); + public static readonly DependencyProperty DisplayTypeProperty = DependencyProperty.Register(nameof(DisplayType), typeof(DayHeaderDisplayType), typeof(DayHeaderControl), new PropertyMetadata(DayHeaderDisplayType.TwentyFourHour, new PropertyChangedCallback(OnHeaderPropertyChanged))); + + public DayHeaderControl() + { + DefaultStyleKey = typeof(DayHeaderControl); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + HeaderTextblock = GetTemplateChild(PART_DayHeaderTextBlock) as TextBlock; + UpdateHeaderText(); + } + + private static void OnHeaderPropertyChanged(DependencyObject control, DependencyPropertyChangedEventArgs e) + { + if (control is DayHeaderControl headerControl) + { + headerControl.UpdateHeaderText(); + } + } + + private void UpdateHeaderText() + { + if (HeaderTextblock != null) + { + HeaderTextblock.Text = DisplayType == DayHeaderDisplayType.TwelveHour ? Date.ToString("h tt") : Date.ToString("HH:mm"); + } + } + } +} diff --git a/Wino.Calendar/Controls/WinoCalendarControl.cs b/Wino.Calendar/Controls/WinoCalendarControl.cs new file mode 100644 index 00000000..f42f937f --- /dev/null +++ b/Wino.Calendar/Controls/WinoCalendarControl.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.ObjectModel; +using CommunityToolkit.Mvvm.Messaging; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Calendar.Args; +using Wino.Core.Domain.Models.Calendar; +using Wino.Messaging.Client.Calendar; + +namespace Wino.Calendar.Controls +{ + public class WinoCalendarControl : Control + { + private const string PART_WinoFlipView = nameof(PART_WinoFlipView); + + public event EventHandler TimelineCellSelected; + public event EventHandler TimelineCellUnselected; + + #region Dependency Properties + + public static readonly DependencyProperty DayRangesProperty = DependencyProperty.Register(nameof(DayRanges), typeof(ObservableCollection), typeof(WinoCalendarControl), new PropertyMetadata(null)); + public static readonly DependencyProperty SelectedFlipViewIndexProperty = DependencyProperty.Register(nameof(SelectedFlipViewIndex), typeof(int), typeof(WinoCalendarControl), new PropertyMetadata(-1)); + public static readonly DependencyProperty SelectedFlipViewDayRangeProperty = DependencyProperty.Register(nameof(SelectedFlipViewDayRange), typeof(DayRangeRenderModel), typeof(WinoCalendarControl), new PropertyMetadata(null)); + + public DayRangeRenderModel SelectedFlipViewDayRange + { + get { return (DayRangeRenderModel)GetValue(SelectedFlipViewDayRangeProperty); } + set { SetValue(SelectedFlipViewDayRangeProperty, value); } + } + + /// + /// Gets or sets the collection of day ranges to render. + /// Each day range usually represents a week, but it may support other ranges. + /// + public ObservableCollection DayRanges + { + get { return (ObservableCollection)GetValue(DayRangesProperty); } + set { SetValue(DayRangesProperty, value); } + } + + public int SelectedFlipViewIndex + { + get { return (int)GetValue(SelectedFlipViewIndexProperty); } + set { SetValue(SelectedFlipViewIndexProperty, value); } + } + + #endregion + + private WinoDayTimelineCanvas _activeCanvas; + + public WinoDayTimelineCanvas ActiveCanvas + { + get { return _activeCanvas; } + set + { + // FlipView's timeline is changing. + // Make sure to unregister from the old one. + + if (_activeCanvas != null) + { + // Dismiss any selection on the old canvas. + + _activeCanvas.SelectedDateTime = null; + _activeCanvas.TimelineCellSelected -= ActiveTimelineCellSelected; + _activeCanvas.TimelineCellUnselected -= ActiveTimelineCellUnselected; + } + + _activeCanvas = value; + + if (_activeCanvas != null) + { + _activeCanvas.TimelineCellSelected += ActiveTimelineCellSelected; + _activeCanvas.TimelineCellUnselected += ActiveTimelineCellUnselected; + + // Raise visible date range change to shell. + WeakReferenceMessenger.Default.Send(new VisibleDateRangeChangedMessage(_activeCanvas.RenderOptions.DateRange)); + } + } + } + + private WinoCalendarFlipView InternalFlipView; + + public WinoCalendarControl() + { + DefaultStyleKey = typeof(WinoCalendarControl); + SizeChanged += CalendarSizeChanged; + } + + private void CalendarSizeChanged(object sender, SizeChangedEventArgs e) + { + if (ActiveCanvas == null) return; + + ActiveCanvas.SelectedDateTime = null; + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + InternalFlipView = GetTemplateChild(PART_WinoFlipView) as WinoCalendarFlipView; + + // Each FlipViewItem will have 1 timeline canvas to draw hour cells in the background that supports selection of them. + // When the selection changes, we need to stop listening to the old canvas and start listening to the new one to catch events. + + InternalFlipView.ActiveTimelineCanvasChanged += FlipViewsActiveTimelineCanvasChanged; + } + + private void FlipViewsActiveTimelineCanvasChanged(object sender, WinoDayTimelineCanvas e) + { + ActiveCanvas = e; + + SelectedFlipViewDayRange = InternalFlipView.SelectedItem as DayRangeRenderModel; + } + + private void ActiveTimelineCellUnselected(object sender, TimelineCellUnselectedArgs e) + => TimelineCellUnselected?.Invoke(this, e); + + private void ActiveTimelineCellSelected(object sender, TimelineCellSelectedArgs e) + => TimelineCellSelected?.Invoke(this, e); + + public void NavigateToDay(DateTime dateTime) => InternalFlipView.NavigateToDay(dateTime); + + public void ResetTimelineSelection() + { + if (ActiveCanvas == null) return; + + ActiveCanvas.SelectedDateTime = null; + } + + public void GoNextRange() + { + if (InternalFlipView == null) return; + + InternalFlipView.GoNextFlip(); + } + + public void GoPreviousRange() + { + if (InternalFlipView == null) return; + + InternalFlipView.GoPreviousFlip(); + } + } +} diff --git a/Wino.Calendar/Controls/WinoCalendarFlipView.cs b/Wino.Calendar/Controls/WinoCalendarFlipView.cs new file mode 100644 index 00000000..c61dfbb6 --- /dev/null +++ b/Wino.Calendar/Controls/WinoCalendarFlipView.cs @@ -0,0 +1,91 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using CommunityToolkit.WinUI; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Models.Calendar; +using Wino.Core.MenuItems; + +namespace Wino.Calendar.Controls +{ + public class WinoCalendarFlipView : CustomCalendarFlipView + { + public event EventHandler ActiveTimelineCanvasChanged; + + public WinoCalendarFlipView() + { + SelectionChanged += CalendarDisplayRangeChanged; + } + + private async void CalendarDisplayRangeChanged(object sender, SelectionChangedEventArgs e) + { + if (SelectedIndex < 0) + ActiveTimelineCanvasChanged?.Invoke(this, null); + else + { + // TODO: Refactor this mechanism by listening to PrepareContainerForItemOverride and Loaded events together. + while (ContainerFromIndex(SelectedIndex) == null) + { + await Task.Delay(250); + } + + if (ContainerFromIndex(SelectedIndex) is FlipViewItem flipViewItem) + { + var canvas = flipViewItem.FindDescendant(); + ActiveTimelineCanvasChanged?.Invoke(this, canvas); + } + } + } + + /// + /// Navigates to the specified date in the calendar. + /// + /// Date to navigate. + public async void NavigateToDay(DateTime dateTime) + { + // Find the day range that contains the date. + var dayRange = GetItemsSource()?.FirstOrDefault(a => a.CalendarDays.Any(b => b.RepresentingDate.Date == dateTime.Date)); + + if (dayRange != null) + { + var navigationItemIndex = GetItemsSource().IndexOf(dayRange); + + if (Math.Abs(navigationItemIndex - SelectedIndex) > 4) + { + // Difference between dates are high. + // No need to animate this much, just go without animating. + + SelectedIndex = navigationItemIndex; + } + else + { + // Until we reach the day in the flip, simulate next-prev button clicks. + // This will make sure the FlipView animations are triggered. + // Setting SelectedIndex directly doesn't trigger the animations. + + while (SelectedIndex != navigationItemIndex) + { + if (SelectedIndex > navigationItemIndex) + { + GoPreviousFlip(); + } + else + { + GoNextFlip(); + } + } + } + } + } + + + public void NavigateHour(TimeSpan hourTimeSpan) + { + // Total height of the FlipViewItem is the same as vertical ScrollViewer to position day headers. + // Find the day range that contains the hour. + } + + private ObservableRangeCollection GetItemsSource() + => ItemsSource as ObservableRangeCollection; + } +} diff --git a/Wino.Calendar/Controls/WinoCalendarPanel.cs b/Wino.Calendar/Controls/WinoCalendarPanel.cs new file mode 100644 index 00000000..9e19ae62 --- /dev/null +++ b/Wino.Calendar/Controls/WinoCalendarPanel.cs @@ -0,0 +1,254 @@ + +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Linq; +using Windows.Foundation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Calendar.Models; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Calendar; + +namespace Wino.Calendar.Controls +{ + public class WinoCalendarPanel : Panel + { + private const double LastItemRightExtraMargin = 12d; + + // Store each ICalendarItem measurements by their Id. + private readonly Dictionary _measurements = new Dictionary(); + + public static readonly DependencyProperty EventItemMarginProperty = DependencyProperty.Register(nameof(EventItemMargin), typeof(Thickness), typeof(WinoCalendarPanel), new PropertyMetadata(new Thickness(0, 0, 0, 0))); + public static readonly DependencyProperty DayModelProperty = DependencyProperty.Register(nameof(DayModel), typeof(CalendarDayModel), typeof(WinoCalendarPanel), new PropertyMetadata(null, new PropertyChangedCallback(OnDayChanged))); + + public CalendarDayModel DayModel + { + get { return (CalendarDayModel)GetValue(DayModelProperty); } + set { SetValue(DayModelProperty, value); } + } + + public Thickness EventItemMargin + { + get { return (Thickness)GetValue(EventItemMarginProperty); } + set { SetValue(EventItemMarginProperty, value); } + } + + private static void OnDayChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is WinoCalendarPanel control) + { + // We need to listen for new events being added or removed from the collection to reset measurements. + if (e.OldValue is CalendarDayModel oldDayModel) + { + control.DetachCollection(oldDayModel.Events); + } + + if (e.NewValue is CalendarDayModel newDayModel) + { + control.AttachCollection(newDayModel.Events); + } + + control.ResetMeasurements(); + control.UpdateLayout(); + } + } + + private void AttachCollection(IEnumerable events) + { + if (events is INotifyCollectionChanged collection) + { + collection.CollectionChanged += EventCollectionChanged; + } + } + + private void DetachCollection(IEnumerable events) + { + if (events is INotifyCollectionChanged collection) + { + collection.CollectionChanged -= EventCollectionChanged; + } + } + + private void ResetMeasurements() => _measurements.Clear(); + + // No need to handle actions. Each action requires a full measurement update. + private void EventCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) => ResetMeasurements(); + + private double GetChildTopMargin(DateTime childStart, double availableHeight) + { + double totalMinutes = 1440; + double minutesFromStart = (childStart - DayModel.RepresentingDate).TotalMinutes; + return (minutesFromStart / totalMinutes) * availableHeight; + } + + private double GetChildWidth(CalendarItemMeasurement calendarItemMeasurement, double availableWidth) + { + return (calendarItemMeasurement.Right - calendarItemMeasurement.Left) * availableWidth; + } + + private double GetChildLeftMargin(CalendarItemMeasurement calendarItemMeasurement, double availableWidth) + => availableWidth * calendarItemMeasurement.Left; + + private double GetChildHeight(DateTime childStart, DateTime childEnd) + { + double totalMinutes = 1440; + double availableHeight = DayModel.CalendarRenderOptions.CalendarSettings.HourHeight * 24; + double childDuration = (childEnd - childStart).TotalMinutes; + return (childDuration / totalMinutes) * availableHeight; + } + + protected override Size ArrangeOverride(Size finalSize) + { + // Measure/arrange each child height and width. + // This is a vertical calendar. Therefore the height of each child is the duration of the event. + // Children weights for left and right will be saved if they don't exist. + // This is important because we don't want to measure the weights again. + // They don't change until new event is added or removed. + // Width of the each child may depend on the rectangle packing algorithm. + // Children are first categorized into columns. Then each column is shifted to the left until + // no overlap occurs. The width of each child is calculated based on the number of columns it spans. + + double availableHeight = finalSize.Height; + double availableWidth = finalSize.Width; + + var calendarControls = Children.Cast(); + + if (_measurements.Count == 0 && DayModel.Events.Count > 0) + { + // We keep track of this collection when event is added/removed/reset etc. + // So if the collection is empty, we must fill it up again for proper calculations. + + LayoutEvents(DayModel.Events); + } + + foreach (var child in calendarControls) + { + // We can't arrange this child. It doesn't have a valid ICalendarItem or measurement. + if (child.Item == null || !_measurements.ContainsKey(child.Item.Id)) continue; + + var childMeasurement = _measurements[child.Item.Id]; + + double childHeight = Math.Max(0, GetChildHeight(child.Item.StartTime, child.Item.EndTime)); + double childWidth = Math.Max(0, GetChildWidth(childMeasurement, finalSize.Width)); + double childTop = Math.Max(0, GetChildTopMargin(child.Item.StartTime, availableHeight)); + double childLeft = Math.Max(0, GetChildLeftMargin(childMeasurement, availableWidth)); + + bool isHorizontallyLastItem = childMeasurement.Right == 1; + + // Add additional right margin to items that falls on the right edge of the panel. + // Max of 5% of the width or 20px. + var extraRightMargin = isHorizontallyLastItem ? Math.Max(LastItemRightExtraMargin, finalSize.Width * 5 / 100) : 0; + + var finalChildWidth = childWidth - extraRightMargin; + + if (finalChildWidth < 0) finalChildWidth = 1; + + child.Measure(new Size(childWidth, childHeight)); + + var arrangementRect = new Rect(childLeft + EventItemMargin.Left, childTop + EventItemMargin.Top, childWidth - extraRightMargin, childHeight); + + child.Arrange(arrangementRect); + } + + return finalSize; + } + + #region ColumSpanning and Packing Algorithm + + private void AddOrUpdateMeasurement(ICalendarItem calendarItem, CalendarItemMeasurement measurement) + { + if (_measurements.ContainsKey(calendarItem.Id)) + { + _measurements[calendarItem.Id] = measurement; + } + else + { + _measurements.Add(calendarItem.Id, measurement); + } + } + + // Pick the left and right positions of each event, such that there are no overlap. + private void LayoutEvents(IEnumerable events) + { + var columns = new List>(); + DateTime? lastEventEnding = null; + + foreach (var ev in events.OrderBy(ev => ev.Period.Start).ThenBy(ev => ev.Period.End)) + { + if (ev.Period.Start >= lastEventEnding) + { + PackEvents(columns); + columns.Clear(); + lastEventEnding = null; + } + + bool placed = false; + + foreach (var col in columns) + { + if (!col.Last().Period.OverlapsWith(ev.Period)) + { + col.Add(ev); + placed = true; + break; + } + } + if (!placed) + { + columns.Add(new List { ev }); + } + if (lastEventEnding == null || ev.Period.End > lastEventEnding.Value) + { + lastEventEnding = ev.Period.End; + } + } + if (columns.Count > 0) + { + PackEvents(columns); + } + } + + // Set the left and right positions for each event in the connected group. + private void PackEvents(List> columns) + { + float numColumns = columns.Count; + int iColumn = 0; + + foreach (var col in columns) + { + foreach (var ev in col) + { + int colSpan = ExpandEvent(ev, iColumn, columns); + + var leftWeight = iColumn / numColumns; + var rightWeight = (iColumn + colSpan) / numColumns; + + AddOrUpdateMeasurement(ev, new CalendarItemMeasurement(leftWeight, rightWeight)); + } + + iColumn++; + } + } + + // Checks how many columns the event can expand into, without colliding with other events. + private int ExpandEvent(ICalendarItem ev, int iColumn, List> columns) + { + int colSpan = 1; + + foreach (var col in columns.Skip(iColumn + 1)) + { + foreach (var ev1 in col) + { + if (ev1.Period.OverlapsWith(ev.Period)) return colSpan; + } + + colSpan++; + } + + return colSpan; + } + + #endregion + } +} diff --git a/Wino.Calendar/Controls/WinoCalendarTypeSelectorControl.cs b/Wino.Calendar/Controls/WinoCalendarTypeSelectorControl.cs new file mode 100644 index 00000000..14169438 --- /dev/null +++ b/Wino.Calendar/Controls/WinoCalendarTypeSelectorControl.cs @@ -0,0 +1,92 @@ +using System.Windows.Input; +using CommunityToolkit.Diagnostics; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain.Enums; + +namespace Wino.Calendar.Controls +{ + public class WinoCalendarTypeSelectorControl : Control + { + private const string PART_TodayButton = nameof(PART_TodayButton); + private const string PART_DayToggle = nameof(PART_DayToggle); + private const string PART_WeekToggle = nameof(PART_WeekToggle); + private const string PART_MonthToggle = nameof(PART_MonthToggle); + private const string PART_YearToggle = nameof(PART_YearToggle); + + public static readonly DependencyProperty SelectedTypeProperty = DependencyProperty.Register(nameof(SelectedType), typeof(CalendarDisplayType), typeof(WinoCalendarTypeSelectorControl), new PropertyMetadata(CalendarDisplayType.Week)); + public static readonly DependencyProperty DisplayDayCountProperty = DependencyProperty.Register(nameof(DisplayDayCount), typeof(int), typeof(WinoCalendarTypeSelectorControl), new PropertyMetadata(0)); + public static readonly DependencyProperty TodayClickedCommandProperty = DependencyProperty.Register(nameof(TodayClickedCommand), typeof(ICommand), typeof(WinoCalendarTypeSelectorControl), new PropertyMetadata(null)); + + public ICommand TodayClickedCommand + { + get { return (ICommand)GetValue(TodayClickedCommandProperty); } + set { SetValue(TodayClickedCommandProperty, value); } + } + + public CalendarDisplayType SelectedType + { + get { return (CalendarDisplayType)GetValue(SelectedTypeProperty); } + set { SetValue(SelectedTypeProperty, value); } + } + + public int DisplayDayCount + { + get { return (int)GetValue(DisplayDayCountProperty); } + set { SetValue(DisplayDayCountProperty, value); } + } + + private AppBarButton _todayButton; + private AppBarToggleButton _dayToggle; + private AppBarToggleButton _weekToggle; + private AppBarToggleButton _monthToggle; + private AppBarToggleButton _yearToggle; + + public WinoCalendarTypeSelectorControl() + { + DefaultStyleKey = typeof(WinoCalendarTypeSelectorControl); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + _todayButton = GetTemplateChild(PART_TodayButton) as AppBarButton; + _dayToggle = GetTemplateChild(PART_DayToggle) as AppBarToggleButton; + _weekToggle = GetTemplateChild(PART_WeekToggle) as AppBarToggleButton; + _monthToggle = GetTemplateChild(PART_MonthToggle) as AppBarToggleButton; + _yearToggle = GetTemplateChild(PART_YearToggle) as AppBarToggleButton; + + Guard.IsNotNull(_todayButton, nameof(_todayButton)); + Guard.IsNotNull(_dayToggle, nameof(_dayToggle)); + Guard.IsNotNull(_weekToggle, nameof(_weekToggle)); + Guard.IsNotNull(_monthToggle, nameof(_monthToggle)); + Guard.IsNotNull(_yearToggle, nameof(_yearToggle)); + + _todayButton.Click += TodayClicked; + + _dayToggle.Click += (s, e) => { SetSelectedType(CalendarDisplayType.Day); }; + _weekToggle.Click += (s, e) => { SetSelectedType(CalendarDisplayType.Week); }; + _monthToggle.Click += (s, e) => { SetSelectedType(CalendarDisplayType.Month); }; + _yearToggle.Click += (s, e) => { SetSelectedType(CalendarDisplayType.Year); }; + + UpdateToggleButtonStates(); + } + + private void TodayClicked(object sender, RoutedEventArgs e) => TodayClickedCommand?.Execute(null); + + private void SetSelectedType(CalendarDisplayType type) + { + SelectedType = type; + UpdateToggleButtonStates(); + } + + private void UpdateToggleButtonStates() + { + _dayToggle.IsChecked = SelectedType == CalendarDisplayType.Day; + _weekToggle.IsChecked = SelectedType == CalendarDisplayType.Week; + _monthToggle.IsChecked = SelectedType == CalendarDisplayType.Month; + _yearToggle.IsChecked = SelectedType == CalendarDisplayType.Year; + } + } +} diff --git a/Wino.Calendar/Controls/WinoCalendarView.cs b/Wino.Calendar/Controls/WinoCalendarView.cs new file mode 100644 index 00000000..5d94bc6c --- /dev/null +++ b/Wino.Calendar/Controls/WinoCalendarView.cs @@ -0,0 +1,145 @@ +using System; +using System.Windows.Input; +using CommunityToolkit.Diagnostics; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; +using Wino.Core.Domain.Models.Calendar; +using Wino.Helpers; + +namespace Wino.Calendar.Controls +{ + public class WinoCalendarView : Control + { + private const string PART_DayViewItemBorder = nameof(PART_DayViewItemBorder); + private const string PART_CalendarView = nameof(PART_CalendarView); + + public static readonly DependencyProperty HighlightedDateRangeProperty = DependencyProperty.Register(nameof(HighlightedDateRange), typeof(DateRange), typeof(WinoCalendarView), new PropertyMetadata(null, new PropertyChangedCallback(OnHighlightedDateRangeChanged))); + public static readonly DependencyProperty VisibleDateBackgroundProperty = DependencyProperty.Register(nameof(VisibleDateBackground), typeof(Brush), typeof(WinoCalendarView), new PropertyMetadata(null, new PropertyChangedCallback(OnPropertiesChanged))); + public static readonly DependencyProperty TodayBackgroundBrushProperty = DependencyProperty.Register(nameof(TodayBackgroundBrush), typeof(Brush), typeof(WinoCalendarView), new PropertyMetadata(null)); + public static readonly DependencyProperty DateClickedCommandProperty = DependencyProperty.Register(nameof(DateClickedCommand), typeof(ICommand), typeof(WinoCalendarView), new PropertyMetadata(null)); + + /// + /// Gets or sets the command to execute when a date is picked. + /// Unused. + /// + public ICommand DateClickedCommand + { + get { return (ICommand)GetValue(DateClickedCommandProperty); } + set { SetValue(DateClickedCommandProperty, value); } + } + + /// + /// Gets or sets the highlighted range of dates. + /// + public DateRange HighlightedDateRange + { + get { return (DateRange)GetValue(HighlightedDateRangeProperty); } + set { SetValue(HighlightedDateRangeProperty, value); } + } + + public Brush VisibleDateBackground + { + get { return (Brush)GetValue(VisibleDateBackgroundProperty); } + set { SetValue(VisibleDateBackgroundProperty, value); } + } + + public Brush TodayBackgroundBrush + { + get { return (Brush)GetValue(TodayBackgroundBrushProperty); } + set { SetValue(TodayBackgroundBrushProperty, value); } + } + + private CalendarView CalendarView; + + public WinoCalendarView() + { + DefaultStyleKey = typeof(WinoCalendarView); + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + CalendarView = GetTemplateChild(PART_CalendarView) as CalendarView; + + Guard.IsNotNull(CalendarView, nameof(CalendarView)); + + CalendarView.SelectedDatesChanged -= InternalCalendarViewSelectionChanged; + CalendarView.SelectedDatesChanged += InternalCalendarViewSelectionChanged; + + // TODO: Should come from settings. + CalendarView.FirstDayOfWeek = Windows.Globalization.DayOfWeek.Monday; + + // Everytime display mode changes, update the visible date range backgrounds. + // If users go back from year -> month -> day, we need to update the visible date range backgrounds. + + CalendarView.RegisterPropertyChangedCallback(CalendarView.DisplayModeProperty, (s, e) => UpdateVisibleDateRangeBackgrounds()); + } + + private void InternalCalendarViewSelectionChanged(CalendarView sender, CalendarViewSelectedDatesChangedEventArgs args) + { + if (args.AddedDates?.Count > 0) + { + var clickedDate = args.AddedDates[0].Date; + SetInnerDisplayDate(clickedDate); + + var clickArgs = new CalendarViewDayClickedEventArgs(clickedDate); + DateClickedCommand?.Execute(clickArgs); + } + + // Reset selection, we don't show selected dates but react to them. + CalendarView.SelectedDates.Clear(); + } + + private static void OnPropertiesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is WinoCalendarView control) + { + control.UpdateVisibleDateRangeBackgrounds(); + } + } + + private void SetInnerDisplayDate(DateTime dateTime) => CalendarView?.SetDisplayDate(dateTime); + + // Changing selected dates will trigger the selection changed event. + // It will behave like user clicked the date. + public void GoToDay(DateTime dateTime) => CalendarView.SelectedDates.Add(dateTime); + + private static void OnHighlightedDateRangeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is WinoCalendarView control) + { + control.SetInnerDisplayDate(control.HighlightedDateRange.StartDate); + control.UpdateVisibleDateRangeBackgrounds(); + } + } + + public void UpdateVisibleDateRangeBackgrounds() + { + if (HighlightedDateRange == null || VisibleDateBackground == null || TodayBackgroundBrush == null || CalendarView == null) return; + + var markDateCalendarDayItems = WinoVisualTreeHelper.FindDescendants(CalendarView); + + foreach (var calendarDayItem in markDateCalendarDayItems) + { + var border = WinoVisualTreeHelper.GetChildObject(calendarDayItem, PART_DayViewItemBorder); + + if (border == null) return; + + if (calendarDayItem.Date.Date == DateTime.Today.Date) + { + border.Background = TodayBackgroundBrush; + } + else if (calendarDayItem.Date.Date >= HighlightedDateRange.StartDate.Date && calendarDayItem.Date.Date < HighlightedDateRange.EndDate.Date) + { + border.Background = VisibleDateBackground; + } + else + { + border.Background = null; + } + } + } + } +} diff --git a/Wino.Calendar/Controls/WinoDayTimelineCanvas.cs b/Wino.Calendar/Controls/WinoDayTimelineCanvas.cs new file mode 100644 index 00000000..7fa509c3 --- /dev/null +++ b/Wino.Calendar/Controls/WinoDayTimelineCanvas.cs @@ -0,0 +1,277 @@ +using System; +using System.Diagnostics; +using Microsoft.Graphics.Canvas.Geometry; +using Microsoft.Graphics.Canvas.UI.Xaml; +using Windows.Foundation; +using Windows.UI.Input; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Media; +using Wino.Calendar.Args; +using Wino.Core.Domain.Models.Calendar; + +namespace Wino.Calendar.Controls +{ + public class WinoDayTimelineCanvas : Control, IDisposable + { + public event EventHandler TimelineCellSelected; + public event EventHandler TimelineCellUnselected; + + private const string PART_InternalCanvas = nameof(PART_InternalCanvas); + private CanvasControl Canvas; + + public static readonly DependencyProperty RenderOptionsProperty = DependencyProperty.Register(nameof(RenderOptions), typeof(CalendarRenderOptions), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null, new PropertyChangedCallback(OnRenderingPropertiesChanged))); + public static readonly DependencyProperty SeperatorColorProperty = DependencyProperty.Register(nameof(SeperatorColor), typeof(SolidColorBrush), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null, new PropertyChangedCallback(OnRenderingPropertiesChanged))); + public static readonly DependencyProperty HalfHourSeperatorColorProperty = DependencyProperty.Register(nameof(HalfHourSeperatorColor), typeof(SolidColorBrush), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null, new PropertyChangedCallback(OnRenderingPropertiesChanged))); + public static readonly DependencyProperty SelectedCellBackgroundBrushProperty = DependencyProperty.Register(nameof(SelectedCellBackgroundBrush), typeof(SolidColorBrush), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null, new PropertyChangedCallback(OnRenderingPropertiesChanged))); + public static readonly DependencyProperty WorkingHourCellBackgroundColorProperty = DependencyProperty.Register(nameof(WorkingHourCellBackgroundColor), typeof(SolidColorBrush), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null, new PropertyChangedCallback(OnRenderingPropertiesChanged))); + public static readonly DependencyProperty SelectedDateTimeProperty = DependencyProperty.Register(nameof(SelectedDateTime), typeof(DateTime?), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null, new PropertyChangedCallback(OnSelectedDateTimeChanged))); + public static readonly DependencyProperty PositionerUIElementProperty = DependencyProperty.Register(nameof(PositionerUIElement), typeof(UIElement), typeof(WinoDayTimelineCanvas), new PropertyMetadata(null)); + + public UIElement PositionerUIElement + { + get { return (UIElement)GetValue(PositionerUIElementProperty); } + set { SetValue(PositionerUIElementProperty, value); } + } + + public CalendarRenderOptions RenderOptions + { + get { return (CalendarRenderOptions)GetValue(RenderOptionsProperty); } + set { SetValue(RenderOptionsProperty, value); } + } + + public SolidColorBrush HalfHourSeperatorColor + { + get { return (SolidColorBrush)GetValue(HalfHourSeperatorColorProperty); } + set { SetValue(HalfHourSeperatorColorProperty, value); } + } + + public SolidColorBrush SeperatorColor + { + get { return (SolidColorBrush)GetValue(SeperatorColorProperty); } + set { SetValue(SeperatorColorProperty, value); } + } + + public SolidColorBrush WorkingHourCellBackgroundColor + { + get { return (SolidColorBrush)GetValue(WorkingHourCellBackgroundColorProperty); } + set { SetValue(WorkingHourCellBackgroundColorProperty, value); } + } + + public SolidColorBrush SelectedCellBackgroundBrush + { + get { return (SolidColorBrush)GetValue(SelectedCellBackgroundBrushProperty); } + set { SetValue(SelectedCellBackgroundBrushProperty, value); } + } + + public DateTime? SelectedDateTime + { + get { return (DateTime?)GetValue(SelectedDateTimeProperty); } + set { SetValue(SelectedDateTimeProperty, value); } + } + + protected override void OnApplyTemplate() + { + base.OnApplyTemplate(); + + Canvas = GetTemplateChild(PART_InternalCanvas) as CanvasControl; + + Canvas.Draw += OnCanvasDraw; + Canvas.PointerPressed += OnCanvasPointerPressed; + + ForceDraw(); + } + + private static void OnSelectedDateTimeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is WinoDayTimelineCanvas control) + { + if (e.OldValue != null && e.NewValue == null) + { + control.RaiseCellUnselected(); + } + + control.ForceDraw(); + } + } + + private void RaiseCellUnselected() + { + TimelineCellUnselected?.Invoke(this, new TimelineCellUnselectedArgs()); + } + + private void OnCanvasPointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e) + { + if (RenderOptions == null) return; + + var hourHeight = RenderOptions.CalendarSettings.HourHeight; + + // When users click to cell we need to find the day, hour and minutes (first 30 minutes or second 30 minutes) that it represents on the timeline. + + PointerPoint positionerRootPoint = e.GetCurrentPoint(PositionerUIElement); + PointerPoint canvasPointerPoint = e.GetCurrentPoint(Canvas); + + Point touchPoint = canvasPointerPoint.Position; + + var singleDayWidth = (Canvas.ActualWidth / RenderOptions.TotalDayCount); + + int day = (int)(touchPoint.X / singleDayWidth); + int hour = (int)(touchPoint.Y / hourHeight); + + bool isSecondHalf = touchPoint.Y % hourHeight > (hourHeight / 2); + + var diffX = positionerRootPoint.Position.X - touchPoint.X; + var diffY = positionerRootPoint.Position.Y - touchPoint.Y; + + var cellStartRelativePositionX = diffX + (day * singleDayWidth); + var cellEndRelativePositionX = cellStartRelativePositionX + singleDayWidth; + + var cellStartRelativePositionY = diffY + (hour * hourHeight) + (isSecondHalf ? hourHeight / 2 : 0); + var cellEndRelativePositionY = cellStartRelativePositionY + (isSecondHalf ? (hourHeight / 2) : hourHeight); + + var cellSize = new Size(cellEndRelativePositionX - cellStartRelativePositionX, hourHeight / 2); + var positionerPoint = new Point(cellStartRelativePositionX, cellStartRelativePositionY); + + var clickedDateTime = RenderOptions.DateRange.StartDate.AddDays(day).AddHours(hour).AddMinutes(isSecondHalf ? 30 : 0); + + // If there is already a selected date, in order to mimic the popup behavior, we need to dismiss the previous selection first. + // Next click will be a new selection. + + // Raise the events directly here instead of DP to not lose pointer position. + if (clickedDateTime == SelectedDateTime || SelectedDateTime != null) + { + SelectedDateTime = null; + } + else + { + TimelineCellSelected?.Invoke(this, new TimelineCellSelectedArgs(clickedDateTime, touchPoint, positionerPoint, cellSize)); + SelectedDateTime = clickedDateTime; + } + + Debug.WriteLine($"Clicked: {clickedDateTime}"); + } + + public WinoDayTimelineCanvas() + { + DefaultStyleKey = typeof(WinoDayTimelineCanvas); + } + + private static void OnRenderingPropertiesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is WinoDayTimelineCanvas control) + { + control.ForceDraw(); + } + } + + private void ForceDraw() => Canvas?.Invalidate(); + + private bool CanDrawTimeline() + { + return RenderOptions != null + && Canvas != null + && Canvas.ReadyToDraw + && WorkingHourCellBackgroundColor != null + && SeperatorColor != null + && HalfHourSeperatorColor != null + && SelectedCellBackgroundBrush != null; + } + + private void OnCanvasDraw(CanvasControl sender, CanvasDrawEventArgs args) + { + if (!CanDrawTimeline()) return; + + int hours = 24; + + double canvasWidth = Canvas.ActualWidth; + double canvasHeight = Canvas.ActualHeight; + + if (canvasWidth == 0 || canvasHeight == 0) return; + + // Calculate the width of each rectangle (1 day column) + // Equal distribution of the whole width. + double rectWidth = canvasWidth / RenderOptions.TotalDayCount; + + // Calculate the height of each rectangle (1 hour row) + double rectHeight = RenderOptions.CalendarSettings.HourHeight; + + // Define stroke and fill colors + var strokeColor = SeperatorColor.Color; + float strokeThickness = 0.5f; + + for (int day = 0; day < RenderOptions.TotalDayCount; day++) + { + var currentDay = RenderOptions.DateRange.StartDate.AddDays(day); + + bool isWorkingDay = RenderOptions.CalendarSettings.WorkingDays.Contains(currentDay.DayOfWeek); + + // Loop through each hour (rows) + for (int hour = 0; hour < hours; hour++) + { + var renderTime = TimeSpan.FromHours(hour); + + var representingDateTime = currentDay.AddHours(hour); + + // Calculate the position and size of the rectangle + double x = day * rectWidth; + double y = hour * rectHeight; + + var rectangle = new Rect(x, y, rectWidth, rectHeight); + + // Draw the rectangle border. + // This is the main rectangle. + args.DrawingSession.DrawRectangle(rectangle, strokeColor, strokeThickness); + + // Fill another rectangle with the working hour background color + // This rectangle must be placed with -1 margin to prevent invisible borders of the main rectangle. + if (isWorkingDay && renderTime >= RenderOptions.CalendarSettings.WorkingHourStart && renderTime <= RenderOptions.CalendarSettings.WorkingHourEnd) + { + var backgroundRectangle = new Rect(x + 1, y + 1, rectWidth - 1, rectHeight - 1); + + args.DrawingSession.DrawRectangle(backgroundRectangle, strokeColor, strokeThickness); + args.DrawingSession.FillRectangle(backgroundRectangle, WorkingHourCellBackgroundColor.Color); + } + + // Draw a line in the center of the rectangle for representing half hours. + double lineY = y + rectHeight / 2; + + args.DrawingSession.DrawLine((float)x, (float)lineY, (float)(x + rectWidth), (float)lineY, HalfHourSeperatorColor.Color, strokeThickness, new CanvasStrokeStyle() + { + DashStyle = CanvasDashStyle.Dot + }); + } + + // Draw selected item background color for the date if possible. + if (SelectedDateTime != null) + { + var selectedDateTime = SelectedDateTime.Value; + if (selectedDateTime.Date == currentDay.Date) + { + var selectionRectHeight = rectHeight / 2; + var selectedY = selectedDateTime.Hour * rectHeight + (selectedDateTime.Minute / 60) * rectHeight; + + // Second half of the hour is selected. + if (selectedDateTime.TimeOfDay.Minutes == 30) + { + selectedY += rectHeight / 2; + } + + var selectedRectangle = new Rect(day * rectWidth, selectedY, rectWidth, selectionRectHeight); + args.DrawingSession.FillRectangle(selectedRectangle, SelectedCellBackgroundBrush.Color); + } + } + } + } + + public void Dispose() + { + if (Canvas == null) return; + + Canvas.Draw -= OnCanvasDraw; + Canvas.PointerPressed -= OnCanvasPointerPressed; + Canvas.RemoveFromVisualTree(); + + Canvas = null; + } + } +} diff --git a/Wino.Calendar/MainPage.xaml b/Wino.Calendar/MainPage.xaml index 136e046c..f9187649 100644 --- a/Wino.Calendar/MainPage.xaml +++ b/Wino.Calendar/MainPage.xaml @@ -2,13 +2,11 @@ x:Class="Wino.Calendar.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:Wino.Calendar" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:local="using:Wino.Calendar" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" - Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> + Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" + mc:Ignorable="d"> - - - + diff --git a/Wino.Calendar/Models/CalendarItemMeasurement.cs b/Wino.Calendar/Models/CalendarItemMeasurement.cs new file mode 100644 index 00000000..b9a30d5b --- /dev/null +++ b/Wino.Calendar/Models/CalendarItemMeasurement.cs @@ -0,0 +1,17 @@ +namespace Wino.Calendar.Models +{ + public struct CalendarItemMeasurement + { + // Where to start? + public double Left { get; set; } + + // Extend until where? + public double Right { get; set; } + + public CalendarItemMeasurement(double left, double right) + { + Left = left; + Right = right; + } + } +} diff --git a/Wino.Calendar/Package.appxmanifest b/Wino.Calendar/Package.appxmanifest index 6e261c84..fac0c7f2 100644 --- a/Wino.Calendar/Package.appxmanifest +++ b/Wino.Calendar/Package.appxmanifest @@ -18,7 +18,7 @@ + Version="1.0.7.0" /> @@ -46,7 +46,7 @@ Square44x44Logo="Assets\Square44x44Logo.png" Description="Wino.Calendar" BackgroundColor="transparent"> - + diff --git a/Wino.Calendar/Properties/Default.rd.xml b/Wino.Calendar/Properties/Default.rd.xml index af00722c..68cdeacf 100644 --- a/Wino.Calendar/Properties/Default.rd.xml +++ b/Wino.Calendar/Properties/Default.rd.xml @@ -21,11 +21,24 @@ An Assembly element with Name="*Application*" applies to all assemblies in the application package. The asterisks are not wildcards. --> - - - - + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/Wino.Calendar/Services/ApplicationResourceManager.cs b/Wino.Calendar/Services/ApplicationResourceManager.cs new file mode 100644 index 00000000..fdd3776d --- /dev/null +++ b/Wino.Calendar/Services/ApplicationResourceManager.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Wino.Calendar.Services +{ + internal class ApplicationResourceManager + { + } +} diff --git a/Wino.Calendar/Services/DialogService.cs b/Wino.Calendar/Services/DialogService.cs new file mode 100644 index 00000000..0fdd80b3 --- /dev/null +++ b/Wino.Calendar/Services/DialogService.cs @@ -0,0 +1,15 @@ +using Windows.UI.Xaml; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Services; + +namespace Wino.Calendar.Services +{ + public class DialogService : DialogServiceBase, ICalendarDialogService + { + public DialogService(IThemeService themeService, + IConfigurationService configurationService, + IApplicationResourceManager applicationResourceManager) : base(themeService, configurationService, applicationResourceManager) + { + } + } +} diff --git a/Wino.Calendar/Services/NavigationService.cs b/Wino.Calendar/Services/NavigationService.cs new file mode 100644 index 00000000..269eaf54 --- /dev/null +++ b/Wino.Calendar/Services/NavigationService.cs @@ -0,0 +1,51 @@ +using System; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Calendar.Views; +using Wino.Calendar.Views.Account; +using Wino.Calendar.Views.Settings; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Navigation; +using Wino.Core.UWP.Services; +using Wino.Views; + +namespace Wino.Calendar.Services +{ + public class NavigationService : NavigationServiceBase, INavigationService + { + public Type GetPageType(WinoPage winoPage) + { + switch (winoPage) + { + case WinoPage.CalendarPage: + return typeof(CalendarPage); + case WinoPage.SettingsPage: + return typeof(SettingsPage); + case WinoPage.CalendarSettingsPage: + return typeof(CalendarSettingsPage); + case WinoPage.AccountManagementPage: + return typeof(AccountManagementPage); + default: + throw new Exception("Page is not implemented yet."); + } + } + + public bool Navigate(WinoPage page, object parameter = null, NavigationReferenceFrame frame = NavigationReferenceFrame.ShellFrame, NavigationTransitionType transition = NavigationTransitionType.None) + { + // All navigations are performed on shell frame for calendar. + + if (Window.Current.Content is Frame appFrame && appFrame.Content is AppShell shellPage) + { + var shellFrame = shellPage.GetShellFrame(); + + var pageType = GetPageType(page); + + shellFrame.Navigate(pageType, parameter); + return true; + } + + return false; + } + } +} diff --git a/Wino.Calendar/Services/SettingsBuilderService.cs b/Wino.Calendar/Services/SettingsBuilderService.cs new file mode 100644 index 00000000..2177d8dc --- /dev/null +++ b/Wino.Calendar/Services/SettingsBuilderService.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Settings; + +namespace Wino.Calendar.Services +{ + public class SettingsBuilderService : ISettingsBuilderService + { + public List GetSettingItems() + => new List() + { + new SettingOption(Translator.SettingsManageAccountSettings_Title, Translator.SettingsManageAccountSettings_Description, WinoPage.AccountManagementPage,"F1 M 3.75 5 L 3.75 4.902344 C 3.75 4.225262 3.885091 3.588867 4.155273 2.993164 C 4.425456 2.397461 4.790039 1.878256 5.249023 1.435547 C 5.708008 0.99284 6.238606 0.642904 6.84082 0.385742 C 7.443034 0.128582 8.079427 0 8.75 0 C 9.420572 0 10.056966 0.128582 10.65918 0.385742 C 11.261393 0.642904 11.791992 0.99284 12.250977 1.435547 C 12.709961 1.878256 13.074544 2.397461 13.344727 2.993164 C 13.614908 3.588867 13.75 4.225262 13.75 4.902344 C 13.75 5.397137 13.689778 5.87077 13.569336 6.323242 C 13.448893 6.775717 13.258463 7.213542 12.998047 7.636719 C 12.229817 7.799479 11.510416 8.079428 10.839844 8.476562 C 10.169271 8.873698 9.583333 9.378256 9.082031 9.990234 C 9.042969 9.996745 9.005533 10 8.969727 10 C 8.933919 10 8.899739 10 8.867188 10 L 8.652344 10 C 7.97526 10 7.338867 9.864909 6.743164 9.594727 C 6.147461 9.324545 5.628255 8.959961 5.185547 8.500977 C 4.742838 8.041993 4.392903 7.511395 4.135742 6.90918 C 3.878581 6.306967 3.75 5.670573 3.75 5 Z M 12.5 5 L 12.5 4.921875 C 12.5 4.414062 12.399088 3.937176 12.197266 3.491211 C 11.995442 3.045248 11.722005 2.65625 11.376953 2.324219 C 11.0319 1.992188 10.633138 1.730145 10.180664 1.538086 C 9.728189 1.346029 9.251302 1.25 8.75 1.25 C 8.229166 1.25 7.740885 1.347656 7.285156 1.542969 C 6.829427 1.738281 6.432292 2.005209 6.09375 2.34375 C 5.755208 2.682293 5.488281 3.079428 5.292969 3.535156 C 5.097656 3.990887 5 4.479167 5 5 C 5 5.520834 5.097656 6.009115 5.292969 6.464844 C 5.488281 6.920573 5.755208 7.317709 6.09375 7.65625 C 6.432292 7.994792 6.829427 8.261719 7.285156 8.457031 C 7.740885 8.652344 8.229166 8.75 8.75 8.75 C 9.270833 8.75 9.759114 8.652344 10.214844 8.457031 C 10.670572 8.261719 11.067708 7.994792 11.40625 7.65625 C 11.744791 7.317709 12.011719 6.920573 12.207031 6.464844 C 12.402344 6.009115 12.5 5.520834 12.5 5 Z M 12.148438 19.365234 C 11.777344 19.208984 11.41276 19.010416 11.054688 18.769531 C 11.113281 18.561197 11.170247 18.357748 11.225586 18.15918 C 11.280924 17.960611 11.308594 17.753906 11.308594 17.539062 C 11.308594 17.252604 11.259766 16.977539 11.162109 16.713867 C 11.064453 16.450195 10.930989 16.210938 10.761719 15.996094 C 10.592447 15.78125 10.390625 15.597331 10.15625 15.444336 C 9.921875 15.291342 9.664713 15.182292 9.384766 15.117188 L 8.779297 14.980469 C 8.759766 14.778646 8.75 14.576823 8.75 14.375 C 8.75 14.179688 8.759766 13.977865 8.779297 13.769531 L 9.384766 13.632812 C 9.664713 13.567709 9.921875 13.458659 10.15625 13.305664 C 10.390625 13.15267 10.592447 12.96875 10.761719 12.753906 C 10.930989 12.539062 11.064453 12.299805 11.162109 12.036133 C 11.259766 11.772461 11.308594 11.497396 11.308594 11.210938 C 11.308594 10.996094 11.280924 10.789389 11.225586 10.59082 C 11.170247 10.392253 11.113281 10.188803 11.054688 9.980469 C 11.41276 9.739584 11.777344 9.541016 12.148438 9.384766 C 12.324219 9.560547 12.488606 9.720053 12.641602 9.863281 C 12.794596 10.006511 12.957356 10.131836 13.129883 10.239258 C 13.302408 10.34668 13.487955 10.429688 13.686523 10.488281 C 13.885091 10.546875 14.114583 10.576172 14.375 10.576172 C 14.635416 10.576172 14.866535 10.546875 15.068359 10.488281 C 15.270182 10.429688 15.455729 10.34668 15.625 10.239258 C 15.79427 10.131836 15.955402 10.006511 16.108398 9.863281 C 16.261393 9.720053 16.425781 9.560547 16.601562 9.384766 C 16.972656 9.541016 17.337238 9.739584 17.695312 9.980469 C 17.636719 10.188803 17.579752 10.392253 17.524414 10.59082 C 17.469074 10.789389 17.441406 10.996094 17.441406 11.210938 C 17.441406 11.497396 17.488605 11.772461 17.583008 12.036133 C 17.677408 12.299805 17.810871 12.539062 17.983398 12.753906 C 18.155924 12.96875 18.359375 13.15267 18.59375 13.305664 C 18.828125 13.458659 19.085285 13.567709 19.365234 13.632812 L 19.970703 13.769531 C 19.990234 13.977865 20 14.179688 20 14.375 C 20 14.576823 19.990234 14.778646 19.970703 14.980469 L 19.365234 15.117188 C 19.085285 15.182292 18.828125 15.291342 18.59375 15.444336 C 18.359375 15.597331 18.155924 15.78125 17.983398 15.996094 C 17.810871 16.210938 17.677408 16.450195 17.583008 16.713867 C 17.488605 16.977539 17.441406 17.252604 17.441406 17.539062 C 17.441406 17.753906 17.469074 17.960611 17.524414 18.15918 C 17.579752 18.357748 17.636719 18.561197 17.695312 18.769531 C 17.337238 19.010416 16.972656 19.208984 16.601562 19.365234 C 16.425781 19.189453 16.261393 19.029947 16.108398 18.886719 C 15.955402 18.74349 15.79427 18.618164 15.625 18.510742 C 15.455729 18.40332 15.270182 18.320312 15.068359 18.261719 C 14.866535 18.203125 14.635416 18.173828 14.375 18.173828 C 14.108072 18.173828 13.875324 18.203125 13.676758 18.261719 C 13.478189 18.320312 13.294271 18.40332 13.125 18.510742 C 12.955729 18.618164 12.794596 18.74349 12.641602 18.886719 C 12.488606 19.029947 12.324219 19.189453 12.148438 19.365234 Z M 0 13.75 C 0 13.404948 0.065104 13.081055 0.195312 12.77832 C 0.325521 12.475586 0.504557 12.210287 0.732422 11.982422 C 0.960286 11.754558 1.225586 11.575521 1.52832 11.445312 C 1.831055 11.315104 2.154948 11.25 2.5 11.25 L 8.251953 11.25 C 8.043619 11.660156 7.880859 12.076823 7.763672 12.5 L 2.5 12.5 C 2.324219 12.5 2.159831 12.532553 2.006836 12.597656 C 1.853841 12.662761 1.722005 12.750651 1.611328 12.861328 C 1.500651 12.972006 1.41276 13.103842 1.347656 13.256836 C 1.282552 13.409831 1.25 13.574219 1.25 13.75 C 1.25 14.420573 1.360677 15.008139 1.582031 15.512695 C 1.803385 16.017252 2.102865 16.455078 2.480469 16.826172 C 2.858073 17.197266 3.297526 17.50651 3.798828 17.753906 C 4.30013 18.001303 4.827474 18.198242 5.380859 18.344727 C 5.934244 18.491211 6.50065 18.595377 7.080078 18.657227 C 7.659505 18.719076 8.216146 18.75 8.75 18.75 L 9.072266 18.75 C 9.449869 19.199219 9.866536 19.5931 10.322266 19.931641 C 10.061849 19.964193 9.801432 19.983725 9.541016 19.990234 C 9.280599 19.996744 9.016927 20 8.75 20 C 8.190104 20 7.618814 19.973959 7.036133 19.921875 C 6.45345 19.869791 5.878906 19.775391 5.3125 19.638672 C 4.746094 19.501953 4.197591 19.319662 3.666992 19.091797 C 3.136393 18.863932 2.646484 18.574219 2.197266 18.222656 C 1.474609 17.66276 0.927734 17.005209 0.556641 16.25 C 0.185547 15.494792 0 14.661458 0 13.75 Z M 15.625 14.375 C 15.625 14.205729 15.592447 14.044597 15.527344 13.891602 C 15.462239 13.738607 15.372721 13.605144 15.258789 13.491211 C 15.144855 13.377279 15.011393 13.287761 14.858398 13.222656 C 14.705403 13.157553 14.544271 13.125 14.375 13.125 C 14.199219 13.125 14.036458 13.157553 13.886719 13.222656 C 13.736979 13.287761 13.605143 13.377279 13.491211 13.491211 C 13.377278 13.605144 13.28776 13.736979 13.222656 13.886719 C 13.157551 14.036459 13.124999 14.199219 13.125 14.375 C 13.124999 14.550781 13.157551 14.71517 13.222656 14.868164 C 13.28776 15.021159 13.37565 15.152995 13.486328 15.263672 C 13.597004 15.37435 13.72884 15.46224 13.881836 15.527344 C 14.03483 15.592448 14.199219 15.625 14.375 15.625 C 14.550781 15.625 14.713541 15.592448 14.863281 15.527344 C 15.01302 15.46224 15.144855 15.372722 15.258789 15.258789 C 15.372721 15.144857 15.462239 15.013021 15.527344 14.863281 C 15.592447 14.713542 15.625 14.550781 15.625 14.375 Z "), + new SettingOption(Translator.SettingsAppPreferences_Title, Translator.SettingsAppPreferences_Description, WinoPage.AppPreferencesPage,"F1 M 15.078125 1.25 C 15.566406 1.25 16.033527 1.349285 16.479492 1.547852 C 16.925455 1.74642 17.31608 2.013348 17.651367 2.348633 C 17.986652 2.68392 18.25358 3.074545 18.452148 3.520508 C 18.650715 3.966473 18.75 4.433594 18.75 4.921875 L 18.75 15.078125 C 18.75 15.566406 18.650715 16.033529 18.452148 16.479492 C 18.25358 16.925455 17.986652 17.31608 17.651367 17.651367 C 17.31608 17.986654 16.925455 18.25358 16.479492 18.452148 C 16.033527 18.650717 15.566406 18.75 15.078125 18.75 L 4.921875 18.75 C 4.433594 18.75 3.966471 18.650717 3.520508 18.452148 C 3.074544 18.25358 2.683919 17.986654 2.348633 17.651367 C 2.013346 17.31608 1.746419 16.925455 1.547852 16.479492 C 1.349284 16.033529 1.25 15.566406 1.25 15.078125 L 1.25 4.921875 C 1.25 4.433594 1.349284 3.966473 1.547852 3.520508 C 1.746419 3.074545 2.013346 2.68392 2.348633 2.348633 C 2.683919 2.013348 3.074544 1.74642 3.520508 1.547852 C 3.966471 1.349285 4.433594 1.25 4.921875 1.25 Z M 4.951172 2.5 C 4.625651 2.5 4.314778 2.566732 4.018555 2.700195 C 3.722331 2.83366 3.461914 3.012695 3.237305 3.237305 C 3.012695 3.461914 2.833659 3.722332 2.700195 4.018555 C 2.566732 4.314779 2.5 4.625651 2.5 4.951172 L 2.5 5 L 17.5 5 L 17.5 4.951172 C 17.5 4.625651 17.433268 4.314779 17.299805 4.018555 C 17.16634 3.722332 16.987305 3.461914 16.762695 3.237305 C 16.538086 3.012695 16.277668 2.83366 15.981445 2.700195 C 15.685221 2.566732 15.374349 2.5 15.048828 2.5 Z M 15.048828 17.5 C 15.374349 17.5 15.685221 17.433268 15.981445 17.299805 C 16.277668 17.166342 16.538086 16.987305 16.762695 16.762695 C 16.987305 16.538086 17.16634 16.27767 17.299805 15.981445 C 17.433268 15.685222 17.5 15.37435 17.5 15.048828 L 17.5 6.25 L 2.5 6.25 L 2.5 15.048828 C 2.5 15.37435 2.566732 15.685222 2.700195 15.981445 C 2.833659 16.27767 3.012695 16.538086 3.237305 16.762695 C 3.461914 16.987305 3.722331 17.166342 4.018555 17.299805 C 4.314778 17.433268 4.625651 17.5 4.951172 17.5 Z M 12.724609 8.935547 C 12.724609 9.195964 12.762044 9.446615 12.836914 9.6875 C 12.911783 9.928386 13.020832 10.151367 13.164062 10.356445 C 13.307291 10.561523 13.476562 10.742188 13.671875 10.898438 C 13.867188 11.054688 14.088541 11.178386 14.335938 11.269531 C 14.348957 11.367188 14.358723 11.466472 14.365234 11.567383 C 14.371744 11.668295 14.375 11.770834 14.375 11.875 C 14.375 11.979167 14.371744 12.081706 14.365234 12.182617 C 14.358723 12.283529 14.348957 12.382812 14.335938 12.480469 C 14.088541 12.571615 13.867188 12.695312 13.671875 12.851562 C 13.476562 13.007812 13.307291 13.188477 13.164062 13.393555 C 13.020832 13.598633 12.911783 13.821615 12.836914 14.0625 C 12.762044 14.303386 12.724609 14.554037 12.724609 14.814453 C 12.724609 14.886068 12.727864 14.960938 12.734375 15.039062 C 12.740885 15.117188 12.75065 15.192058 12.763672 15.263672 C 12.470703 15.511068 12.145182 15.712891 11.787109 15.869141 C 11.546224 15.621745 11.274414 15.43457 10.97168 15.307617 C 10.668945 15.180664 10.345052 15.117188 10 15.117188 C 9.654947 15.117188 9.331055 15.180664 9.02832 15.307617 C 8.725586 15.43457 8.453775 15.621745 8.212891 15.869141 C 7.854817 15.712891 7.529296 15.511068 7.236328 15.263672 C 7.249349 15.192058 7.259114 15.117188 7.265625 15.039062 C 7.272135 14.960938 7.275391 14.886068 7.275391 14.814453 C 7.275391 14.554037 7.237956 14.303386 7.163086 14.0625 C 7.088216 13.821615 6.979167 13.598633 6.835938 13.393555 C 6.692708 13.188477 6.52181 13.007812 6.323242 12.851562 C 6.124674 12.695312 5.904948 12.571615 5.664062 12.480469 C 5.651042 12.382812 5.641276 12.283529 5.634766 12.182617 C 5.628255 12.081706 5.625 11.979167 5.625 11.875 C 5.625 11.770834 5.628255 11.668295 5.634766 11.567383 C 5.641276 11.466472 5.651042 11.367188 5.664062 11.269531 C 5.904948 11.178386 6.124674 11.054688 6.323242 10.898438 C 6.52181 10.742188 6.692708 10.561523 6.835938 10.356445 C 6.979167 10.151367 7.088216 9.928386 7.163086 9.6875 C 7.237956 9.446615 7.275391 9.195964 7.275391 8.935547 C 7.275391 8.863933 7.272135 8.789062 7.265625 8.710938 C 7.259114 8.632812 7.249349 8.557943 7.236328 8.486328 C 7.529296 8.238933 7.854817 8.037109 8.212891 7.880859 C 8.440755 8.121745 8.712564 8.307292 9.02832 8.4375 C 9.344075 8.567709 9.667969 8.632812 10 8.632812 C 10.332031 8.632812 10.655924 8.567709 10.97168 8.4375 C 11.287435 8.307292 11.559244 8.121745 11.787109 7.880859 C 12.145182 8.037109 12.470703 8.238933 12.763672 8.486328 C 12.75065 8.557943 12.740885 8.632812 12.734375 8.710938 C 12.727864 8.789062 12.724609 8.863933 12.724609 8.935547 Z M 10.9375 11.875 C 10.9375 11.614584 10.846354 11.393229 10.664062 11.210938 C 10.481771 11.028646 10.260416 10.9375 10 10.9375 C 9.739583 10.9375 9.518229 11.028646 9.335938 11.210938 C 9.153646 11.393229 9.0625 11.614584 9.0625 11.875 C 9.0625 12.135417 9.153646 12.356771 9.335938 12.539062 C 9.518229 12.721354 9.739583 12.8125 10 12.8125 C 10.260416 12.8125 10.481771 12.721354 10.664062 12.539062 C 10.846354 12.356771 10.9375 12.135417 10.9375 11.875 Z "), + new SettingOption(Translator.SettingsCalendarSettings_Title, Translator.SettingsCalendarSettings_Description, WinoPage.CalendarSettingsPage,"F1 M 1.25 3.75 C 1.25 3.404949 1.315104 3.081055 1.445312 2.77832 C 1.575521 2.475586 1.754557 2.210287 1.982422 1.982422 C 2.210286 1.754559 2.475586 1.575521 2.77832 1.445312 C 3.081055 1.315105 3.404948 1.25 3.75 1.25 L 16.25 1.25 C 16.595051 1.25 16.918945 1.315105 17.22168 1.445312 C 17.524414 1.575521 17.789713 1.754559 18.017578 1.982422 C 18.245441 2.210287 18.424479 2.475586 18.554688 2.77832 C 18.684895 3.081055 18.75 3.404949 18.75 3.75 L 18.75 5 L 1.25 5 Z M 3.75 18.75 C 3.404948 18.75 3.081055 18.684896 2.77832 18.554688 C 2.475586 18.424479 2.210286 18.245443 1.982422 18.017578 C 1.754557 17.789713 1.575521 17.524414 1.445312 17.22168 C 1.315104 16.918945 1.25 16.595053 1.25 16.25 L 1.25 6.25 L 18.75 6.25 L 18.75 16.25 C 18.75 16.595053 18.684895 16.918945 18.554688 17.22168 C 18.424479 17.524414 18.245441 17.789713 18.017578 18.017578 C 17.789713 18.245443 17.524414 18.424479 17.22168 18.554688 C 16.918945 18.684896 16.595051 18.75 16.25 18.75 Z M 7.65625 9.990234 C 7.65625 9.794922 7.618815 9.612631 7.543945 9.443359 C 7.469075 9.274089 7.368164 9.125977 7.241211 8.999023 C 7.114258 8.87207 6.966146 8.772787 6.796875 8.701172 C 6.627604 8.629558 6.445312 8.59375 6.25 8.59375 C 6.054688 8.59375 5.870768 8.631186 5.698242 8.706055 C 5.525716 8.780925 5.375977 8.881836 5.249023 9.008789 C 5.12207 9.135742 5.022786 9.283854 4.951172 9.453125 C 4.879557 9.622396 4.84375 9.804688 4.84375 10 C 4.84375 10.195312 4.879557 10.377604 4.951172 10.546875 C 5.022786 10.716146 5.12207 10.864258 5.249023 10.991211 C 5.375977 11.118164 5.524088 11.219076 5.693359 11.293945 C 5.86263 11.368815 6.044922 11.40625 6.240234 11.40625 C 6.442057 11.40625 6.629231 11.370443 6.801758 11.298828 C 6.974283 11.227214 7.124023 11.12793 7.250977 11.000977 C 7.377929 10.874023 7.477213 10.724284 7.548828 10.551758 C 7.620442 10.379232 7.65625 10.192058 7.65625 9.990234 Z M 11.40625 9.990234 C 11.40625 9.794922 11.368814 9.612631 11.293945 9.443359 C 11.219075 9.274089 11.118164 9.125977 10.991211 8.999023 C 10.864258 8.87207 10.716146 8.772787 10.546875 8.701172 C 10.377604 8.629558 10.195312 8.59375 10 8.59375 C 9.804688 8.59375 9.620768 8.631186 9.448242 8.706055 C 9.275716 8.780925 9.125977 8.881836 8.999023 9.008789 C 8.87207 9.135742 8.772786 9.283854 8.701172 9.453125 C 8.629557 9.622396 8.59375 9.804688 8.59375 10 C 8.59375 10.195312 8.629557 10.377604 8.701172 10.546875 C 8.772786 10.716146 8.87207 10.864258 8.999023 10.991211 C 9.125977 11.118164 9.274088 11.219076 9.443359 11.293945 C 9.61263 11.368815 9.794922 11.40625 9.990234 11.40625 C 10.192057 11.40625 10.379231 11.370443 10.551758 11.298828 C 10.724283 11.227214 10.874023 11.12793 11.000977 11.000977 C 11.12793 10.874023 11.227213 10.724284 11.298828 10.551758 C 11.370442 10.379232 11.40625 10.192058 11.40625 9.990234 Z M 15.15625 9.990234 C 15.15625 9.794922 15.118814 9.612631 15.043945 9.443359 C 14.969075 9.274089 14.868164 9.125977 14.741211 8.999023 C 14.614258 8.87207 14.466146 8.772787 14.296875 8.701172 C 14.127604 8.629558 13.945312 8.59375 13.75 8.59375 C 13.554688 8.59375 13.370768 8.631186 13.198242 8.706055 C 13.025716 8.780925 12.875977 8.881836 12.749023 9.008789 C 12.62207 9.135742 12.522786 9.283854 12.451172 9.453125 C 12.379557 9.622396 12.34375 9.804688 12.34375 10 C 12.34375 10.195312 12.379557 10.377604 12.451172 10.546875 C 12.522786 10.716146 12.62207 10.864258 12.749023 10.991211 C 12.875977 11.118164 13.024088 11.219076 13.193359 11.293945 C 13.362629 11.368815 13.544921 11.40625 13.740234 11.40625 C 13.942057 11.40625 14.129231 11.370443 14.301758 11.298828 C 14.474283 11.227214 14.624022 11.12793 14.750977 11.000977 C 14.877929 10.874023 14.977213 10.724284 15.048828 10.551758 C 15.120442 10.379232 15.15625 10.192058 15.15625 9.990234 Z M 7.65625 13.740234 C 7.65625 13.544922 7.618815 13.362631 7.543945 13.193359 C 7.469075 13.024089 7.368164 12.875977 7.241211 12.749023 C 7.114258 12.62207 6.966146 12.522787 6.796875 12.451172 C 6.627604 12.379558 6.445312 12.34375 6.25 12.34375 C 6.054688 12.34375 5.870768 12.381186 5.698242 12.456055 C 5.525716 12.530925 5.375977 12.631836 5.249023 12.758789 C 5.12207 12.885742 5.022786 13.033854 4.951172 13.203125 C 4.879557 13.372396 4.84375 13.554688 4.84375 13.75 C 4.84375 13.945312 4.879557 14.127604 4.951172 14.296875 C 5.022786 14.466146 5.12207 14.614258 5.249023 14.741211 C 5.375977 14.868164 5.524088 14.969076 5.693359 15.043945 C 5.86263 15.118815 6.044922 15.15625 6.240234 15.15625 C 6.442057 15.15625 6.629231 15.120443 6.801758 15.048828 C 6.974283 14.977214 7.124023 14.87793 7.250977 14.750977 C 7.377929 14.624023 7.477213 14.474284 7.548828 14.301758 C 7.620442 14.129232 7.65625 13.942058 7.65625 13.740234 Z M 11.40625 13.740234 C 11.40625 13.544922 11.368814 13.362631 11.293945 13.193359 C 11.219075 13.024089 11.118164 12.875977 10.991211 12.749023 C 10.864258 12.62207 10.716146 12.522787 10.546875 12.451172 C 10.377604 12.379558 10.195312 12.34375 10 12.34375 C 9.804688 12.34375 9.620768 12.381186 9.448242 12.456055 C 9.275716 12.530925 9.125977 12.631836 8.999023 12.758789 C 8.87207 12.885742 8.772786 13.033854 8.701172 13.203125 C 8.629557 13.372396 8.59375 13.554688 8.59375 13.75 C 8.59375 13.945312 8.629557 14.127604 8.701172 14.296875 C 8.772786 14.466146 8.87207 14.614258 8.999023 14.741211 C 9.125977 14.868164 9.274088 14.969076 9.443359 15.043945 C 9.61263 15.118815 9.794922 15.15625 9.990234 15.15625 C 10.192057 15.15625 10.379231 15.120443 10.551758 15.048828 C 10.724283 14.977214 10.874023 14.87793 11.000977 14.750977 C 11.12793 14.624023 11.227213 14.474284 11.298828 14.301758 C 11.370442 14.129232 11.40625 13.942058 11.40625 13.740234 Z "), + new SettingOption(Translator.SettingsAbout_Title, Translator.SettingsAbout_Description, WinoPage.AboutPage,"F1 M 9.375 18.75 C 8.509114 18.75 7.677409 18.639322 6.879883 18.417969 C 6.082356 18.196615 5.335286 17.882486 4.638672 17.475586 C 3.942057 17.068686 3.308919 16.580404 2.739258 16.010742 C 2.169596 15.441081 1.681315 14.807943 1.274414 14.111328 C 0.867513 13.414714 0.553385 12.667644 0.332031 11.870117 C 0.110677 11.072592 0 10.240886 0 9.375 C 0 8.509115 0.110677 7.677409 0.332031 6.879883 C 0.553385 6.082357 0.867513 5.335287 1.274414 4.638672 C 1.681315 3.942059 2.169596 3.30892 2.739258 2.739258 C 3.308919 2.169598 3.942057 1.681316 4.638672 1.274414 C 5.335286 0.867514 6.082356 0.553387 6.879883 0.332031 C 7.677409 0.110678 8.509114 0 9.375 0 C 10.240885 0 11.072591 0.110678 11.870117 0.332031 C 12.667643 0.553387 13.414713 0.867514 14.111328 1.274414 C 14.807942 1.681316 15.44108 2.169598 16.010742 2.739258 C 16.580402 3.30892 17.068684 3.942059 17.475586 4.638672 C 17.882486 5.335287 18.196613 6.082357 18.417969 6.879883 C 18.639322 7.677409 18.75 8.509115 18.75 9.375 C 18.75 10.240886 18.639322 11.072592 18.417969 11.870117 C 18.196613 12.667644 17.882486 13.414714 17.475586 14.111328 C 17.068684 14.807943 16.580402 15.441081 16.010742 16.010742 C 15.44108 16.580404 14.807942 17.068686 14.111328 17.475586 C 13.414713 17.882486 12.667643 18.196615 11.870117 18.417969 C 11.072591 18.639322 10.240885 18.75 9.375 18.75 Z M 9.375 1.25 C 8.626302 1.25 7.906901 1.347656 7.216797 1.542969 C 6.526692 1.738281 5.880533 2.011719 5.27832 2.363281 C 4.676106 2.714844 4.127604 3.138021 3.632812 3.632812 C 3.138021 4.127604 2.714844 4.676107 2.363281 5.27832 C 2.011719 5.880534 1.738281 6.52832 1.542969 7.22168 C 1.347656 7.915039 1.25 8.632812 1.25 9.375 C 1.25 10.117188 1.347656 10.834961 1.542969 11.52832 C 1.738281 12.22168 2.011719 12.869467 2.363281 13.47168 C 2.714844 14.073894 3.138021 14.622396 3.632812 15.117188 C 4.127604 15.611979 4.676106 16.035156 5.27832 16.386719 C 5.880533 16.738281 6.526692 17.011719 7.216797 17.207031 C 7.906901 17.402344 8.626302 17.5 9.375 17.5 C 10.117188 17.5 10.834961 17.402344 11.52832 17.207031 C 12.221679 17.011719 12.869465 16.738281 13.47168 16.386719 C 14.073893 16.035156 14.622396 15.611979 15.117188 15.117188 C 15.611979 14.622396 16.035156 14.073894 16.386719 13.47168 C 16.738281 12.869467 17.011719 12.223308 17.207031 11.533203 C 17.402344 10.8431 17.5 10.123698 17.5 9.375 C 17.5 8.632812 17.402344 7.915039 17.207031 7.22168 C 17.011719 6.52832 16.738281 5.880534 16.386719 5.27832 C 16.035156 4.676107 15.611979 4.127604 15.117188 3.632812 C 14.622396 3.138021 14.073893 2.714844 13.47168 2.363281 C 12.869465 2.011719 12.221679 1.738281 11.52832 1.542969 C 10.834961 1.347656 10.117188 1.25 9.375 1.25 Z M 8.75 7.5 L 10 7.5 L 10 13.75 L 8.75 13.75 Z M 8.75 5 L 10 5 L 10 6.25 L 8.75 6.25 Z "), + }; + } +} diff --git a/Wino.Calendar/Styles/CalendarDayItemsControl.xaml b/Wino.Calendar/Styles/CalendarDayItemsControl.xaml new file mode 100644 index 00000000..4385be31 --- /dev/null +++ b/Wino.Calendar/Styles/CalendarDayItemsControl.xaml @@ -0,0 +1,21 @@ + + + + + diff --git a/Wino.Calendar/Styles/CalendarItemControlResources.xaml b/Wino.Calendar/Styles/CalendarItemControlResources.xaml new file mode 100644 index 00000000..eaa70e09 --- /dev/null +++ b/Wino.Calendar/Styles/CalendarItemControlResources.xaml @@ -0,0 +1,29 @@ + + + + + + diff --git a/Wino.Calendar/Styles/CalendarItemControlResources.xaml.cs b/Wino.Calendar/Styles/CalendarItemControlResources.xaml.cs new file mode 100644 index 00000000..9d0cb0d1 --- /dev/null +++ b/Wino.Calendar/Styles/CalendarItemControlResources.xaml.cs @@ -0,0 +1,12 @@ +using Windows.UI.Xaml; + +namespace Wino.Calendar.Styles +{ + public sealed partial class CalendarItemControlResources : ResourceDictionary + { + public CalendarItemControlResources() + { + InitializeComponent(); + } + } +} diff --git a/Wino.Calendar/Styles/CalendarRenderStyles.xaml b/Wino.Calendar/Styles/CalendarRenderStyles.xaml new file mode 100644 index 00000000..000bb58c --- /dev/null +++ b/Wino.Calendar/Styles/CalendarRenderStyles.xaml @@ -0,0 +1,26 @@ + + + + + + + #D9D9D9 + #ffffff + #f9f9f9 + #ebebeb + Yellow + #dfe4ea + + + + #000000 + #262626 + #1a1a1a + #121212 + + #3d3d3d + #2f3542 + + + + diff --git a/Wino.Calendar/Styles/DayColumnControl.xaml b/Wino.Calendar/Styles/DayColumnControl.xaml new file mode 100644 index 00000000..a6651ad6 --- /dev/null +++ b/Wino.Calendar/Styles/DayColumnControl.xaml @@ -0,0 +1,93 @@ + + + + + + + + diff --git a/Wino.Calendar/Styles/DayHeaderControl.xaml b/Wino.Calendar/Styles/DayHeaderControl.xaml new file mode 100644 index 00000000..396a0cf0 --- /dev/null +++ b/Wino.Calendar/Styles/DayHeaderControl.xaml @@ -0,0 +1,23 @@ + + + + + + diff --git a/Wino.Calendar/Styles/WinoCalendarResources.xaml b/Wino.Calendar/Styles/WinoCalendarResources.xaml new file mode 100644 index 00000000..07c09302 --- /dev/null +++ b/Wino.Calendar/Styles/WinoCalendarResources.xaml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000 + 1000 + + diff --git a/Wino.Calendar/Styles/WinoCalendarResources.xaml.cs b/Wino.Calendar/Styles/WinoCalendarResources.xaml.cs new file mode 100644 index 00000000..7a24cde1 --- /dev/null +++ b/Wino.Calendar/Styles/WinoCalendarResources.xaml.cs @@ -0,0 +1,12 @@ +using Windows.UI.Xaml; + +namespace Wino.Calendar.Styles +{ + public sealed partial class WinoCalendarResources : ResourceDictionary + { + public WinoCalendarResources() + { + this.InitializeComponent(); + } + } +} diff --git a/Wino.Calendar/Styles/WinoCalendarTypeSelectorControl.xaml b/Wino.Calendar/Styles/WinoCalendarTypeSelectorControl.xaml new file mode 100644 index 00000000..bf2362e2 --- /dev/null +++ b/Wino.Calendar/Styles/WinoCalendarTypeSelectorControl.xaml @@ -0,0 +1,64 @@ + + + + + diff --git a/Wino.Calendar/Styles/WinoCalendarView.xaml b/Wino.Calendar/Styles/WinoCalendarView.xaml new file mode 100644 index 00000000..393ae107 --- /dev/null +++ b/Wino.Calendar/Styles/WinoCalendarView.xaml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + diff --git a/Wino.Calendar/Styles/WinoDayTimelineCanvas.xaml b/Wino.Calendar/Styles/WinoDayTimelineCanvas.xaml new file mode 100644 index 00000000..96257f2f --- /dev/null +++ b/Wino.Calendar/Styles/WinoDayTimelineCanvas.xaml @@ -0,0 +1,19 @@ + + + + + diff --git a/Wino.Calendar/Views/Abstract/AccountManagementPageAbstract.cs b/Wino.Calendar/Views/Abstract/AccountManagementPageAbstract.cs new file mode 100644 index 00000000..50509dd2 --- /dev/null +++ b/Wino.Calendar/Views/Abstract/AccountManagementPageAbstract.cs @@ -0,0 +1,7 @@ +using Wino.Calendar.ViewModels; +using Wino.Core.UWP; + +namespace Wino.Calendar.Views.Abstract +{ + public class AccountManagementPageAbstract : BasePage { } +} diff --git a/Wino.Calendar/Views/Abstract/AppShellAbstract.cs b/Wino.Calendar/Views/Abstract/AppShellAbstract.cs new file mode 100644 index 00000000..39eb8c5c --- /dev/null +++ b/Wino.Calendar/Views/Abstract/AppShellAbstract.cs @@ -0,0 +1,7 @@ +using Wino.Calendar.ViewModels; +using Wino.Core.UWP; + +namespace Wino.Calendar.Views.Abstract +{ + public abstract class AppShellAbstract : BasePage { } +} diff --git a/Wino.Calendar/Views/Abstract/CalendarPageAbstract.cs b/Wino.Calendar/Views/Abstract/CalendarPageAbstract.cs new file mode 100644 index 00000000..9c40d5d6 --- /dev/null +++ b/Wino.Calendar/Views/Abstract/CalendarPageAbstract.cs @@ -0,0 +1,7 @@ +using Wino.Calendar.ViewModels; +using Wino.Core.UWP; + +namespace Wino.Calendar.Views.Abstract +{ + public abstract class CalendarPageAbstract : BasePage { } +} diff --git a/Wino.Calendar/Views/Abstract/CalendarSettingsPageAbstract.cs b/Wino.Calendar/Views/Abstract/CalendarSettingsPageAbstract.cs new file mode 100644 index 00000000..00c511a6 --- /dev/null +++ b/Wino.Calendar/Views/Abstract/CalendarSettingsPageAbstract.cs @@ -0,0 +1,7 @@ +using Wino.Calendar.ViewModels; +using Wino.Core.UWP; + +namespace Wino.Calendar.Views.Abstract +{ + public abstract class CalendarSettingsPageAbstract : BasePage { } +} diff --git a/Wino.Calendar/Views/Account/AccountManagementPage.xaml b/Wino.Calendar/Views/Account/AccountManagementPage.xaml new file mode 100644 index 00000000..7748bf0a --- /dev/null +++ b/Wino.Calendar/Views/Account/AccountManagementPage.xaml @@ -0,0 +1,12 @@ + + + + diff --git a/Wino.Calendar/Views/Account/AccountManagementPage.xaml.cs b/Wino.Calendar/Views/Account/AccountManagementPage.xaml.cs new file mode 100644 index 00000000..813889b1 --- /dev/null +++ b/Wino.Calendar/Views/Account/AccountManagementPage.xaml.cs @@ -0,0 +1,12 @@ +using Wino.Calendar.Views.Abstract; + +namespace Wino.Calendar.Views.Account +{ + public sealed partial class AccountManagementPage : AccountManagementPageAbstract + { + public AccountManagementPage() + { + this.InitializeComponent(); + } + } +} diff --git a/Wino.Calendar/Views/AppShell.xaml b/Wino.Calendar/Views/AppShell.xaml new file mode 100644 index 00000000..3f1ec9c0 --- /dev/null +++ b/Wino.Calendar/Views/AppShell.xaml @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Calendar/Views/AppShell.xaml.cs b/Wino.Calendar/Views/AppShell.xaml.cs new file mode 100644 index 00000000..ecf59c9c --- /dev/null +++ b/Wino.Calendar/Views/AppShell.xaml.cs @@ -0,0 +1,57 @@ +using CommunityToolkit.Mvvm.Messaging; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Calendar.Views.Abstract; +using Wino.Messaging.Client.Calendar; + +namespace Wino.Calendar.Views +{ + public sealed partial class AppShell : AppShellAbstract, + IRecipient + { + private const string STATE_HorizontalCalendar = "HorizontalCalendar"; + private const string STATE_VerticalCalendar = "VerticalCalendar"; + + public Frame GetShellFrame() => ShellFrame; + public AppShell() + { + InitializeComponent(); + + Window.Current.SetTitleBar(DragArea); + + ViewModel.DisplayTypeChanged += CalendarDisplayTypeChanged; + } + + private void CalendarDisplayTypeChanged(object sender, Core.Domain.Enums.CalendarDisplayType e) + { + // Go to different states based on the display type. + if (ViewModel.IsVerticalCalendar) + { + VisualStateManager.GoToState(this, STATE_VerticalCalendar, false); + } + else + { + VisualStateManager.GoToState(this, STATE_HorizontalCalendar, false); + } + } + + private void ShellFrameContentNavigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) + { + + } + + private void BackButtonClicked(Core.UWP.Controls.WinoAppTitleBar sender, Windows.UI.Xaml.RoutedEventArgs args) + { + + } + + public void Receive(GoToCalendarDayMessage message) + { + CalendarView.GoToDay(message.DateTime); + } + + private void PreviousDateClicked(object sender, RoutedEventArgs e) => WeakReferenceMessenger.Default.Send(new GoPreviousDateRequestedMessage()); + + private void NextDateClicked(object sender, RoutedEventArgs e) => WeakReferenceMessenger.Default.Send(new GoNextDateRequestedMessage()); + } +} diff --git a/Wino.Calendar/Views/CalendarPage.xaml b/Wino.Calendar/Views/CalendarPage.xaml new file mode 100644 index 00000000..03a2b72d --- /dev/null +++ b/Wino.Calendar/Views/CalendarPage.xaml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs b/Wino.Core.UWP/Controls/WinoAppTitleBar.xaml.cs similarity index 84% rename from Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs rename to Wino.Core.UWP/Controls/WinoAppTitleBar.xaml.cs index 4ecbf99a..7514fdd8 100644 --- a/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml.cs +++ b/Wino.Core.UWP/Controls/WinoAppTitleBar.xaml.cs @@ -4,7 +4,7 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Wino.Core.Domain.Enums; -namespace Wino.Controls.Advanced +namespace Wino.Core.UWP.Controls { public sealed partial class WinoAppTitleBar : UserControl { @@ -22,6 +22,8 @@ namespace Wino.Controls.Advanced public static readonly DependencyProperty ReadingPaneLengthProperty = DependencyProperty.Register(nameof(ReadingPaneLength), typeof(double), typeof(WinoAppTitleBar), new PropertyMetadata(420d, OnDrawingPropertyChanged)); public static readonly DependencyProperty ConnectionStatusProperty = DependencyProperty.Register(nameof(ConnectionStatus), typeof(WinoServerConnectionStatus), typeof(WinoAppTitleBar), new PropertyMetadata(WinoServerConnectionStatus.None, new PropertyChangedCallback(OnConnectionStatusChanged))); public static readonly DependencyProperty ReconnectCommandProperty = DependencyProperty.Register(nameof(ReconnectCommand), typeof(ICommand), typeof(WinoAppTitleBar), new PropertyMetadata(null)); + public static readonly DependencyProperty ShrinkShellContentOnExpansionProperty = DependencyProperty.Register(nameof(ShrinkShellContentOnExpansion), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(true)); + public static readonly DependencyProperty IsDragAreaProperty = DependencyProperty.Register(nameof(IsDragArea), typeof(bool), typeof(WinoAppTitleBar), new PropertyMetadata(false, new PropertyChangedCallback(OnIsDragAreaChanged))); public ICommand ReconnectCommand { @@ -41,6 +43,18 @@ namespace Wino.Controls.Advanced set { SetValue(CoreWindowTextProperty, value); } } + + + public bool IsDragArea + { + get { return (bool)GetValue(IsDragAreaProperty); } + set { SetValue(IsDragAreaProperty, value); } + } + + + + + public double SystemReserved { get { return (double)GetValue(SystemReservedProperty); } @@ -59,6 +73,12 @@ namespace Wino.Controls.Advanced set { SetValue(NavigationViewDisplayModeProperty, value); } } + public bool ShrinkShellContentOnExpansion + { + get { return (bool)GetValue(ShrinkShellContentOnExpansionProperty); } + set { SetValue(ShrinkShellContentOnExpansionProperty, value); } + } + public bool IsNavigationPaneOpen { get { return (bool)GetValue(IsNavigationPaneOpenProperty); } @@ -122,6 +142,22 @@ namespace Wino.Controls.Advanced } } + private static void OnIsDragAreaChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) + { + if (obj is WinoAppTitleBar bar) + { + bar.SetDragArea(); + } + } + + private void SetDragArea() + { + if (IsDragArea) + { + Window.Current.SetTitleBar(this); + } + } + private void UpdateConnectionStatus() { @@ -147,7 +183,7 @@ namespace Wino.Controls.Advanced { // Icons are visible. - if (!IsReaderNarrowed) + if (!IsReaderNarrowed && ShrinkShellContentOnExpansion) { ShellContentContainer.HorizontalAlignment = HorizontalAlignment.Left; ShellContentContainer.Width = ReadingPaneLength; @@ -162,7 +198,7 @@ namespace Wino.Controls.Advanced // LMargin = OpenPaneLength - LeftMenuStackPanel ShellContentContainer.Margin = new Thickness(OpenPaneLength - LeftMenuStackPanel.ActualSize.X, 0, 0, 0); - if (!IsReaderNarrowed) + if (!IsReaderNarrowed && ShrinkShellContentOnExpansion) { ShellContentContainer.HorizontalAlignment = HorizontalAlignment.Left; ShellContentContainer.Width = ReadingPaneLength; @@ -170,16 +206,15 @@ namespace Wino.Controls.Advanced } else { - EmptySpaceWidth.Width = new GridLength(ReadingPaneLength, GridUnitType.Pixel); + // EmptySpaceWidth.Width = new GridLength(ReadingPaneLength, GridUnitType.Pixel); + EmptySpaceWidth.Width = new GridLength(ReadingPaneLength, GridUnitType.Star); } } } public WinoAppTitleBar() { - this.InitializeComponent(); - - Window.Current.SetTitleBar(dragbar); + InitializeComponent(); } private void BackClicked(object sender, RoutedEventArgs e) diff --git a/Wino.Mail/Controls/WinoFontIcon.cs b/Wino.Core.UWP/Controls/WinoFontIcon.cs similarity index 98% rename from Wino.Mail/Controls/WinoFontIcon.cs rename to Wino.Core.UWP/Controls/WinoFontIcon.cs index 91dd7736..12ce11b0 100644 --- a/Wino.Mail/Controls/WinoFontIcon.cs +++ b/Wino.Core.UWP/Controls/WinoFontIcon.cs @@ -1,7 +1,7 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; -namespace Wino.Controls +namespace Wino.Core.UWP.Controls { public enum WinoIconGlyph { diff --git a/Wino.Mail/Controls/WinoFontIconSource.cs b/Wino.Core.UWP/Controls/WinoFontIconSource.cs similarity index 97% rename from Wino.Mail/Controls/WinoFontIconSource.cs rename to Wino.Core.UWP/Controls/WinoFontIconSource.cs index 150bf2d8..e8bcaf7a 100644 --- a/Wino.Mail/Controls/WinoFontIconSource.cs +++ b/Wino.Core.UWP/Controls/WinoFontIconSource.cs @@ -1,4 +1,5 @@ using Windows.UI.Xaml; +using Wino.Core.UWP.Controls; namespace Wino.Controls { diff --git a/Wino.Mail/Controls/WinoInfoBar.cs b/Wino.Core.UWP/Controls/WinoInfoBar.cs similarity index 99% rename from Wino.Mail/Controls/WinoInfoBar.cs rename to Wino.Core.UWP/Controls/WinoInfoBar.cs index 6f2e288e..70f18869 100644 --- a/Wino.Mail/Controls/WinoInfoBar.cs +++ b/Wino.Core.UWP/Controls/WinoInfoBar.cs @@ -5,7 +5,7 @@ using Microsoft.UI.Xaml.Controls; using Windows.UI.Xaml; using Wino.Core.Domain.Enums; -namespace Wino.Controls +namespace Wino.Core.UWP.Controls { public class WinoInfoBar : InfoBar { diff --git a/Wino.Mail/Controls/WinoNavigationViewItem.cs b/Wino.Core.UWP/Controls/WinoNavigationViewItem.cs similarity index 95% rename from Wino.Mail/Controls/WinoNavigationViewItem.cs rename to Wino.Core.UWP/Controls/WinoNavigationViewItem.cs index e28070b8..b831567c 100644 --- a/Wino.Mail/Controls/WinoNavigationViewItem.cs +++ b/Wino.Core.UWP/Controls/WinoNavigationViewItem.cs @@ -3,7 +3,7 @@ using Microsoft.UI.Xaml.Controls; using Windows.UI.Xaml; using Windows.UI.Xaml.Hosting; -namespace Wino.Controls +namespace Wino.Core.UWP.Controls { public class WinoNavigationViewItem : NavigationViewItem { @@ -37,7 +37,7 @@ namespace Wino.Controls private void ScaleAnimation(Vector3 vector) { - if (this.Content is UIElement content) + if (Content is UIElement content) { var visual = ElementCompositionPreview.GetElementVisual(content); visual.Scale = vector; diff --git a/Wino.Mail/Converters/GridLengthConverter.cs b/Wino.Core.UWP/Converters/GridLengthConverter.cs similarity index 100% rename from Wino.Mail/Converters/GridLengthConverter.cs rename to Wino.Core.UWP/Converters/GridLengthConverter.cs diff --git a/Wino.Mail/Converters/ReverseBooleanConverter.cs b/Wino.Core.UWP/Converters/ReverseBooleanConverter.cs similarity index 100% rename from Wino.Mail/Converters/ReverseBooleanConverter.cs rename to Wino.Core.UWP/Converters/ReverseBooleanConverter.cs diff --git a/Wino.Mail/Converters/ReverseBooleanToVisibilityConverter.cs b/Wino.Core.UWP/Converters/ReverseBooleanToVisibilityConverter.cs similarity index 100% rename from Wino.Mail/Converters/ReverseBooleanToVisibilityConverter.cs rename to Wino.Core.UWP/Converters/ReverseBooleanToVisibilityConverter.cs diff --git a/Wino.Core.UWP/CoreGeneric.xaml b/Wino.Core.UWP/CoreGeneric.xaml new file mode 100644 index 00000000..167005ca --- /dev/null +++ b/Wino.Core.UWP/CoreGeneric.xaml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + 0 + + 19 + 19 + 24,24,24,24 + + + + + + + + + + + + + + + + + + + + diff --git a/Wino.Core.UWP/CoreGeneric.xaml.cs b/Wino.Core.UWP/CoreGeneric.xaml.cs new file mode 100644 index 00000000..116a0255 --- /dev/null +++ b/Wino.Core.UWP/CoreGeneric.xaml.cs @@ -0,0 +1,9 @@ +using Windows.UI.Xaml; + +namespace Wino.Core.UWP +{ + public partial class CoreGeneric : ResourceDictionary + { + public CoreGeneric() => InitializeComponent(); + } +} diff --git a/Wino.Core.UWP/CoreUWPContainerSetup.cs b/Wino.Core.UWP/CoreUWPContainerSetup.cs index dd825f77..ab2ef6fc 100644 --- a/Wino.Core.UWP/CoreUWPContainerSetup.cs +++ b/Wino.Core.UWP/CoreUWPContainerSetup.cs @@ -1,7 +1,9 @@ using Microsoft.Extensions.DependencyInjection; using Windows.ApplicationModel.AppService; +using Windows.UI.Xaml; using Wino.Core.Domain.Interfaces; using Wino.Core.UWP.Services; +using Wino.Core.ViewModels; using Wino.Services; namespace Wino.Core.UWP @@ -14,11 +16,15 @@ namespace Wino.Core.UWP services.AddSingleton(serverConnectionManager); services.AddSingleton>(serverConnectionManager); + services.AddSingleton, ApplicationResourceManager>(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); services.AddTransient(); @@ -29,6 +35,17 @@ namespace Wino.Core.UWP services.AddTransient(); services.AddTransient(); services.AddSingleton(); + + } + + public static void RegisterCoreViewModels(this IServiceCollection services) + { + services.AddTransient(typeof(SettingsDialogViewModel)); + services.AddTransient(typeof(PersonalizationPageViewModel)); + services.AddTransient(typeof(SettingOptionsPageViewModel)); + services.AddTransient(typeof(AboutPageViewModel)); + services.AddTransient(typeof(SettingsPageViewModel)); + services.AddTransient(typeof(NewAccountManagementPageViewModel)); } } } diff --git a/Wino.Mail/Dialogs/AccountCreationDialog.xaml b/Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml similarity index 100% rename from Wino.Mail/Dialogs/AccountCreationDialog.xaml rename to Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml diff --git a/Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs b/Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml.cs similarity index 91% rename from Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs rename to Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml.cs index 47bf6e51..f8847e9e 100644 --- a/Wino.Mail/Dialogs/AccountCreationDialog.xaml.cs +++ b/Wino.Core.UWP/Dialogs/AccountCreationDialog.xaml.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP; using Wino.Messaging.UI; namespace Wino.Dialogs @@ -35,7 +36,7 @@ namespace Wino.Dialogs { if (string.IsNullOrEmpty(copyClipboardURL)) return; - var clipboardService = App.Current.Services.GetService(); + var clipboardService = WinoApplication.Current.Services.GetService(); await clipboardService.CopyClipboardAsync(copyClipboardURL); } } diff --git a/Wino.Mail/Dialogs/AccountEditDialog.xaml b/Wino.Core.UWP/Dialogs/AccountEditDialog.xaml similarity index 78% rename from Wino.Mail/Dialogs/AccountEditDialog.xaml rename to Wino.Core.UWP/Dialogs/AccountEditDialog.xaml index 34cba8f8..08963c0f 100644 --- a/Wino.Mail/Dialogs/AccountEditDialog.xaml +++ b/Wino.Core.UWP/Dialogs/AccountEditDialog.xaml @@ -2,18 +2,18 @@ x:Class="Wino.Dialogs.AccountEditDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:domain="using:Wino.Core.Domain" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:domain="using:Wino.Core.Domain" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" Title="{x:Bind domain:Translator.AccountEditDialog_Title}" - Style="{StaticResource WinoDialogStyle}" DefaultButton="Primary" + PrimaryButtonClick="SaveClicked" PrimaryButtonText="{x:Bind domain:Translator.Buttons_Save}" SecondaryButtonText="{x:Bind domain:Translator.Buttons_Discard}" - PrimaryButtonClick="SaveClicked"> + Style="{StaticResource WinoDialogStyle}" + mc:Ignorable="d"> - + diff --git a/Wino.Mail/Dialogs/AccountEditDialog.xaml.cs b/Wino.Core.UWP/Dialogs/AccountEditDialog.xaml.cs similarity index 92% rename from Wino.Mail/Dialogs/AccountEditDialog.xaml.cs rename to Wino.Core.UWP/Dialogs/AccountEditDialog.xaml.cs index e158b8b3..dae0a599 100644 --- a/Wino.Mail/Dialogs/AccountEditDialog.xaml.cs +++ b/Wino.Core.UWP/Dialogs/AccountEditDialog.xaml.cs @@ -1,5 +1,5 @@ using Windows.UI.Xaml.Controls; -using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Entities.Shared; namespace Wino.Dialogs { diff --git a/Wino.Mail/Dialogs/AccountPickerDialog.xaml b/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml similarity index 88% rename from Wino.Mail/Dialogs/AccountPickerDialog.xaml rename to Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml index f06da6d2..e7bcd9ce 100644 --- a/Wino.Mail/Dialogs/AccountPickerDialog.xaml +++ b/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml @@ -3,17 +3,17 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" - Style="{StaticResource WinoDialogStyle}" - PrimaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" xmlns:domain="using:Wino.Core.Domain" - Title="{x:Bind domain:Translator.AccountPickerDialog_Title}"> + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + Title="{x:Bind domain:Translator.AccountPickerDialog_Title}" + PrimaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" + Style="{StaticResource WinoDialogStyle}" + mc:Ignorable="d"> + IsItemClickEnabled="True" + ItemClick="AccountClicked" + ItemsSource="{x:Bind AvailableAccounts}" + SelectionMode="None" /> diff --git a/Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs b/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml.cs similarity index 94% rename from Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs rename to Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml.cs index 9b4c46c4..a8d50246 100644 --- a/Wino.Mail/Dialogs/AccountPickerDialog.xaml.cs +++ b/Wino.Core.UWP/Dialogs/AccountPickerDialog.xaml.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using Windows.UI.Xaml.Controls; -using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Entities.Shared; namespace Wino.Dialogs { diff --git a/Wino.Mail/Dialogs/BaseAccountCreationDialog.cs b/Wino.Core.UWP/Dialogs/BaseAccountCreationDialog.cs similarity index 100% rename from Wino.Mail/Dialogs/BaseAccountCreationDialog.cs rename to Wino.Core.UWP/Dialogs/BaseAccountCreationDialog.cs diff --git a/Wino.Mail/Dialogs/CustomMessageDialogInformationContainer.cs b/Wino.Core.UWP/Dialogs/CustomMessageDialogInformationContainer.cs similarity index 100% rename from Wino.Mail/Dialogs/CustomMessageDialogInformationContainer.cs rename to Wino.Core.UWP/Dialogs/CustomMessageDialogInformationContainer.cs diff --git a/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml b/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml similarity index 94% rename from Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml rename to Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml index 89e46480..8010ea9c 100644 --- a/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml +++ b/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml @@ -2,21 +2,21 @@ x:Class="Wino.Dialogs.CustomThemeBuilderDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:Wino.Dialogs" - xmlns:muxc="using:Microsoft.UI.Xaml.Controls" - Style="{StaticResource WinoDialogStyle}" xmlns:controls="using:CommunityToolkit.WinUI.Controls" - FullSizeDesired="False" - xmlns:domain="using:Wino.Core.Domain" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:domain="using:Wino.Core.Domain" + xmlns:local="using:Wino.Dialogs" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:muxc="using:Microsoft.UI.Xaml.Controls" + Title="{x:Bind domain:Translator.CustomThemeBuilder_Title}" + DefaultButton="Primary" + FullSizeDesired="False" IsPrimaryButtonEnabled="False" - mc:Ignorable="d" + PrimaryButtonClick="ApplyClicked" PrimaryButtonText="{x:Bind domain:Translator.Buttons_ApplyTheme}" SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" - DefaultButton="Primary" - PrimaryButtonClick="ApplyClicked" - Title="{x:Bind domain:Translator.CustomThemeBuilder_Title}"> + Style="{StaticResource WinoDialogStyle}" + mc:Ignorable="d"> 600 @@ -28,7 +28,7 @@ - + @@ -38,18 +38,18 @@ + Description="{x:Bind domain:Translator.CustomThemeBuilder_WallpaperDescription}" + Header="{x:Bind domain:Translator.CustomThemeBuilder_WallpaperTitle}"> - diff --git a/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs b/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml.cs similarity index 89% rename from Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs rename to Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml.cs index 633fce37..a4154918 100644 --- a/Wino.Mail/Dialogs/CustomThemeBuilderDialog.xaml.cs +++ b/Wino.Core.UWP/Dialogs/CustomThemeBuilderDialog.xaml.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; using Wino.Core.Domain.Interfaces; -using Wino.Services; +using Wino.Core.UWP; namespace Wino.Dialogs { @@ -19,7 +19,7 @@ namespace Wino.Dialogs { InitializeComponent(); - _themeService = App.Current.Services.GetService(); + _themeService = WinoApplication.Current.Services.GetService(); } private async void ApplyClicked(ContentDialog sender, ContentDialogButtonClickEventArgs args) @@ -45,7 +45,7 @@ namespace Wino.Dialogs private async void BrowseWallpaperClicked(object sender, Windows.UI.Xaml.RoutedEventArgs e) { - var dialogService = App.Current.Services.GetService(); + var dialogService = WinoApplication.Current.Services.GetService(); var pickedFileData = await dialogService.PickWindowsFileContentAsync(".jpg", ".png"); diff --git a/Wino.Mail/Dialogs/TextInputDialog.xaml b/Wino.Core.UWP/Dialogs/TextInputDialog.xaml similarity index 100% rename from Wino.Mail/Dialogs/TextInputDialog.xaml rename to Wino.Core.UWP/Dialogs/TextInputDialog.xaml index 6ca651f1..89a7cd8b 100644 --- a/Wino.Mail/Dialogs/TextInputDialog.xaml +++ b/Wino.Core.UWP/Dialogs/TextInputDialog.xaml @@ -3,15 +3,15 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - Style="{StaticResource WinoDialogStyle}" - DefaultButton="Primary" - HorizontalContentAlignment="Stretch" xmlns:domain="using:Wino.Core.Domain" - PrimaryButtonClick="UpdateOrCreateClicked" - SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" - SecondaryButtonClick="CancelClicked" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" + DefaultButton="Primary" + PrimaryButtonClick="UpdateOrCreateClicked" + SecondaryButtonClick="CancelClicked" + SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" + Style="{StaticResource WinoDialogStyle}" mc:Ignorable="d"> diff --git a/Wino.Mail/Dialogs/TextInputDialog.xaml.cs b/Wino.Core.UWP/Dialogs/TextInputDialog.xaml.cs similarity index 100% rename from Wino.Mail/Dialogs/TextInputDialog.xaml.cs rename to Wino.Core.UWP/Dialogs/TextInputDialog.xaml.cs diff --git a/Wino.Mail/Extensions/AnimationExtensions.cs b/Wino.Core.UWP/Extensions/AnimationExtensions.cs similarity index 100% rename from Wino.Mail/Extensions/AnimationExtensions.cs rename to Wino.Core.UWP/Extensions/AnimationExtensions.cs diff --git a/Wino.Mail/Extensions/CompositionEnums.cs b/Wino.Core.UWP/Extensions/CompositionEnums.cs similarity index 100% rename from Wino.Mail/Extensions/CompositionEnums.cs rename to Wino.Core.UWP/Extensions/CompositionEnums.cs diff --git a/Wino.Mail/Extensions/CompositionExtensions.Implicit.cs b/Wino.Core.UWP/Extensions/CompositionExtensions.Implicit.cs similarity index 100% rename from Wino.Mail/Extensions/CompositionExtensions.Implicit.cs rename to Wino.Core.UWP/Extensions/CompositionExtensions.Implicit.cs diff --git a/Wino.Mail/Extensions/CompositionExtensions.Size.cs b/Wino.Core.UWP/Extensions/CompositionExtensions.Size.cs similarity index 100% rename from Wino.Mail/Extensions/CompositionExtensions.Size.cs rename to Wino.Core.UWP/Extensions/CompositionExtensions.Size.cs diff --git a/Wino.Mail/Extensions/UIExtensions.cs b/Wino.Core.UWP/Extensions/UIExtensions.cs similarity index 100% rename from Wino.Mail/Extensions/UIExtensions.cs rename to Wino.Core.UWP/Extensions/UIExtensions.cs diff --git a/Wino.Mail/Extensions/UtilExtensions.cs b/Wino.Core.UWP/Extensions/UtilExtensions.cs similarity index 97% rename from Wino.Mail/Extensions/UtilExtensions.cs rename to Wino.Core.UWP/Extensions/UtilExtensions.cs index 50367afc..6a1185c0 100644 --- a/Wino.Mail/Extensions/UtilExtensions.cs +++ b/Wino.Core.UWP/Extensions/UtilExtensions.cs @@ -83,7 +83,7 @@ namespace Wino.Extensions } public static void ScrollToElement(this ScrollViewer scrollViewer, FrameworkElement element, - bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null, bool bringToTopOrLeft = true) + bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null, bool bringToTopOrLeft = true, bool addMargin = true) { if (!bringToTopOrLeft && element.IsFullyVisibile(scrollViewer)) return; @@ -94,7 +94,7 @@ namespace Wino.Extensions if (isVerticalScrolling) { // Accomodate for additional header. - scrollViewer.ChangeView(null, Math.Max(0, position.Y - 48), zoomFactor, !smoothScrolling); + scrollViewer.ChangeView(null, Math.Max(0, position.Y - (addMargin ? 48 : 0)), zoomFactor, !smoothScrolling); } else { diff --git a/Wino.Mail/Helpers/WinoVisualTreeHelper.cs b/Wino.Core.UWP/Helpers/WinoVisualTreeHelper.cs similarity index 55% rename from Wino.Mail/Helpers/WinoVisualTreeHelper.cs rename to Wino.Core.UWP/Helpers/WinoVisualTreeHelper.cs index ded3482e..10c15bc7 100644 --- a/Wino.Mail/Helpers/WinoVisualTreeHelper.cs +++ b/Wino.Core.UWP/Helpers/WinoVisualTreeHelper.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; using Windows.UI.Xaml; using Windows.UI.Xaml.Media; @@ -34,5 +30,25 @@ namespace Wino.Helpers } return null; } + + public static IEnumerable FindDescendants(this DependencyObject depObj) where T : DependencyObject + { + if (depObj != null) + { + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) + { + var child = VisualTreeHelper.GetChild(depObj, i); + if (child != null && child is T) + { + yield return (T)child; + } + + foreach (T childOfChild in FindDescendants(child)) + { + yield return childOfChild; + } + } + } + } } } diff --git a/Wino.Mail/Helpers/XamlHelpers.cs b/Wino.Core.UWP/Helpers/XamlHelpers.cs similarity index 99% rename from Wino.Mail/Helpers/XamlHelpers.cs rename to Wino.Core.UWP/Helpers/XamlHelpers.cs index 9a2cb1ed..5b882f99 100644 --- a/Wino.Mail/Helpers/XamlHelpers.cs +++ b/Wino.Core.UWP/Helpers/XamlHelpers.cs @@ -8,10 +8,10 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Markup; using Windows.UI.Xaml.Media; -using Wino.Controls; using Wino.Core.Domain; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Models.MailItem; +using Wino.Core.UWP.Controls; namespace Wino.Helpers { diff --git a/Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs b/Wino.Core.UWP/Selectors/AppThemePreviewTemplateSelector.cs similarity index 95% rename from Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs rename to Wino.Core.UWP/Selectors/AppThemePreviewTemplateSelector.cs index f3afe31e..d1091e85 100644 --- a/Wino.Mail/Selectors/AppThemePreviewTemplateSelector.cs +++ b/Wino.Core.UWP/Selectors/AppThemePreviewTemplateSelector.cs @@ -2,7 +2,7 @@ using Windows.UI.Xaml.Controls; using Wino.Core.UWP.Models.Personalization; -namespace Wino.Selectors +namespace Wino.Core.UWP.Selectors { public class AppThemePreviewTemplateSelector : DataTemplateSelector { diff --git a/Wino.Mail/Selectors/CustomWinoMessageDialogIconSelector.cs b/Wino.Core.UWP/Selectors/CustomWinoMessageDialogIconSelector.cs similarity index 97% rename from Wino.Mail/Selectors/CustomWinoMessageDialogIconSelector.cs rename to Wino.Core.UWP/Selectors/CustomWinoMessageDialogIconSelector.cs index 2dad8413..6f339354 100644 --- a/Wino.Mail/Selectors/CustomWinoMessageDialogIconSelector.cs +++ b/Wino.Core.UWP/Selectors/CustomWinoMessageDialogIconSelector.cs @@ -3,7 +3,7 @@ using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Wino.Core.Domain.Enums; -namespace Wino.Selectors +namespace Wino.Core.UWP.Selectors { public class CustomWinoMessageDialogIconSelector : DataTemplateSelector { diff --git a/Wino.Mail/Selectors/FileAttachmentTypeSelector.cs b/Wino.Core.UWP/Selectors/FileAttachmentTypeSelector.cs similarity index 91% rename from Wino.Mail/Selectors/FileAttachmentTypeSelector.cs rename to Wino.Core.UWP/Selectors/FileAttachmentTypeSelector.cs index e117fcd2..e83507a5 100644 --- a/Wino.Mail/Selectors/FileAttachmentTypeSelector.cs +++ b/Wino.Core.UWP/Selectors/FileAttachmentTypeSelector.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Windows.UI.Xaml; +using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Wino.Core.Domain.Enums; -namespace Wino.Selectors +namespace Wino.Core.UWP.Selectors { public class FileAttachmentTypeSelector : DataTemplateSelector { diff --git a/Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs b/Wino.Core.UWP/Selectors/NavigationMenuTemplateSelector.cs similarity index 95% rename from Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs rename to Wino.Core.UWP/Selectors/NavigationMenuTemplateSelector.cs index ce929a30..13d2a7c8 100644 --- a/Wino.Mail/Selectors/NavigationMenuTemplateSelector.cs +++ b/Wino.Core.UWP/Selectors/NavigationMenuTemplateSelector.cs @@ -2,7 +2,7 @@ using Windows.UI.Xaml.Controls; using Wino.Core.MenuItems; -namespace Wino.Selectors +namespace Wino.Core.UWP.Selectors { public class NavigationMenuTemplateSelector : DataTemplateSelector { @@ -47,7 +47,7 @@ namespace Wino.Selectors else if (item is FolderMenuItem) return FolderMenuTemplate; else if (item is FixAccountIssuesMenuItem fixAccountIssuesMenuItem) - return fixAccountIssuesMenuItem.Account.AttentionReason == Core.Domain.Enums.AccountAttentionReason.MissingSystemFolderConfiguration + return fixAccountIssuesMenuItem.Account.AttentionReason == Domain.Enums.AccountAttentionReason.MissingSystemFolderConfiguration ? FixMissingFolderConfigTemplate : FixAuthenticationIssueTemplate; else { diff --git a/Wino.Core.UWP/Services/ApplicationResourceManager.cs b/Wino.Core.UWP/Services/ApplicationResourceManager.cs new file mode 100644 index 00000000..0e50dc1f --- /dev/null +++ b/Wino.Core.UWP/Services/ApplicationResourceManager.cs @@ -0,0 +1,27 @@ +using System.Linq; +using Windows.UI.Xaml; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP; + +namespace Wino.Services +{ + public class ApplicationResourceManager : IApplicationResourceManager + { + public void AddResource(ResourceDictionary resource) + => WinoApplication.Current.Resources.MergedDictionaries.Add(resource); + public void RemoveResource(ResourceDictionary resource) + => WinoApplication.Current.Resources.MergedDictionaries.Remove(resource); + + public bool ContainsResourceKey(string resourceKey) + => WinoApplication.Current.Resources.ContainsKey(resourceKey); + + public ResourceDictionary GetLastResource() + => WinoApplication.Current.Resources.MergedDictionaries.LastOrDefault(); + + public void ReplaceResource(string resourceKey, object resource) + => WinoApplication.Current.Resources[resourceKey] = resource; + + public TReturnType GetResource(string resourceKey) + => (TReturnType)WinoApplication.Current.Resources[resourceKey]; + } +} diff --git a/Wino.Core.UWP/Services/ConfigurationService.cs b/Wino.Core.UWP/Services/ConfigurationService.cs index 79455800..7c905742 100644 --- a/Wino.Core.UWP/Services/ConfigurationService.cs +++ b/Wino.Core.UWP/Services/ConfigurationService.cs @@ -34,6 +34,11 @@ namespace Wino.Core.UWP.Services return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(value); } + if (typeof(T) == typeof(TimeSpan)) + { + return (T)(object)TimeSpan.Parse(value); + } + return (T)Convert.ChangeType(value, typeof(T)); } diff --git a/Wino.Core.UWP/Services/DialogServiceBase.cs b/Wino.Core.UWP/Services/DialogServiceBase.cs new file mode 100644 index 00000000..13d8ab07 --- /dev/null +++ b/Wino.Core.UWP/Services/DialogServiceBase.cs @@ -0,0 +1,205 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using CommunityToolkit.Mvvm.Messaging; +using Microsoft.Toolkit.Uwp.Helpers; +using Serilog; +using Windows.Storage; +using Windows.Storage.Pickers; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Wino.Core.Domain; +using Wino.Core.Domain.Enums; +using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Extensions; +using Wino.Dialogs; +using Wino.Messaging.Client.Shell; + +namespace Wino.Core.UWP.Services +{ + public class DialogServiceBase : IDialogServiceBase + { + private SemaphoreSlim _presentationSemaphore = new SemaphoreSlim(1); + + protected IThemeService ThemeService { get; } + protected IConfigurationService ConfigurationService { get; } + + protected IApplicationResourceManager ApplicationResourceManager { get; } + + public DialogServiceBase(IThemeService themeService, IConfigurationService configurationService, IApplicationResourceManager applicationResourceManager) + { + ThemeService = themeService; + ConfigurationService = configurationService; + ApplicationResourceManager = applicationResourceManager; + } + + private async Task PickFileAsync(params object[] typeFilters) + { + var picker = new FileOpenPicker + { + ViewMode = PickerViewMode.Thumbnail + }; + + foreach (var filter in typeFilters) + { + picker.FileTypeFilter.Add(filter.ToString()); + } + + var file = await picker.PickSingleFileAsync(); + + if (file == null) return null; + + Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("FilePickerPath", file); + + return file; + } + + public async Task PickWindowsFileContentAsync(params object[] typeFilters) + { + var file = await PickFileAsync(typeFilters); + + if (file == null) return []; + + return await file.ReadBytesAsync(); + } + + public Task ShowMessageAsync(string message, string title, WinoCustomMessageDialogIcon icon = WinoCustomMessageDialogIcon.Information) + => ShowWinoCustomMessageDialogAsync(title, message, Translator.Buttons_Close, icon); + + public Task ShowConfirmationDialogAsync(string question, string title, string confirmationButtonTitle) + => ShowWinoCustomMessageDialogAsync(title, question, confirmationButtonTitle, WinoCustomMessageDialogIcon.Question, Translator.Buttons_Cancel, string.Empty); + + public async Task ShowWinoCustomMessageDialogAsync(string title, + string description, + string approveButtonText, + WinoCustomMessageDialogIcon? icon, + string cancelButtonText = "", + string dontAskAgainConfigurationKey = "") + + { + // This config key has been marked as don't ask again already. + // Return immidiate result without presenting the dialog. + + bool isDontAskEnabled = !string.IsNullOrEmpty(dontAskAgainConfigurationKey); + + if (isDontAskEnabled && ConfigurationService.Get(dontAskAgainConfigurationKey, false)) return false; + + var informationContainer = new CustomMessageDialogInformationContainer(title, description, icon.Value, isDontAskEnabled); + + var dialog = new ContentDialog + { + Style = ApplicationResourceManager.GetResource - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - + diff --git a/Wino.Mail/App.xaml.cs b/Wino.Mail/App.xaml.cs index e3cbbf7e..cd740c52 100644 --- a/Wino.Mail/App.xaml.cs +++ b/Wino.Mail/App.xaml.cs @@ -1,14 +1,8 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Text; -using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using CommunityToolkit.WinUI.Notifications; -using Microsoft.AppCenter; -using Microsoft.AppCenter.Analytics; -using Microsoft.AppCenter.Crashes; using Microsoft.Extensions.DependencyInjection; using Nito.AsyncEx; using Serilog; @@ -16,16 +10,8 @@ using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.AppService; using Windows.ApplicationModel.Background; -using Windows.ApplicationModel.Core; -using Windows.Foundation.Metadata; -using Windows.Storage; -using Windows.System.Profile; -using Windows.UI; using Windows.UI.Core.Preview; using Windows.UI.Notifications; -using Windows.UI.ViewManagement; -using Windows.UI.Xaml; -using Windows.UI.Xaml.Controls; using Wino.Activation; using Wino.Core; using Wino.Core.Domain; @@ -34,9 +20,7 @@ using Wino.Core.Domain.Exceptions; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.MailItem; using Wino.Core.Domain.Models.Synchronization; -using Wino.Core.Services; using Wino.Core.UWP; -using Wino.Core.UWP.Services; using Wino.Mail.ViewModels; using Wino.Messaging.Client.Connection; using Wino.Messaging.Client.Navigation; @@ -45,139 +29,23 @@ using Wino.Services; namespace Wino { - public sealed partial class App : Application, IRecipient + public sealed partial class App : WinoApplication, IRecipient { - private const string WinoLaunchLogPrefix = "[Wino Launch] "; - private const string AppCenterKey = "90deb1d0-a77f-47d0-8a6b-7eaf111c6b72"; - - public new static App Current => (App)Application.Current; - public IServiceProvider Services { get; } + public override string AppCenterKey { get; } = "90deb1d0-a77f-47d0-8a6b-7eaf111c6b72"; private BackgroundTaskDeferral connectionBackgroundTaskDeferral; private BackgroundTaskDeferral toastActionBackgroundTaskDeferral; - private readonly IWinoServerConnectionManager _appServiceConnectionManager; - private readonly ILogInitializer _logInitializer; - private readonly IThemeService _themeService; - private readonly IDatabaseService _databaseService; - private readonly IApplicationConfiguration _appInitializerService; - private readonly ITranslationService _translationService; - private readonly IApplicationConfiguration _applicationFolderConfiguration; - private readonly IDialogService _dialogService; - - // Order matters. - private List initializeServices => new List() - { - _databaseService, - _translationService, - _themeService, - }; - public App() { InitializeComponent(); - UnhandledException += OnAppUnhandledException; - - Resuming += OnResuming; - Suspending += OnSuspending; - - Services = ConfigureServices(); - - _logInitializer = Services.GetService(); - - ConfigureLogger(); - ConfigureAppCenter(); - ConfigurePrelaunch(); - ConfigureXbox(); - - _applicationFolderConfiguration = Services.GetService(); - - // Make sure the paths are setup on app start. - _applicationFolderConfiguration.ApplicationDataFolderPath = ApplicationData.Current.LocalFolder.Path; - _applicationFolderConfiguration.PublisherSharedFolderPath = ApplicationData.Current.GetPublisherCacheFolder(ApplicationConfiguration.SharedFolderName).Path; - _applicationFolderConfiguration.ApplicationTempFolderPath = ApplicationData.Current.TemporaryFolder.Path; - - _appServiceConnectionManager = Services.GetService>(); - _themeService = Services.GetService(); - _databaseService = Services.GetService(); - _appInitializerService = Services.GetService(); - _translationService = Services.GetService(); - _dialogService = Services.GetService(); - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); WeakReferenceMessenger.Default.Register(this); } - private async void ApplicationCloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) - { - var deferral = e.GetDeferral(); - - // Wino should notify user on app close if: - // 1. Startup behavior is not Enabled. - // 2. Server terminate behavior is set to Terminate. - - // User has some accounts. Check if Wino Server runs on system startup. - - var dialogService = Services.GetService(); - var startupBehaviorService = Services.GetService(); - var preferencesService = Services.GetService(); - - var currentStartupBehavior = await startupBehaviorService.GetCurrentStartupBehaviorAsync(); - - bool? isGoToAppPreferencesRequested = null; - - if (preferencesService.ServerTerminationBehavior == ServerBackgroundMode.Terminate) - { - // Starting the server is fine, but check if server termination behavior is set to terminate. - // This state will kill the server once the app is terminated. - - isGoToAppPreferencesRequested = await _dialogService.ShowWinoCustomMessageDialogAsync(Translator.AppCloseBackgroundSynchronizationWarningTitle, - $"{Translator.AppCloseTerminateBehaviorWarningMessageFirstLine}\n{Translator.AppCloseTerminateBehaviorWarningMessageSecondLine}\n\n{Translator.AppCloseTerminateBehaviorWarningMessageThirdLine}", - Translator.Buttons_Yes, - WinoCustomMessageDialogIcon.Warning, - Translator.Buttons_No, - "DontAskTerminateServerBehavior"); - } - - if (isGoToAppPreferencesRequested == null && currentStartupBehavior != StartupBehaviorResult.Enabled) - { - // Startup behavior is not enabled. - - isGoToAppPreferencesRequested = await dialogService.ShowWinoCustomMessageDialogAsync(Translator.AppCloseBackgroundSynchronizationWarningTitle, - $"{Translator.AppCloseStartupLaunchDisabledWarningMessageFirstLine}\n{Translator.AppCloseStartupLaunchDisabledWarningMessageSecondLine}\n\n{Translator.AppCloseStartupLaunchDisabledWarningMessageThirdLine}", - Translator.Buttons_Yes, - WinoCustomMessageDialogIcon.Warning, - Translator.Buttons_No, - "DontAskDisabledStartup"); - } - - if (isGoToAppPreferencesRequested == true) - { - WeakReferenceMessenger.Default.Send(new NavigateAppPreferencesRequested()); - e.Handled = true; - } - else if (preferencesService.ServerTerminationBehavior == ServerBackgroundMode.Terminate) - { - try - { - var isServerKilled = await _appServiceConnectionManager.GetResponseAsync(new TerminateServerRequested()); - - isServerKilled.ThrowIfFailed(); - - Log.Information("Server is killed."); - } - catch (Exception ex) - { - Log.Error(ex, "Failed to kill server."); - } - } - - deferral.Complete(); - } - - private async void OnResuming(object sender, object e) + public override async void OnResuming(object sender, object e) { // App Service connection was lost on suspension. // We must restore it. @@ -185,7 +53,7 @@ namespace Wino try { - await _appServiceConnectionManager.ConnectAsync(); + await AppServiceConnectionManager.ConnectAsync(); } catch (OperationCanceledException) { @@ -197,19 +65,13 @@ namespace Wino } } - private void OnSuspending(object sender, SuspendingEventArgs e) - { - var deferral = e.SuspendingOperation.GetDeferral(); - deferral.Complete(); - } - - private void LogActivation(string log) => Log.Information($"{WinoLaunchLogPrefix}{log}"); - private IServiceProvider ConfigureServices() + public override IServiceProvider ConfigureServices() { var services = new ServiceCollection(); services.RegisterCoreServices(); services.RegisterCoreUWPServices(); + services.RegisterCoreViewModels(); RegisterUWPServices(services); RegisterViewModels(services); @@ -229,30 +91,22 @@ namespace Wino private void RegisterUWPServices(IServiceCollection services) { - services.AddSingleton, ApplicationResourceManager>(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); } private void RegisterViewModels(IServiceCollection services) { services.AddSingleton(typeof(AppShellViewModel)); - services.AddTransient(typeof(SettingsDialogViewModel)); - services.AddTransient(typeof(PersonalizationPageViewModel)); - services.AddTransient(typeof(SettingOptionsPageViewModel)); + services.AddTransient(typeof(MailListPageViewModel)); services.AddTransient(typeof(MailRenderingPageViewModel)); services.AddTransient(typeof(AccountManagementViewModel)); services.AddTransient(typeof(WelcomePageViewModel)); - services.AddTransient(typeof(AboutPageViewModel)); + services.AddTransient(typeof(ComposePageViewModel)); services.AddTransient(typeof(IdlePageViewModel)); - services.AddTransient(typeof(SettingsPageViewModel)); - services.AddTransient(typeof(NewAccountManagementPageViewModel)); + services.AddTransient(typeof(AccountDetailsPageViewModel)); services.AddTransient(typeof(SignatureManagementPageViewModel)); services.AddTransient(typeof(MessageListPageViewModel)); @@ -265,98 +119,6 @@ namespace Wino #endregion - #region Misc Configuration - - private void ConfigureLogger() - { - string logFilePath = Path.Combine(ApplicationData.Current.LocalFolder.Path, Constants.ClientLogFile); - _logInitializer.SetupLogger(logFilePath); - } - - private void ConfigureAppCenter() => AppCenter.Start(AppCenterKey, typeof(Analytics), typeof(Crashes)); - - private void ConfigurePrelaunch() - { - if (ApiInformation.IsMethodPresent("Windows.ApplicationModel.Core.CoreApplication", "EnablePrelaunch")) - CoreApplication.EnablePrelaunch(true); - } - - private void ConfigureXbox() - { - // Xbox users should use Reveal focus. - if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 6)) - { - FocusVisualKind = AnalyticsInfo.VersionInfo.DeviceFamily == "Xbox" ? FocusVisualKind.Reveal : FocusVisualKind.HighVisibility; - } - } - - private void ConfigureTitleBar() - { - var coreTitleBar = CoreApplication.GetCurrentView().TitleBar; - var applicationViewTitleBar = ApplicationView.GetForCurrentView().TitleBar; - - // Extend shell content into core window to meet design requirements. - coreTitleBar.ExtendViewIntoTitleBar = true; - - // Change system buttons and background colors to meet design requirements. - applicationViewTitleBar.ButtonBackgroundColor = Colors.Transparent; - applicationViewTitleBar.BackgroundColor = Colors.Transparent; - applicationViewTitleBar.ButtonInactiveBackgroundColor = Colors.Transparent; - applicationViewTitleBar.ButtonForegroundColor = Colors.White; - } - - #endregion - - protected override void OnWindowCreated(WindowCreatedEventArgs args) - { - base.OnWindowCreated(args); - - LogActivation($"OnWindowCreated -> IsWindowNull: {args.Window == null}"); - - ConfigureTitleBar(); - TryRegisterAppCloseChange(); - } - - protected override async void OnLaunched(LaunchActivatedEventArgs args) - { - LogActivation($"OnLaunched -> {args.GetType().Name}, Kind -> {args.Kind}, PreviousExecutionState -> {args.PreviousExecutionState}, IsPrelaunch -> {args.PrelaunchActivated}"); - - if (!args.PrelaunchActivated) - { - await ActivateWinoAsync(args); - } - } - - private void TryRegisterAppCloseChange() - { - try - { - var systemNavigationManagerPreview = SystemNavigationManagerPreview.GetForCurrentView(); - - systemNavigationManagerPreview.CloseRequested -= ApplicationCloseRequested; - systemNavigationManagerPreview.CloseRequested += ApplicationCloseRequested; - } - catch { } - } - - protected override async void OnFileActivated(FileActivatedEventArgs args) - { - base.OnFileActivated(args); - - LogActivation($"OnFileActivated -> ItemCount: {args.Files.Count}, Kind: {args.Kind}, PreviousExecutionState: {args.PreviousExecutionState}"); - - await ActivateWinoAsync(args); - } - - protected override async void OnActivated(IActivatedEventArgs args) - { - base.OnActivated(args); - - Log.Information($"OnActivated -> {args.GetType().Name}, Kind -> {args.Kind}, Prev Execution State -> {args.PreviousExecutionState}"); - - await ActivateWinoAsync(args); - } - protected override async void OnBackgroundActivated(BackgroundActivatedEventArgs args) { base.OnBackgroundActivated(args); @@ -373,7 +135,7 @@ namespace Wino connectionBackgroundTaskDeferral = args.TaskInstance.GetDeferral(); args.TaskInstance.Canceled += OnConnectionBackgroundTaskCanceled; - _appServiceConnectionManager.Connection = appServiceTriggerDetails.AppServiceConnection; + AppServiceConnectionManager.Connection = appServiceTriggerDetails.AppServiceConnection; WeakReferenceMessenger.Default.Send(new WinoServerConnectionEstablished()); } @@ -404,9 +166,9 @@ namespace Wino // At this point server should've already been connected. - var processor = Services.GetService(); - var delegator = Services.GetService(); - var mailService = Services.GetService(); + var processor = base.Services.GetService(); + var delegator = base.Services.GetService(); + var mailService = base.Services.GetService(); var mailItem = await mailService.GetSingleMailItemAsync(mailUniqueId); @@ -439,72 +201,7 @@ namespace Wino toastActionBackgroundTaskDeferral = null; } - private void OnAppUnhandledException(object sender, Windows.UI.Xaml.UnhandledExceptionEventArgs e) - { - var parameters = new Dictionary() - { - { "BaseMessage", e.Exception.GetBaseException().Message }, - { "BaseStackTrace", e.Exception.GetBaseException().StackTrace }, - { "StackTrace", e.Exception.StackTrace }, - { "Message", e.Exception.Message }, - }; - - Log.Error(e.Exception, "[Wino Crash]"); - - Crashes.TrackError(e.Exception, parameters); - Analytics.TrackEvent("Wino Crashed", parameters); - } - - private bool IsInteractiveLaunchArgs(object args) => args is IActivatedEventArgs; - - private Task InitializeServicesAsync() => initializeServices.Select(a => a.InitializeAsync()).WhenAll(); - - private async Task ActivateWinoAsync(object args) - { - await InitializeServicesAsync(); - - if (IsInteractiveLaunchArgs(args)) - { - if (Window.Current.Content == null) - { - var mainFrame = new Frame(); - - Window.Current.Content = mainFrame; - - await _themeService.InitializeAsync(); - } - } - - await HandleActivationAsync(args); - - if (IsInteractiveLaunchArgs(args)) - { - Window.Current.Activate(); - - LogActivation("Window activated"); - } - } - - private async Task HandleActivationAsync(object activationArgs) - { - var activationHandler = GetActivationHandlers().FirstOrDefault(h => h.CanHandle(activationArgs)); - - if (activationHandler != null) - { - await activationHandler.HandleAsync(activationArgs); - } - - if (IsInteractiveLaunchArgs(activationArgs)) - { - var defaultHandler = new DefaultActivationHandler(); - if (defaultHandler.CanHandle(activationArgs)) - { - await defaultHandler.HandleAsync(activationArgs); - } - } - } - - private IEnumerable GetActivationHandlers() + protected override IEnumerable GetActivationHandlers() { yield return Services.GetService(); yield return Services.GetService(); @@ -520,20 +217,90 @@ namespace Wino connectionBackgroundTaskDeferral?.Complete(); connectionBackgroundTaskDeferral = null; - _appServiceConnectionManager.Connection = null; + AppServiceConnectionManager.Connection = null; } public async void Receive(NewSynchronizationRequested message) { try { - var synchronizationResultResponse = await _appServiceConnectionManager.GetResponseAsync(message); + var synchronizationResultResponse = await AppServiceConnectionManager.GetResponseAsync(message); synchronizationResultResponse.ThrowIfFailed(); } catch (WinoServerException serverException) { - _dialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error); + DialogService.InfoBarMessage(Translator.Info_SyncFailedTitle, serverException.Message, InfoBarMessageType.Error); } } + + protected override async void OnApplicationCloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) + { + var deferral = e.GetDeferral(); + + // Wino should notify user on app close if: + // 1. Startup behavior is not Enabled. + // 2. Server terminate behavior is set to Terminate. + + // User has some accounts. Check if Wino Server runs on system startup. + + var dialogService = base.Services.GetService(); + var startupBehaviorService = base.Services.GetService(); + var preferencesService = base.Services.GetService(); + + var currentStartupBehavior = await startupBehaviorService.GetCurrentStartupBehaviorAsync(); + + bool? isGoToAppPreferencesRequested = null; + + if (preferencesService.ServerTerminationBehavior == ServerBackgroundMode.Terminate) + { + // Starting the server is fine, but check if server termination behavior is set to terminate. + // This state will kill the server once the app is terminated. + + isGoToAppPreferencesRequested = await DialogService.ShowWinoCustomMessageDialogAsync(Translator.AppCloseBackgroundSynchronizationWarningTitle, + $"{Translator.AppCloseTerminateBehaviorWarningMessageFirstLine}\n{Translator.AppCloseTerminateBehaviorWarningMessageSecondLine}\n\n{Translator.AppCloseTerminateBehaviorWarningMessageThirdLine}", + Translator.Buttons_Yes, + WinoCustomMessageDialogIcon.Warning, + Translator.Buttons_No, + "DontAskTerminateServerBehavior"); + } + + if (isGoToAppPreferencesRequested == null && currentStartupBehavior != StartupBehaviorResult.Enabled) + { + // Startup behavior is not enabled. + + isGoToAppPreferencesRequested = await dialogService.ShowWinoCustomMessageDialogAsync(Translator.AppCloseBackgroundSynchronizationWarningTitle, + $"{Translator.AppCloseStartupLaunchDisabledWarningMessageFirstLine}\n{Translator.AppCloseStartupLaunchDisabledWarningMessageSecondLine}\n\n{Translator.AppCloseStartupLaunchDisabledWarningMessageThirdLine}", + Translator.Buttons_Yes, + WinoCustomMessageDialogIcon.Warning, + Translator.Buttons_No, + "DontAskDisabledStartup"); + } + + if (isGoToAppPreferencesRequested == true) + { + WeakReferenceMessenger.Default.Send(new NavigateAppPreferencesRequested()); + e.Handled = true; + } + else if (preferencesService.ServerTerminationBehavior == ServerBackgroundMode.Terminate) + { + try + { + var isServerKilled = await AppServiceConnectionManager.GetResponseAsync(new TerminateServerRequested()); + + isServerKilled.ThrowIfFailed(); + + Log.Information("Server is killed."); + } + catch (Exception ex) + { + Log.Error(ex, "Failed to kill server."); + } + } + + deferral.Complete(); + } + + protected override ActivationHandler GetDefaultActivationHandler() + => new DefaultActivationHandler(); } } diff --git a/Wino.Mail/AppShell.xaml b/Wino.Mail/AppShell.xaml index 5bf79342..8e3e7dee 100644 --- a/Wino.Mail/AppShell.xaml +++ b/Wino.Mail/AppShell.xaml @@ -8,6 +8,8 @@ xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:controls="using:Wino.Controls" xmlns:controls1="using:CommunityToolkit.WinUI.Controls" + xmlns:coreControls="using:Wino.Core.UWP.Controls" + xmlns:coreSelectors="using:Wino.Core.UWP.Selectors" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:domain="using:Wino.Core.Domain" xmlns:enums="using:Wino.Core.Domain.Enums" @@ -15,21 +17,12 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:menu="using:Wino.Core.MenuItems" xmlns:muxc="using:Microsoft.UI.Xaml.Controls" - xmlns:selectors="using:Wino.Selectors" x:Name="Root" muxc:BackdropMaterial.ApplyToRootOrPageBackground="{ThemeResource UseMica}" mc:Ignorable="d"> - - - - - - - - - + - + - + - - + + - - + + - - + + - - - - - - - - - - - + + - - + - + - - - - + + + - + @@ -261,14 +242,14 @@ Visibility="{x:Bind helpers:XamlHelpers.CountToVisibilityConverter(UnreadItemCount), Mode=OneWay}" Value="{x:Bind UnreadItemCount, Mode=OneWay}" /> - + - - + + - + @@ -294,7 +275,7 @@ - - - - + + + - + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -493,7 +433,7 @@ - - RealAppBar.ShellFrameContent = (e.Content as BasePage).ShellContent; - private void BackButtonClicked(Controls.Advanced.WinoAppTitleBar sender, RoutedEventArgs args) + private void BackButtonClicked(WinoAppTitleBar sender, RoutedEventArgs args) { WeakReferenceMessenger.Default.Send(new ClearMailSelectionsRequested()); WeakReferenceMessenger.Default.Send(new DisposeRenderingFrameRequested()); diff --git a/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs b/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs index 2cf6c8c1..09e86a7d 100644 --- a/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs +++ b/Wino.Mail/Behaviors/BindableCommandBarBehavior.cs @@ -7,6 +7,7 @@ using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Wino.Controls; using Wino.Core.Domain.Models.Menus; +using Wino.Core.UWP.Controls; using Wino.Helpers; namespace Wino.Behaviors diff --git a/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs b/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs index 6726a351..77d35081 100644 --- a/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs +++ b/Wino.Mail/Behaviors/CreateMailNavigationItemBehavior.cs @@ -1,8 +1,8 @@ using System.Collections.ObjectModel; using Microsoft.Xaml.Interactivity; using Windows.UI.Xaml; -using Wino.Controls; using Wino.Core.MenuItems; +using Wino.Core.UWP.Controls; namespace Wino.Behaviors { diff --git a/Wino.Mail/Controls/AccountNavigationItem.cs b/Wino.Mail/Controls/AccountNavigationItem.cs index d19e3f6f..7172d94b 100644 --- a/Wino.Mail/Controls/AccountNavigationItem.cs +++ b/Wino.Mail/Controls/AccountNavigationItem.cs @@ -2,6 +2,7 @@ using Microsoft.UI.Xaml.Controls; using Windows.UI.Xaml; using Wino.Core.Domain.Interfaces; +using Wino.Core.UWP.Controls; namespace Wino.Controls { diff --git a/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml b/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml deleted file mode 100644 index b862d210..00000000 --- a/Wino.Mail/Controls/Advanced/WinoAppTitleBar.xaml +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml index c5f01fd5..f989f972 100644 --- a/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml +++ b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml @@ -4,6 +4,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:animatedvisuals="using:Microsoft.UI.Xaml.Controls.AnimatedVisuals" xmlns:controls="using:Wino.Controls" + xmlns:coreControls="using:Wino.Core.UWP.Controls" xmlns:domain="using:Wino.Core.Domain" xmlns:enums="using:Wino.Core.Domain.Enums" xmlns:helpers="using:Wino.Helpers" @@ -139,19 +140,19 @@ diff --git a/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs index 5e104b0b..b37f2927 100644 --- a/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs +++ b/Wino.Mail/Controls/MailItemDisplayInformationControl.xaml.cs @@ -3,7 +3,7 @@ using System.Numerics; using System.Windows.Input; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; -using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Models.MailItem; using Wino.Extensions; diff --git a/Wino.Mail/Dialogs/AccountReorderDialog.xaml b/Wino.Mail/Dialogs/AccountReorderDialog.xaml index 4f733a3a..d37c129e 100644 --- a/Wino.Mail/Dialogs/AccountReorderDialog.xaml +++ b/Wino.Mail/Dialogs/AccountReorderDialog.xaml @@ -2,21 +2,22 @@ x:Class="Wino.Dialogs.AccountReorderDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:Wino.Dialogs" - xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:interfaces="using:Wino.Core.Domain.Interfaces" xmlns:controls="using:Wino.Controls" - xmlns:helpers="using:Wino.Helpers" + xmlns:coreControls="using:Wino.Core.UWP.Controls" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:domain="using:Wino.Core.Domain" + xmlns:helpers="using:Wino.Helpers" + xmlns:interfaces="using:Wino.Core.Domain.Interfaces" + xmlns:local="using:Wino.Dialogs" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:selectors="using:Wino.Selectors" - mc:Ignorable="d" Title="Reorder Accounnts" Closed="DialogClosed" - Opened="DialogOpened" DefaultButton="Secondary" + Opened="DialogOpened" + SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" Style="{StaticResource WinoDialogStyle}" - SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}"> + mc:Ignorable="d"> @@ -29,19 +30,19 @@ - + VerticalAlignment="Center" + FontSize="24" + Icon="{x:Bind helpers:XamlHelpers.GetProviderIcon(ProviderDetail.Type)}" /> + FontWeight="SemiBold" + Text="{x:Bind StartupEntityTitle}" /> + Text="{x:Bind StartupEntityAddresses}" /> @@ -59,13 +60,13 @@ VerticalAlignment="Center" Data="F1 M 8.613281 17.5 C 8.75 17.942709 8.945312 18.359375 9.199219 18.75 L 4.921875 18.75 C 4.433594 18.75 3.966471 18.650717 3.520508 18.452148 C 3.074544 18.25358 2.683919 17.986654 2.348633 17.651367 C 2.013346 17.31608 1.746419 16.925455 1.547852 16.479492 C 1.349284 16.033529 1.25 15.566406 1.25 15.078125 L 1.25 4.921875 C 1.25 4.433594 1.349284 3.966473 1.547852 3.520508 C 1.746419 3.074545 2.013346 2.68392 2.348633 2.348633 C 2.683919 2.013348 3.074544 1.74642 3.520508 1.547852 C 3.966471 1.349285 4.433594 1.25 4.921875 1.25 L 15.078125 1.25 C 15.566406 1.25 16.033527 1.349285 16.479492 1.547852 C 16.925455 1.74642 17.31608 2.013348 17.651367 2.348633 C 17.986652 2.68392 18.25358 3.074545 18.452148 3.520508 C 18.650715 3.966473 18.75 4.433594 18.75 4.921875 L 18.75 6.572266 C 18.580729 6.344402 18.390299 6.132813 18.178711 5.9375 C 17.967121 5.742188 17.740885 5.566407 17.5 5.410156 L 17.5 4.951172 C 17.5 4.625651 17.433268 4.314779 17.299805 4.018555 C 17.16634 3.722332 16.987305 3.461914 16.762695 3.237305 C 16.538086 3.012695 16.277668 2.83366 15.981445 2.700195 C 15.685221 2.566732 15.374349 2.5 15.048828 2.5 L 4.951172 2.5 C 4.619141 2.5 4.303385 2.568359 4.003906 2.705078 C 3.704427 2.841797 3.44401 3.02409 3.222656 3.251953 C 3.001302 3.479818 2.825521 3.745117 2.695312 4.047852 C 2.565104 4.350587 2.5 4.66797 2.5 5 L 13.310547 5 C 12.60091 5.266928 11.998697 5.683594 11.503906 6.25 L 2.5 6.25 L 2.5 15.048828 C 2.5 15.38737 2.568359 15.704753 2.705078 16.000977 C 2.841797 16.297201 3.024088 16.55599 3.251953 16.777344 C 3.479818 16.998697 3.745117 17.174479 4.047852 17.304688 C 4.350586 17.434896 4.667969 17.5 5 17.5 Z M 18.125 9.443359 C 18.125 9.866537 18.040363 10.263672 17.871094 10.634766 C 17.701822 11.005859 17.473957 11.329753 17.1875 11.606445 C 16.901041 11.883139 16.56901 12.101237 16.191406 12.260742 C 15.813802 12.420248 15.416666 12.5 15 12.5 C 14.563802 12.5 14.1569 12.41862 13.779297 12.255859 C 13.401691 12.0931 13.071288 11.870117 12.788086 11.586914 C 12.504882 11.303711 12.2819 10.973308 12.119141 10.595703 C 11.95638 10.2181 11.875 9.811198 11.875 9.375 C 11.875 8.938803 11.95638 8.531901 12.119141 8.154297 C 12.2819 7.776693 12.504882 7.446289 12.788086 7.163086 C 13.071288 6.879883 13.401691 6.656901 13.779297 6.494141 C 14.1569 6.331381 14.563802 6.25 15 6.25 C 15.449218 6.25 15.864257 6.333008 16.245117 6.499023 C 16.625977 6.665039 16.956379 6.892904 17.236328 7.182617 C 17.516275 7.472331 17.734375 7.810873 17.890625 8.198242 C 18.046875 8.585612 18.125 9.000651 18.125 9.443359 Z M 20 16.25 C 20 16.666666 19.926758 17.049154 19.780273 17.397461 C 19.633789 17.745768 19.435221 18.058268 19.18457 18.334961 C 18.933918 18.611654 18.642578 18.854166 18.310547 19.0625 C 17.978516 19.270834 17.626953 19.444986 17.255859 19.584961 C 16.884766 19.724936 16.505533 19.829102 16.118164 19.897461 C 15.730794 19.96582 15.358072 20 15 20 C 14.654947 20 14.291992 19.96582 13.911133 19.897461 C 13.530273 19.829102 13.154297 19.726562 12.783203 19.589844 C 12.412109 19.453125 12.058919 19.282227 11.723633 19.077148 C 11.388346 18.87207 11.092122 18.632812 10.834961 18.359375 C 10.577799 18.085938 10.374349 17.779947 10.224609 17.441406 C 10.074869 17.102865 10 16.731771 10 16.328125 L 10 15.78125 C 10 15.501303 10.052083 15.237631 10.15625 14.990234 C 10.260416 14.742839 10.405273 14.526367 10.59082 14.34082 C 10.776367 14.155273 10.991211 14.010417 11.235352 13.90625 C 11.479492 13.802084 11.744791 13.75 12.03125 13.75 L 17.96875 13.75 C 18.248697 13.75 18.512369 13.803711 18.759766 13.911133 C 19.00716 14.018555 19.222004 14.163412 19.404297 14.345703 C 19.586588 14.527995 19.731445 14.742839 19.838867 14.990234 C 19.946289 15.237631 20 15.501303 20 15.78125 Z " /> + FontWeight="SemiBold" + Text="{x:Bind StartupEntityTitle}" /> + Text="{x:Bind StartupEntityAddresses}" /> @@ -76,9 +77,9 @@ + SelectionMode="None" /> diff --git a/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml b/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml index ed0323e7..2e18c01b 100644 --- a/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml +++ b/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml @@ -2,24 +2,24 @@ x:Class="Wino.Dialogs.CreateAccountAliasDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:Wino.Dialogs" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - mc:Ignorable="d" xmlns:domain="using:Wino.Core.Domain" - PrimaryButtonText="{x:Bind domain:Translator.Buttons_Create}" - SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" + xmlns:local="using:Wino.Dialogs" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + Title="{x:Bind domain:Translator.CreateAccountAliasDialog_Title}" DefaultButton="Primary" PrimaryButtonClick="CreateClicked" - Title="{x:Bind domain:Translator.CreateAccountAliasDialog_Title}" - Style="{StaticResource WinoDialogStyle}"> + PrimaryButtonText="{x:Bind domain:Translator.Buttons_Create}" + SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" + Style="{StaticResource WinoDialogStyle}" + mc:Ignorable="d"> - + + Header="{x:Bind domain:Translator.CreateAccountAliasDialog_AliasAddress}" + PlaceholderText="{x:Bind domain:Translator.CreateAccountAliasDialog_AliasAddressPlaceholder}" /> + Header="{x:Bind domain:Translator.CreateAccountAliasDialog_ReplyToAddress}" + PlaceholderText="{x:Bind domain:Translator.CreateAccountAliasDialog_ReplyToAddressPlaceholder}" /> diff --git a/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml.cs b/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml.cs index a3dfc7f0..806f661f 100644 --- a/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml.cs +++ b/Wino.Mail/Dialogs/CreateAccountAliasDialog.xaml.cs @@ -1,6 +1,6 @@ using System; using Windows.UI.Xaml.Controls; -using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Interfaces; namespace Wino.Dialogs diff --git a/Wino.Mail/Dialogs/MoveMailDialog.xaml b/Wino.Mail/Dialogs/MoveMailDialog.xaml index dff1bd8c..570d7ff8 100644 --- a/Wino.Mail/Dialogs/MoveMailDialog.xaml +++ b/Wino.Mail/Dialogs/MoveMailDialog.xaml @@ -3,17 +3,18 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="using:Wino.Controls" - xmlns:helpers="using:Wino.Helpers" - xmlns:muxc="using:Microsoft.UI.Xaml.Controls" + xmlns:coreControls="using:Wino.Core.UWP.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:folders="using:Wino.Core.Domain.Models.Folders" - Title="{x:Bind domain:Translator.MoveMailDialog_Title}" - Style="{StaticResource WinoDialogStyle}" - PrimaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" xmlns:domain="using:Wino.Core.Domain" + xmlns:folders="using:Wino.Core.Domain.Models.Folders" + xmlns:helpers="using:Wino.Helpers" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:muxc="using:Microsoft.UI.Xaml.Controls" + Title="{x:Bind domain:Translator.MoveMailDialog_Title}" DefaultButton="Primary" PrimaryButtonClick="CancelClicked" + PrimaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" + Style="{StaticResource WinoDialogStyle}" mc:Ignorable="d"> @@ -23,12 +24,12 @@ 756 - + - + @@ -44,17 +45,17 @@ + Foreground="{ThemeResource InfoBarWarningSeverityIconBackground}" + Visibility="Collapsed" /> diff --git a/Wino.Mail/Dialogs/NewImapSetupDialog.xaml b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml index 09ffaba7..f161ddd3 100644 --- a/Wino.Mail/Dialogs/NewImapSetupDialog.xaml +++ b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml @@ -2,15 +2,15 @@ x:Class="Wino.Dialogs.NewImapSetupDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:Wino.Dialogs" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - Style="{StaticResource WinoDialogStyle}" - DefaultButton="Secondary" - Closing="OnDialogClosing" - Closed="ImapSetupDialogClosed" - Opened="ImapSetupDialogOpened" - FullSizeDesired="False" + xmlns:local="using:Wino.Dialogs" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + Closed="ImapSetupDialogClosed" + Closing="OnDialogClosing" + DefaultButton="Secondary" + FullSizeDesired="False" + Opened="ImapSetupDialogOpened" + Style="{StaticResource WinoDialogStyle}" mc:Ignorable="d"> diff --git a/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs index 1d01e32f..34453f7f 100644 --- a/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs +++ b/Wino.Mail/Dialogs/NewImapSetupDialog.xaml.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using CommunityToolkit.Mvvm.Messaging; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media.Animation; -using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Entities.Shared; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; using Wino.Messaging.Client.Mails; diff --git a/Wino.Mail/Dialogs/SignatureEditorDialog.xaml b/Wino.Mail/Dialogs/SignatureEditorDialog.xaml index 3326191c..a10a2149 100644 --- a/Wino.Mail/Dialogs/SignatureEditorDialog.xaml +++ b/Wino.Mail/Dialogs/SignatureEditorDialog.xaml @@ -5,6 +5,7 @@ xmlns:accounts="using:Wino.Core.Domain.Models.Accounts" xmlns:controls="using:Wino.Controls" xmlns:controls1="using:CommunityToolkit.WinUI.Controls" + xmlns:coreControls="using:Wino.Core.UWP.Controls" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:domain="using:Wino.Core.Domain" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" @@ -59,7 +60,7 @@ ToolTipService.ToolTip="Light Theme" Visibility="{x:Bind IsComposerDarkMode, Mode=OneWay}"> - + @@ -70,7 +71,7 @@ ToolTipService.ToolTip="Dark Theme" Visibility="{x:Bind IsComposerDarkMode, Mode=OneWay, Converter={StaticResource ReverseBooleanToVisibilityConverter}}"> - + diff --git a/Wino.Mail/Dialogs/SignatureEditorDialog.xaml.cs b/Wino.Mail/Dialogs/SignatureEditorDialog.xaml.cs index 821c7ec0..f8c0a316 100644 --- a/Wino.Mail/Dialogs/SignatureEditorDialog.xaml.cs +++ b/Wino.Mail/Dialogs/SignatureEditorDialog.xaml.cs @@ -8,7 +8,7 @@ using Windows.UI.ViewManagement.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Wino.Core.Domain; -using Wino.Core.Domain.Entities; +using Wino.Core.Domain.Entities.Mail; using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Models.Reader; using Wino.Views.Settings; diff --git a/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml b/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml index 44b98813..51f82af3 100644 --- a/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml +++ b/Wino.Mail/Dialogs/SystemFolderConfigurationDialog.xaml @@ -2,21 +2,22 @@ x:Class="Wino.Dialogs.SystemFolderConfigurationDialog" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:controls="using:Wino.Controls" xmlns:controls1="using:CommunityToolkit.WinUI.Controls" - mc:Ignorable="d" - Style="{StaticResource WinoDialogStyle}" + xmlns:coreControls="using:Wino.Core.UWP.Controls" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:domain="using:Wino.Core.Domain" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + Title="{x:Bind domain:Translator.SettingsConfigureSpecialFolders_Title}" + Closing="DialogClosing" DefaultButton="Primary" IsPrimaryButtonEnabled="True" - SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" - xmlns:domain="using:Wino.Core.Domain" - PrimaryButtonText="{x:Bind domain:Translator.Buttons_SaveConfiguration}" PrimaryButtonClick="SaveClicked" - Closing="DialogClosing" + PrimaryButtonText="{x:Bind domain:Translator.Buttons_SaveConfiguration}" SecondaryButtonClick="CancelClicked" - Title="{x:Bind domain:Translator.SettingsConfigureSpecialFolders_Title}"> + SecondaryButtonText="{x:Bind domain:Translator.Buttons_Cancel}" + Style="{StaticResource WinoDialogStyle}" + mc:Ignorable="d">