├── .editorconfig
├── .gitattributes
├── .github
└── workflows
│ └── publish.yml
├── .gitignore
├── LICENSE
├── Policy
├── README.md
├── RainbowFrame.slnx
├── dev
├── App.xaml
├── App.xaml.cs
├── Assets
│ ├── Fluent
│ │ ├── Acrylic.png
│ │ ├── Color.png
│ │ ├── ColorPicker.png
│ │ ├── External.png
│ │ ├── Info.png
│ │ ├── Reset.png
│ │ ├── Settings.png
│ │ ├── Speed.png
│ │ ├── StartStop.png
│ │ ├── Theme.png
│ │ └── Update.png
│ ├── NavViewMenu
│ │ └── AppData.json
│ ├── Store
│ │ ├── LargeTile.scale-100.png
│ │ ├── LargeTile.scale-125.png
│ │ ├── LargeTile.scale-150.png
│ │ ├── LargeTile.scale-200.png
│ │ ├── LargeTile.scale-400.png
│ │ ├── LockScreenLogo.scale-200.png
│ │ ├── SmallTile.scale-100.png
│ │ ├── SmallTile.scale-125.png
│ │ ├── SmallTile.scale-150.png
│ │ ├── SmallTile.scale-200.png
│ │ ├── SmallTile.scale-400.png
│ │ ├── SplashScreen.scale-100.png
│ │ ├── SplashScreen.scale-125.png
│ │ ├── SplashScreen.scale-150.png
│ │ ├── SplashScreen.scale-200.png
│ │ ├── SplashScreen.scale-400.png
│ │ ├── Square150x150Logo.scale-100.png
│ │ ├── Square150x150Logo.scale-125.png
│ │ ├── Square150x150Logo.scale-150.png
│ │ ├── Square150x150Logo.scale-200.png
│ │ ├── Square150x150Logo.scale-400.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
│ │ ├── Square44x44Logo.altform-unplated_targetsize-16.png
│ │ ├── Square44x44Logo.altform-unplated_targetsize-256.png
│ │ ├── Square44x44Logo.altform-unplated_targetsize-32.png
│ │ ├── Square44x44Logo.altform-unplated_targetsize-48.png
│ │ ├── Square44x44Logo.scale-100.png
│ │ ├── Square44x44Logo.scale-125.png
│ │ ├── Square44x44Logo.scale-150.png
│ │ ├── Square44x44Logo.scale-200.png
│ │ ├── Square44x44Logo.scale-400.png
│ │ ├── Square44x44Logo.targetsize-16.png
│ │ ├── Square44x44Logo.targetsize-24.png
│ │ ├── Square44x44Logo.targetsize-24_altform-unplated.png
│ │ ├── Square44x44Logo.targetsize-256.png
│ │ ├── Square44x44Logo.targetsize-32.png
│ │ ├── Square44x44Logo.targetsize-48.png
│ │ ├── StoreLogo.backup.png
│ │ ├── StoreLogo.scale-100.png
│ │ ├── StoreLogo.scale-125.png
│ │ ├── StoreLogo.scale-150.png
│ │ ├── StoreLogo.scale-200.png
│ │ ├── StoreLogo.scale-400.png
│ │ ├── Wide310x150Logo.scale-100.png
│ │ ├── Wide310x150Logo.scale-125.png
│ │ ├── Wide310x150Logo.scale-150.png
│ │ ├── Wide310x150Logo.scale-200.png
│ │ └── Wide310x150Logo.scale-400.png
│ ├── icon.ico
│ └── icon.png
├── Common
│ ├── AppConfig.cs
│ ├── AppHelper.cs
│ ├── BreadcrumbPageMappings.cs
│ ├── Constants.cs
│ ├── ContentDialogEx.cs
│ ├── NativeMethods.cs
│ └── NavigationPageMappings.cs
├── GlobalUsings.cs
├── MainWindow.xaml
├── MainWindow.xaml.cs
├── Package.appxmanifest
├── Properties
│ └── launchSettings.json
├── RainbowFrame.csproj
├── ViewModels
│ ├── AppUpdateSettingViewModel.cs
│ ├── GeneralSettingViewModel.cs
│ └── MainViewModel.cs
├── Views
│ ├── ControlCenterPage.xaml
│ ├── ControlCenterPage.xaml.cs
│ ├── MainPage.xaml
│ ├── MainPage.xaml.cs
│ ├── Settings
│ │ ├── AboutUsSettingPage.xaml
│ │ ├── AboutUsSettingPage.xaml.cs
│ │ ├── AppUpdateSettingPage.xaml
│ │ ├── AppUpdateSettingPage.xaml.cs
│ │ ├── GeneralSettingPage.xaml
│ │ ├── GeneralSettingPage.xaml.cs
│ │ ├── ThemeSettingPage.xaml
│ │ └── ThemeSettingPage.xaml.cs
│ ├── SettingsPage.xaml
│ └── SettingsPage.xaml.cs
└── app.manifest
└── settings.xamlstyler
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*]
2 | end_of_line=crlf
3 | charset=utf-8-bom
4 | indent_size=4
5 | insert_final_newline=true
6 | tab_width=4
7 | trim_trailing_whitespace=true
8 |
9 | [*.proto]
10 | indent_style=tab
11 | indent_size=tab
12 |
13 | [*.{asax,ascx,aspx,cs,cshtml,css,htm,html,js,jsx,master,razor,skin,ts,tsx,vb,xaml,xamlx,xoml}]
14 | indent_style=space
15 |
16 | [*.{appxmanifest,axml,build,config,csproj,dbml,discomap,dtd,json,jsproj,lsproj,njsproj,nuspec,proj,props,resjson,resw,resx,StyleCop,targets,tasks,vbproj,xml,xsd}]
17 | indent_style=space
18 | indent_size=2
19 | tab_width=2
20 |
21 | [*.{cs,vb}]
22 | dotnet_sort_system_directives_first=true
23 | dotnet_style_coalesce_expression=true:suggestion
24 | dotnet_style_collection_initializer=true:suggestion
25 | dotnet_style_explicit_tuple_names=true:suggestion
26 | dotnet_style_null_propagation=true:suggestion
27 | dotnet_style_object_initializer=true:suggestion
28 | dotnet_style_parentheses_in_arithmetic_binary_operators=never_if_unnecessary:none
29 | dotnet_style_parentheses_in_other_binary_operators=never_if_unnecessary:none
30 | dotnet_style_parentheses_in_other_operators=never_if_unnecessary:silent
31 | dotnet_style_parentheses_in_relational_binary_operators=never_if_unnecessary:none
32 | dotnet_style_predefined_type_for_locals_parameters_members=true:suggestion
33 | dotnet_style_predefined_type_for_member_access=true:suggestion
34 | dotnet_style_prefer_auto_properties=true:suggestion
35 | dotnet_style_prefer_conditional_expression_over_assignment=true
36 | dotnet_style_prefer_conditional_expression_over_return=true
37 | dotnet_style_prefer_inferred_anonymous_type_member_names=true:suggestion
38 | dotnet_style_prefer_inferred_tuple_names=true:suggestion
39 | dotnet_style_prefer_is_null_check_over_reference_equality_method=true:silent
40 | dotnet_style_qualification_for_event=false:suggestion
41 | dotnet_style_qualification_for_field=false:suggestion
42 | dotnet_style_qualification_for_method=false:suggestion
43 | dotnet_style_qualification_for_property=false:suggestion
44 | dotnet_style_readonly_field=true:suggestion
45 | dotnet_style_require_accessibility_modifiers=for_non_interface_members:suggestion
46 |
47 | [*.cs]
48 | csharp_indent_case_contents=true
49 | csharp_indent_labels=flush_left
50 | csharp_indent_switch_labels=true
51 | csharp_new_line_before_catch=true
52 | csharp_new_line_before_else=true
53 | csharp_new_line_before_finally=true
54 | csharp_new_line_before_members_in_anonymous_types=true
55 | csharp_new_line_before_members_in_object_initializers=false
56 | csharp_new_line_before_open_brace=all
57 | csharp_new_line_between_query_expression_clauses=true
58 | csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
59 | csharp_prefer_braces=true:silent
60 | csharp_prefer_simple_default_expression=true:suggestion
61 | csharp_preserve_single_line_blocks=true
62 | csharp_preserve_single_line_statements=true
63 | csharp_space_after_cast=false
64 | csharp_space_after_colon_in_inheritance_clause=true
65 | csharp_space_after_keywords_in_control_flow_statements=true
66 | csharp_space_around_binary_operators=before_and_after
67 | csharp_space_before_colon_in_inheritance_clause=true
68 | csharp_space_between_method_call_empty_parameter_list_parentheses=false
69 | csharp_space_between_method_call_name_and_opening_parenthesis=false
70 | csharp_space_between_method_call_parameter_list_parentheses=false
71 | csharp_space_between_method_declaration_empty_parameter_list_parentheses=false
72 | csharp_space_between_method_declaration_parameter_list_parentheses=false
73 | csharp_space_between_parentheses=false
74 | csharp_style_conditional_delegate_call=true:suggestion
75 | csharp_style_deconstructed_variable_declaration=true:suggestion
76 | csharp_style_expression_bodied_accessors=true:silent
77 | csharp_style_expression_bodied_constructors=false:silent
78 | csharp_style_expression_bodied_indexers=true:silent
79 | csharp_style_expression_bodied_methods=false:silent
80 | csharp_style_expression_bodied_operators=false:silent
81 | csharp_style_expression_bodied_properties=true:silent
82 | csharp_style_inlined_variable_declaration=true:suggestion
83 | csharp_style_pattern_local_over_anonymous_function=true:suggestion
84 | csharp_style_pattern_matching_over_as_with_null_check=true:suggestion
85 | csharp_style_pattern_matching_over_is_with_cast_check=true:suggestion
86 | csharp_style_throw_expression=true:suggestion
87 | csharp_style_var_elsewhere=true:suggestion
88 | csharp_style_var_for_built_in_types=true:suggestion
89 | csharp_style_var_when_type_is_apparent=true:suggestion
90 | # IDE0160: Convert to file-scoped namespace
91 | csharp_style_namespace_declarations = file_scoped:warning
92 |
93 | # ReSharper inspection severities
94 | resharper_arrange_redundant_parentheses_highlighting=suggestion
95 | resharper_arrange_this_qualifier_highlighting=hint
96 | resharper_arrange_type_member_modifiers_highlighting=hint
97 | resharper_arrange_type_modifiers_highlighting=hint
98 | resharper_built_in_type_reference_style_for_member_access_highlighting=hint
99 | resharper_built_in_type_reference_style_highlighting=hint
100 | resharper_check_namespace_highlighting=hint
101 | resharper_comment_typo_highlighting=hint
102 | resharper_identifier_typo_highlighting=none
103 | resharper_inconsistent_naming_highlighting=hint
104 | resharper_localizable_element_highlighting=hint
105 | resharper_markup_attribute_typo_highlighting=hint
106 | resharper_not_resolved_in_text_highlighting=hint
107 | resharper_redundant_base_qualifier_highlighting=warning
108 | resharper_specify_a_culture_in_string_conversion_explicitly_highlighting=hint
109 | resharper_string_literal_typo_highlighting=hint
110 | resharper_suggest_var_or_type_built_in_types_highlighting=hint
111 | resharper_suggest_var_or_type_elsewhere_highlighting=hint
112 | resharper_suggest_var_or_type_simple_types_highlighting=hint
113 | resharper_suspicious_type_conversion_global_highlighting=hint
114 | resharper_unassigned_get_only_auto_property_highlighting=hint
115 | resharper_unused_member_global_highlighting=none
116 | resharper_unused_member_local_highlighting=hint
117 | resharper_unused_method_return_value_local_highlighting=hint
118 | resharper_unused_parameter_local_highlighting=none
119 | resharper_use_negated_pattern_matching_highlighting=suggestion
120 | resharper_xaml_path_error_highlighting=hint
121 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.github/workflows/publish.yml:
--------------------------------------------------------------------------------
1 | name: GitHub Release Publisher
2 |
3 | on:
4 | workflow_dispatch:
5 |
6 | permissions:
7 | contents: write
8 |
9 | env:
10 | # Configuring Project
11 | PROJECT_PATH: dev/RainbowFrame.csproj
12 | APP_NAME: RainbowFrame
13 |
14 | # Check Tag
15 | CHECK_TAG_EXISTENCE_BEFORE_CREATING_TAG: false
16 |
17 | # Custom Nuget Source
18 | IS_COMMUNITY_TOOLKIT_NUGET_SOURCE_ENABLED: true
19 | IS_CUSTOM_NUGET_SOURCE_ENABLED: false
20 | CUSTOM_NUGET_SOURCES: '' # Example ('https://api.nuget.org/v3/index.json, https://api.nuget.org/v2/index.json,...')
21 |
22 | # Configuring Dotnet Build Commands
23 | PUBLISH_OUTPUT_FOLDER: Publish
24 | PUBLISH_SELF_CONTAINED: false
25 | PUBLISH_SINGLE_FILE: false
26 | PUBLISH_READY_TO_RUN: false
27 | PUBLISH_AOT: false
28 | PUBLISH_TRIMMED: false
29 | PUBLISH_TRIM_MODE: partial # or full
30 |
31 | # Configuring GitHub Release
32 | IS_PRE_RELEASE: false
33 | SKIP_IF_RELEASE_EXIST: true
34 | MAKE_LATEST: true
35 | ALLOW_UPDATES: false
36 | ARTIFACT_ERRORS_FAIL_BUILD: false
37 |
38 | jobs:
39 | build:
40 | runs-on: windows-latest
41 | outputs: # For accessing them from 'release' job
42 | app-version: ${{ steps.get-version.outputs.version }}
43 | IS_PRE_RELEASE: ${{ env.IS_PRE_RELEASE }}
44 | strategy:
45 | matrix:
46 | platform: [x86, x64, ARM64] # Change platform if you want to build only a specific platform
47 |
48 | steps:
49 | - uses: actions/checkout@v4
50 | with:
51 | fetch-depth: 0
52 |
53 | - uses: actions/setup-dotnet@v4
54 | with:
55 | dotnet-version: |
56 | 8.x.x
57 | 9.x.x
58 |
59 | # Add CommunityToolkit Labs and Main nuget sources
60 | - run: |
61 | nuget sources add -name CommunityToolkit-Labs -source https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-Labs/nuget/v3/index.json
62 | nuget sources add -name CommunityToolkit-Main -source https://pkgs.dev.azure.com/dotnet/CommunityToolkit/_packaging/CommunityToolkit-MainLatest/nuget/v3/index.json
63 | if: contains(env.IS_COMMUNITY_TOOLKIT_NUGET_SOURCE_ENABLED, 'true')
64 |
65 | # Add Custom nuget sources
66 | - run: |
67 | $sources = $env:CUSTOM_NUGET_SOURCES -split ','
68 | $trimmedSources = $sources | ForEach-Object { $_.Trim() }
69 | $prefix = "CUSTOM_SOURCES_"
70 | for ($i = 0; $i -lt $trimmedSources.Length; $i++) {
71 | $sourceName = "${prefix}$($i + 1)"
72 | nuget sources add -name $sourceName -source $trimmedSources[$i]
73 | }
74 | if: contains(env.IS_CUSTOM_NUGET_SOURCE_ENABLED, 'true')
75 |
76 | # Reading version tag from the csproj file.
77 | - uses: kzrnm/get-net-sdk-project-versions-action@v2
78 | id: get-version
79 | with:
80 | proj-path: ${{ env.PROJECT_PATH }}
81 |
82 | # Building with configured commands
83 | - run: |
84 | $runtimeIdentifier = "${{ matrix.platform }}"
85 | dotnet publish ${{ env.PROJECT_PATH }} -c Release -r win-$($runtimeIdentifier.ToLower()) /p:GITHUB_ACTIONS=true -p:Platform=${{ matrix.platform }} --self-contained ${{ env.PUBLISH_SELF_CONTAINED }} -p:PublishSingleFile=${{ env.PUBLISH_SINGLE_FILE }} -p:PublishReadyToRun=${{ env.PUBLISH_READY_TO_RUN }} -p:PublishTrimmed=${{ env.PUBLISH_TRIMMED }} -p:TrimMode=${{ env.PUBLISH_TRIM_MODE }} -p:PublishAot=${{ env.PUBLISH_AOT }} --output ${{ env.PUBLISH_OUTPUT_FOLDER }}/${{ matrix.platform }}
86 |
87 | # Zipping folder and all files
88 | - uses: vimtor/action-zip@v1.2
89 | with:
90 | files: ${{ env.PUBLISH_OUTPUT_FOLDER }}/${{ matrix.platform }}
91 | recursive: true
92 | dest: ${{ env.APP_NAME }}-v${{ steps.get-version.outputs.version }}-${{ matrix.platform }}.zip
93 |
94 | # Uploading all zip files to access them in the 'release' job
95 | - uses: actions/upload-artifact@v4
96 | with:
97 | name: artifacts-${{ matrix.platform }}
98 | path: ${{ env.APP_NAME }}-v${{ steps.get-version.outputs.version }}-${{ matrix.platform }}.zip
99 |
100 | # Checking version suffix for words like [alpha, beta, preview, and experiment]. Marking the release as a pre-release if any exists.
101 | - run: |
102 | # Define the list of strings
103 | $list = @("beta", "alpha", "preview", "experiment")
104 |
105 | # Define the suffix variable
106 | $suffix = "${{ steps.get-version.outputs.version-suffix }}"
107 |
108 | foreach ($item in $list) {
109 | # Convert both strings to lower case for case-insensitive comparison
110 | if ($suffix.ToLower().StartsWith($item.ToLower())) {
111 | echo "IS_PRE_RELEASE=true" >> $env:GITHUB_ENV
112 | break
113 | }
114 | }
115 |
116 |
117 | release:
118 | needs: build
119 | runs-on: ubuntu-latest
120 | env:
121 | # Read some variables from the 'build' job
122 | APP_VERSION: ${{ needs.build.outputs.app-version }}
123 | IS_PRE_RELEASE: ${{ needs.build.outputs.IS_PRE_RELEASE }}
124 | steps:
125 | - uses: actions/checkout@v4
126 | with:
127 | fetch-depth: 0
128 |
129 | # Downloading all zip files into the GitHub root directory (uploaded in 'build' job)
130 | - uses: actions/download-artifact@v4
131 | with:
132 | merge-multiple: true
133 |
134 | # Configuring git to create a tag
135 | - run: |
136 | git config --local user.email "actions@github.com"
137 | git config --local user.name "GitHub Actions"
138 |
139 | TAG_NAME="v${{ env.APP_VERSION }}"
140 | if [[ "${{ env.CHECK_TAG_EXISTENCE_BEFORE_CREATING_TAG }}" == "true" ]]; then
141 | git fetch --tags
142 | if [[ $(git tag -l "$TAG_NAME") ]]; then
143 | echo "Tag found (already exist). Skipping to the next step"
144 | else
145 | echo "Tag not found, creating new tag"
146 | git tag "$TAG_NAME"
147 | git push origin "$TAG_NAME"
148 | fi
149 | else
150 | echo "Creating new tag"
151 | git tag "$TAG_NAME"
152 | git push origin "$TAG_NAME"
153 | fi
154 |
155 | # Installing a package for generating a changelog file
156 | - run: npm install -g auto-changelog
157 | - run: auto-changelog --tag-pattern .+ --commit-limit false --starting-version v${{ env.APP_VERSION }} --ending-version v${{ env.APP_VERSION }} --hide-credit
158 |
159 | # Creating a Release in GitHub
160 | - uses: ncipollo/release-action@v1
161 | with:
162 | artifacts: "${{ env.APP_NAME }}-v${{ env.APP_VERSION }}-*.zip"
163 | bodyFile: "CHANGELOG.md"
164 | name: v${{ env.APP_VERSION }}
165 | tag: v${{ env.APP_VERSION }}
166 | prerelease: ${{ env.IS_PRE_RELEASE }}
167 | skipIfReleaseExists: ${{ env.SKIP_IF_RELEASE_EXIST }}
168 | makeLatest: ${{ env.MAKE_LATEST }}
169 | allowUpdates: ${{ env.ALLOW_UPDATES }}
170 | artifactErrorsFailBuild: ${{ env.ARTIFACT_ERRORS_FAIL_BUILD }}
171 |
172 |
173 |
174 | # - uses: softprops/action-gh-release@v1
175 | # with:
176 | # name: v${{ env.APP_VERSION }}
177 | # tag_name: v${{ env.APP_VERSION }}
178 | # body_path: CHANGELOG.md
179 | # prerelease: ${{ env.PUBLISH_PRE_RELEASE }}
180 | # files: |
181 | # ${{ env.APP_NAME }}-v${{ env.APP_VERSION }}-*.zip
182 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Ww][Ii][Nn]32/
27 | [Aa][Rr][Mm]/
28 | [Aa][Rr][Mm]64/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Ll]og/
33 | [Ll]ogs/
34 |
35 | # Visual Studio 2015/2017 cache/options directory
36 | .vs/
37 | # Uncomment if you have tasks that create the project's static files in wwwroot
38 | #wwwroot/
39 |
40 | # Visual Studio 2017 auto generated files
41 | Generated\ Files/
42 |
43 | # MSTest test Results
44 | [Tt]est[Rr]esult*/
45 | [Bb]uild[Ll]og.*
46 |
47 | # NUnit
48 | *.VisualState.xml
49 | TestResult.xml
50 | nunit-*.xml
51 |
52 | # Build Results of an ATL Project
53 | [Dd]ebugPS/
54 | [Rr]eleasePS/
55 | dlldata.c
56 |
57 | # Benchmark Results
58 | BenchmarkDotNet.Artifacts/
59 |
60 | # .NET Core
61 | project.lock.json
62 | project.fragment.lock.json
63 | artifacts/
64 |
65 | # ASP.NET Scaffolding
66 | ScaffoldingReadMe.txt
67 |
68 | # StyleCop
69 | StyleCopReport.xml
70 |
71 | # Files built by Visual Studio
72 | *_i.c
73 | *_p.c
74 | *_h.h
75 | *.ilk
76 | *.meta
77 | *.obj
78 | *.iobj
79 | *.pch
80 | *.pdb
81 | *.ipdb
82 | *.pgc
83 | *.pgd
84 | *.rsp
85 | *.sbr
86 | *.tlb
87 | *.tli
88 | *.tlh
89 | *.tmp
90 | *.tmp_proj
91 | *_wpftmp.csproj
92 | *.log
93 | *.tlog
94 | *.vspscc
95 | *.vssscc
96 | .builds
97 | *.pidb
98 | *.svclog
99 | *.scc
100 |
101 | # Chutzpah Test files
102 | _Chutzpah*
103 |
104 | # Visual C++ cache files
105 | ipch/
106 | *.aps
107 | *.ncb
108 | *.opendb
109 | *.opensdf
110 | *.sdf
111 | *.cachefile
112 | *.VC.db
113 | *.VC.VC.opendb
114 |
115 | # Visual Studio profiler
116 | *.psess
117 | *.vsp
118 | *.vspx
119 | *.sap
120 |
121 | # Visual Studio Trace Files
122 | *.e2e
123 |
124 | # TFS 2012 Local Workspace
125 | $tf/
126 |
127 | # Guidance Automation Toolkit
128 | *.gpState
129 |
130 | # ReSharper is a .NET coding add-in
131 | _ReSharper*/
132 | *.[Rr]e[Ss]harper
133 | *.DotSettings.user
134 |
135 | # TeamCity is a build add-in
136 | _TeamCity*
137 |
138 | # DotCover is a Code Coverage Tool
139 | *.dotCover
140 |
141 | # AxoCover is a Code Coverage Tool
142 | .axoCover/*
143 | !.axoCover/settings.json
144 |
145 | # Coverlet is a free, cross platform Code Coverage Tool
146 | coverage*.json
147 | coverage*.xml
148 | coverage*.info
149 |
150 | # Visual Studio code coverage results
151 | *.coverage
152 | *.coveragexml
153 |
154 | # NCrunch
155 | _NCrunch_*
156 | .*crunch*.local.xml
157 | nCrunchTemp_*
158 |
159 | # MightyMoose
160 | *.mm.*
161 | AutoTest.Net/
162 |
163 | # Web workbench (sass)
164 | .sass-cache/
165 |
166 | # Installshield output folder
167 | [Ee]xpress/
168 |
169 | # DocProject is a documentation generator add-in
170 | DocProject/buildhelp/
171 | DocProject/Help/*.HxT
172 | DocProject/Help/*.HxC
173 | DocProject/Help/*.hhc
174 | DocProject/Help/*.hhk
175 | DocProject/Help/*.hhp
176 | DocProject/Help/Html2
177 | DocProject/Help/html
178 |
179 | # Click-Once directory
180 | publish/
181 |
182 | # Publish Web Output
183 | *.[Pp]ublish.xml
184 | *.azurePubxml
185 | # Note: Comment the next line if you want to checkin your web deploy settings,
186 | # but database connection strings (with potential passwords) will be unencrypted
187 | *.pubxml
188 | *.publishproj
189 |
190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
191 | # checkin your Azure Web App publish settings, but sensitive information contained
192 | # in these scripts will be unencrypted
193 | PublishScripts/
194 |
195 | # NuGet Packages
196 | *.nupkg
197 | # NuGet Symbol Packages
198 | *.snupkg
199 | # The packages folder can be ignored because of Package Restore
200 | **/[Pp]ackages/*
201 | # except build/, which is used as an MSBuild target.
202 | !**/[Pp]ackages/build/
203 | # Uncomment if necessary however generally it will be regenerated when needed
204 | #!**/[Pp]ackages/repositories.config
205 | # NuGet v3's project.json files produces more ignorable files
206 | *.nuget.props
207 | *.nuget.targets
208 |
209 | # Microsoft Azure Build Output
210 | csx/
211 | *.build.csdef
212 |
213 | # Microsoft Azure Emulator
214 | ecf/
215 | rcf/
216 |
217 | # Windows Store app package directories and files
218 | AppPackages/
219 | BundleArtifacts/
220 | Package.StoreAssociation.xml
221 | _pkginfo.txt
222 | *.appx
223 | *.appxbundle
224 | *.appxupload
225 |
226 | # Visual Studio cache files
227 | # files ending in .cache can be ignored
228 | *.[Cc]ache
229 | # but keep track of directories ending in .cache
230 | !?*.[Cc]ache/
231 |
232 | # Others
233 | ClientBin/
234 | ~$*
235 | *~
236 | *.dbmdl
237 | *.dbproj.schemaview
238 | *.jfm
239 | *.pfx
240 | *.publishsettings
241 | orleans.codegen.cs
242 |
243 | # Including strong name files can present a security risk
244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
245 | #*.snk
246 |
247 | # Since there are multiple workflows, uncomment next line to ignore bower_components
248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
249 | #bower_components/
250 |
251 | # RIA/Silverlight projects
252 | Generated_Code/
253 |
254 | # Backup & report files from converting an old project file
255 | # to a newer Visual Studio version. Backup files are not needed,
256 | # because we have git ;-)
257 | _UpgradeReport_Files/
258 | Backup*/
259 | UpgradeLog*.XML
260 | UpgradeLog*.htm
261 | ServiceFabricBackup/
262 | *.rptproj.bak
263 |
264 | # SQL Server files
265 | *.mdf
266 | *.ldf
267 | *.ndf
268 |
269 | # Business Intelligence projects
270 | *.rdl.data
271 | *.bim.layout
272 | *.bim_*.settings
273 | *.rptproj.rsuser
274 | *- [Bb]ackup.rdl
275 | *- [Bb]ackup ([0-9]).rdl
276 | *- [Bb]ackup ([0-9][0-9]).rdl
277 |
278 | # Microsoft Fakes
279 | FakesAssemblies/
280 |
281 | # GhostDoc plugin setting file
282 | *.GhostDoc.xml
283 |
284 | # Node.js Tools for Visual Studio
285 | .ntvs_analysis.dat
286 | node_modules/
287 |
288 | # Visual Studio 6 build log
289 | *.plg
290 |
291 | # Visual Studio 6 workspace options file
292 | *.opt
293 |
294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
295 | *.vbw
296 |
297 | # Visual Studio 6 auto-generated project file (contains which files were open etc.)
298 | *.vbp
299 |
300 | # Visual Studio 6 workspace and project file (working project files containing files to include in project)
301 | *.dsw
302 | *.dsp
303 |
304 | # Visual Studio 6 technical files
305 | *.ncb
306 | *.aps
307 |
308 | # Visual Studio LightSwitch build output
309 | **/*.HTMLClient/GeneratedArtifacts
310 | **/*.DesktopClient/GeneratedArtifacts
311 | **/*.DesktopClient/ModelManifest.xml
312 | **/*.Server/GeneratedArtifacts
313 | **/*.Server/ModelManifest.xml
314 | _Pvt_Extensions
315 |
316 | # Paket dependency manager
317 | .paket/paket.exe
318 | paket-files/
319 |
320 | # FAKE - F# Make
321 | .fake/
322 |
323 | # CodeRush personal settings
324 | .cr/personal
325 |
326 | # Python Tools for Visual Studio (PTVS)
327 | __pycache__/
328 | *.pyc
329 |
330 | # Cake - Uncomment if you are using it
331 | # tools/**
332 | # !tools/packages.config
333 |
334 | # Tabs Studio
335 | *.tss
336 |
337 | # Telerik's JustMock configuration file
338 | *.jmconfig
339 |
340 | # BizTalk build output
341 | *.btp.cs
342 | *.btm.cs
343 | *.odx.cs
344 | *.xsd.cs
345 |
346 | # OpenCover UI analysis results
347 | OpenCover/
348 |
349 | # Azure Stream Analytics local run output
350 | ASALocalRun/
351 |
352 | # MSBuild Binary and Structured Log
353 | *.binlog
354 |
355 | # NVidia Nsight GPU debugger configuration file
356 | *.nvuser
357 |
358 | # MFractors (Xamarin productivity tool) working folder
359 | .mfractor/
360 |
361 | # Local History for Visual Studio
362 | .localhistory/
363 |
364 | # Visual Studio History (VSHistory) files
365 | .vshistory/
366 |
367 | # BeatPulse healthcheck temp database
368 | healthchecksdb
369 |
370 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
371 | MigrationBackup/
372 |
373 | # Ionide (cross platform F# VS Code tools) working folder
374 | .ionide/
375 |
376 | # Fody - auto-generated XML schema
377 | FodyWeavers.xsd
378 |
379 | # VS Code files for those working on multiple tools
380 | .vscode/*
381 | !.vscode/settings.json
382 | !.vscode/tasks.json
383 | !.vscode/launch.json
384 | !.vscode/extensions.json
385 | *.code-workspace
386 |
387 | # Local History for Visual Studio Code
388 | .history/
389 |
390 | # Windows Installer files from build outputs
391 | *.cab
392 | *.msi
393 | *.msix
394 | *.msm
395 | *.msp
396 |
397 | # JetBrains Rider
398 | *.sln.iml
399 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Mahdi Hosseini
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 |
--------------------------------------------------------------------------------
/Policy:
--------------------------------------------------------------------------------
1 | Privacy Policy for RainbowFrame
2 |
3 | This privacy policy describes how [Mahdi Hosseini] ("we", "us", or "our") collects, uses, and protects your data when you use the RainbowFrame app ("the app").
4 |
5 | What data do we collect?
6 |
7 | The app does not collect any personal data from you or your device.
8 |
9 | Changes to this policy
10 |
11 | We may update this policy from time to time to reflect changes in our practices or applicable laws.
12 |
13 | Contact us
14 |
15 | If you have any questions or concerns about this policy or our data practices, please contact us at [mahdidvb72@gmail.com]. We will be happy to assist you.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # RainbowFrame
2 | Change any window Border color to static color or rainbow effect
3 |
4 | ## Install
5 | ### Recommended
6 | Install from MS Store
7 |
8 |
10 |
11 |
12 |
13 | ### Github Release
14 | you can download from Github Release Section:
15 | - Download frome [Release](https://github.com/ghost1372/RainbowFrame/releases)
16 |
17 | 
18 | 
19 | 
20 | 
21 |
22 |
23 |
--------------------------------------------------------------------------------
/RainbowFrame.slnx:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/dev/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | 40,48,0,0
15 | 0,0,40,0
16 | M512 0C229.12 0 0 229.12 0 512c0 226.56 146.56 417.92 350.08 485.76 25.6 4.48 35.2-10.88 35.2-24.32 0-12.16-0.64-52.48-0.64-95.36-128.64 23.68-161.92-31.36-172.16-60.16-5.76-14.72-30.72-60.16-52.48-72.32-17.92-9.6-43.52-33.28-0.64-33.92 40.32-0.64 69.12 37.12 78.72 52.48 46.08 77.44 119.68 55.68 149.12 42.24 4.48-33.28 17.92-55.68 32.64-68.48-113.92-12.8-232.96-56.96-232.96-252.8 0-55.68 19.84-101.76 52.48-137.6-5.12-12.8-23.04-65.28 5.12-135.68 0 0 42.88-13.44 140.8 52.48 40.96-11.52 84.48-17.28 128-17.28 43.52 0 87.04 5.76 128 17.28 97.92-66.56 140.8-52.48 140.8-52.48 28.16 70.4 10.24 122.88 5.12 135.68 32.64 35.84 52.48 81.28 52.48 137.6 0 196.48-119.68 240-233.6 252.8 18.56 16 34.56 46.72 34.56 94.72 0 68.48-0.64 123.52-0.64 140.8 0 13.44 9.6 29.44 35.2 24.32A512.832 512.832 0 0 0 1024 512c0-282.88-229.12-512-512-512z
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/dev/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.DependencyInjection;
2 | using RainbowFrame.ViewModels;
3 |
4 | namespace RainbowFrame;
5 | public partial class App : Application
6 | {
7 | public static Window MainWindow = Window.Current;
8 | public new static App Current => (App)Application.Current;
9 | public IServiceProvider Services { get; }
10 | public IThemeService ThemeService => GetService();
11 | public IJsonNavigationService NavService => GetService();
12 |
13 | public static T GetService() where T : class
14 | {
15 | if ((App.Current as App)!.Services.GetService(typeof(T)) is not T service)
16 | {
17 | throw new ArgumentException($"{typeof(T)} needs to be registered in ConfigureServices within App.xaml.cs.");
18 | }
19 |
20 | return service;
21 | }
22 |
23 | public App()
24 | {
25 | Services = ConfigureServices();
26 | this.InitializeComponent();
27 | }
28 | private static IServiceProvider ConfigureServices()
29 | {
30 | var services = new ServiceCollection();
31 |
32 | services.AddSingleton();
33 | services.AddSingleton();
34 |
35 | services.AddTransient();
36 | services.AddTransient();
37 | services.AddTransient();
38 |
39 | return services.BuildServiceProvider();
40 | }
41 | protected override void OnLaunched(LaunchActivatedEventArgs args)
42 | {
43 | MainWindow = new MainWindow();
44 |
45 | if (this.ThemeService != null)
46 | {
47 | this.ThemeService.AutoInitialize(MainWindow);
48 | }
49 |
50 | MainWindow.Title = MainWindow.AppWindow.Title = ProcessInfoHelper.ProductNameAndVersion;
51 | MainWindow.AppWindow.SetIcon("Assets/icon.ico");
52 |
53 | MainWindow.Activate();
54 | }
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Acrylic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Acrylic.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Color.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Color.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/ColorPicker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/ColorPicker.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/External.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/External.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Info.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Reset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Reset.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Settings.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Speed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Speed.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/StartStop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/StartStop.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Theme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Theme.png
--------------------------------------------------------------------------------
/dev/Assets/Fluent/Update.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Fluent/Update.png
--------------------------------------------------------------------------------
/dev/Assets/NavViewMenu/AppData.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://raw.githubusercontent.com/Ghost1372/DevWinUI/refs/heads/main/AppData.Schema.json",
3 | "Groups": [
4 | {
5 | "UniqueId": "RainbowFrame.Views.MainPage",
6 | "ShowItemsWithoutGroup": true,
7 | "Items": [
8 | {
9 | "UniqueId": "RainbowFrame.Views.MainPage",
10 | "Title": "Home",
11 | "HideItem": true
12 | }
13 | ]
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/dev/Assets/Store/LargeTile.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/LargeTile.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/LargeTile.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/LargeTile.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/LargeTile.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/LargeTile.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/LargeTile.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/LargeTile.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/LargeTile.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/LargeTile.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/Store/LockScreenLogo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/LockScreenLogo.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SmallTile.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SmallTile.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SmallTile.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SmallTile.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SmallTile.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SmallTile.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SmallTile.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SmallTile.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SmallTile.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SmallTile.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SplashScreen.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SplashScreen.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SplashScreen.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SplashScreen.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SplashScreen.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SplashScreen.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SplashScreen.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SplashScreen.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/SplashScreen.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/SplashScreen.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square150x150Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square150x150Logo.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square150x150Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square150x150Logo.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square150x150Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square150x150Logo.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square150x150Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square150x150Logo.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square150x150Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square150x150Logo.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-16.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-24.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-256.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-32.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-lightunplated_targetsize-48.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-16.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-256.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-32.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.altform-unplated_targetsize-48.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.targetsize-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.targetsize-16.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.targetsize-24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.targetsize-24.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.targetsize-24_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.targetsize-24_altform-unplated.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.targetsize-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.targetsize-256.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.targetsize-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.targetsize-32.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Square44x44Logo.targetsize-48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Square44x44Logo.targetsize-48.png
--------------------------------------------------------------------------------
/dev/Assets/Store/StoreLogo.backup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/StoreLogo.backup.png
--------------------------------------------------------------------------------
/dev/Assets/Store/StoreLogo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/StoreLogo.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/StoreLogo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/StoreLogo.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/StoreLogo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/StoreLogo.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/StoreLogo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/StoreLogo.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/StoreLogo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/StoreLogo.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Wide310x150Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Wide310x150Logo.scale-100.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Wide310x150Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Wide310x150Logo.scale-125.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Wide310x150Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Wide310x150Logo.scale-150.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Wide310x150Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Wide310x150Logo.scale-200.png
--------------------------------------------------------------------------------
/dev/Assets/Store/Wide310x150Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/Store/Wide310x150Logo.scale-400.png
--------------------------------------------------------------------------------
/dev/Assets/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/icon.ico
--------------------------------------------------------------------------------
/dev/Assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ghost1372/RainbowFrame/9d124b8bd065f1b5f86ed9b25f6b6ffcb40a48bc/dev/Assets/icon.png
--------------------------------------------------------------------------------
/dev/Common/AppConfig.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.ObjectModel;
2 | using Nucs.JsonSettings.Examples;
3 | using Nucs.JsonSettings.Modulation;
4 |
5 | namespace RainbowFrame.Common;
6 |
7 | [GenerateAutoSaveOnChange]
8 | public partial class AppConfig : NotifiyingJsonSettings, IVersionable
9 | {
10 | [EnforcedVersion("2.0.0.0")]
11 | public Version Version { get; set; } = new Version(2, 0, 0, 0);
12 |
13 | private string fileName { get; set; } = Constants.AppConfigPath;
14 | private bool useTrayIcon { get; set; } = true;
15 | private bool isFirstTrayIcon { get; set; } = true;
16 | private bool resetWhenClosed { get; set; }
17 | private bool activeWindow { get; set; }
18 | private string lastUpdateCheck { get; set; }
19 | private ObservableCollection rainbowWindows { get; set; } = new();
20 | }
21 |
22 | public partial class RainbowWindow
23 | {
24 | public nint HWND { get; set; }
25 | public string Title { get; set; }
26 | public int Speed { get; set; }
27 | }
28 |
--------------------------------------------------------------------------------
/dev/Common/AppHelper.cs:
--------------------------------------------------------------------------------
1 | using Nucs.JsonSettings;
2 | using Nucs.JsonSettings.Fluent;
3 | using Nucs.JsonSettings.Modulation;
4 | using Nucs.JsonSettings.Modulation.Recovery;
5 |
6 | namespace RainbowFrame.Common;
7 | public static partial class AppHelper
8 | {
9 | public static AppConfig Settings = JsonSettings.Configure()
10 | .WithRecovery(RecoveryAction.RenameAndLoadDefault)
11 | .WithVersioning(VersioningResultAction.RenameAndLoadDefault)
12 | .LoadNow();
13 | }
14 |
15 |
--------------------------------------------------------------------------------
/dev/Common/BreadcrumbPageMappings.cs:
--------------------------------------------------------------------------------
1 | namespace RainbowFrame.Common;
2 | public partial class BreadcrumbPageMappings
3 | {
4 | public static Dictionary PageDictionary = new()
5 | {
6 | {typeof(RainbowFrame.Views.SettingsPage), new BreadcrumbPageConfig { PageTitle = null, IsHeaderVisible = true, ClearNavigation = false}},
7 | {typeof(RainbowFrame.Views.AboutUsSettingPage), new BreadcrumbPageConfig { PageTitle = null, IsHeaderVisible = true, ClearNavigation = false}},
8 | {typeof(RainbowFrame.Views.AppUpdateSettingPage), new BreadcrumbPageConfig { PageTitle = null, IsHeaderVisible = true, ClearNavigation = false}},
9 | {typeof(RainbowFrame.Views.GeneralSettingPage), new BreadcrumbPageConfig { PageTitle = null, IsHeaderVisible = true, ClearNavigation = false}},
10 | {typeof(RainbowFrame.Views.ThemeSettingPage), new BreadcrumbPageConfig { PageTitle = null, IsHeaderVisible = true, ClearNavigation = false}},
11 | };
12 | }
13 |
--------------------------------------------------------------------------------
/dev/Common/Constants.cs:
--------------------------------------------------------------------------------
1 | namespace RainbowFrame.Common;
2 |
3 | public static partial class Constants
4 | {
5 | public static readonly string RootDirectoryPath = Path.Combine(PathHelper.GetAppDataFolderPath(), ProcessInfoHelper.ProductNameAndVersion);
6 | public static readonly string AppConfigPath = Path.Combine(RootDirectoryPath, "AppConfig.json");
7 | }
8 |
--------------------------------------------------------------------------------
/dev/Common/ContentDialogEx.cs:
--------------------------------------------------------------------------------
1 | namespace RainbowFrame.Common;
2 | public static partial class ContentDialogEx
3 | {
4 | private static TaskCompletionSource _contentDialogShowRequest;
5 |
6 | public static async Task ShowAsyncQueue(this ContentDialog dialog)
7 | {
8 | while (_contentDialogShowRequest != null)
9 | {
10 | await _contentDialogShowRequest.Task;
11 | }
12 |
13 | var request = _contentDialogShowRequest = new TaskCompletionSource();
14 | var result = await dialog.ShowAsync();
15 | _contentDialogShowRequest = null;
16 | request.SetResult(dialog);
17 |
18 | return result;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/dev/Common/NativeMethods.cs:
--------------------------------------------------------------------------------
1 | using System.Runtime.InteropServices;
2 |
3 | namespace RainbowFrame.Common;
4 | internal partial class NativeMethods
5 | {
6 | internal delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime);
7 |
8 | [DllImport("user32.dll")]
9 | internal static extern bool IsWindowVisible(IntPtr hWnd);
10 |
11 | [DllImport("user32.dll")]
12 | internal static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags);
13 |
14 | [DllImport("user32.dll")]
15 | internal static extern IntPtr GetForegroundWindow();
16 | }
17 |
--------------------------------------------------------------------------------
/dev/Common/NavigationPageMappings.cs:
--------------------------------------------------------------------------------
1 | namespace RainbowFrame.Common;
2 | public partial class NavigationPageMappings
3 | {
4 | public static Dictionary PageDictionary { get; } = new Dictionary
5 | {
6 | {"RainbowFrame.Views.MainPage", typeof(RainbowFrame.Views.MainPage)},
7 | };
8 | }
9 |
--------------------------------------------------------------------------------
/dev/GlobalUsings.cs:
--------------------------------------------------------------------------------
1 | global using DevWinUI;
2 | global using Microsoft.UI.Xaml;
3 | global using Microsoft.UI.Xaml.Controls;
4 | global using static RainbowFrame.Common.AppHelper;
5 |
6 |
--------------------------------------------------------------------------------
/dev/MainWindow.xaml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
14 |
15 |
16 |
17 |
23 |
30 |
31 |
34 |
35 |
36 |
37 |
45 |
46 |
47 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
63 |
64 |
65 |
67 |
68 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/dev/MainWindow.xaml.cs:
--------------------------------------------------------------------------------
1 | using RainbowFrame.Common;
2 | using RainbowFrame.Views;
3 |
4 | namespace RainbowFrame;
5 |
6 | public sealed partial class MainWindow : Window
7 | {
8 | internal static MainWindow Instance { get; private set; }
9 | public IDelegateCommand ShowHideWindowCommand { get; }
10 | public IDelegateCommand ExitCommand { get; }
11 | public MainWindow()
12 | {
13 | this.InitializeComponent();
14 | Instance = this;
15 |
16 | ShowHideWindowCommand = DelegateCommand.Create(OnShowHideWindow);
17 | ExitCommand = DelegateCommand.Create(OnExit);
18 |
19 | ExtendsContentIntoTitleBar = true;
20 | SetTitleBar(AppTitleBar);
21 | AppWindow.TitleBar.PreferredHeightOption = Microsoft.UI.Windowing.TitleBarHeightOption.Tall;
22 |
23 | var NavService = App.GetService() as JsonNavigationService;
24 | if (NavService != null)
25 | {
26 | NavService.Initialize(NavView, NavFrame, NavigationPageMappings.PageDictionary)
27 | .ConfigureDefaultPage(typeof(MainPage))
28 | .ConfigureSettingsPage(typeof(SettingsPage))
29 | .ConfigureJsonFile("Assets/NavViewMenu/AppData.json", OrderItemsType.AscendingBoth)
30 | .ConfigureTitleBar(AppTitleBar)
31 | .ConfigureBreadcrumbBar(BreadCrumbNav, BreadcrumbPageMappings.PageDictionary);
32 | }
33 | Closed += MainWindow_Closed;
34 | }
35 |
36 | private async void MainWindow_Closed(object sender, WindowEventArgs args)
37 | {
38 | args.Handled = true;
39 | if (Settings.IsFirstTrayIcon)
40 | {
41 | ContentDialog contentDialog = new ContentDialog();
42 | contentDialog.XamlRoot = App.MainWindow.Content.XamlRoot;
43 | contentDialog.Loaded += (s, e) =>
44 | {
45 | contentDialog.Content = "The app will continue running in the background and can be accessed from the system tray. You can enable or disable this notification in the app settings.";
46 | contentDialog.RequestedTheme = App.Current.ThemeService.GetElementTheme();
47 | };
48 | contentDialog.Title = "App Hidden to System Tray";
49 | contentDialog.PrimaryButtonText = "Ok";
50 | contentDialog.SecondaryButtonText = "Cancel";
51 | contentDialog.CloseButtonText = "Exit";
52 | contentDialog.PrimaryButtonClick += (s, e) =>
53 | {
54 | Settings.IsFirstTrayIcon = false;
55 | App.MainWindow.AppWindow.Hide();
56 | };
57 | contentDialog.CloseButtonClick += (s, e) =>
58 | {
59 | args.Handled = false;
60 | Close();
61 | Environment.Exit(0);
62 | };
63 | contentDialog.PrimaryButtonStyle = (Style)Application.Current.Resources["AccentButtonStyle"];
64 | await contentDialog.ShowAsyncQueue();
65 | }
66 | else
67 | {
68 | if (Settings.UseTrayIcon)
69 | {
70 | App.MainWindow.AppWindow.Hide();
71 | }
72 | else
73 | {
74 | args.Handled = false;
75 |
76 | if (Settings.ResetWhenClosed)
77 | {
78 | MainPage.Instance?.ViewModel?.ResetAll();
79 | }
80 | }
81 | }
82 | }
83 |
84 | private void ThemeButton_Click(object sender, RoutedEventArgs e)
85 | {
86 | ThemeService.ChangeThemeWithoutSave(App.MainWindow);
87 | }
88 |
89 | private void OnTextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
90 | {
91 | if (args.Reason == AutoSuggestionBoxTextChangeReason.UserInput)
92 | {
93 | string query = sender.Text;
94 |
95 | var filteredItems = MainPage.Instance?.ViewModel.Windows.Where(item =>
96 | (item.Text != null && item.Text.Contains(query, StringComparison.OrdinalIgnoreCase)) ||
97 | item.Handle.ToString().Contains(query)).ToList();
98 |
99 | MainPage.Instance?.SetListViewItemsSource(filteredItems);
100 | }
101 | }
102 |
103 | private void OnQuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
104 | {
105 |
106 | }
107 |
108 | private void KeyboardAccelerator_Invoked(Microsoft.UI.Xaml.Input.KeyboardAccelerator sender, Microsoft.UI.Xaml.Input.KeyboardAcceleratorInvokedEventArgs args)
109 | {
110 | HeaderAutoSuggestBox.Focus(FocusState.Programmatic);
111 | }
112 |
113 | public void OnShowHideWindow()
114 | {
115 | if (Visible)
116 | {
117 | AppWindow.Hide();
118 | }
119 | else
120 | {
121 | AppWindow.Show();
122 | }
123 | }
124 |
125 | public void OnExit()
126 | {
127 | if (Settings.ResetWhenClosed)
128 | {
129 | MainPage.Instance?.ViewModel?.ResetAll();
130 | }
131 | Environment.Exit(0);
132 | }
133 | }
134 |
135 |
--------------------------------------------------------------------------------
/dev/Package.appxmanifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
14 |
15 |
16 |
17 |
18 | RainbowFrame
19 | mahdi
20 | Assets\Store\StoreLogo.png
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
36 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/dev/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "RainbowFrame (Package)": {
4 | "commandName": "MsixPackage"
5 | },
6 | "RainbowFrame (Unpackaged)": {
7 | "commandName": "Project"
8 | }
9 | }
10 | }
--------------------------------------------------------------------------------
/dev/RainbowFrame.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | WinExe
4 | net9.0-windows10.0.19041.0
5 | 10.0.17763.0
6 | RainbowFrame
7 | app.manifest
8 | x86;x64;ARM64
9 | win-x86;win-x64;win-arm64
10 | win-$(Platform).pubxml
11 | true
12 | true
13 | 2.0.0
14 | true
15 | preview
16 | False
17 | Assets\icon.ico
18 | false
19 | true
20 | true
21 |
22 |
23 |
24 | False
25 | False
26 | False
27 | False
28 | False
29 |
30 |
31 |
32 |
33 | Always
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
60 |
61 |
62 |
63 |
64 |
69 |
70 | true
71 |
72 |
73 |
--------------------------------------------------------------------------------
/dev/ViewModels/AppUpdateSettingViewModel.cs:
--------------------------------------------------------------------------------
1 | using CommunityToolkit.Mvvm.ComponentModel;
2 | using CommunityToolkit.Mvvm.Input;
3 | using Windows.System;
4 |
5 | namespace RainbowFrame.ViewModels;
6 | public partial class AppUpdateSettingViewModel : ObservableObject
7 | {
8 | [ObservableProperty]
9 | public partial string CurrentVersion { get; set; }
10 |
11 | [ObservableProperty]
12 | public partial string LastUpdateCheck { get; set; }
13 |
14 | [ObservableProperty]
15 | public partial bool IsUpdateAvailable { get; set; }
16 |
17 | [ObservableProperty]
18 | public partial bool IsLoading { get; set; }
19 |
20 | [ObservableProperty]
21 | public partial bool IsCheckButtonEnabled { get; set; } = true;
22 |
23 | [ObservableProperty]
24 | public partial string LoadingStatus { get; set; } = "Status";
25 |
26 | private string ChangeLog = string.Empty;
27 |
28 | public AppUpdateSettingViewModel()
29 | {
30 | CurrentVersion = $"Current Version {ProcessInfoHelper.VersionWithPrefix}";
31 | LastUpdateCheck = Settings.LastUpdateCheck;
32 | }
33 |
34 | [RelayCommand]
35 | private async Task CheckForUpdateAsync()
36 | {
37 | IsLoading = true;
38 | IsUpdateAvailable = false;
39 | IsCheckButtonEnabled = false;
40 | LoadingStatus = "Checking for new version";
41 | if (NetworkHelper.IsNetworkAvailable())
42 | {
43 | try
44 | {
45 | string username = "Ghost1372";
46 | string repo = "RainbowFrame";
47 | LastUpdateCheck = DateTime.Now.ToShortDateString();
48 | Settings.LastUpdateCheck = DateTime.Now.ToShortDateString();
49 | var update = await UpdateHelper.CheckUpdateAsync(username, repo, new Version(ProcessInfoHelper.Version));
50 | if (update.StableRelease.IsExistNewVersion)
51 | {
52 | IsUpdateAvailable = true;
53 | ChangeLog = update.StableRelease.Changelog;
54 | LoadingStatus = $"We found a new version {update.StableRelease.TagName} Created at {update.StableRelease.CreatedAt} and Published at {update.StableRelease.PublishedAt}";
55 | }
56 | else if (update.PreRelease.IsExistNewVersion)
57 | {
58 | IsUpdateAvailable = true;
59 | ChangeLog = update.PreRelease.Changelog;
60 | LoadingStatus = $"We found a new PreRelease Version {update.PreRelease.TagName} Created at {update.PreRelease.CreatedAt} and Published at {update.PreRelease.PublishedAt}";
61 | }
62 | else
63 | {
64 | LoadingStatus = "You are using latest version";
65 | }
66 | }
67 | catch (Exception ex)
68 | {
69 | LoadingStatus = ex.Message;
70 | IsLoading = false;
71 | IsCheckButtonEnabled = true;
72 | }
73 | }
74 | else
75 | {
76 | LoadingStatus = "Error Connection";
77 | }
78 | IsLoading = false;
79 | IsCheckButtonEnabled = true;
80 | }
81 |
82 | [RelayCommand]
83 | private async Task GoToUpdateAsync()
84 | {
85 | await Launcher.LaunchUriAsync(new Uri("https://github.com/Ghost1372/RainbowFrame/releases"));
86 | }
87 |
88 | [RelayCommand]
89 | private async Task GetReleaseNotesAsync()
90 | {
91 | ContentDialog dialog = new ContentDialog()
92 | {
93 | Title = "Release Note",
94 | CloseButtonText = "Close",
95 | Content = new ScrollViewer
96 | {
97 | Content = new TextBlock
98 | {
99 | Text = ChangeLog,
100 | Margin = new Thickness(10)
101 | },
102 | Margin = new Thickness(10)
103 | },
104 | Margin = new Thickness(10),
105 | DefaultButton = ContentDialogButton.Close,
106 | XamlRoot = App.MainWindow.Content.XamlRoot
107 | };
108 |
109 | await dialog.ShowAsync();
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/dev/ViewModels/GeneralSettingViewModel.cs:
--------------------------------------------------------------------------------
1 | using CommunityToolkit.Mvvm.ComponentModel;
2 |
3 | namespace RainbowFrame.ViewModels;
4 | public partial class GeneralSettingViewModel : ObservableObject
5 | {
6 |
7 | }
8 |
--------------------------------------------------------------------------------
/dev/ViewModels/MainViewModel.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.ObjectModel;
2 | using CommunityToolkit.Mvvm.ComponentModel;
3 | using CommunityToolkit.Mvvm.Input;
4 | using RainbowFrame.Views;
5 | using static RainbowFrame.Common.NativeMethods;
6 |
7 | namespace RainbowFrame.ViewModels;
8 |
9 | public partial class MainViewModel : ObservableRecipient
10 | {
11 | private IntPtr _previousWindow;
12 | private const uint EVENT_SYSTEM_FOREGROUND = 0x0003;
13 | private const uint WINEVENT_OUTOFCONTEXT = 0;
14 | private WinEventDelegate _winEventDelegate;
15 |
16 | public Dictionary rainbowKeys = new();
17 |
18 | [ObservableProperty]
19 | public partial ObservableCollection Windows { get; set; } = new();
20 |
21 | [ObservableProperty]
22 | public partial object SelectedItem { get; set; }
23 |
24 | [ObservableProperty]
25 | public partial bool IsUIElementEnabled { get; set; }
26 |
27 | [ObservableProperty]
28 | public partial bool IsAllWindowToggled { get; set; }
29 |
30 | [ObservableProperty]
31 | public partial bool UseRainbowEffectForAllWindow { get; set; }
32 |
33 | [ObservableProperty]
34 | public partial int RainbowEffectSpeed { get; set; } = 4;
35 | public void OnEffectSpeedValueChanged()
36 | {
37 | Win32Window selectedItem = SelectedItem as Win32Window;
38 | OnEffectSpeedChangedBase(selectedItem, RainbowEffectSpeed);
39 | }
40 |
41 | [ObservableProperty]
42 | public partial int RainbowEffectSpeedAll { get; set; } = 4;
43 | public void OnEffectSpeedAllValueChanged()
44 | {
45 | foreach (var item in Windows)
46 | {
47 | OnEffectSpeedChangedBase(item, RainbowEffectSpeedAll);
48 | }
49 | }
50 |
51 | public MainViewModel()
52 | {
53 | StartTracking();
54 | }
55 | private List GetOpenWindows()
56 | {
57 | List _windows = new List();
58 | var topWindows = WindowHelper.GetTopLevelWindows();
59 |
60 | if (IsAllWindowToggled)
61 | {
62 | return topWindows.ToList();
63 | }
64 | else
65 | {
66 | return topWindows.Where(w => !string.IsNullOrEmpty(w.Text) && IsWindowVisible(w.Handle)).ToList();
67 | }
68 | }
69 |
70 | internal void StartRainbowBase(Win32Window window, int speed)
71 | {
72 | rainbowKeys.TryGetValue(window.Handle, out var rainbowFrame);
73 | if (window != null)
74 | {
75 | if (rainbowFrame == null)
76 | {
77 | rainbowFrame = new DevWinUI.RainbowFrame();
78 | rainbowFrame.Initialize(window.Handle);
79 | rainbowKeys.AddIfNotExists(window.Handle, rainbowFrame);
80 | }
81 | rainbowFrame?.UpdateEffectSpeed(speed);
82 | rainbowFrame?.StopRainbowFrame();
83 | rainbowFrame?.StartRainbowFrame();
84 |
85 | Settings.RainbowWindows.Add(new Common.RainbowWindow { HWND = window.Handle, Title = window.Text, Speed = speed });
86 | Settings.Save();
87 | }
88 | }
89 | internal void StopRainbowBase(Win32Window window)
90 | {
91 | if (window != null)
92 | {
93 | rainbowKeys.TryGetValue(window.Handle, out var rainbowFrame);
94 | rainbowFrame?.StopRainbowFrame();
95 | }
96 | }
97 | internal void ResetRainbowBase(Win32Window window)
98 | {
99 | if (window != null)
100 | {
101 | rainbowKeys.TryGetValue(window.Handle, out var rainbowFrame);
102 | rainbowFrame?.ResetFrameColorToDefault();
103 | }
104 | }
105 | internal void OnEffectSpeedChangedBase(Win32Window window, int speed)
106 | {
107 | if (window != null)
108 | {
109 | rainbowKeys.TryGetValue(window.Handle, out var rainbowFrame);
110 | rainbowFrame?.UpdateEffectSpeed(speed);
111 | }
112 | }
113 |
114 | [RelayCommand]
115 | private void OnAllWindowToggled()
116 | {
117 | OnRefresh();
118 | }
119 |
120 | [RelayCommand]
121 | private void OnStartRainbowForAll()
122 | {
123 | foreach (var item in Windows)
124 | {
125 | StartRainbowBase(item, RainbowEffectSpeedAll);
126 | }
127 | }
128 |
129 | [RelayCommand]
130 | private void OnStopRainbowForAll()
131 | {
132 | foreach (var item in Windows)
133 | {
134 | StopRainbowBase(item);
135 | }
136 | }
137 |
138 | [RelayCommand]
139 | private void OnStartRainbow()
140 | {
141 | Win32Window selectedItem = SelectedItem as Win32Window;
142 | StartRainbowBase(selectedItem, RainbowEffectSpeed);
143 | }
144 |
145 | [RelayCommand]
146 | private void OnStopRainbow()
147 | {
148 | Win32Window selectedItem = SelectedItem as Win32Window;
149 | StopRainbowBase(selectedItem);
150 | }
151 |
152 | [RelayCommand]
153 | private void OnResetAll()
154 | {
155 | foreach (var item in Windows)
156 | {
157 | ResetRainbowBase(item);
158 | }
159 |
160 | Settings.RainbowWindows.Clear();
161 | Settings.Save();
162 | }
163 |
164 | [RelayCommand]
165 | private void OnReset()
166 | {
167 | Win32Window selectedItem = SelectedItem as Win32Window;
168 | ResetRainbowBase(selectedItem);
169 |
170 | var rbWindow = Settings.RainbowWindows.Where(x => x.HWND == selectedItem.Handle).FirstOrDefault();
171 | if (rbWindow != null)
172 | {
173 | Settings.RainbowWindows.Remove(rbWindow);
174 | Settings.Save();
175 | }
176 | }
177 |
178 | [RelayCommand]
179 | private async Task OnChooseColor()
180 | {
181 | var scrollViewer = new ScrollViewer { Margin = new Thickness(10) };
182 | var colorPicker = new ColorPicker
183 | {
184 | ColorSpectrumShape = ColorSpectrumShape.Ring,
185 | IsMoreButtonVisible = false,
186 | IsColorSliderVisible = true,
187 | IsColorChannelTextInputVisible = true,
188 | IsHexInputVisible = true,
189 | IsAlphaEnabled = true,
190 | IsAlphaSliderVisible = true,
191 | IsAlphaTextInputVisible = true,
192 | Margin = new Thickness(10)
193 | };
194 | Win32Window selectedItem = SelectedItem as Win32Window;
195 | rainbowKeys.TryGetValue(selectedItem.Handle, out var rainbowFrame);
196 | colorPicker.ColorChanged += (s, e) =>
197 | {
198 | try
199 | {
200 | if (selectedItem != null)
201 | {
202 | if (rainbowFrame == null)
203 | {
204 | rainbowFrame = new DevWinUI.RainbowFrame();
205 | rainbowFrame.Initialize(selectedItem.Handle);
206 | rainbowKeys.AddIfNotExists(selectedItem.Handle, rainbowFrame);
207 | }
208 | rainbowFrame?.StopRainbowFrame();
209 | rainbowFrame?.ChangeFrameColor(e.NewColor);
210 | }
211 | }
212 | catch (Exception)
213 | {
214 | }
215 | };
216 |
217 | scrollViewer.Content = colorPicker;
218 | ContentDialog contentDialog = new ContentDialog();
219 | contentDialog.XamlRoot = App.MainWindow.Content.XamlRoot;
220 | contentDialog.Loaded += (s, e) =>
221 | {
222 | contentDialog.Content = scrollViewer;
223 | contentDialog.RequestedTheme = App.Current.ThemeService.GetElementTheme();
224 | };
225 | contentDialog.Title = "Choose Color";
226 | contentDialog.PrimaryButtonText = "Ok";
227 | contentDialog.SecondaryButtonText = "Cancel";
228 | contentDialog.SecondaryButtonClick += (s, e) =>
229 | {
230 | rainbowFrame?.ResetFrameColorToDefault();
231 | };
232 | contentDialog.PrimaryButtonStyle = (Style)Application.Current.Resources["AccentButtonStyle"];
233 | await contentDialog.ShowAsync();
234 | }
235 |
236 | [RelayCommand]
237 | private void OnRefresh()
238 | {
239 | Windows = new ObservableCollection(GetOpenWindows());
240 | }
241 | public void ResetAll()
242 | {
243 | foreach (var rainbow in rainbowKeys.Values)
244 | {
245 | rainbow?.ResetFrameColorToDefault();
246 | }
247 | }
248 |
249 | public void StartTracking()
250 | {
251 | _winEventDelegate = new WinEventDelegate(WinEventProc);
252 | SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, _winEventDelegate, 0, 0, WINEVENT_OUTOFCONTEXT);
253 | }
254 |
255 | private void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
256 | {
257 | IntPtr activeWindowHandle = GetForegroundWindow();
258 | if (!Windows.Where(x => x.Handle == activeWindowHandle).Any())
259 | {
260 | OnRefresh();
261 | }
262 |
263 | if (activeWindowHandle != _previousWindow)
264 | {
265 | // If the previously focused window is not null, reset the rainbow effect
266 | if (_previousWindow != IntPtr.Zero && Settings.ActiveWindow)
267 | {
268 | ResetRainbowBase(new Win32Window(_previousWindow));
269 | }
270 |
271 | // Update the tracked window
272 | _previousWindow = activeWindowHandle;
273 |
274 | // Start the rainbow effect on the new active window
275 | if (Settings.ActiveWindow || UseRainbowEffectForAllWindow)
276 | {
277 | StartRainbowBase(new Win32Window(activeWindowHandle), RainbowEffectSpeedAll);
278 | }
279 | }
280 | }
281 |
282 | [RelayCommand]
283 | private void OnNavigateToSettings()
284 | {
285 | App.Current.NavService.NavigateTo(typeof(SettingsPage));
286 | }
287 | }
288 |
--------------------------------------------------------------------------------
/dev/Views/ControlCenterPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
13 |
18 |
20 |
21 |
25 |
32 |
33 |
34 |
35 |
38 |
42 |
43 |
47 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/dev/Views/ControlCenterPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.UI.Xaml.Navigation;
2 | using RainbowFrame.ViewModels;
3 |
4 | namespace RainbowFrame.Views;
5 |
6 | public sealed partial class ControlCenterPage : Page
7 | {
8 | public MainViewModel ViewModel { get; set; }
9 | public ControlCenterPage()
10 | {
11 | ViewModel = MainPage.Instance.ViewModel;
12 | this.InitializeComponent();
13 | }
14 | protected override void OnNavigatedTo(NavigationEventArgs e)
15 | {
16 | base.OnNavigatedTo(e);
17 | Win32Window selectedItem = ViewModel.SelectedItem as Win32Window;
18 | if (selectedItem != null)
19 | {
20 | var itemExist = Settings.RainbowWindows.Where(x => x.HWND == selectedItem.Handle).FirstOrDefault();
21 | if (itemExist != null)
22 | {
23 | TGRainbowEffectForWindow.IsOn = true;
24 | NBSpeed.Value = itemExist.Speed;
25 | }
26 | }
27 | }
28 | private void NumberBox_ValueChanged(NumberBox sender, NumberBoxValueChangedEventArgs args)
29 | {
30 | ViewModel?.OnEffectSpeedValueChanged();
31 | }
32 |
33 | private void OnRainbowEffectForWindow_Toggled(object sender, RoutedEventArgs e)
34 | {
35 | if (TGRainbowEffectForWindow.IsOn)
36 | {
37 | ViewModel.StartRainbowCommand.Execute(null);
38 | }
39 | else
40 | {
41 | ViewModel.StopRainbowCommand.Execute(null);
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/dev/Views/MainPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
25 |
26 |
30 |
31 |
32 |
33 |
35 |
40 |
45 |
46 |
47 |
48 |
51 |
52 |
53 |
54 |
55 |
60 |
61 |
62 |
63 |
65 |
66 |
69 |
70 |
71 |
72 |
73 |
74 |
76 |
78 |
79 |
80 |
81 |
82 |
86 |
87 |
88 |
94 |
95 |
96 |
97 |
98 |
100 |
101 |
102 |
103 |
104 |
105 |
108 |
111 |
112 |
115 |
120 |
121 |
122 |
123 |
126 |
129 |
130 |
131 |
133 |
134 |
135 |
136 |
--------------------------------------------------------------------------------
/dev/Views/MainPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using RainbowFrame.ViewModels;
2 |
3 | namespace RainbowFrame.Views;
4 |
5 | public sealed partial class MainPage : Page
6 | {
7 | public MainViewModel ViewModel { get; }
8 | internal static MainPage Instance { get; private set; }
9 | public MainPage()
10 | {
11 | ViewModel = App.GetService();
12 |
13 | this.InitializeComponent();
14 | Instance = this;
15 | Loaded += MainPage_Loaded;
16 | }
17 |
18 | private void MainPage_Loaded(object sender, RoutedEventArgs e)
19 | {
20 | ViewModel.RefreshCommand.Execute(null);
21 | }
22 |
23 | private void OnRainbowEffectForAllWindow_Toggled(object sender, RoutedEventArgs e)
24 | {
25 | if (TGRainbowEffectForAllWindow.IsOn)
26 | {
27 | ViewModel.StartRainbowForAllCommand.Execute(null);
28 | }
29 | else
30 | {
31 | ViewModel.StopRainbowForAllCommand.Execute(null);
32 | }
33 | }
34 |
35 | private void listView_SelectionChanged(object sender, SelectionChangedEventArgs e)
36 | {
37 | if (listView.SelectedIndex == -1)
38 | {
39 | ViewModel.IsUIElementEnabled = false;
40 | }
41 | else
42 | {
43 | ViewModel.IsUIElementEnabled = true;
44 | }
45 | MainFrame.Navigate(typeof(ControlCenterPage));
46 | }
47 |
48 | private void NumberBoxAll_ValueChanged(NumberBox sender, NumberBoxValueChangedEventArgs args)
49 | {
50 | ViewModel?.OnEffectSpeedAllValueChanged();
51 | }
52 |
53 | internal void SetListViewItemsSource(List filteredItems)
54 | {
55 | listView.ItemsSource = filteredItems;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/dev/Views/Settings/AboutUsSettingPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
14 |
17 |
21 |
22 |
25 |
26 |
28 |
30 |
31 |
33 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/dev/Views/Settings/AboutUsSettingPage.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace RainbowFrame.Views;
2 |
3 | public sealed partial class AboutUsSettingPage : Page
4 | {
5 | public AboutUsSettingPage()
6 | {
7 | this.InitializeComponent();
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/dev/Views/Settings/AppUpdateSettingPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
15 |
18 |
20 |
21 |
23 |
25 |
28 |
29 |
30 |
32 |
33 |
38 |
39 |
40 |
41 |
43 |
44 |
48 |
49 |
52 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/dev/Views/Settings/AppUpdateSettingPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using RainbowFrame.ViewModels;
2 |
3 | namespace RainbowFrame.Views;
4 |
5 | public sealed partial class AppUpdateSettingPage : Page
6 | {
7 | public AppUpdateSettingViewModel ViewModel { get; }
8 |
9 | public AppUpdateSettingPage()
10 | {
11 | ViewModel = App.GetService();
12 | this.InitializeComponent();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/dev/Views/Settings/GeneralSettingPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
16 |
19 |
22 |
24 |
25 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/dev/Views/Settings/GeneralSettingPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using RainbowFrame.ViewModels;
2 |
3 | namespace RainbowFrame.Views;
4 | public sealed partial class GeneralSettingPage : Page
5 | {
6 | public GeneralSettingViewModel ViewModel { get; }
7 | public GeneralSettingPage()
8 | {
9 | ViewModel = App.GetService();
10 | this.InitializeComponent();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/dev/Views/Settings/ThemeSettingPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
15 |
18 |
21 |
22 |
24 |
26 |
28 |
29 |
30 |
33 |
34 |
36 |
38 |
40 |
42 |
43 |
44 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/dev/Views/Settings/ThemeSettingPage.xaml.cs:
--------------------------------------------------------------------------------
1 | namespace RainbowFrame.Views;
2 |
3 | public sealed partial class ThemeSettingPage : Page
4 | {
5 | public ThemeSettingPage()
6 | {
7 | this.InitializeComponent();
8 | }
9 | }
10 |
11 |
12 |
--------------------------------------------------------------------------------
/dev/Views/SettingsPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
16 |
20 |
25 |
30 |
35 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/dev/Views/SettingsPage.xaml.cs:
--------------------------------------------------------------------------------
1 | // To learn more about WinUI, the WinUI project structure,
2 | // and more about our project templates, see: http://aka.ms/winui-project-info.
3 |
4 | namespace RainbowFrame.Views;
5 | ///
6 | /// An empty page that can be used on its own or navigated to within a Frame.
7 | ///
8 | public sealed partial class SettingsPage : Page
9 | {
10 | public SettingsPage()
11 | {
12 | this.InitializeComponent();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/dev/app.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | PerMonitorV2
17 |
18 |
19 |
--------------------------------------------------------------------------------
/settings.xamlstyler:
--------------------------------------------------------------------------------
1 | {
2 | "AttributesTolerance": 1,
3 | "KeepFirstAttributeOnSameLine": true,
4 | "MaxAttributeCharactersPerLine": 0,
5 | "MaxAttributesPerLine": 1,
6 | "NewlineExemptionElements": "RadialGradientBrush, GradientStop, LinearGradientBrush, ScaleTransform, SkewTransform, RotateTransform, TranslateTransform, Trigger, Condition, Setter",
7 | "SeparateByGroups": false,
8 | "AttributeIndentation": 0,
9 | "AttributeIndentationStyle": 1,
10 | "RemoveDesignTimeReferences": false,
11 | "EnableAttributeReordering": true,
12 | "AttributeOrderingRuleGroups": [
13 | "x:Class",
14 | "xmlns, xmlns:x",
15 | "xmlns:*",
16 | "x:Key, Key, x:Name, Name, x:Uid, Uid, Title",
17 | "Grid.Row, Grid.RowSpan, Grid.Column, Grid.ColumnSpan, Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom",
18 | "Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight",
19 | "Margin, Padding, HorizontalAlignment, VerticalAlignment, HorizontalContentAlignment, VerticalContentAlignment, Panel.ZIndex",
20 | "*:*, *",
21 | "PageSource, PageIndex, Offset, Color, TargetName, Property, Value, StartPoint, EndPoint",
22 | "mc:Ignorable, d:IsDataSource, d:LayoutOverrides, d:IsStaticText",
23 | "Storyboard.*, From, To, Duration"
24 | ],
25 | "FirstLineAttributes": "",
26 | "OrderAttributesByName": true,
27 | "PutEndingBracketOnNewLine": false,
28 | "RemoveEndingTagOfEmptyElement": true,
29 | "SpaceBeforeClosingSlash": true,
30 | "RootElementLineBreakRule": 0,
31 | "ReorderVSM": 1,
32 | "ReorderGridChildren": false,
33 | "ReorderCanvasChildren": false,
34 | "ReorderSetters": 0,
35 | "FormatMarkupExtension": true,
36 | "NoNewLineMarkupExtensions": "x:Bind, Binding",
37 | "ThicknessSeparator": 2,
38 | "ThicknessAttributes": "Margin, Padding, BorderThickness, ThumbnailClipMargin",
39 | "FormatOnSave": true,
40 | "CommentPadding": 2,
41 | "IndentSize": 4
42 | }
--------------------------------------------------------------------------------