├── _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 |
--------------------------------------------------------------------------------