├── _config.yml ├── Scanner ├── Assets │ ├── Simon.jpg │ ├── ClipShelf │ │ └── Hero Image Alt Close-Up.jpg │ ├── contrast-black │ │ ├── SplashScreen.scale-100.png │ │ ├── SplashScreen.scale-125.png │ │ ├── SplashScreen.scale-150.png │ │ ├── SplashScreen.scale-200.png │ │ └── SplashScreen.scale-400.png │ ├── contrast-high │ │ ├── SplashScreen.scale-100.png │ │ ├── SplashScreen.scale-125.png │ │ ├── SplashScreen.scale-150.png │ │ ├── SplashScreen.scale-200.png │ │ └── SplashScreen.scale-400.png │ ├── contrast-white │ │ ├── SplashScreen.scale-100.png │ │ ├── SplashScreen.scale-125.png │ │ ├── SplashScreen.scale-150.png │ │ ├── SplashScreen.scale-200.png │ │ └── SplashScreen.scale-400.png │ └── contrast-standard │ │ ├── SplashScreen.scale-100.png │ │ ├── SplashScreen.scale-125.png │ │ ├── SplashScreen.scale-150.png │ │ ├── SplashScreen.scale-200.png │ │ └── SplashScreen.scale-400.png ├── priconfig.packaging.xml ├── priconfig.default.xml ├── Views │ ├── EmptyView.xaml.cs │ ├── Enums │ │ └── HelpViewEnums.cs │ ├── Dialogs │ │ ├── LogExportDialogView.xaml.cs │ │ ├── ChangelogDialogView.xaml.cs │ │ ├── DonateDialogView.xaml.cs │ │ ├── OtherAppsDialogView.xaml.cs │ │ ├── LicenseDetailView.xaml │ │ └── SetupDialogView.xaml.cs │ ├── Converters │ │ ├── NotNullBoolConverter.cs │ │ ├── BoolVisibilityConverter.cs │ │ ├── VisibilityOpacityConverter.cs │ │ ├── StringWhitespaceVisualizationConverter.cs │ │ ├── NullVisibilityConverter.cs │ │ ├── NotNullVisibilityConverter.cs │ │ ├── NotZeroVisibilityConverter.cs │ │ ├── ToolTipConverter.cs │ │ ├── NegativeBoolConverter.cs │ │ ├── StringNotEmptyVisibilityConverter.cs │ │ ├── FilePathFolderConverter.cs │ │ ├── AppWideMessageSeverityInfoBarConverter.cs │ │ ├── ScanMergeElementTooltipConverter.cs │ │ ├── AspectRatioOptionIntConverter.cs │ │ ├── FilePathFolderPathConverter.cs │ │ ├── ListNotNullOrEmptyConverter.cs │ │ ├── SignedIntConverter.cs │ │ ├── ScanSaveLocationGlyphConverter.cs │ │ ├── AppLanguageSettingConverter.cs │ │ ├── ScanActionVisibilityConverter.cs │ │ ├── DoubleStringConverter.cs │ │ ├── NegativeBoolVisibilityConverter.cs │ │ ├── PreviewToolTipConverter.cs │ │ ├── EditorModeIntConverter.cs │ │ ├── AspectRatioOptionBoolConverter.cs │ │ ├── RadioButtonsDayTypeConverter.cs │ │ ├── RadioButtonsMonthTypeConverter.cs │ │ ├── ScannerSourceIntConverter.cs │ │ ├── RadioButtonsScannerSourceConverter.cs │ │ ├── ScanMergeElementGlyphConverter.cs │ │ ├── RadioButtonsScannerAutoCropModeConverter.cs │ │ ├── RadioButtonsScannerColorModeConverter.cs │ │ ├── ScannerFileFormatGlyphConverter.cs │ │ └── WindowStateOpacityConverter.cs │ └── EmptyView.xaml ├── App.xaml ├── Services │ ├── Interfaces │ │ ├── IAccessibilityService.cs │ │ ├── ILogService.cs │ │ ├── IPdfService.cs │ │ ├── IScannerDiscoveryService.cs │ │ ├── IAutoRotatorService.cs │ │ ├── IAppDataService.cs │ │ ├── IScanOptionsDatabaseService.cs │ │ ├── IPersistentScanOptionsDatabaseService.cs │ │ ├── IScanService.cs │ │ ├── IAppCenterService.cs │ │ └── IHelperService.cs │ ├── Messenger │ │ └── Messages │ │ │ ├── SetupCompletedMessage.cs │ │ │ ├── DonateDialogRequestMessage.cs │ │ │ ├── PreviewDialogRequestMessage.cs │ │ │ ├── ScanMergeDialogRequestMessage.cs │ │ │ ├── NarratorAnnouncementMessage.cs │ │ │ ├── EditorSelectionTitleChangedMessage.cs │ │ │ ├── EditorIsEditingRequestMessage.cs │ │ │ ├── EditorCurrentIndexRequestMessage.cs │ │ │ ├── HelpRequestMessage.cs │ │ │ ├── HelpRequestShellMessage.cs │ │ │ ├── SetShareFilesMessage.cs │ │ │ ├── SelectedScannerRequestMessage.cs │ │ │ ├── SettingsRequestMessage.cs │ │ │ ├── ScanMergeRequestMessage.cs │ │ │ ├── SettingsRequestShellMessage.cs │ │ │ ├── EditorCurrentIndexChangedMessage.cs │ │ │ ├── PageListCurrentIndexChangedMessage.cs │ │ │ ├── PreviewParametersRequestMessage.cs │ │ │ ├── EditorIsEditingChangedMessage.cs │ │ │ ├── SelectedScannerChangedMessage.cs │ │ │ ├── PreviewSelectedRegionChangedMessage.cs │ │ │ └── AppWideStatusMessage.cs │ └── AccessibilityService.cs ├── Globals.cs ├── Models │ ├── FileNaming │ │ ├── IFileNamingBlock.cs │ │ ├── ResolutionFileNamingBlock.cs │ │ ├── YearFileNamingBlock.cs │ │ └── ScannerNameFileNamingBlock.cs │ ├── ScanMergeConfig.cs │ ├── PersistentScanOptions.cs │ └── PersistentScanOptions.cs~merged ├── Helpers │ ├── AppConstants.cs │ └── ScanAndEditingProgress.cs ├── License Texts │ ├── LicenseMicrosoftAppCenterAnalytics.txt │ ├── LicenseMicrosoftAppCenterCrashes.txt │ ├── LicensePDFsharp.txt │ ├── LicenseQueryStringNET.txt │ ├── LicenseSerilogExceptions.txt │ ├── LicenseMicrosoftXamlBehaviorsUwpManaged.txt │ ├── LicenseMicrosoftToolkitMvvm.txt │ ├── LicenseMicrosoftToolkitUwpUILottie.txt │ ├── LicenseMicrosoftToolkitUwpUIAnimations.txt │ ├── LicenseMicrosoftToolkitUwpUIControls.txt │ └── LicenseMicrosoftExtensionsDependencyInjection.txt ├── Properties │ ├── AssemblyInfo.cs │ └── Default.rd.xml ├── ViewModels │ ├── ChangelogDialogViewModel.cs │ ├── OtherAppsDialogViewModel.cs │ ├── LicensesDialogViewModel.cs │ └── DonateDialogViewModel.cs ├── Enums.cs └── Package.appxmanifest ├── UnitTests ├── Assets │ ├── StoreLogo.png │ ├── SplashScreen.scale-200.png │ ├── LockScreenLogo.scale-200.png │ ├── Square44x44Logo.scale-200.png │ ├── Wide310x150Logo.scale-200.png │ ├── Square150x150Logo.scale-200.png │ └── Square44x44Logo.targetsize-24_altform-unplated.png ├── UnitTestApp.xaml ├── Properties │ └── AssemblyInfo.cs └── Package.appxmanifest ├── Scanner.Package └── Assets │ ├── contrast-black │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ └── Square44x44Logo.altform-lightunplated_targetsize-48.png │ ├── contrast-high │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ └── Square44x44Logo.altform-lightunplated_targetsize-48.png │ ├── contrast-white │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ └── Square44x44Logo.altform-lightunplated_targetsize-48.png │ └── contrast-standard │ ├── LargeTile.scale-100.png │ ├── LargeTile.scale-125.png │ ├── LargeTile.scale-150.png │ ├── LargeTile.scale-200.png │ ├── LargeTile.scale-400.png │ ├── SmallTile.scale-100.png │ ├── SmallTile.scale-125.png │ ├── SmallTile.scale-150.png │ ├── SmallTile.scale-200.png │ ├── SmallTile.scale-400.png │ ├── StoreLogo.scale-100.png │ ├── StoreLogo.scale-125.png │ ├── StoreLogo.scale-150.png │ ├── StoreLogo.scale-200.png │ ├── StoreLogo.scale-400.png │ ├── Square44x44Logo.scale-100.png │ ├── Square44x44Logo.scale-125.png │ ├── Square44x44Logo.scale-150.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.scale-400.png │ ├── Wide310x150Logo.scale-100.png │ ├── Wide310x150Logo.scale-125.png │ ├── Wide310x150Logo.scale-150.png │ ├── Wide310x150Logo.scale-200.png │ ├── Wide310x150Logo.scale-400.png │ ├── Square150x150Logo.scale-100.png │ ├── Square150x150Logo.scale-125.png │ ├── Square150x150Logo.scale-150.png │ ├── Square150x150Logo.scale-200.png │ ├── Square150x150Logo.scale-400.png │ ├── Square44x44Logo.targetsize-16.png │ ├── Square44x44Logo.targetsize-24.png │ ├── Square44x44Logo.targetsize-32.png │ ├── Square44x44Logo.targetsize-48.png │ ├── Square44x44Logo.targetsize-256.png │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png │ └── Square44x44Logo.altform-lightunplated_targetsize-256.png ├── ImageToPDF ├── App.config ├── app.manifest └── Properties │ └── AssemblyInfo.cs └── .github └── ISSUE_TEMPLATE ├── feature_request.md └── bug_report.md /_config.yml: -------------------------------------------------------------------------------- 1 | remote_theme: mmistakes/jekyll-theme-basically-basic 2 | -------------------------------------------------------------------------------- /Scanner/Assets/Simon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/Simon.jpg -------------------------------------------------------------------------------- /UnitTests/Assets/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/StoreLogo.png -------------------------------------------------------------------------------- /UnitTests/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /UnitTests/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /UnitTests/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /UnitTests/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /UnitTests/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner/Assets/ClipShelf/Hero Image Alt Close-Up.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/ClipShelf/Hero Image Alt Close-Up.jpg -------------------------------------------------------------------------------- /Scanner/priconfig.packaging.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Scanner/Assets/contrast-black/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-black/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-black/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-black/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-black/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-black/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-black/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-black/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-black/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-black/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-high/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-high/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-high/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-high/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-high/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-high/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-high/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-high/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-high/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-high/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-white/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-white/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-white/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-white/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-white/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-white/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-white/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-white/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-white/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-white/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-standard/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-standard/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-standard/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-standard/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-standard/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-standard/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-standard/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-standard/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /Scanner/Assets/contrast-standard/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner/Assets/contrast-standard/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/LargeTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/LargeTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/LargeTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/LargeTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/LargeTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/SmallTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/SmallTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/SmallTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/SmallTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/SmallTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/LargeTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/LargeTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/LargeTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/LargeTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/LargeTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/SmallTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/SmallTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/SmallTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/SmallTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/SmallTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/LargeTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/LargeTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/LargeTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/LargeTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/LargeTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/SmallTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/SmallTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/SmallTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/SmallTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/SmallTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/LargeTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/LargeTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/LargeTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/LargeTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/LargeTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/SmallTile.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/SmallTile.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/SmallTile.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/SmallTile.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/SmallTile.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /UnitTests/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/UnitTests/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /ImageToPDF/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-black/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-high/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-white/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/simon-knuth/scanner/HEAD/Scanner.Package/Assets/contrast-standard/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /UnitTests/UnitTestApp.xaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Scanner/priconfig.default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Scanner/Views/EmptyView.xaml.cs: -------------------------------------------------------------------------------- 1 | using Windows.UI.Xaml.Controls; 2 | 3 | namespace Scanner.Views 4 | { 5 | public sealed partial class EmptyView : Page 6 | { 7 | public EmptyView() 8 | { 9 | this.InitializeComponent(); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Scanner/App.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Scanner/Views/Enums/HelpViewEnums.cs: -------------------------------------------------------------------------------- 1 | public static class HelpViewEnums 2 | { 3 | public enum HelpTopic 4 | { 5 | ScannerDiscovery, 6 | ScannerNotWorking, 7 | ChooseResolution, 8 | BrightnessContrast, 9 | AutoCrop, 10 | SaveChanges, 11 | ChangeScanFolder, 12 | ChooseFileFormat, 13 | StartNewPdf, 14 | ReorderPdfPages 15 | } 16 | } -------------------------------------------------------------------------------- /ImageToPDF/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | true 6 | 7 | 8 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IAccessibilityService.cs: -------------------------------------------------------------------------------- 1 | using Windows.UI.Xaml; 2 | 3 | namespace Scanner.Services 4 | { 5 | /// 6 | /// Simplifies meeting accessibility requirements. 7 | /// 8 | public interface IAccessibilityService 9 | { 10 | FlowDirection DefaultFlowDirection 11 | { 12 | get; 13 | } 14 | 15 | FlowDirection InvertedFlowDirection 16 | { 17 | get; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Scanner/Views/Dialogs/LogExportDialogView.xaml.cs: -------------------------------------------------------------------------------- 1 | using Windows.UI.Xaml.Controls; 2 | 3 | namespace Scanner.Views.Dialogs 4 | { 5 | public sealed partial class LogExportDialogView : ContentDialog 6 | { 7 | public LogExportDialogView() 8 | { 9 | this.InitializeComponent(); 10 | } 11 | 12 | private void Button_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 13 | { 14 | ((Button)sender).Command = ViewModel.LogExportCommand; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Scanner/Views/Dialogs/ChangelogDialogView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.System; 3 | using Windows.UI.Xaml.Controls; 4 | 5 | namespace Scanner.Views.Dialogs 6 | { 7 | public sealed partial class ChangelogDialogView : ContentDialog 8 | { 9 | public ChangelogDialogView() 10 | { 11 | this.InitializeComponent(); 12 | } 13 | 14 | private void ContentDialog_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 15 | { 16 | // load actual content later to fix transitions 17 | FindName("GridContent"); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Scanner/Views/Dialogs/DonateDialogView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.System; 3 | using Windows.UI.Xaml.Controls; 4 | 5 | 6 | namespace Scanner.Views.Dialogs 7 | { 8 | public sealed partial class DonateDialogView : ContentDialog 9 | { 10 | public DonateDialogView() 11 | { 12 | this.InitializeComponent(); 13 | } 14 | 15 | private void ContentDialog_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 16 | { 17 | // load actual content later to fix transitions 18 | FindName("GridContent"); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/ILogService.cs: -------------------------------------------------------------------------------- 1 | using Serilog; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | 5 | namespace Scanner.Services 6 | { 7 | /// 8 | /// Manages and exposes the application event log. 9 | /// 10 | public interface ILogService 11 | { 12 | ILogger Log 13 | { 14 | get; 15 | } 16 | 17 | string LogFolder 18 | { 19 | get; 20 | } 21 | 22 | Task InitializeAsync(); 23 | Task> GetLogFiles(); 24 | void CloseAndFlush(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Scanner/Globals.cs: -------------------------------------------------------------------------------- 1 | using Serilog; 2 | using System.Threading.Tasks; 3 | using Windows.ApplicationModel.AppService; 4 | using Windows.ApplicationModel.Background; 5 | using Windows.Media.SpeechSynthesis; 6 | using Windows.Storage; 7 | using Windows.UI.ViewManagement; 8 | using Windows.UI.Xaml.Controls; 9 | 10 | public static class Globals 11 | { 12 | public static ApplicationViewTitleBar applicationViewTitlebar; 13 | 14 | public static AppServiceConnection appServiceConnection; 15 | public static BackgroundTaskDeferral appServiceDeferral; 16 | public static TaskCompletionSource taskCompletionSource = null; 17 | } -------------------------------------------------------------------------------- /Scanner/Models/FileNaming/IFileNamingBlock.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | 3 | namespace Scanner.Models.FileNaming 4 | { 5 | public interface IFileNamingBlock : INotifyPropertyChanged 6 | { 7 | string Glyph 8 | { 9 | get; 10 | } 11 | 12 | string Name 13 | { 14 | get; 15 | } 16 | 17 | string DisplayName 18 | { 19 | get; 20 | } 21 | 22 | bool IsValid 23 | { 24 | get; 25 | } 26 | 27 | 28 | string ToString(ScanOptions scanOptions, DiscoveredScanner scanner); 29 | string GetSerialized(bool obfuscated); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /UnitTests/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | [assembly: AssemblyTitle("UnitTests")] 6 | [assembly: AssemblyDescription("")] 7 | [assembly: AssemblyConfiguration("")] 8 | [assembly: AssemblyCompany("")] 9 | [assembly: AssemblyProduct("UnitTests")] 10 | [assembly: AssemblyCopyright("Copyright © 2022")] 11 | [assembly: AssemblyTrademark("")] 12 | [assembly: AssemblyCulture("")] 13 | [assembly: AssemblyMetadata("TargetPlatform","UAP")] 14 | 15 | // [assembly: AssemblyVersion("1.0.*")] 16 | [assembly: AssemblyVersion("1.0.0.0")] 17 | [assembly: AssemblyFileVersion("1.0.0.0")] 18 | [assembly: ComVisible(false)] -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IPdfService.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Models; 2 | using System; 3 | using System.Threading.Tasks; 4 | using Windows.ApplicationModel.AppService; 5 | using Windows.ApplicationModel.Background; 6 | using Windows.Devices.Scanners; 7 | using Windows.Storage; 8 | using Windows.UI.Xaml.Media.Imaging; 9 | 10 | namespace Scanner.Services 11 | { 12 | /// 13 | /// Manages the PDF conversion (kicks it off and processes the result). 14 | /// 15 | public interface IPdfService 16 | { 17 | event EventHandler GenerationEnded; 18 | 19 | Task GeneratePdfAsync(string name, StorageFolder targetFolder, bool replaceExisting); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/NotNullBoolConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | namespace Scanner.Views.Converters 5 | { 6 | public class NotNullBoolConverter : IValueConverter 7 | { 8 | /// 9 | /// Converts the given object into a bool based on it not equaling null. 10 | /// 11 | public object Convert(object value, Type targetType, object parameter, string language) 12 | { 13 | return value != null; 14 | } 15 | 16 | public object ConvertBack(object value, Type targetType, object parameter, string language) 17 | { 18 | throw new NotImplementedException(); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Scanner/Views/Dialogs/OtherAppsDialogView.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 2 | using Scanner.Services; 3 | using System; 4 | using Windows.System; 5 | using Windows.UI.Xaml.Controls; 6 | 7 | 8 | namespace Scanner.Views.Dialogs 9 | { 10 | public sealed partial class OtherAppsDialogView : ContentDialog 11 | { 12 | public OtherAppsDialogView() 13 | { 14 | this.InitializeComponent(); 15 | } 16 | 17 | private async void ButtonGetClipShelf_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) 18 | { 19 | await Launcher.LaunchUriAsync(new Uri("ms-windows-store://pdp/?productid=9NV7F7JGLRPL&cid=scanner")); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this app 4 | title: '' 5 | labels: enhancement 6 | assignees: simon-knuth 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | 12 | 13 | **Describe the solution you'd like** 14 | 15 | 16 | **Describe alternatives you've considered** 17 | 18 | 19 | **Additional context** 20 | 21 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IScannerDiscoveryService.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Models; 2 | using System; 3 | using System.Collections.ObjectModel; 4 | using System.Threading.Tasks; 5 | 6 | namespace Scanner.Services 7 | { 8 | /// 9 | /// Searches for and lists discovered wired/wireless scanners. 10 | /// 11 | public interface IScannerDiscoveryService 12 | { 13 | event EventHandler InitialCrawlCompleted; 14 | 15 | Task RestartSearchAsync(); 16 | void TryPauseSearchAsync(); 17 | void TryResumeSearchAsync(); 18 | Task AddDebugScannerAsync(DiscoveredScanner scanner); 19 | ObservableCollection DiscoveredScanners 20 | { 21 | get; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/BoolVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class BoolVisibilityConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given bool into the corresponding . 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | return (bool)value ? Visibility.Visible : Visibility.Collapsed; 15 | } 16 | 17 | public object ConvertBack(object value, Type targetType, object parameter, string language) 18 | { 19 | throw new NotImplementedException(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IAutoRotatorService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | using Windows.Devices.Scanners; 4 | using Windows.Globalization; 5 | using Windows.Graphics.Imaging; 6 | using Windows.Storage; 7 | using Windows.UI.Xaml; 8 | 9 | namespace Scanner.Services 10 | { 11 | /// 12 | /// Determines the correct rotation of an image. 13 | /// 14 | public interface IAutoRotatorService 15 | { 16 | IReadOnlyList AvailableLanguages 17 | { 18 | get; 19 | } 20 | 21 | Language DefaultLanguage 22 | { 23 | get; 24 | } 25 | 26 | Task TryGetRecommendedRotationAsync(StorageFile imageFile, ImageScannerFormat format); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/VisibilityOpacityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class VisibilityOpacityConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given to an opacity value. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if ((Visibility)value == Visibility.Visible) return 1.0; 15 | else return 0.0; 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | { 20 | throw new NotImplementedException(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Scanner/Views/Dialogs/LicenseDetailView.xaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/StringWhitespaceVisualizationConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class StringWhitespaceVisualizationConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts a string to visualize the included whitespace characters. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | string text = value as string; 15 | return text.Replace(' ', '⌴'); 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | { 20 | throw new NotImplementedException(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/NullVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | using Windows.UI.Xaml; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class NullVisibilityConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given object into a based on it equaling null. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if (value == null) return Visibility.Visible; 15 | else return Visibility.Collapsed; 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | { 20 | throw new NotImplementedException(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help improve the app 4 | title: '' 5 | labels: bug 6 | assignees: simon-knuth 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | 12 | 13 | **To Reproduce** 14 | 19 | 20 | **Expected behavior** 21 | 22 | 23 | **Screenshots** 24 | 25 | 26 | **Log data** 27 | 28 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/NotNullVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | using Windows.UI.Xaml; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class NotNullVisibilityConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given object into a based on it not equaling null. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if (value != null) return Visibility.Visible; 15 | else return Visibility.Collapsed; 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | { 20 | throw new NotImplementedException(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/NotZeroVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class NotZeroVisibilityConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given int into the corresponding based on it 11 | /// not equaling zero. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return (int)value != 0 ? Visibility.Visible : Visibility.Collapsed; 16 | } 17 | 18 | public object ConvertBack(object value, Type targetType, object parameter, string language) 19 | { 20 | throw new NotImplementedException(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ToolTipConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Controls; 4 | using Windows.UI.Xaml.Data; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class ToolTipConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given element into its ToolTip. null results in an empty string. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | object tooltip = ToolTipService.GetToolTip((UIElement)value); 16 | return (string)tooltip ?? ""; 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, string language) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Scanner/Helpers/AppConstants.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Scanner.Helpers 4 | { 5 | public static class AppConstants 6 | { 7 | public static Uri UriWebsite = new Uri("https://simon-knuth.github.io/scanner"); 8 | public static Uri UriSimon = new Uri("https://simon-knuth.github.io/"); 9 | public static Uri UriPrivacyPolicy = new Uri("https://simon-knuth.github.io/scanner/privacy-policy"); 10 | public static Uri UriGithub = new Uri("https://github.com/simon-knuth/scanner"); 11 | public static Uri UriHelpTranslate = new Uri("https://simon-knuth.github.io/scanner/help-translate.html"); 12 | public static Uri UriDonation = new Uri("https://www.paypal.com/donate?hosted_button_id=TLR5GM8NKE3L2&source=url"); 13 | public static string UriStoreRating = "ms-windows-store://review/?productid=9N438MZHD3ZF"; 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IAppDataService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Windows.Storage; 3 | 4 | namespace Scanner.Services 5 | { 6 | /// 7 | /// Manages the app's internal storage. 8 | /// 9 | public interface IAppDataService 10 | { 11 | StorageFolder FolderTemp 12 | { 13 | get; 14 | } 15 | 16 | StorageFolder FolderReceivedPages 17 | { 18 | get; 19 | } 20 | 21 | StorageFolder FolderConversion 22 | { 23 | get; 24 | } 25 | 26 | StorageFolder FolderWithoutRotation 27 | { 28 | get; 29 | } 30 | 31 | StorageFolder FolderPreview 32 | { 33 | get; 34 | } 35 | 36 | Task Initialize(); 37 | Task EmptyReceivedPagesFolderAsync(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/NegativeBoolConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | namespace Scanner.Views.Converters 5 | { 6 | public class NegativeBoolConverter : IValueConverter 7 | { 8 | /// 9 | /// Inverts the given bool value. 10 | /// 11 | public object Convert(object value, Type targetType, object parameter, string language) 12 | { 13 | if (value != null && (bool)value == true) return false; 14 | else return true; 15 | } 16 | 17 | /// 18 | /// Inverts the given bool value. 19 | /// 20 | public object ConvertBack(object value, Type targetType, object parameter, string language) 21 | { 22 | if ((bool)value == true) return false; 23 | else return true; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/StringNotEmptyVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class StringNotEmptyVisibilityConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts a string to a visibility, which is useful for hiding parts of the UI when 11 | /// no text is available. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | if (!string.IsNullOrEmpty((string)value)) return Visibility.Visible; 16 | else return Visibility.Collapsed; 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, string language) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/FilePathFolderConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class FilePathFolderConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts a file path string to a string containing just the parent folder. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | string path = (string)value; 15 | string[] parts = path.Split(Path.DirectorySeparatorChar); 16 | 17 | string result = parts[parts.Length - 2]; 18 | return result; 19 | } 20 | 21 | public object ConvertBack(object value, Type targetType, object parameter, string language) 22 | { 23 | throw new NotImplementedException(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/AppWideMessageSeverityInfoBarConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.UI.Xaml.Controls; 2 | using Scanner.Services.Messenger; 3 | using System; 4 | using Windows.UI.Xaml.Data; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class AppWideMessageSeverityInfoBarConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given into the corresponding 12 | /// . 13 | /// 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | return (InfoBarSeverity)((AppWideStatusMessageSeverity)((int)value)); 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, string language) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ScanMergeElementTooltipConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | namespace Scanner.Views.Converters 5 | { 6 | public class ScanMergeElementTooltipConverter : IValueConverter 7 | { 8 | /// 9 | /// Converts the given into a tooltip string. 10 | /// 11 | public object Convert(object value, Type targetType, object parameter, string language) 12 | { 13 | ScanMergeElement element = value as ScanMergeElement; 14 | 15 | if (element == null) return null; 16 | else if (element.IsPotentialPage) return element.ItemDescriptor; 17 | else return null; 18 | } 19 | 20 | public object ConvertBack(object value, Type targetType, object parameter, string language) 21 | { 22 | throw new NotImplementedException(); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/AspectRatioOptionIntConverter.cs: -------------------------------------------------------------------------------- 1 | using Scanner.ViewModels; 2 | using System; 3 | using Windows.UI.Xaml.Data; 4 | using static Enums; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class AspectRatioOptionIntConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given enum element into an integer string. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return ((int)value).ToString(); 16 | } 17 | 18 | 19 | /// 20 | /// Converts the given integer string into a . 21 | /// 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | return (AspectRatioOption)int.Parse((string)value); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/FilePathFolderPathConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class FilePathFolderPathConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts a file path string to the path of the containing folder. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | string path = (string)value; 15 | int lastDirectorySeparatorIndex = path.LastIndexOf(Path.DirectorySeparatorChar); 16 | 17 | string result = path.Substring(0, lastDirectorySeparatorIndex); 18 | return result; 19 | } 20 | 21 | public object ConvertBack(object value, Type targetType, object parameter, string language) 22 | { 23 | throw new NotImplementedException(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ListNotNullOrEmptyConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class ListNotNullOrEmptyConverter : IValueConverter 8 | { 9 | /// 10 | /// Checks whether the given is not null or empty 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if (value == null) return false; 15 | 16 | IEnumerable list = (IEnumerable)value; 17 | foreach (var item in list) 18 | { 19 | return true; 20 | } 21 | return false; 22 | } 23 | 24 | public object ConvertBack(object value, Type targetType, object parameter, string language) 25 | { 26 | throw new NotImplementedException(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/SignedIntConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class SignedIntConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given int into a signed number string. "0" will always remain unsigned. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | if ((double)value > 0) 15 | { 16 | return (-(double)value).ToString().Replace('-', '+'); 17 | } 18 | else 19 | { 20 | return ((double)value).ToString(); 21 | } 22 | } 23 | 24 | public object ConvertBack(object value, Type targetType, object parameter, string language) 25 | { 26 | throw new NotImplementedException(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IScanOptionsDatabaseService.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Models; 2 | using System.Threading.Tasks; 3 | 4 | namespace Scanner.Services 5 | { 6 | /// 7 | /// Manages remembered on a per-scanner basis. 8 | /// 9 | public interface IScanOptionsDatabaseService 10 | { 11 | Task InitializeAsync(); 12 | ScanOptions GetScanOptionsForScanner(DiscoveredScanner scanner); 13 | void SaveScanOptionsForScanner(DiscoveredScanner scanner, ScanOptions scanOptions); 14 | 15 | /// 16 | /// Deletes all remembered scan options for a given . This 17 | /// can be used when the data is suspected to have been corrupted or when a scanner 18 | /// with different capabilities has the same ID as a previous one (quite unlikely). 19 | /// 20 | void DeleteScanOptionsForScanner(DiscoveredScanner scanner); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/SetupCompletedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | class SetupCompletedMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | 9 | 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | public SetupCompletedMessage() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/DonateDialogRequestMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | public class DonateDialogRequestMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | 9 | 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | public DonateDialogRequestMessage() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/PreviewDialogRequestMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | public class PreviewDialogRequestMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | 9 | 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | public PreviewDialogRequestMessage() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/ScanMergeDialogRequestMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | public class ScanMergeDialogRequestMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | 9 | 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | public ScanMergeDialogRequestMessage() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IPersistentScanOptionsDatabaseService.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Models; 2 | using System.Threading.Tasks; 3 | 4 | namespace Scanner.Services 5 | { 6 | /// 7 | /// Manages on a per-scanner basis. 8 | /// 9 | public interface IPersistentScanOptionsDatabaseService 10 | { 11 | Task InitializeAsync(); 12 | PersistentScanOptions GetPersistentScanOptionsForScanner(DiscoveredScanner scanner); 13 | void SavePersistentScanOptionsForScanner(DiscoveredScanner scanner, PersistentScanOptions persistentScanOptions); 14 | 15 | /// 16 | /// Deletes all persistent scan options for a given . This 17 | /// can be used when the data is suspected to have been corrupted or when a scanner 18 | /// with different capabilities has the same ID as a previous one (quite unlikely). 19 | /// 20 | void DeletePersistentScanOptionsForScanner(DiscoveredScanner scanner); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ScanSaveLocationGlyphConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | namespace Scanner.Views.Converters 5 | { 6 | public class ScanSaveLocationGlyphConverter : IValueConverter 7 | { 8 | private const string glyphDefault = "\uE838"; 9 | private const string glyphNotDefault = "\uEC25"; 10 | private const string glyphAskForLocation = "\uE81C"; 11 | 12 | /// 13 | /// Converts the given bool into a glyph string. 14 | /// 15 | public object Convert(object value, Type targetType, object parameter, string language) 16 | { 17 | bool? isDefault = (bool?)value; 18 | 19 | if (isDefault == true) return glyphDefault; 20 | else if (isDefault == false) return glyphNotDefault; 21 | else return glyphAskForLocation; 22 | } 23 | 24 | public object ConvertBack(object value, Type targetType, object parameter, string language) 25 | { 26 | throw new NotImplementedException(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/NarratorAnnouncementMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | public class NarratorAnnouncementMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | public string AnnouncementText; 9 | 10 | 11 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 13 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | public NarratorAnnouncementMessage() 15 | { 16 | 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/EditorSelectionTitleChangedMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | public class EditorSelectionTitleChangedMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | public string Title; 9 | 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | public EditorSelectionTitleChangedMessage() 14 | { 15 | 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/AppLanguageSettingConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.Globalization; 3 | using Windows.UI.Xaml.Data; 4 | using static Utilities; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class AppLanguageSettingConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given into a display string. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | string languageString = value as string; 16 | 17 | if (languageString == "SYSTEM") 18 | { 19 | return LocalizedString("OptionSettingsAppLanguageSystem"); 20 | } 21 | else 22 | { 23 | return new Language(languageString).DisplayName; 24 | } 25 | } 26 | 27 | public object ConvertBack(object value, Type targetType, object parameter, string language) 28 | { 29 | throw new NotImplementedException(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ScanActionVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using Scanner.ViewModels; 2 | using System; 3 | using Windows.UI.Xaml; 4 | using Windows.UI.Xaml.Data; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class ScanActionVisibilityConverter : IValueConverter 9 | { 10 | /// 11 | /// Compares the parameter int to the given and returns 12 | /// a corresponding . 13 | /// 14 | public object Convert(object value, Type targetType, object parameter, string language) 15 | { 16 | if ((ScanAction)value == (ScanAction)int.Parse((string)parameter)) 17 | { 18 | return Visibility.Visible; 19 | } 20 | else 21 | { 22 | return Visibility.Collapsed; 23 | } 24 | } 25 | 26 | 27 | public object ConvertBack(object value, Type targetType, object parameter, string language) 28 | { 29 | throw new NotImplementedException(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/DoubleStringConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class DoubleStringConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given to a string with the decimal places given as parameter. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | double number = (double)value; 15 | int places = int.Parse((string)parameter); 16 | 17 | string placesConfig = ""; 18 | for (int i = 0; i < places; i++) 19 | { 20 | placesConfig += "0"; 21 | } 22 | return number.ToString($"0.{placesConfig}"); 23 | } 24 | 25 | public object ConvertBack(object value, Type targetType, object parameter, string language) 26 | { 27 | string number = (string)value; 28 | return double.Parse(number); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/EditorIsEditingRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class EditorIsEditingRequestMessage : RequestMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public EditorIsEditingRequestMessage() 16 | { 17 | 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/EditorCurrentIndexRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class EditorCurrentIndexRequestMessage : RequestMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public EditorCurrentIndexRequestMessage() 16 | { 17 | 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/HelpRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using static Enums; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class HelpRequestMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | public HelpTopic HelpTopic; 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public HelpRequestMessage(HelpTopic helpTopic) 16 | { 17 | HelpTopic = helpTopic; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/HelpRequestShellMessage.cs: -------------------------------------------------------------------------------- 1 | using static Enums; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class HelpRequestShellMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | public HelpTopic HelpTopic; 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public HelpRequestShellMessage(HelpTopic helpTopic) 16 | { 17 | HelpTopic = helpTopic; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/SetShareFilesMessage.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using Windows.Storage; 3 | 4 | namespace Scanner.Services.Messenger 5 | { 6 | public class SetShareFilesMessage 7 | { 8 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | public List Files; 12 | 13 | 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 16 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 17 | public SetShareFilesMessage() 18 | { 19 | 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/NegativeBoolVisibilityConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class NegativeBoolVisibilityConverter : IValueConverter 8 | { 9 | /// 10 | /// Inverts the given bool value and converts it to a . 11 | /// Also returns if null is received. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | if (value == null || (bool)value == true) return Visibility.Collapsed; 16 | else return Visibility.Visible; 17 | } 18 | 19 | /// 20 | /// Inverts the given value and converts it to a bool. 21 | /// 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | if ((Visibility)value == Visibility.Visible) return false; 25 | else return true; 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftAppCenterAnalytics.txt: -------------------------------------------------------------------------------- 1 | SPDX identifier 2 | MIT 3 | 4 | License text 5 | MIT License 6 | 7 | Copyright (c) _____ 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftAppCenterCrashes.txt: -------------------------------------------------------------------------------- 1 | SPDX identifier 2 | MIT 3 | 4 | License text 5 | MIT License 6 | 7 | Copyright (c) _____ 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/SelectedScannerRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | using Scanner.Models; 3 | 4 | namespace Scanner.Services.Messenger 5 | { 6 | class SelectedScannerRequestMessage : RequestMessage 7 | { 8 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | 12 | 13 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | public SelectedScannerRequestMessage() 17 | { 18 | 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /Scanner/License Texts/LicensePDFsharp.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2005-2014 empira Software GmbH, Troisdorf (Germany) 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/SettingsRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using static Enums; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class SettingsRequestMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | public SettingsSection SettingsSection; 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public SettingsRequestMessage(SettingsSection settingsSection) 16 | { 17 | SettingsSection = settingsSection; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseQueryStringNET.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Windows Notifications 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseSerilogExceptions.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Muhammad Rehan Saeed 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftXamlBehaviorsUwpManaged.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Microsoft 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/ScanMergeRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using static Enums; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class ScanMergeRequestMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | public ScanMergeConfig ScanMergeConfig; 11 | 12 | 13 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | public ScanMergeRequestMessage(ScanMergeConfig scanMergeConfig) 17 | { 18 | ScanMergeConfig = scanMergeConfig; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/SettingsRequestShellMessage.cs: -------------------------------------------------------------------------------- 1 | using static Enums; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class SettingsRequestShellMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | public SettingsSection SettingsSection; 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public SettingsRequestShellMessage(SettingsSection settingsSection) 16 | { 17 | SettingsSection = settingsSection; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftToolkitMvvm.txt: -------------------------------------------------------------------------------- 1 | # Windows Community Toolkit 2 | 3 | Copyright © .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | ## MIT License (MIT) 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/Views/Converters/PreviewToolTipConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | using static Utilities; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class PreviewToolTipConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given into a tooltip string. If the object is null, 11 | /// there is no scan region selected. If the object isn't null, a custom region is selected. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | if (value == null) 16 | { 17 | // no region selected 18 | return LocalizedString("TextButtonPreviewToolTipNoRegion"); 19 | } 20 | else 21 | { 22 | // region selected 23 | return LocalizedString("TextButtonPreviewToolTipRegion"); 24 | } 25 | } 26 | 27 | public object ConvertBack(object value, Type targetType, object parameter, string language) 28 | { 29 | throw new NotImplementedException(); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftToolkitUwpUILottie.txt: -------------------------------------------------------------------------------- 1 | # Windows Community Toolkit 2 | 3 | Copyright (c) .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | # MIT License (MIT) 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftToolkitUwpUIAnimations.txt: -------------------------------------------------------------------------------- 1 | # Windows Community Toolkit 2 | 3 | Copyright (c) .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | # MIT License (MIT) 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftToolkitUwpUIControls.txt: -------------------------------------------------------------------------------- 1 | # Windows Community Toolkit 2 | 3 | Copyright (c) .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | # MIT License (MIT) 8 | 9 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/EditorCurrentIndexChangedMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class EditorCurrentIndexChangedMessage : ValueChangedMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | int NewIndex; 11 | 12 | 13 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | public EditorCurrentIndexChangedMessage(int index) : base(index) 17 | { 18 | NewIndex = index; 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/PageListCurrentIndexChangedMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class PageListCurrentIndexChangedMessage : ValueChangedMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | int NewIndex; 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public PageListCurrentIndexChangedMessage(int index) : base(index) 16 | { 17 | NewIndex = index; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/PreviewParametersRequestMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | using Scanner.Models; 3 | using System; 4 | 5 | namespace Scanner.Services.Messenger 6 | { 7 | class PreviewParametersRequestMessage : RequestMessage> 8 | { 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12 | 13 | 14 | 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 17 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | public PreviewParametersRequestMessage() 19 | { 20 | 21 | } 22 | } 23 | } -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/EditorIsEditingChangedMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | 3 | namespace Scanner.Services.Messenger 4 | { 5 | class EditorIsEditingChangedMessage : ValueChangedMessage 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | bool IsEditing; 11 | 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public EditorIsEditingChangedMessage(bool isEditing) : base(isEditing) 16 | { 17 | IsEditing = isEditing; 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Scanner/License Texts/LicenseMicrosoftExtensionsDependencyInjection.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) .NET Foundation and Contributors 4 | 5 | All rights reserved. 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/SelectedScannerChangedMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | using Scanner.Models; 3 | 4 | namespace Scanner.Services.Messenger 5 | { 6 | class SelectedScannerChangedMessage : ValueChangedMessage 7 | { 8 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | DiscoveredScanner Scanner; 12 | 13 | 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 16 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 17 | public SelectedScannerChangedMessage(DiscoveredScanner scanner) : base(scanner) 18 | { 19 | Scanner = scanner; 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /Scanner/Views/Converters/EditorModeIntConverter.cs: -------------------------------------------------------------------------------- 1 | using Scanner.ViewModels; 2 | using System; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class EditorModeIntConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given enum element into an integer string. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | return ((int)value).ToString(); 15 | } 16 | 17 | 18 | /// 19 | /// Converts the given integer string into a . 20 | /// 21 | public object ConvertBack(object value, Type targetType, object parameter, string language) 22 | { 23 | switch ((string)value) 24 | { 25 | case "0": 26 | return EditorMode.Initial; 27 | case "1": 28 | return EditorMode.Crop; 29 | case "2": 30 | return EditorMode.Draw; 31 | default: 32 | throw new ApplicationException("Can't convert " + (int)value + " to EditorMode."); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/AspectRatioOptionBoolConverter.cs: -------------------------------------------------------------------------------- 1 | using Scanner.ViewModels; 2 | using System; 3 | using Windows.UI.Xaml.Data; 4 | using static Enums; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class AspectRatioOptionBoolConverter : IValueConverter 9 | { 10 | /// 11 | /// Checks whether the given equals the parameter. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | AspectRatioOption aspectRatioOptionSelected = (AspectRatioOption)value; 16 | AspectRatioOption aspectRatioOptionComparison = (AspectRatioOption)int.Parse((string)parameter); 17 | 18 | return aspectRatioOptionSelected == aspectRatioOptionComparison; 19 | } 20 | 21 | 22 | /// 23 | /// Converts the given parameter to an . 24 | /// 25 | public object ConvertBack(object value, Type targetType, object parameter, string language) 26 | { 27 | AspectRatioOption aspectRatioOptionSelected = (AspectRatioOption)int.Parse((string)parameter); 28 | return aspectRatioOptionSelected; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/RadioButtonsDayTypeConverter.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Models.FileNaming; 2 | using System; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class RadioButtonsDayTypeConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given enum element into an integer. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | return (int)value; 15 | } 16 | 17 | 18 | /// 19 | /// Converts the given integer into a . 20 | /// 21 | public object ConvertBack(object value, Type targetType, object parameter, string language) 22 | { 23 | switch ((int)value) 24 | { 25 | case -1: 26 | return DayType.DayOfMonth; 27 | case 0: 28 | return DayType.DayOfWeek; 29 | case 1: 30 | return DayType.DayOfMonth; 31 | case 2: 32 | return DayType.DayOfYear; 33 | default: 34 | throw new ApplicationException("Can't convert " + (int)value + " to DayType."); 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/RadioButtonsMonthTypeConverter.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Models.FileNaming; 2 | using System; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class RadioButtonsMonthTypeConverter : IValueConverter 8 | { 9 | /// 10 | /// Converts the given enum element into an integer. 11 | /// 12 | public object Convert(object value, Type targetType, object parameter, string language) 13 | { 14 | return (int)value; 15 | } 16 | 17 | 18 | /// 19 | /// Converts the given integer into a . 20 | /// 21 | public object ConvertBack(object value, Type targetType, object parameter, string language) 22 | { 23 | switch ((int)value) 24 | { 25 | case -1: 26 | return MonthType.Number; 27 | case 0: 28 | return MonthType.Number; 29 | case 1: 30 | return MonthType.Name; 31 | case 2: 32 | return MonthType.ShortName; 33 | default: 34 | throw new ApplicationException("Can't convert " + (int)value + " to MonthType."); 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ScannerSourceIntConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | using static Enums; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class ScannerSourceIntConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given enum element into an integer. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return (int)value; 16 | } 17 | 18 | 19 | /// 20 | /// Converts the given integer into a . 21 | /// 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | switch ((int)value) 25 | { 26 | case 0: 27 | return ScannerSource.None; 28 | case 1: 29 | return ScannerSource.Auto; 30 | case 2: 31 | return ScannerSource.Flatbed; 32 | case 3: 33 | return ScannerSource.Feeder; 34 | default: 35 | throw new ApplicationException("Can't convert " + (int)value + " to ScannerSource."); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IScanService.cs: -------------------------------------------------------------------------------- 1 | using Scanner.Helpers; 2 | using Scanner.Models; 3 | using System; 4 | using System.Threading.Tasks; 5 | using Windows.Devices.Scanners; 6 | using Windows.Storage; 7 | using Windows.Storage.Streams; 8 | using Windows.UI.Xaml.Media.Imaging; 9 | 10 | namespace Scanner.Services 11 | { 12 | /// 13 | /// Interfaces with s to request scans and previews. 14 | /// 15 | public interface IScanService 16 | { 17 | event EventHandler ScanStarted; 18 | event EventHandler ScanEnded; 19 | 20 | bool IsScanInProgress 21 | { 22 | get; 23 | } 24 | 25 | Progress ScanProgress 26 | { 27 | get; 28 | } 29 | 30 | int CompletedScans 31 | { 32 | get; 33 | } 34 | 35 | Task GetPreviewAsync(DiscoveredScanner scanner, ScanOptions options); 36 | Task> GetPreviewWithStreamAsync(DiscoveredScanner scanner, ScanOptions options); 37 | Task GetScanAsync(DiscoveredScanner scanner, ScanOptions options, StorageFolder targetFolder); 38 | void SimulateScan(); 39 | void CancelScan(); 40 | void CancelPreview(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/RadioButtonsScannerSourceConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | using static Enums; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class RadioButtonsScannerSourceConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given enum element into an integer. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return (int)value - 1; 16 | } 17 | 18 | 19 | /// 20 | /// Converts the given integer into a . 21 | /// 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | switch ((int)value) 25 | { 26 | case -1: 27 | return null; 28 | case 0: 29 | return ScannerSource.Auto; 30 | case 1: 31 | return ScannerSource.Flatbed; 32 | case 2: 33 | return ScannerSource.Feeder; 34 | default: 35 | throw new ApplicationException("Can't convert " + (int)value + " to ScannerSource."); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ScanMergeElementGlyphConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | namespace Scanner.Views.Converters 5 | { 6 | public class ScanMergeElementGlyphConverter : IValueConverter 7 | { 8 | private const string glyphStartPage = "\uE819"; 9 | private const string glyphStartPageReversed = "\uE81B"; 10 | private const string glyphSinglePage = "\uE160"; 11 | private const string glyphMultiplePages = "\uE10C"; 12 | 13 | /// 14 | /// Converts the given into a glyph string. 15 | /// 16 | public object Convert(object value, Type targetType, object parameter, string language) 17 | { 18 | ScanMergeElement element = value as ScanMergeElement; 19 | 20 | if (element.IsStartPage && !element.IsOrderReversed) return glyphStartPage; 21 | else if (element.IsStartPage && element.IsOrderReversed) return glyphStartPageReversed; 22 | else if (!element.IsPlaceholderForMultiplePages) return glyphSinglePage; 23 | else return glyphMultiplePages; 24 | } 25 | 26 | public object ConvertBack(object value, Type targetType, object parameter, string language) 27 | { 28 | throw new NotImplementedException(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/PreviewSelectedRegionChangedMessage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.Messaging.Messages; 2 | using Windows.Foundation; 3 | using static Enums; 4 | 5 | namespace Scanner.Services.Messenger 6 | { 7 | class PreviewSelectedRegionChangedMessage : ValueChangedMessage 8 | { 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12 | public Rect? SelectedRegionInches; 13 | 14 | 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 17 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | public PreviewSelectedRegionChangedMessage(Rect? selectedRegionInches) : base(selectedRegionInches) 19 | { 20 | SelectedRegionInches = selectedRegionInches; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Scanner/Services/Messenger/Messages/AppWideStatusMessage.cs: -------------------------------------------------------------------------------- 1 | namespace Scanner.Services.Messenger 2 | { 3 | public class AppWideStatusMessage 4 | { 5 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 6 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | public string Title; 9 | public string MessageText; 10 | public string AdditionalText; 11 | 12 | public AppWideStatusMessageSeverity Severity; 13 | 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 16 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 17 | public AppWideStatusMessage() 18 | { 19 | 20 | } 21 | } 22 | 23 | public enum AppWideStatusMessageSeverity 24 | { 25 | Informational = 0, 26 | Success = 1, 27 | Warning = 2, 28 | Error = 3 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Scanner/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Resources; 2 | using System.Reflection; 3 | using System.Runtime.InteropServices; 4 | using System.Runtime.CompilerServices; 5 | 6 | // General Information about an assembly is controlled through the following 7 | // set of attributes. Change these attribute values to modify the information 8 | // associated with an assembly. 9 | [assembly: AssemblyTitle("Scanner")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("Scanner")] 14 | [assembly: AssemblyCopyright("Copyright © 2023 Simon Knuth")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | 18 | // Version information for an assembly consists of the following four values: 19 | // 20 | // Major Version 21 | // Minor Version 22 | // Build Number 23 | // Revision 24 | // 25 | // You can specify all the values or you can default the Build and Revision Numbers 26 | // by using the '*' as shown below: 27 | // [assembly: AssemblyVersion("1.0.*")] 28 | [assembly: AssemblyVersion("1.0.0.0")] 29 | [assembly: AssemblyFileVersion("1.0.0.0")] 30 | [assembly: ComVisible(false)] 31 | [assembly: NeutralResourcesLanguage("en")] 32 | 33 | [assembly: InternalsVisibleTo("UnitTests")] 34 | [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 35 | 36 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/RadioButtonsScannerAutoCropModeConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | using static Enums; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class RadioButtonsScannerAutoCropModeConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given enum element into an integer. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return (int)value - 1; 16 | } 17 | 18 | 19 | /// 20 | /// Converts the given integer into a . 21 | /// 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | switch ((int)value) 25 | { 26 | case -1: 27 | return ScannerAutoCropMode.None; 28 | case 0: 29 | return ScannerAutoCropMode.Disabled; 30 | case 1: 31 | return ScannerAutoCropMode.SingleRegion; 32 | case 2: 33 | return ScannerAutoCropMode.MultipleRegions; 34 | default: 35 | throw new ApplicationException("Can't convert " + (int)value + " to ScannerAutoCropMode."); 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/RadioButtonsScannerColorModeConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Xaml.Data; 3 | 4 | using static Enums; 5 | 6 | namespace Scanner.Views.Converters 7 | { 8 | public class RadioButtonsScannerColorModeConverter : IValueConverter 9 | { 10 | /// 11 | /// Converts the given enum element into an integer. 12 | /// 13 | public object Convert(object value, Type targetType, object parameter, string language) 14 | { 15 | return (int)value - 1; 16 | } 17 | 18 | 19 | /// 20 | /// Converts the given integer into a . 21 | /// 22 | public object ConvertBack(object value, Type targetType, object parameter, string language) 23 | { 24 | switch ((int)value) 25 | { 26 | case -1: 27 | return ScannerColorMode.None; 28 | case 0: 29 | return ScannerColorMode.Color; 30 | case 1: 31 | return ScannerColorMode.Grayscale; 32 | case 2: 33 | return ScannerColorMode.Monochrome; 34 | case 3: 35 | return ScannerColorMode.Automatic; 36 | default: 37 | throw new ApplicationException("Can't convert " + (int)value + " to ScannerColorMode."); 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /ImageToPDF/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ImageToPDF")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("ImageToPDF")] 13 | [assembly: AssemblyCopyright("Copyright © 2023 Simon Knuth")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("ccfefacf-b58e-4600-b906-02bc7eb041e8")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IAppCenterService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AppCenter.Crashes; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Threading.Tasks; 5 | 6 | namespace Scanner.Services 7 | { 8 | /// 9 | /// Manages the Microsoft AppCenter integration. 10 | /// 11 | public interface IAppCenterService 12 | { 13 | void TrackEvent(AppCenterEvent appCenterEvent, IDictionary properties = null); 14 | void TrackError(Exception exception, IDictionary properties = null, 15 | params ErrorAttachmentLog[] attachments); 16 | void GenerateTestCrash(); 17 | Task InitializeAsync(); 18 | } 19 | 20 | public enum AppCenterEvent 21 | { 22 | ScannerAdded, 23 | ScanCompleted, 24 | Share, 25 | Preview, 26 | RotatePages, 27 | RenamePage, 28 | RenamePDF, 29 | Crop, 30 | CropMultiple, 31 | CropAsCopy, 32 | DeletePages, 33 | DeletePage, 34 | DrawOnPage, 35 | DrawOnPageAsCopy, 36 | CopyPages, 37 | CopyPage, 38 | CopyDocument, 39 | OpenWith, 40 | DuplicatePage, 41 | DonationDialogOpened, 42 | DonationLinkClicked, 43 | HelpRequested, 44 | AutoRotatedPage, 45 | CorrectedAutoRotation, 46 | SetSaveLocationUnavailable, 47 | SettingsRequested, 48 | ChangelogOpened, 49 | ArchitectureDetected, 50 | OtherAppsDialogOpened, 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Scanner/Models/ScanMergeConfig.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Scanner 4 | { 5 | public class ScanMergeConfig 6 | { 7 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 8 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | public List InsertIndices = new List(); 11 | public int SurplusPagesIndex; 12 | public bool InsertReversed; 13 | 14 | 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 17 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | public ScanMergeConfig() 19 | { 20 | 21 | } 22 | 23 | 24 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 25 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 26 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 27 | 28 | 29 | } 30 | } -------------------------------------------------------------------------------- /Scanner/Views/EmptyView.xaml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Scanner/Models/PersistentScanOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel.DataAnnotations; 3 | using Windows.Devices.Scanners; 4 | using static Enums; 5 | 6 | namespace Scanner.Models 7 | { 8 | public class PersistentScanOptions 9 | { 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | public int? FlatbedBrightness; 14 | public int? FlatbedContrast; 15 | 16 | public int? FeederBrightness; 17 | public int? FeederContrast; 18 | 19 | 20 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 21 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 22 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 23 | public PersistentScanOptions() 24 | { 25 | 26 | } 27 | 28 | 29 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 31 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 32 | 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/ScannerFileFormatGlyphConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.Devices.Scanners; 3 | using Windows.UI.Xaml.Data; 4 | 5 | namespace Scanner.Views.Converters 6 | { 7 | public class ScannerFileFormatGlyphConverter : IValueConverter 8 | { 9 | private const string glyphImage = "\uEB9F"; 10 | private const string glyphPdf = "\uEA90"; 11 | 12 | /// 13 | /// Converts the given into a glyph string. 14 | /// 15 | public object Convert(object value, Type targetType, object parameter, string language) 16 | { 17 | ImageScannerFormat format = (ImageScannerFormat)value; 18 | 19 | switch (format) 20 | { 21 | case ImageScannerFormat.Jpeg: 22 | return glyphImage; 23 | case ImageScannerFormat.Png: 24 | return glyphImage; 25 | case ImageScannerFormat.DeviceIndependentBitmap: 26 | return glyphImage; 27 | case ImageScannerFormat.Tiff: 28 | return glyphImage; 29 | case ImageScannerFormat.Xps: 30 | return glyphImage; 31 | case ImageScannerFormat.OpenXps: 32 | return glyphImage; 33 | case ImageScannerFormat.Pdf: 34 | return glyphPdf; 35 | default: 36 | break; 37 | } 38 | 39 | return (int)value; 40 | } 41 | 42 | public object ConvertBack(object value, Type targetType, object parameter, string language) 43 | { 44 | throw new NotImplementedException(); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /UnitTests/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | UnitTests 16 | simon 17 | Assets\StoreLogo.png 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Scanner/Properties/Default.rd.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Scanner/ViewModels/ChangelogDialogViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 3 | using Microsoft.Toolkit.Uwp.Helpers; 4 | using Scanner.Services; 5 | 6 | namespace Scanner.ViewModels 7 | { 8 | public class ChangelogDialogViewModel : ObservableObject 9 | { 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | #region Services 14 | public readonly IAccessibilityService AccessibilityService = Ioc.Default.GetService(); 15 | #endregion 16 | 17 | public bool IsWindows11 = SystemInformation.Instance.OperatingSystemVersion.Build >= 22000; 18 | 19 | 20 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 21 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 22 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 23 | public ChangelogDialogViewModel() 24 | { 25 | 26 | } 27 | 28 | 29 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 31 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Scanner/Helpers/ScanAndEditingProgress.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using System.Collections.Generic; 3 | 4 | namespace Scanner.Helpers 5 | { 6 | public class ScanAndEditingProgress : ObservableObject 7 | { 8 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | private int? _Progress; 12 | public int? Progress 13 | { 14 | get => _Progress; 15 | set => SetProperty(ref _Progress, value); 16 | } 17 | 18 | private ProgressState _State; 19 | public ProgressState State 20 | { 21 | get => _State; 22 | set => SetProperty(ref _State, value); 23 | } 24 | 25 | 26 | 27 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 28 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 29 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 | public ScanAndEditingProgress() 31 | { 32 | 33 | } 34 | 35 | 36 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 37 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 38 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 39 | 40 | 41 | } 42 | 43 | public enum ProgressState 44 | { 45 | Scanning = 0, 46 | Processing = 1, 47 | AutomaticRotation = 2, 48 | PdfGeneration = 3, 49 | Saving = 4, 50 | Finishing = 5 51 | } 52 | } -------------------------------------------------------------------------------- /Scanner/Services/Interfaces/IHelperService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Threading.Tasks; 4 | using Windows.Devices.Scanners; 5 | using Windows.Graphics.Imaging; 6 | using Windows.Storage; 7 | using Windows.Storage.Streams; 8 | using Windows.UI.Xaml.Media.Imaging; 9 | 10 | namespace Scanner.Services 11 | { 12 | /// 13 | /// Offers helper methods. 14 | /// 15 | public interface IHelperService 16 | { 17 | /// 18 | /// Shows the dialog for rating the app. Opens the Microsoft Store, if something goes wrong. 19 | /// 20 | Task ShowRatingDialogAsync(); 21 | 22 | /// 23 | /// Moves the to the . Attempts to name 24 | /// it . 25 | /// 26 | /// The file that's to be moved. 27 | /// The folder that the file shall be moved to. 28 | /// The name that the file should ideally have when finished. 29 | /// Replaces file if true, otherwise asks the OS to generate a unique name. 30 | /// The updated file. 31 | Task MoveFileToFolderAsync(StorageFile file, StorageFolder targetFolder, string desiredName, bool replaceExisting); 32 | 33 | /// 34 | /// Converts the to a . 35 | /// 36 | /// 37 | /// Partially runs on the UI thread. 38 | /// 39 | Task GenerateBitmapFromFileAsync(StorageFile file); 40 | 41 | /// 42 | /// Creates a for the given that's optimized 43 | /// to prevent unneccessarily big results. 44 | /// 45 | Task CreateOptimizedBitmapEncoderAsync(ImageScannerFormat? encoderFormat, IRandomAccessStream stream); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Scanner/Enums.cs: -------------------------------------------------------------------------------- 1 | public static class Enums 2 | { 3 | /// 4 | /// The possible scanner sources. 5 | /// 6 | public enum ScannerSource 7 | { 8 | None = 0, 9 | Auto = 1, 10 | Flatbed = 2, 11 | Feeder = 3 12 | } 13 | 14 | /// 15 | /// The possible scanner color modes. 16 | /// 17 | public enum ScannerColorMode 18 | { 19 | None = 0, 20 | Color = 1, 21 | Grayscale = 2, 22 | Monochrome = 3, 23 | Automatic = 4 24 | } 25 | 26 | /// 27 | /// The possible scanner auto crop modes. 28 | /// 29 | public enum ScannerAutoCropMode 30 | { 31 | None = 0, 32 | Disabled = 1, 33 | SingleRegion = 2, 34 | MultipleRegions = 3 35 | } 36 | 37 | /// 38 | /// Available help topics. 39 | /// 40 | public enum HelpTopic 41 | { 42 | ScannerDiscovery, 43 | ScannerNotWorking, 44 | ChooseResolution, 45 | BrightnessContrast, 46 | AutoCrop, 47 | SaveChanges, 48 | ChangeScanFolder, 49 | ChooseFileFormat, 50 | StartNewPdf, 51 | ReorderPdfPages 52 | } 53 | 54 | /// 55 | /// Available settings section. 56 | /// 57 | public enum SettingsSection 58 | { 59 | SaveLocation, 60 | AutoRotation, 61 | FileNaming, 62 | ScanOptions, 63 | ScanAction, 64 | Theme, 65 | EditorOrientation, 66 | Animations, 67 | ErrorReports, 68 | Surveys, 69 | MeasurementUnits 70 | } 71 | 72 | /// 73 | /// Available aspect ratio options for cropping or selecting a region. 74 | /// 75 | public enum AspectRatioOption 76 | { 77 | Custom = 0, 78 | Square = 1, 79 | ThreeByTwo = 2, 80 | FourByThree = 3, 81 | DinA = 4, 82 | AnsiA = 5, 83 | AnsiB = 6, 84 | AnsiC = 7, 85 | Kai4 = 8, 86 | Kai8 = 9, 87 | Kai16 = 10, 88 | Kai32 = 11, 89 | Legal = 12 90 | } 91 | } -------------------------------------------------------------------------------- /Scanner/ViewModels/OtherAppsDialogViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 3 | using Microsoft.Toolkit.Mvvm.Input; 4 | using Scanner.Services; 5 | using System; 6 | using System.Threading.Tasks; 7 | using Windows.System; 8 | 9 | using static Scanner.Helpers.AppConstants; 10 | 11 | namespace Scanner.ViewModels 12 | { 13 | public class OtherAppsDialogViewModel : ObservableRecipient, IDisposable 14 | { 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 17 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | #region Services 19 | private readonly IAppCenterService AppCenterService = Ioc.Default.GetService(); 20 | public readonly IAccessibilityService AccessibilityService = Ioc.Default.GetService(); 21 | #endregion 22 | 23 | #region Commands 24 | public RelayCommand DisposeCommand; 25 | #endregion 26 | 27 | 28 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 29 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 30 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 31 | public OtherAppsDialogViewModel() 32 | { 33 | AppCenterService.TrackEvent(AppCenterEvent.OtherAppsDialogOpened); 34 | } 35 | 36 | 37 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 38 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 39 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 40 | public void Dispose() 41 | { 42 | // clean up messenger 43 | Messenger.UnregisterAll(this); 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Scanner/Models/FileNaming/ResolutionFileNamingBlock.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel.DataAnnotations; 5 | using Windows.Devices.Scanners; 6 | using static Utilities; 7 | 8 | namespace Scanner.Models.FileNaming 9 | { 10 | public class ResolutionFileNamingBlock : ObservableObject, IFileNamingBlock 11 | { 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public string Glyph => "\uE744"; 16 | public string Name => "RESOLUTION"; 17 | 18 | public string DisplayName 19 | { 20 | get => LocalizedString("HeadingFileNamingBlockResolution/Text"); 21 | } 22 | 23 | public bool IsValid 24 | { 25 | get => true; 26 | } 27 | 28 | 29 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 31 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 32 | public ResolutionFileNamingBlock() 33 | { 34 | 35 | } 36 | 37 | public ResolutionFileNamingBlock(string serialized) 38 | { 39 | 40 | } 41 | 42 | 43 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 44 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 45 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 46 | public string ToString(ScanOptions scanOptions, DiscoveredScanner scanner) 47 | { 48 | return scanOptions.Resolution.ToString("0"); 49 | } 50 | 51 | public string GetSerialized(bool obfuscated) 52 | { 53 | return $"*{Name}"; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Scanner/Views/Converters/WindowStateOpacityConverter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 2 | using Scanner.Services; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.Globalization; 6 | using Windows.UI.Core; 7 | using Windows.UI.Xaml.Data; 8 | 9 | namespace Scanner.Views.Converters 10 | { 11 | public class WindowStateOpacityConverter : IValueConverter 12 | { 13 | private readonly ILogService LogService = Ioc.Default.GetRequiredService(); 14 | private readonly IAppCenterService AppCenterService = Ioc.Default.GetRequiredService(); 15 | 16 | 17 | /// 18 | /// Converts the given into an 19 | /// opacity value to expose the current window state to the user as per 20 | /// guidelines. 21 | /// 22 | public object Convert(object value, Type targetType, object parameter, string language) 23 | { 24 | var windowActivationState = (CoreWindowActivationState) value; 25 | 26 | if (windowActivationState == CoreWindowActivationState.Deactivated) 27 | { 28 | // window deactivated 29 | return 0.4; 30 | } 31 | else 32 | { 33 | // window activated 34 | if (parameter != null) 35 | { 36 | // allow override of default value 37 | try 38 | { 39 | CultureInfo cultureInfo = CultureInfo.GetCultureInfoByIetfLanguageTag("en-us"); 40 | return Double.Parse((string)parameter, cultureInfo); 41 | } 42 | catch (Exception exc) 43 | { 44 | LogService.Log.Error(exc, "Error while parsing value in WindowStateOpacityConverter"); 45 | AppCenterService.TrackError(exc, new Dictionary { 46 | { "Parameter", (string)parameter }, 47 | }); 48 | return 1.0; 49 | } 50 | } 51 | else 52 | { 53 | return 1.0; 54 | } 55 | } 56 | } 57 | 58 | public object ConvertBack(object value, Type targetType, object parameter, string language) 59 | { 60 | throw new NotImplementedException(); 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Scanner/Models/FileNaming/YearFileNamingBlock.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel.DataAnnotations; 5 | using System.Globalization; 6 | using Windows.Devices.Scanners; 7 | using static Utilities; 8 | 9 | namespace Scanner.Models.FileNaming 10 | { 11 | public class YearFileNamingBlock : ObservableObject, IFileNamingBlock 12 | { 13 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | public string Glyph => "\uE163"; 17 | public string Name => "YEAR"; 18 | 19 | public string DisplayName 20 | { 21 | get => LocalizedString("HeadingFileNamingBlockYear/Text"); 22 | } 23 | 24 | public bool IsValid 25 | { 26 | get => true; 27 | } 28 | 29 | 30 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 31 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 32 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 33 | public YearFileNamingBlock() 34 | { 35 | 36 | } 37 | 38 | public YearFileNamingBlock(string serialized) 39 | { 40 | 41 | } 42 | 43 | 44 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 45 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 46 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 47 | public string ToString(ScanOptions scanOptions, DiscoveredScanner scanner) 48 | { 49 | DateTime currentTime = DateTime.Now; 50 | 51 | return CultureInfo.CurrentCulture.Calendar.GetYear(currentTime).ToString(); 52 | } 53 | 54 | public string GetSerialized(bool obfuscated) 55 | { 56 | return $"*{Name}"; 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Scanner/ViewModels/LicensesDialogViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 3 | using Scanner.Services; 4 | 5 | namespace Scanner.ViewModels 6 | { 7 | public class LicensesDialogViewModel : ObservableObject 8 | { 9 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12 | #region Services 13 | public readonly IAccessibilityService AccessibilityService = Ioc.Default.GetService(); 14 | #endregion 15 | 16 | 17 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 19 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 20 | public LicensesDialogViewModel() 21 | { 22 | 23 | } 24 | 25 | 26 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 27 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 28 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 29 | 30 | 31 | } 32 | 33 | public enum ThirdPartyLicense 34 | { 35 | MicrosoftAppCenterAnalytics = 0, 36 | MicrosoftAppCenterCrashes = 1, 37 | MicrosoftNETCoreUniversalWindowsPlatform = 2, 38 | MicrosoftServicesStoreEngagement = 3, 39 | MicrosoftToolkitUwpNotifications = 4, 40 | MicrosoftToolkitUwpUIAnimations = 5, 41 | MicrosoftToolkitUwpUIControls = 6, 42 | MicrosoftToolkitUwpUILottie = 7, 43 | MicrosoftUIXAML = 8, 44 | PDFsharp = 9, 45 | QueryStringNET = 10, 46 | Win2Duwp = 11, 47 | Serilog = 12, 48 | SerilogExceptions = 13, 49 | SerilogSinksAsync = 14, 50 | SerilogSinksFile = 15, 51 | MicrosoftDataSqliteCore = 16, 52 | MicrosoftExtensionsDependencyInjection = 17, 53 | MicrosoftToolkitMvvm = 18, 54 | MicrosoftXamlBehaviorsUwpManaged = 19, 55 | SqlitePclRawBundleWinsqlite3 = 20, 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Scanner/Services/AccessibilityService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 2 | using Windows.UI.Xaml; 3 | 4 | namespace Scanner.Services 5 | { 6 | internal class AccessibilityService : IAccessibilityService 7 | { 8 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 9 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 10 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 11 | private readonly ILogService LogService = Ioc.Default.GetService(); 12 | 13 | private FlowDirection _DefaultFlowDirection; 14 | public FlowDirection DefaultFlowDirection 15 | { 16 | get => _DefaultFlowDirection; 17 | } 18 | 19 | private FlowDirection _InvertedFlowDirection; 20 | public FlowDirection InvertedFlowDirection 21 | { 22 | get => _InvertedFlowDirection; 23 | } 24 | 25 | 26 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 27 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 28 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 29 | public AccessibilityService() 30 | { 31 | // get text direction 32 | var flowDirectionSetting = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues["LayoutDirection"]; 33 | if (flowDirectionSetting == "LTR") 34 | { 35 | _DefaultFlowDirection = FlowDirection.LeftToRight; 36 | _InvertedFlowDirection = FlowDirection.RightToLeft; 37 | } 38 | else 39 | { 40 | _DefaultFlowDirection = FlowDirection.RightToLeft; 41 | _InvertedFlowDirection = FlowDirection.LeftToRight; 42 | } 43 | 44 | LogService?.Log.Information("System text direction is {0}.", flowDirectionSetting); 45 | } 46 | 47 | 48 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 49 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 50 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Scanner/Models/PersistentScanOptions.cs~merged: -------------------------------------------------------------------------------- 1 | <<<<<<< HEAD 2 | <<<<<<< HEAD:Scanner/Models/PersistentScanOptions.cs 3 | ======= 4 | >>>>>>> main 5 | using System; 6 | using System.ComponentModel.DataAnnotations; 7 | using Windows.Devices.Scanners; 8 | using static Enums; 9 | 10 | namespace Scanner.Models 11 | { 12 | public class PersistentScanOptions 13 | <<<<<<< HEAD 14 | ======= 15 | using System.Collections.Generic; 16 | 17 | namespace Scanner 18 | { 19 | public class ScanMergeConfig 20 | >>>>>>> main:Scanner/Models/ScanMergeConfig.cs 21 | ======= 22 | >>>>>>> main 23 | { 24 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 25 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 26 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 27 | <<<<<<< HEAD 28 | <<<<<<< HEAD:Scanner/Models/PersistentScanOptions.cs 29 | ======= 30 | >>>>>>> main 31 | public int? FlatbedBrightness; 32 | public int? FlatbedContrast; 33 | 34 | public int? FeederBrightness; 35 | public int? FeederContrast; 36 | <<<<<<< HEAD 37 | ======= 38 | public List InsertIndices = new List(); 39 | public int SurplusPagesIndex; 40 | >>>>>>> main:Scanner/Models/ScanMergeConfig.cs 41 | ======= 42 | >>>>>>> main 43 | 44 | 45 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 46 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 47 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 48 | <<<<<<< HEAD 49 | <<<<<<< HEAD:Scanner/Models/PersistentScanOptions.cs 50 | public PersistentScanOptions() 51 | ======= 52 | public ScanMergeConfig() 53 | >>>>>>> main:Scanner/Models/ScanMergeConfig.cs 54 | ======= 55 | public PersistentScanOptions() 56 | >>>>>>> main 57 | { 58 | 59 | } 60 | 61 | 62 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 63 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 64 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 65 | <<<<<<< HEAD 66 | <<<<<<< HEAD:Scanner/Models/PersistentScanOptions.cs 67 | 68 | ======= 69 | 70 | >>>>>>> main:Scanner/Models/ScanMergeConfig.cs 71 | ======= 72 | 73 | >>>>>>> main 74 | 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /Scanner/ViewModels/DonateDialogViewModel.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using Microsoft.Toolkit.Mvvm.DependencyInjection; 3 | using Microsoft.Toolkit.Mvvm.Input; 4 | using Scanner.Services; 5 | using System; 6 | using System.Threading.Tasks; 7 | using Windows.System; 8 | 9 | using static Scanner.Helpers.AppConstants; 10 | 11 | namespace Scanner.ViewModels 12 | { 13 | public class DonateDialogViewModel : ObservableRecipient, IDisposable 14 | { 15 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 17 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | #region Services 19 | private readonly IAppCenterService AppCenterService = Ioc.Default.GetService(); 20 | public readonly IAccessibilityService AccessibilityService = Ioc.Default.GetService(); 21 | #endregion 22 | 23 | #region Commands 24 | public RelayCommand DisposeCommand; 25 | public AsyncRelayCommand DonateCommand; 26 | #endregion 27 | 28 | 29 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 31 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 32 | public DonateDialogViewModel() 33 | { 34 | DonateCommand = new AsyncRelayCommand(Donate); 35 | 36 | AppCenterService.TrackEvent(AppCenterEvent.DonationDialogOpened); 37 | } 38 | 39 | 40 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 41 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 42 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 43 | public void Dispose() 44 | { 45 | // clean up messenger 46 | Messenger.UnregisterAll(this); 47 | } 48 | 49 | /// 50 | /// Opens the donation webpage specified by . 51 | /// 52 | private async Task Donate() 53 | { 54 | AppCenterService?.TrackEvent(AppCenterEvent.DonationLinkClicked); 55 | await Launcher.LaunchUriAsync(UriDonation); 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Scanner/Views/Dialogs/SetupDialogView.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Windows.UI.Core; 3 | using Windows.UI.Popups; 4 | using Windows.UI.Xaml.Controls; 5 | using static Utilities; 6 | 7 | namespace Scanner.Views.Dialogs 8 | { 9 | public sealed partial class SetupDialogView : ContentDialog 10 | { 11 | private SetupDialogStep currentStep; 12 | private bool closing; 13 | 14 | public SetupDialogView() 15 | { 16 | this.InitializeComponent(); 17 | ViewModel.ErrorOccurred += ViewModel_ErrorOccurred; 18 | } 19 | 20 | private async void ViewModel_ErrorOccurred(object sender, Tuple e) 21 | { 22 | await RunOnUIThreadAsync(CoreDispatcherPriority.High, async () => 23 | { 24 | MessageDialog dialog = new MessageDialog(e.Item1, e.Item2); 25 | await dialog.ShowAsync(); 26 | }); 27 | } 28 | 29 | private void ContentDialog_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) 30 | { 31 | // load actual content later to fix transitions 32 | FindName("GridContent"); 33 | } 34 | 35 | private void ContentDialog_Closing(ContentDialog sender, ContentDialogClosingEventArgs args) 36 | { 37 | if (closing) 38 | { 39 | ViewModel.ConfirmSettingsCommand.Execute(null); 40 | } 41 | else 42 | { 43 | args.Cancel = true; 44 | } 45 | } 46 | 47 | private async void ButtonConfirm_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) 48 | { 49 | await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => 50 | { 51 | if (currentStep == SetupDialogStep.Privacy) 52 | { 53 | currentStep = SetupDialogStep.Saving; 54 | SwitchPresenterContent.Value = "Saving"; 55 | ButtonBack.IsEnabled = true; 56 | } 57 | else if (currentStep == SetupDialogStep.Saving) 58 | { 59 | closing = true; 60 | this.Hide(); 61 | } 62 | }); 63 | } 64 | 65 | private async void ButtonBack_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) 66 | { 67 | await RunOnUIThreadAsync(CoreDispatcherPriority.Normal, () => 68 | { 69 | if (currentStep == SetupDialogStep.Saving) 70 | { 71 | ButtonBack.IsEnabled = false; 72 | currentStep = SetupDialogStep.Privacy; 73 | SwitchPresenterContent.Value = "Privacy"; 74 | } 75 | }); 76 | } 77 | } 78 | 79 | public enum SetupDialogStep 80 | { 81 | Privacy, 82 | Saving, 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Scanner/Package.appxmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | ms-resource:ManifestPackageDisplayName 20 | Simon Knuth 21 | Assets\StoreLogo.png 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 36 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /Scanner/Models/FileNaming/ScannerNameFileNamingBlock.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Toolkit.Mvvm.ComponentModel; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.ComponentModel.DataAnnotations; 5 | using Windows.Devices.Scanners; 6 | using static Utilities; 7 | 8 | namespace Scanner.Models.FileNaming 9 | { 10 | public class ScannerNameFileNamingBlock : ObservableObject, IFileNamingBlock 11 | { 12 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 13 | // DECLARATIONS ///////////////////////////////////////////////////////////////////////////////////////////////////////// 14 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 15 | public string Glyph => "\uE294"; 16 | public string Name => "SCANNERNAME"; 17 | 18 | public string DisplayName 19 | { 20 | get => LocalizedString("HeadingFileNamingBlockScannerName/Text"); 21 | } 22 | 23 | private bool _AllCaps; 24 | public bool AllCaps 25 | { 26 | get => _AllCaps; 27 | set => SetProperty(ref _AllCaps, value); 28 | } 29 | 30 | public bool IsValid 31 | { 32 | get => true; 33 | } 34 | 35 | 36 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 37 | // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// 38 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 39 | public ScannerNameFileNamingBlock() 40 | { 41 | 42 | } 43 | 44 | public ScannerNameFileNamingBlock(string serialized) 45 | { 46 | string[] parts = serialized.TrimStart('*').Split('|', StringSplitOptions.RemoveEmptyEntries); 47 | AllCaps = bool.Parse(parts[1]); 48 | } 49 | 50 | 51 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 52 | // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 53 | ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 54 | public string ToString(ScanOptions scanOptions, DiscoveredScanner scanner) 55 | { 56 | if (AllCaps) 57 | { 58 | return scanner.Name.ToUpper(); 59 | } 60 | else 61 | { 62 | return scanner.Name; 63 | } 64 | } 65 | 66 | public string GetSerialized(bool obfuscated) 67 | { 68 | return $"*{Name}|{AllCaps}"; 69 | } 70 | } 71 | } 72 | --------------------------------------------------------------------------------