162 Commits
0.15 ... 1.0.2

Author SHA1 Message Date
Ben Wallis
f238bbf856 Fixed a crash on exit caused by a null SelectedBlockViewModel 2018-09-30 14:02:47 +01:00
Ben Wallis
a0191576f0 Update README.md 2018-09-30 13:57:35 +01:00
Ben Wallis
1d96b69800 Update README.md 2018-09-30 12:51:47 +01:00
Ben Wallis
99abb276af Merge branch 'bugfix/FixBlockOutputPreview' 2018-09-30 12:49:35 +01:00
Ben Wallis
073fe553ea Made block output preview pane text selectable 2018-09-30 12:48:24 +01:00
Ben Wallis
0d81d0ef54 Fixed block output preview 2018-09-30 12:38:26 +01:00
Ben Wallis
f04f9c20ed Update README.md 2018-09-30 11:57:40 +01:00
Ben Wallis
f71ba74425 Update README.md 2018-09-30 11:57:24 +01:00
Ben Wallis
04cbf218f3 Bumped version to 1.0.0 2018-09-30 11:43:22 +01:00
Ben Wallis
6007306346 Added 1.0.0 release notes 2018-09-28 20:44:25 +01:00
Ben Wallis
992bd21570 Fixed UpdateService which was erroneously using the local update manager instead of the GitHub update manager for several parts of the update process 2018-09-28 20:24:09 +01:00
Ben Wallis
7d8b32b2e7 Fixup after merging missed commit from master 2018-09-28 17:58:16 +01:00
Ben Wallis
ac904c31ff * Added default colours for TextColor, BorderColor and BackgroundColor block items (previously the default color was completely transparent)
* Bumped version to 1.0.0-beta3
2018-09-28 17:47:23 +01:00
Ben Wallis
f51fe315ad Updated Filtration.nuspec for 1.0.0-beta2 2018-09-28 17:27:07 +01:00
Ben Wallis
3ce2e12f56 Disabled setting themes for MinimapIcon, PlayEffect and SetFontSize blocks (temporary fix for issue #68) 2018-09-28 17:20:42 +01:00
Ben Wallis
43e5b30080 Merge pull request #88 from GlenCFL/validate-lists
Audit and Validate the Data Files
2018-09-27 12:38:58 +01:00
GlenCFL
bc99339390 Audit the static data files. 2018-09-27 07:21:32 -04:00
Ben Wallis
781faae85d Merge pull request #87 from GlenCFL/mod-completions
Provide autocompletions for item mods.
2018-09-27 07:08:47 +01:00
GlenCFL
c926808878 Remove the now irrelevant static data test. 2018-09-26 23:40:34 -04:00
GlenCFL
24d9f97717 Provide autocompletions for item mods. 2018-09-26 23:35:39 -04:00
Ben Wallis
7e4e6fe42e Refactored StaticDataService to use local resources for ItemBaseTypes.txt and ItemClasses.txt instead of the old files in APPDATA that aren't used anymore.
Bumped develop version to 1.0.0-beta2
2018-09-26 19:12:31 +01:00
Ben Wallis
c6d75cfff6 Implemented auto-update using Squirrel
Reworked SettingsPageView to not need a Save Button and added a folder browser control
2018-09-26 18:40:54 +01:00
Ben Wallis
2f30eade7c Merge pull request #84 from azakhi/bugfix/fix-child-firing-block-selection-event
Fix block items firing blocklist selectionchanged
2018-09-21 17:43:07 +01:00
azakhi
e719f0bce0 Fix block items firing blocklist selectionchanged 2018-09-21 19:28:37 +03:00
Ben Wallis
dffbbf3591 Merge pull request #82 from azakhi/bugfix/81-increase-maximum-explicit-mod-rule
Increase HasExplicitMod limit to 8
2018-09-17 12:13:26 +01:00
azakhi
07a7e8d05c Increase HasExplicitMod limit to 8 2018-09-17 10:37:25 +03:00
Ben Wallis
1ba224906c Merge pull request #80 from azakhi/feature/improve-section-wide-actions
Improve commands & add multiple selection feature
2018-09-16 19:19:24 +01:00
azakhi
32523787d2 Improve commands & add multiple selection feature 2018-09-13 17:34:16 +03:00
Ben Wallis
ac6943d73b Replaced AlertSound .wav files with .mp3 files (reduces installer size by 50%~) 2018-09-08 22:34:41 +01:00
Ben Wallis
36c0aaea17 Bumped version to 0.21 2018-09-08 10:26:45 +01:00
Ben Wallis
4b38a6a4e0 Bumped version to 0.20 2018-09-08 10:14:56 +01:00
Ben Wallis
9c44dd7e7d Merge pull request #79 from azakhi/feature/12-13-preserve-user-ui-choices
Preserve UI states and last active document
2018-09-08 10:13:36 +01:00
Ben Wallis
18c878e350 Merge pull request #75 from azakhi/feature/40-add-enable-disable-to-group-browser
Feature/40 add enable disable to group browser
2018-09-08 10:12:04 +01:00
Ben Wallis
5d30888597 Merge pull request #72 from azakhi/feature/improve-pasting-multiple-blocks
Improve pasting to support different copy sources
2018-09-08 09:56:14 +01:00
azakhi
bfd722d362 Add add/delete block group support to blocks 2018-09-07 20:36:27 +03:00
azakhi
d23741555a Fix tests 2018-09-07 20:36:27 +03:00
azakhi
820aa5499e Fix block group creation 2018-09-07 20:36:27 +03:00
azakhi
1ee38b4c0e Fix block group output & expand/collapse all 2018-09-07 20:36:27 +03:00
azakhi
4bed777427 Improve parent group status logic 2018-09-07 20:36:27 +03:00
azakhi
1f6cbeec86 Add enable/disable checkbox to group browser 2018-09-07 20:36:27 +03:00
azakhi
550a2d8f25 Preserve UI states and last active document 2018-09-07 19:57:32 +03:00
Ben Wallis
ae38197052 Merge pull request #77 from GlenCFL/save-state
Set the state to dirty on using editing commands.
2018-09-07 15:05:43 +01:00
GlenCFL
4fd4ffc520 Set the state to dirty on using editing commands. 2018-09-07 04:59:57 -04:00
Ben Wallis
e15efe4e15 Merge pull request #76 from GlenCFL/transparency_rework
Make the minimap icons transparent. Take 2.
2018-09-07 08:13:27 +01:00
GlenCFL
196db4c730 Use Enum.IsDefined as suggested. 2018-09-07 03:01:45 -04:00
GlenCFL
910b2b8c7f Make the minimap icons transparent. 2018-09-06 20:01:16 -04:00
Ben Wallis
b31ce1d843 Merge pull request #74 from azakhi/feature/19-add-buttons-to-group-browser
Add clear all button & missing functions
2018-09-05 16:01:46 +01:00
azakhi
99a011c78c Add clear all button & missing functions 2018-09-05 17:55:16 +03:00
azakhi
69ce542c1a Improve pasting to support different copy sources 2018-09-04 14:18:11 +03:00
Ben Wallis
2ff9ebf242 Merge pull request #71 from azakhi/bugfix/70-fix-max-quality
Increase maximum quality to 30
2018-09-04 06:45:18 +01:00
azakhi
0eff63d706 Increase maximum quality to 30 2018-09-04 08:34:26 +03:00
Ben Wallis
1b8f37ca3a Merge pull request #65 from azakhi/bugfix/64-fix-group-browser-filter
Fix block group browser not filtering
2018-09-03 18:55:19 +01:00
Ben Wallis
b4f02f872e Merge pull request #67 from azakhi/bugfix/10-fix-default-opacity
Change default alpha value to 240
2018-09-03 18:53:09 +01:00
azakhi
cfef82e53a Change default alpha value to 240 2018-09-03 15:37:10 +03:00
azakhi
bdd121f48c Fix block group browser not filtering 2018-09-03 11:26:13 +03:00
Ben Wallis
0209de3817 Update README.md 2018-09-01 10:15:38 +01:00
Ben Wallis
1e26a2ae3e Merge pull request #62 from GlenCFL/fix-reopen
Fix the reading of CustomAlertSounds containing path separators.
2018-09-01 09:57:54 +01:00
GlenCFL
54b72e44b0 Reposition the new custom sound tests. 2018-08-31 21:06:51 -04:00
GlenCFL
24df1d7687 Fix the reading of CustomAlertSounds containing path separators. 2018-08-31 20:01:21 -04:00
Ben Wallis
7162e16b49 Merge pull request #59 from azakhi/improvements
Improvements
2018-08-31 15:28:18 +01:00
azakhi
324ce4d0b3 Fix binding problem 2018-08-31 17:05:21 +03:00
azakhi
de489e8b2c Fix folder bug 2018-08-31 16:54:24 +03:00
azakhi
341b1d1eb2 Make section header parsing more generic 2018-08-31 16:13:57 +03:00
azakhi
6be29dbd28 Add tests and fix theme bug 2018-08-31 16:02:17 +03:00
azakhi
3851ad51e1 Add support for comments between rules 2018-08-31 14:22:26 +03:00
azakhi
65d3e07156 Add comment support for all rule types 2018-08-31 11:21:43 +03:00
azakhi
a86ab3ec8d Use available sounds as combobox source 2018-08-31 09:40:48 +03:00
azakhi
41722e8a57 Update icons 2018-08-31 09:00:31 +03:00
Ben Wallis
3cb0a041d7 Update README.md 2018-08-30 19:31:45 +01:00
Ben Wallis
c8778bb1eb bumped version to 0.19 2018-08-30 19:28:32 +01:00
Ben Wallis
8e849d6a8f Merge pull request #57 from azakhi/master
Fix play effect parsing bug
2018-08-30 19:26:37 +01:00
azakhi
0d3f01a856 Update item classes 2018-08-30 21:23:34 +03:00
azakhi
178ff579c6 Fix PlayEffect parsing 2018-08-30 21:22:20 +03:00
Ben Wallis
30aa52e788 updated Delve Socketable Currency in ItemClasses 2018-08-30 19:20:44 +01:00
Ben Wallis
c1aee2f8f7 Merge branch 'master' of https://github.com/ben-wallis/Filtration 2018-08-30 18:31:53 +01:00
Ben Wallis
937426e9a3 added tests 2018-08-30 18:31:34 +01:00
Ben Wallis
7e0932830d Update README.md 2018-08-30 18:14:24 +01:00
Ben Wallis
15c63fa222 Merge pull request #55 from azakhi/master
Copy paste sound bug fix
2018-08-30 18:00:09 +01:00
Ben Wallis
cc986eea21 updated version to 0.18 and 2016 dates to 2018 2018-08-30 17:59:20 +01:00
azakhi
c260014a16 Add requested changes 2018-08-30 19:56:47 +03:00
azakhi
8f0f73f185 Copy paste sound bug fix 2018-08-30 19:33:46 +03:00
Ben Wallis
15143f738f Fixed crash when scrolling with open blocks 2018-08-29 22:45:47 +01:00
Ben Wallis
dc6ed934b2 Merge pull request #54 from azakhi/master
3.4 Update and Improvements
2018-08-29 22:39:36 +01:00
azakhi
78b4ddc862 Add new filter fuatures 2018-08-29 20:12:02 +03:00
azakhi
a09f0a5090 Add custom sound theme support 2018-08-29 13:11:41 +03:00
azakhi
2958d93b33 Add Custom Sound block 2018-08-27 22:43:01 +03:00
azakhi
1e9b1158bd Merge branch 'improvements' 2018-08-26 20:27:23 +03:00
azakhi
d92d34af05 Add alert sound theme support 2018-08-26 20:24:13 +03:00
azakhi
bc5a005ee7 Add font size theme support & improve theme system 2018-08-25 15:52:16 +03:00
azakhi
8ba3433dcf Refactor theme code to support different types 2018-08-24 22:07:24 +03:00
azakhi
d0bc0b6864 Add section search feature 2018-08-24 18:03:38 +03:00
azakhi
1eaf0b6fe5 Improve UI performance 2018-08-24 01:09:44 +03:00
azakhi
4c76dc9bab Improve test block for beam feature 2018-08-22 20:20:12 +03:00
azakhi
2a7df9a1ca Add a temporary block type for new beam feature 2018-08-22 13:15:50 +03:00
azakhi
add7514ce7 Fix temporary block type control 2018-08-22 11:47:32 +03:00
azakhi
0974579684 Add requested changes & minor bug fixes 2018-08-22 11:41:02 +03:00
azakhi
c0e9c534de Add temporary block type for new type 2018-08-21 17:03:42 +03:00
azakhi
780081263c Replace 'Maelström' to prevent encoding problems 2018-08-20 21:34:16 +03:00
azakhi
387f08db85 Improve parsing 2018-08-20 21:25:30 +03:00
azakhi
7fb9378304 Improve parsing & bug fixes 2018-08-20 21:25:30 +03:00
azakhi
e5209fb459 Improve UI 2018-08-20 21:25:30 +03:00
azakhi
961805272d Make comment blocks expandable & improve parsing 2018-08-20 21:25:30 +03:00
azakhi
281c7d85e1 Fix adding comment block to collapsed section 2018-08-20 21:25:30 +03:00
azakhi
57775a9e22 Start sections collapsed & restyle buttons 2018-08-20 21:25:30 +03:00
azakhi
5817295f7c Fix adding block to a collapsed section 2018-08-20 21:25:30 +03:00
azakhi
216168533f Fix pasting sections 2018-08-20 21:25:29 +03:00
azakhi
f6969a0204 Fix performance issue 2018-08-20 21:25:29 +03:00
azakhi
38053666a0 Fix collapsed section height 2018-08-20 21:25:29 +03:00
azakhi
bd730dd518 Add section features 2018-08-20 21:25:29 +03:00
azakhi
2c4096ff2c Add DisableDropSound block type 2018-08-20 21:19:18 +03:00
azakhi
738415f10a Add ElderMap block type 2018-08-12 11:15:45 +03:00
azakhi
f03e37602d Fix script desc bug in a better way 2018-08-11 12:28:13 +03:00
azakhi
2230b81257 Fix test 2018-08-10 17:27:43 +03:00
azakhi
3aa2bf488c Fix tests 2018-08-10 17:22:55 +03:00
azakhi
71b7a45f84 Add tests and small bugfixes 2018-08-10 17:08:17 +03:00
azakhi
0fd2db7076 Add new base types and classes 2018-08-09 17:12:03 +03:00
azakhi
400688573c Add new block types added in 3.3 2018-08-09 16:48:11 +03:00
Ben Wallis
52fc1f6bbc Merge branch 'master' of https://github.com/ben-wallis/Filtration 2017-12-09 16:16:29 +00:00
Ben Wallis
3f437c0109 FIL-18: Fixed first comment block being merged into the script description 2017-12-09 16:16:20 +00:00
Ben Wallis
f838b35b4c Added Murderous Eye Jewel to ItemBaseTypes.txt 2017-12-09 15:12:39 +00:00
Ben Wallis
ac706486cb Update README.md 2017-12-08 18:09:04 +00:00
Ben Wallis
3607ad362e Update README.md 2017-12-08 18:08:48 +00:00
Ben Wallis
1ecec4e9dc Bumped version to 0.17 2017-12-08 17:58:53 +00:00
Ben Wallis
404a04c210 Merge pull request #51 from GlenCFL/fixes
0.16 Regression Fixing
2017-12-08 17:57:13 +00:00
GlenCFL
f1b2be7d74 Add in Ben's fix for Comments not setting dirty state. 2017-12-08 12:54:53 -05:00
GlenCFL
6393a53bf5 Remove code duplication. 2017-12-08 12:12:17 -05:00
GlenCFL
a0a72b5fe8 Mark comments as two way, fixing updating issues. 2017-12-08 10:44:22 -05:00
GlenCFL
d96234f099 Fix the contextual Delete Section command. 2017-12-08 09:15:01 -05:00
GlenCFL
07fdc2eb49 Fix the Add Section crash. 2017-12-08 07:41:16 -05:00
GlenCFL
86ff670fb0 Fix for the ShChaos sound not playing. 2017-12-08 01:42:00 -05:00
Ben Wallis
c9caed7e6b Fixed failing test 2017-12-07 22:35:06 +00:00
Ben Wallis
9cf4d86cb0 Fixed multiline comment saving 2017-12-07 22:22:26 +00:00
Ben Wallis
523a9553d9 Fixed section browser 2017-12-07 21:36:42 +00:00
Ben Wallis
b88730fb3a Merge pull request #49 from GlenCFL/master
Provide an update to fully support Path of Exile 3.1.
2017-12-07 20:19:14 +00:00
GlenCFL
06b88e85f2 Fix failing tests. 2017-12-07 14:27:03 -05:00
GlenCFL
b98988f0b5 Merge remote-tracking branch 'upstream/master' 2017-12-07 14:16:47 -05:00
Ben Wallis
d14e4e9320 Merge pull request #50 from ben-wallis/develop
Various changes from local repo
2017-12-07 18:24:46 +00:00
Ben Wallis
d91f7e1ac3 Fixed compile warnings 2017-12-07 18:18:05 +00:00
Ben Wallis
d84b17ced3 Implemented script-level undo/redo (currently hidden in UI) 2017-12-07 18:14:47 +00:00
GlenCFL
fef20ff36a Fix the halting issue on window close. 2017-12-07 12:53:44 -05:00
GlenCFL
23fa82655b Add tests for the new keywords. 2017-12-07 12:14:42 -05:00
GlenCFL
e5bd994164 Fix the existing tests. 2017-12-07 11:57:36 -05:00
GlenCFL
342487f800 Update the ordering of the BlockItems. 2017-12-07 09:26:33 -05:00
GlenCFL
8bf3527b69 Add support for PlayAlertSoundPositional. 2017-12-07 08:21:32 -05:00
GlenCFL
010e0dda31 Add support for the new alert sounds. 2017-12-07 06:49:25 -05:00
GlenCFL
2cf6a5953b Update both the item class and item base lists. 2017-12-06 23:24:30 -05:00
GlenCFL
1ebbe5b5a8 Add support for the new block types. 2017-12-06 23:03:46 -05:00
Ben Wallis
fee2a4dd99 Initial refactoring to support CommandManager 2017-06-17 13:50:44 +01:00
Ben Wallis
b65fad0679 FIL-4 Completed refactoring of Sections to ItemFilterCommentBlocks 2017-06-17 12:19:54 +01:00
Ben Wallis
43c6149832 Fixed failing tests 2017-05-20 18:34:45 +01:00
Ben Wallis
4def27c49d FIL-4 Refactored script parsing to retain isolated comments as a new ItemFilterBlockComment type - UI still needs reworking with new templates and such. 2017-05-20 18:14:28 +01:00
Ben Wallis
7b8ff1e3cb Update README.md 2017-05-14 14:15:11 +01:00
Ben Wallis
797c911bb5 FIL-13 Comments on the Show/Hide line are now preserved if block groups are not enabled for the script 2017-05-14 14:10:54 +01:00
Ben Wallis
8e54cc3b4b Fixed failing tests 2017-05-14 13:06:07 +01:00
Ben Wallis
ab7aefa8a6 FIL-11 Added BlockGroupsEnabled flag to ItemFilterScript (encapsulated in new ItemFilterScriptSettings object) 2017-05-14 13:02:30 +01:00
Ben Wallis
bb77138854 FIL-1 Changed Block Group Parsing to use " - " as delimiter instead of "-" 2017-05-14 12:12:42 +01:00
Ben Wallis
2d98f7de36 Updated appveyor.yml 2017-05-09 22:03:24 +01:00
Ben Wallis
6277917ae6 Updated Filtration.sln Visual Studio version from 14 to 15 2017-05-09 21:58:34 +01:00
Ben Wallis
3fe021949a Replaced AutoMapper usage for ItemFilterBlockGroup viewmodel mapping with constructor overload
Updated NuGet packages
2017-05-09 21:41:51 +01:00
Ben Wallis
733c7d1757 Added [Ignore] to integration unit tests 2017-05-08 20:12:24 +01:00
Ben Wallis
702c118783 Added appveyor.yml 2017-05-08 20:09:29 +01:00
Ben Wallis
11d85fdd1b Update README.md 2016-12-03 12:22:15 +00:00
278 changed files with 12977 additions and 3890 deletions

183
.gitignore vendored
View File

@@ -1,23 +1,37 @@
## Ignore Visual Studio temporary files, build results, and ## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons. ## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files # User-specific files
/.vs/
*.suo *.suo
*.user *.user
*.userosscache
*.sln.docstates *.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results # Build results
[Dd]ebug/ [Dd]ebug/
[Dd]ebugPublic/ [Dd]ebugPublic/
[Rr]elease/ [Rr]elease/
[Rr]eleases/
x64/ x64/
build/ x86/
bld/ bld/
[Bb]in/ [Bb]in/
[Oo]bj/ [Oo]bj/
[Ll]og/
# Roslyn cache directories # Visual Studio 2015/2017 cache/options directory
*.ide/ .vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results # MSTest test Results
[Tt]est[Rr]esult*/ [Tt]est[Rr]esult*/
@@ -32,6 +46,19 @@ TestResult.xml
[Rr]eleasePS/ [Rr]eleasePS/
dlldata.c dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c *_i.c
*_p.c *_p.c
*_i.h *_i.h
@@ -64,14 +91,21 @@ _Chutzpah*
ipch/ ipch/
*.aps *.aps
*.ncb *.ncb
*.opendb
*.opensdf *.opensdf
*.sdf *.sdf
*.cachefile *.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler # Visual Studio profiler
*.psess *.psess
*.vsp *.vsp
*.vspx *.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace # TFS 2012 Local Workspace
$tf/ $tf/
@@ -84,7 +118,7 @@ _ReSharper*/
*.[Rr]e[Ss]harper *.[Rr]e[Ss]harper
*.DotSettings.user *.DotSettings.user
# JustCode is a .NET coding addin-in # JustCode is a .NET coding add-in
.JustCode .JustCode
# TeamCity is a build add-in # TeamCity is a build add-in
@@ -93,9 +127,18 @@ _TeamCity*
# DotCover is a Code Coverage Tool # DotCover is a Code Coverage Tool
*.dotCover *.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch # NCrunch
_NCrunch_* _NCrunch_*
.*crunch*.local.xml .*crunch*.local.xml
nCrunchTemp_*
# MightyMoose # MightyMoose
*.mm.* *.mm.*
@@ -123,42 +166,63 @@ publish/
# Publish Web Output # Publish Web Output
*.[Pp]ublish.xml *.[Pp]ublish.xml
*.azurePubxml *.azurePubxml
## TODO: Comment the next line if you want to checkin your # Note: Comment the next line if you want to checkin your web deploy settings,
## web deploy settings but do note that will include unencrypted # but database connection strings (with potential passwords) will be unencrypted
## passwords *.pubxml
#*.pubxml *.publishproj
# NuGet Packages Directory # Microsoft Azure Web App publish settings. Comment the next line if you want to
packages/* # checkin your Azure Web App publish settings, but sensitive information contained
## TODO: If the tool you use requires repositories.config # in these scripts will be unencrypted
## uncomment the next line PublishScripts/
#!packages/repositories.config
# Enable "build/" folder in the NuGet Packages folder since # NuGet Packages
# NuGet packages use it for MSBuild targets. *.nupkg
# This line needs to be after the ignore of the build folder # The packages folder can be ignored because of Package Restore
# (and the packages folder if the line above has been uncommented) **/[Pp]ackages/*
!packages/build/ # except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Windows Azure Build Output # Microsoft Azure Build Output
csx/ csx/
*.build.csdef *.build.csdef
# Windows Store app package directory # Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/ AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others # Others
sql/
*.Cache
ClientBin/ ClientBin/
[Ss]tyle[Cc]op.*
~$* ~$*
*~ *~
*.dbmdl *.dbmdl
*.dbproj.schemaview *.dbproj.schemaview
*.jfm
*.pfx *.pfx
*.publishsettings *.publishsettings
node_modules/ orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects # RIA/Silverlight projects
Generated_Code/ Generated_Code/
@@ -174,6 +238,7 @@ UpgradeLog*.htm
# SQL Server files # SQL Server files
*.mdf *.mdf
*.ldf *.ldf
*.ndf
# Business Intelligence projects # Business Intelligence projects
*.rdl.data *.rdl.data
@@ -183,7 +248,69 @@ UpgradeLog*.htm
# Microsoft Fakes # Microsoft Fakes
FakesAssemblies/ FakesAssemblies/
# LightSwitch generated files # GhostDoc plugin setting file
GeneratedArtifacts/ *.GhostDoc.xml
_Pvt_Extensions/
ModelManifest.xml # Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# TypeScript v1 declaration files
typings/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/

View File

@@ -35,13 +35,11 @@
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Moq, Version=4.5.21.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.21\lib\net45\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="nunit.framework, Version=3.4.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <Reference Include="nunit.framework, Version=3.6.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net461" /> <package id="Castle.Core" version="3.3.3" targetFramework="net461" />
<package id="Moq" version="4.5.21" targetFramework="net461" /> <package id="Moq" version="4.5.30" targetFramework="net461" />
<package id="NUnit" version="3.4.1" targetFramework="net461" /> <package id="NUnit" version="3.6.1" targetFramework="net461" />
</packages> </packages>

View File

@@ -3,9 +3,9 @@ using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Windows.Markup; using System.Windows.Markup;
namespace Filtration.Extensions namespace Filtration.Common.Extensions
{ {
internal class EnumerationExtension : MarkupExtension public class EnumerationExtension : MarkupExtension
{ {
private Type _enumType; private Type _enumType;

View File

@@ -4,7 +4,7 @@ using System.Windows;
using System.Windows.Documents; using System.Windows.Documents;
using System.Windows.Navigation; using System.Windows.Navigation;
namespace Filtration.Extensions namespace Filtration.Common.Extensions
{ {
public static class HyperlinkExtensions public static class HyperlinkExtensions
{ {

View File

@@ -35,8 +35,8 @@
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Castle.Windsor"> <Reference Include="Castle.Windsor, Version=3.4.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll</HintPath> <HintPath>..\packages\Castle.Windsor.3.4.0\lib\net45\Castle.Windsor.dll</HintPath>
</Reference> </Reference>
<Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL"> <Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath> <HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
@@ -75,6 +75,8 @@
<Compile Include="Converters\ColorToSolidColorBrushConverter.cs" /> <Compile Include="Converters\ColorToSolidColorBrushConverter.cs" />
<Compile Include="Converters\InverseBooleanVisibilityConverter.cs" /> <Compile Include="Converters\InverseBooleanVisibilityConverter.cs" />
<Compile Include="Converters\StringToVisibilityConverter.cs" /> <Compile Include="Converters\StringToVisibilityConverter.cs" />
<Compile Include="Extensions\EnumerationExtension.cs" />
<Compile Include="Extensions\HyperlinkExtensions.cs" />
<Compile Include="Messages\ThemeClosedMessage.cs" /> <Compile Include="Messages\ThemeClosedMessage.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\FileSystemService.cs" /> <Compile Include="Services\FileSystemService.cs" />

View File

@@ -2,6 +2,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Text; using System.Text;
@@ -21,6 +22,7 @@ namespace Filtration.Common.Utilities
/// the stream into text. /// the stream into text.
/// </summary> /// </summary>
/// <param name="streamSource">Data source</param> /// <param name="streamSource">Data source</param>
[DebuggerStepThrough]
public LineReader(Func<Stream> streamSource) public LineReader(Func<Stream> streamSource)
: this(streamSource, Encoding.UTF8) : this(streamSource, Encoding.UTF8)
{ {
@@ -33,6 +35,7 @@ namespace Filtration.Common.Utilities
/// <param name="streamSource">Data source</param> /// <param name="streamSource">Data source</param>
/// <param name="encoding">Encoding to use to decode the stream /// <param name="encoding">Encoding to use to decode the stream
/// into text</param> /// into text</param>
[DebuggerStepThrough]
public LineReader(Func<Stream> streamSource, Encoding encoding) public LineReader(Func<Stream> streamSource, Encoding encoding)
: this(() => new StreamReader(streamSource(), encoding)) : this(() => new StreamReader(streamSource(), encoding))
{ {
@@ -44,6 +47,7 @@ namespace Filtration.Common.Utilities
/// UTF8 is used to decode the file into text. /// UTF8 is used to decode the file into text.
/// </summary> /// </summary>
/// <param name="filename">File to read from</param> /// <param name="filename">File to read from</param>
[DebuggerStepThrough]
public LineReader(string filename) public LineReader(string filename)
: this(filename, Encoding.UTF8) : this(filename, Encoding.UTF8)
{ {
@@ -56,6 +60,7 @@ namespace Filtration.Common.Utilities
/// <param name="filename">File to read from</param> /// <param name="filename">File to read from</param>
/// <param name="encoding">Encoding to use to decode the file /// <param name="encoding">Encoding to use to decode the file
/// into text</param> /// into text</param>
[DebuggerStepThrough]
public LineReader(string filename, Encoding encoding) public LineReader(string filename, Encoding encoding)
: this(() => new StreamReader(filename, encoding)) : this(() => new StreamReader(filename, encoding))
{ {
@@ -66,6 +71,7 @@ namespace Filtration.Common.Utilities
/// is only called when the enumerator is fetched /// is only called when the enumerator is fetched
/// </summary> /// </summary>
/// <param name="dataSource">Data source</param> /// <param name="dataSource">Data source</param>
[DebuggerStepThrough]
public LineReader(Func<TextReader> dataSource) public LineReader(Func<TextReader> dataSource)
{ {
_dataSource = dataSource; _dataSource = dataSource;
@@ -74,6 +80,7 @@ namespace Filtration.Common.Utilities
/// <summary> /// <summary>
/// Enumerates the data source line by line. /// Enumerates the data source line by line.
/// </summary> /// </summary>
[DebuggerStepThrough]
public IEnumerator<string> GetEnumerator() public IEnumerator<string> GetEnumerator()
{ {
using (TextReader reader = _dataSource()) using (TextReader reader = _dataSource())
@@ -89,6 +96,7 @@ namespace Filtration.Common.Utilities
/// <summary> /// <summary>
/// Enumerates the data source line by line. /// Enumerates the data source line by line.
/// </summary> /// </summary>
[DebuggerStepThrough]
IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator()
{ {
return GetEnumerator(); return GetEnumerator();

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net451" /> <package id="Castle.Core" version="3.3.3" targetFramework="net451" />
<package id="Castle.Windsor" version="3.3.0" targetFramework="net451" /> <package id="Castle.Windsor" version="3.4.0" targetFramework="net461" />
<package id="CommonServiceLocator" version="1.3" targetFramework="net451" /> <package id="CommonServiceLocator" version="1.3" targetFramework="net451" />
<package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net461" /> <package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net461" />
</packages> </packages>

View File

@@ -31,9 +31,24 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Practices.ServiceLocation, Version=1.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" /> <Reference Include="PresentationCore" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
@@ -46,6 +61,9 @@
<Compile Include="IEditableDocument.cs" /> <Compile Include="IEditableDocument.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -1,4 +1,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Input;
using GalaSoft.MvvmLight.CommandWpf;
namespace Filtration.Interface namespace Filtration.Interface
{ {
@@ -7,5 +9,6 @@ namespace Filtration.Interface
bool IsScript { get; } bool IsScript { get; }
bool IsTheme { get; } bool IsTheme { get; }
Task Close(); Task Close();
RelayCommand CloseCommand { get; }
} }
} }

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommonServiceLocator" version="1.3" targetFramework="net461" />
<package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net461" />
</packages>

View File

@@ -46,9 +46,8 @@
<HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath> <HintPath>..\packages\EntityFramework.6.1.3\lib\net45\EntityFramework.SqlServer.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="nunit.framework, Version=3.4.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <Reference Include="nunit.framework, Version=3.6.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" /> <Reference Include="System.ComponentModel.DataAnnotations" />

View File

@@ -6,6 +6,7 @@ using NUnit.Framework;
namespace Filtration.ItemFilterPreview.Data.Tests.Repositories namespace Filtration.ItemFilterPreview.Data.Tests.Repositories
{ {
[Ignore("integration test")]
[TestFixture] [TestFixture]
public class TestItemSetRepository public class TestItemSetRepository
{ {

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="EntityFramework" version="6.1.3" targetFramework="net461" /> <package id="EntityFramework" version="6.1.3" targetFramework="net461" />
<package id="NUnit" version="3.4.1" targetFramework="net461" /> <package id="NUnit" version="3.6.1" targetFramework="net461" />
<package id="System.Data.SQLite" version="1.0.102.0" targetFramework="net461" /> <package id="System.Data.SQLite" version="1.0.102.0" targetFramework="net461" />
<package id="System.Data.SQLite.Core" version="1.0.102.0" targetFramework="net461" /> <package id="System.Data.SQLite.Core" version="1.0.102.0" targetFramework="net461" />
<package id="System.Data.SQLite.EF6" version="1.0.102.0" targetFramework="net461" /> <package id="System.Data.SQLite.EF6" version="1.0.102.0" targetFramework="net461" />

View File

@@ -46,21 +46,17 @@
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentAssertions, Version=4.13.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.13.1\lib\net45\FluentAssertions.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="FluentAssertions.Core, Version=4.13.1.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> <Reference Include="FluentAssertions.Core, Version=4.19.2.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL">
<HintPath>..\packages\FluentAssertions.4.13.1\lib\net45\FluentAssertions.Core.dll</HintPath> <HintPath>..\packages\FluentAssertions.4.19.2\lib\net45\FluentAssertions.Core.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Moq, Version=4.5.21.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.21\lib\net45\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="nunit.framework, Version=3.4.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <Reference Include="nunit.framework, Version=3.6.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
@@ -121,7 +117,6 @@
<None Include="packages.config" /> <None Include="packages.config" />
<None Include="Resources\MuldiniFilterScript.txt" /> <None Include="Resources\MuldiniFilterScript.txt" />
</ItemGroup> </ItemGroup>
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -6,6 +6,7 @@ using Filtration.ItemFilterPreview.Tests.Properties;
using Filtration.ObjectModel; using Filtration.ObjectModel;
using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Factories;
using Filtration.Parser.Services; using Filtration.Parser.Services;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
@@ -29,7 +30,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(); var testInputItem = Mock.Of<IItem>();
var testInputBlock = Mock.Of<IItemFilterBlock>(); var testInputBlock = Mock.Of<IItemFilterBlock>();
var testInputScript = Mock.Of<IItemFilterScript>(s => s.ItemFilterBlocks == new ObservableCollection<IItemFilterBlock> {testInputBlock}); var testInputScript = Mock.Of<IItemFilterScript>(s => s.ItemFilterBlocks == new ObservableCollection<IItemFilterBlockBase> {testInputBlock});
_testUtility.MockBlockItemMatcher _testUtility.MockBlockItemMatcher
.Setup(b => b.ItemBlockMatch(testInputBlock, testInputItem)) .Setup(b => b.ItemBlockMatch(testInputBlock, testInputItem))
@@ -50,7 +51,7 @@ namespace Filtration.ItemFilterPreview.Tests.Services
//Arrange //Arrange
var testInputItem = Mock.Of<IItem>(); var testInputItem = Mock.Of<IItem>();
var testInputBlock = Mock.Of<IItemFilterBlock>(); var testInputBlock = Mock.Of<IItemFilterBlock>();
var testInputScript = Mock.Of<IItemFilterScript>(s => s.ItemFilterBlocks == new ObservableCollection<IItemFilterBlock> { testInputBlock }); var testInputScript = Mock.Of<IItemFilterScript>(s => s.ItemFilterBlocks == new ObservableCollection<IItemFilterBlockBase> { testInputBlock });
_testUtility.MockBlockItemMatcher _testUtility.MockBlockItemMatcher
.Setup(b => b.ItemBlockMatch(testInputBlock, testInputItem)) .Setup(b => b.ItemBlockMatch(testInputBlock, testInputItem))
@@ -66,12 +67,18 @@ namespace Filtration.ItemFilterPreview.Tests.Services
} }
[Test] [Test]
[Ignore("Outdated item filter")]
public void ProcessItemsAgainstItemFilterScript_IntegrationTest() public void ProcessItemsAgainstItemFilterScript_IntegrationTest()
{ {
//Arrange //Arrange
var testInputScriptFile = Resources.MuldiniFilterScript; var testInputScriptFile = Resources.MuldiniFilterScript;
var blockGroupHierarchyBuilder = new BlockGroupHierarchyBuilder(); var blockGroupHierarchyBuilder = new BlockGroupHierarchyBuilder();
var scriptTranslator = new ItemFilterScriptTranslator(new ItemFilterBlockTranslator(blockGroupHierarchyBuilder), blockGroupHierarchyBuilder); var mockItemFilterScriptFactory = new Mock<IItemFilterScriptFactory>();
mockItemFilterScriptFactory
.Setup(i => i.Create())
.Returns(new ItemFilterScript());
var scriptTranslator = new ItemFilterScriptTranslator(blockGroupHierarchyBuilder, new ItemFilterBlockTranslator(blockGroupHierarchyBuilder), mockItemFilterScriptFactory.Object);
var script = scriptTranslator.TranslateStringToItemFilterScript(testInputScriptFile); var script = scriptTranslator.TranslateStringToItemFilterScript(testInputScriptFile);
var testInputItem = new Item var testInputItem = new Item
@@ -96,12 +103,17 @@ namespace Filtration.ItemFilterPreview.Tests.Services
} }
[Test] [Test]
[Ignore("Outdated item filter")]
public void ProcessItemsAgainstItemFilterScript_IntegrationTest_10Items() public void ProcessItemsAgainstItemFilterScript_IntegrationTest_10Items()
{ {
//Arrange //Arrange
var testInputScriptFile = Resources.MuldiniFilterScript; var testInputScriptFile = Resources.MuldiniFilterScript;
var blockGroupHierarchyBuilder = new BlockGroupHierarchyBuilder(); var blockGroupHierarchyBuilder = new BlockGroupHierarchyBuilder();
var scriptTranslator = new ItemFilterScriptTranslator(new ItemFilterBlockTranslator(blockGroupHierarchyBuilder), blockGroupHierarchyBuilder); var mockItemFilterScriptFactory = new Mock<IItemFilterScriptFactory>();
mockItemFilterScriptFactory
.Setup(i => i.Create())
.Returns(new ItemFilterScript());
var scriptTranslator = new ItemFilterScriptTranslator(blockGroupHierarchyBuilder, new ItemFilterBlockTranslator(blockGroupHierarchyBuilder), mockItemFilterScriptFactory.Object);
var script = scriptTranslator.TranslateStringToItemFilterScript(testInputScriptFile); var script = scriptTranslator.TranslateStringToItemFilterScript(testInputScriptFile);
var testInputItems = new List<IItem> var testInputItems = new List<IItem>

View File

@@ -6,7 +6,6 @@ using System.Xml.Serialization;
using Filtration.ObjectModel; using Filtration.ObjectModel;
using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Enums;
using NUnit.Framework; using NUnit.Framework;
using YamlDotNet.Serialization;
namespace Filtration.ItemFilterPreview.Tests.Services namespace Filtration.ItemFilterPreview.Tests.Services
{ {
@@ -40,7 +39,6 @@ namespace Filtration.ItemFilterPreview.Tests.Services
output = textWriter.ToString(); output = textWriter.ToString();
} }
var x = 2;
//Assert //Assert
} }
} }

View File

@@ -8,7 +8,7 @@
</dependentAssembly> </dependentAssembly>
<dependentAssembly> <dependentAssembly>
<assemblyIdentity name="ControlzEx" publicKeyToken="f08b075e934b7045" culture="neutral" /> <assemblyIdentity name="ControlzEx" publicKeyToken="f08b075e934b7045" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.2.3" newVersion="2.1.2.3" /> <bindingRedirect oldVersion="0.0.0.0-2.2.0.4" newVersion="2.2.0.4" />
</dependentAssembly> </dependentAssembly>
</assemblyBinding> </assemblyBinding>
</runtime> </runtime>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net461" /> <package id="Castle.Core" version="3.3.3" targetFramework="net461" />
<package id="FluentAssertions" version="4.13.1" targetFramework="net461" /> <package id="FluentAssertions" version="4.19.2" targetFramework="net461" />
<package id="Moq" version="4.5.21" targetFramework="net461" /> <package id="Moq" version="4.5.30" targetFramework="net461" />
<package id="NUnit" version="3.4.1" targetFramework="net461" /> <package id="NUnit" version="3.6.1" targetFramework="net461" />
<package id="YamlDotNet" version="3.9.0" targetFramework="net461" /> <package id="YamlDotNet" version="3.9.0" targetFramework="net461" />
</packages> </packages>

View File

@@ -40,9 +40,8 @@
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL"> <Reference Include="Castle.Windsor, Version=3.4.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Windsor.3.3.0\lib\net45\Castle.Windsor.dll</HintPath> <HintPath>..\packages\Castle.Windsor.3.4.0\lib\net45\Castle.Windsor.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL"> <Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath> <HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
@@ -60,9 +59,8 @@
<HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath> <HintPath>..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Moq, Version=4.5.21.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.21\lib\net45\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />

View File

@@ -31,7 +31,7 @@ namespace Filtration.ItemFilterPreview.Services
sw.Restart(); sw.Restart();
var matchedBlock = itemFilterScript.ItemFilterBlocks var matchedBlock = itemFilterScript.ItemFilterBlocks
.Where(b => !(b is ItemFilterSection)) .OfType<IItemFilterBlock>()
.FirstOrDefault(block => _blockItemMatcher.ItemBlockMatch(block, item)); .FirstOrDefault(block => _blockItemMatcher.ItemBlockMatch(block, item));
filteredItems.Add(new FilteredItem(item, matchedBlock)); filteredItems.Add(new FilteredItem(item, matchedBlock));

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net461" /> <package id="Castle.Core" version="3.3.3" targetFramework="net461" />
<package id="Castle.Windsor" version="3.3.0" targetFramework="net461" /> <package id="Castle.Windsor" version="3.4.0" targetFramework="net461" />
<package id="CommonServiceLocator" version="1.3" targetFramework="net461" /> <package id="CommonServiceLocator" version="1.3" targetFramework="net461" />
<package id="Moq" version="4.5.21" targetFramework="net461" /> <package id="Moq" version="4.5.30" targetFramework="net461" />
<package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net461" /> <package id="MvvmLightLibs" version="5.3.0.0" targetFramework="net461" />
</packages> </packages>

View File

@@ -35,13 +35,11 @@
<HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath> <HintPath>..\packages\Castle.Core.3.3.3\lib\net45\Castle.Core.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Moq, Version=4.5.21.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL"> <Reference Include="Moq, Version=4.5.30.0, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\packages\Moq.4.5.21\lib\net45\Moq.dll</HintPath> <HintPath>..\packages\Moq.4.5.30\lib\net45\Moq.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="nunit.framework, Version=3.4.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL"> <Reference Include="nunit.framework, Version=3.6.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll</HintPath> <HintPath>..\packages\NUnit.3.6.1\lib\net45\nunit.framework.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="PresentationCore" /> <Reference Include="PresentationCore" />
<Reference Include="System" /> <Reference Include="System" />
@@ -68,6 +66,9 @@
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -6,23 +6,6 @@ namespace Filtration.ObjectModel.Tests
[TestFixture] [TestFixture]
public class TestItemFilterBlock public class TestItemFilterBlock
{ {
[Test]
public void ItemFilterBlock_BlockCount_ReturnsCorrectNumber()
{
// Arrange
var block = new ItemFilterBlock();
block.BlockItems.Add(new ItemLevelBlockItem());
block.BlockItems.Add(new ItemLevelBlockItem());
block.BlockItems.Add(new ItemLevelBlockItem());
block.BlockItems.Add(new ItemLevelBlockItem());
// Act
var count = block.BlockCount(typeof (ItemLevelBlockItem));
// Assert
Assert.AreEqual(4, count);
}
[Test] [Test]
public void ItemFilterBlock_AddBlockItemAllowed_LessThanMaximum_ReturnsTrue() public void ItemFilterBlock_AddBlockItemAllowed_LessThanMaximum_ReturnsTrue()
{ {

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Castle.Core" version="3.3.3" targetFramework="net461" /> <package id="Castle.Core" version="3.3.3" targetFramework="net461" />
<package id="Moq" version="4.5.21" targetFramework="net461" /> <package id="Moq" version="4.5.30" targetFramework="net461" />
<package id="NUnit" version="3.4.1" targetFramework="net461" /> <package id="NUnit" version="3.6.1" targetFramework="net461" />
</packages> </packages>

View File

@@ -15,7 +15,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
public BlockAction Action public BlockAction Action
{ {
get { return _action; } get => _action;
set set
{ {
_action = value; _action = value;

View File

@@ -17,6 +17,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
public abstract Color SummaryBackgroundColor { get; } public abstract Color SummaryBackgroundColor { get; }
public abstract Color SummaryTextColor { get; } public abstract Color SummaryTextColor { get; }
public abstract int SortOrder { get; } public abstract int SortOrder { get; }
public string Comment { get; set; }
public bool IsDirty public bool IsDirty
{ {

View File

@@ -4,7 +4,7 @@ using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes namespace Filtration.ObjectModel.BlockItemBaseTypes
{ {
public abstract class ColorBlockItem : BlockItemBase, IAudioVisualBlockItem public abstract class ColorBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{ {
private Color _color; private Color _color;
private ThemeComponent _themeComponent; private ThemeComponent _themeComponent;
@@ -19,7 +19,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
} }
public override string OutputText => PrefixText + " " + +Color.R + " " + Color.G + " " public override string OutputText => PrefixText + " " + +Color.R + " " + Color.G + " "
+ Color.B + (Color.A < 255 ? " " + Color.A : string.Empty) + + Color.B + (Color.A != 240 ? " " + Color.A : string.Empty) +
(ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty); (ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty; public override string SummaryText => string.Empty;
@@ -63,7 +63,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
private void OnThemeComponentUpdated(object sender, EventArgs e) private void OnThemeComponentUpdated(object sender, EventArgs e)
{ {
Color = ((ThemeComponent) sender).Color; Color = ((ColorThemeComponent) sender).Color;
} }
private void OnThemeComponentDeleted(object sender, EventArgs e) private void OnThemeComponentDeleted(object sender, EventArgs e)

View File

@@ -0,0 +1,53 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class ColorBooleanBlockItem : BlockItemBase, IAudioVisualBlockItem
{
private Color _color;
private bool _booleanValue;
protected ColorBooleanBlockItem()
{
}
protected ColorBooleanBlockItem(Color color, bool booleanValue)
{
Color = color;
BooleanValue = booleanValue;
}
public override string OutputText => PrefixText + " " + +Color.R + " " + Color.G + " "
+ Color.B + (Color.A < 255 ? " " + Color.A : string.Empty) +
(BooleanValue ? " True" : " False");
public override string SummaryText => string.Empty;
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public Color Color
{
get { return _color; }
set
{
_color = value;
IsDirty = true;
OnPropertyChanged();
}
}
public bool BooleanValue
{
get { return _booleanValue; }
set
{
_booleanValue = value;
IsDirty = true;
OnPropertyChanged();
}
}
}
}

View File

@@ -0,0 +1,90 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class EffectColorBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{
private EffectColor _color;
private bool _temporary;
private ThemeComponent _themeComponent;
protected EffectColorBlockItem()
{
}
protected EffectColorBlockItem(EffectColor color, bool temporary)
{
Color = color;
Temporary = temporary;
}
public override string OutputText => PrefixText + " " + Color.GetAttributeDescription() +
(Temporary ? " " + "Temp" : string.Empty) +
(ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty;
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public EffectColor Color
{
get { return _color; }
set
{
_color = value;
IsDirty = true;
OnPropertyChanged();
}
}
public bool Temporary
{
get { return _temporary; }
set
{
_temporary = value;
IsDirty = true;
OnPropertyChanged();
}
}
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Color = ((EffectColorThemeComponent)sender).EffectColor;
Temporary = ((EffectColorThemeComponent)sender).Temporary;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
}
}

View File

@@ -0,0 +1,103 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class IconBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{
private IconSize _size;
private IconColor _color;
private IconShape _shape;
private ThemeComponent _themeComponent;
protected IconBlockItem()
{
}
protected IconBlockItem(IconSize size, IconColor color, IconShape shape)
{
Size = size;
Color = color;
Shape = shape;
}
public override string OutputText => PrefixText + " " + (int)Size + " " + Color.GetAttributeDescription() + " " + Shape.GetAttributeDescription() +
(ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty;
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public IconSize Size
{
get { return _size; }
set
{
_size = value;
IsDirty = true;
OnPropertyChanged();
}
}
public IconColor Color
{
get { return _color; }
set
{
_color = value;
IsDirty = true;
OnPropertyChanged();
}
}
public IconShape Shape
{
get { return _shape; }
set
{
_shape = value;
IsDirty = true;
OnPropertyChanged();
}
}
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Size = ((IconThemeComponent)sender).IconSize;
Color = ((IconThemeComponent)sender).IconColor;
Shape = ((IconThemeComponent)sender).IconShape;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
}
}

View File

@@ -1,10 +1,13 @@
using System.Windows.Media; using System;
using System.Windows.Media;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes namespace Filtration.ObjectModel.BlockItemBaseTypes
{ {
public abstract class IntegerBlockItem : BlockItemBase, IAudioVisualBlockItem public abstract class IntegerBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{ {
private int _value; private int _value;
private ThemeComponent _themeComponent;
protected IntegerBlockItem() protected IntegerBlockItem()
{ {
@@ -15,7 +18,7 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
Value = value; Value = value;
} }
public override string OutputText => PrefixText + " " + Value; public override string OutputText => PrefixText + " " + Value + (ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty; public override string SummaryText => string.Empty;
public override Color SummaryBackgroundColor => Colors.Transparent; public override Color SummaryBackgroundColor => Colors.Transparent;
@@ -24,6 +27,29 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
public abstract int Minimum { get; } public abstract int Minimum { get; }
public abstract int Maximum { get; } public abstract int Maximum { get; }
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public int Value public int Value
{ {
get { return _value; } get { return _value; }
@@ -34,5 +60,15 @@ namespace Filtration.ObjectModel.BlockItemBaseTypes
OnPropertyChanged(); OnPropertyChanged();
} }
} }
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Value = ((IntegerBlockItem)sender).Value;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
} }
} }

View File

@@ -0,0 +1,87 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class StrIntBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{
private string _value;
private int _secondValue;
private ThemeComponent _themeComponent;
protected StrIntBlockItem()
{
}
protected StrIntBlockItem(string value, int secondValue)
{
Value = value;
SecondValue = secondValue;
Value = value;
SecondValue = secondValue;
}
public override string OutputText => PrefixText + " " + Value + " " + SecondValue + (ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty;
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public string Value
{
get { return _value; }
set
{
_value = value;
IsDirty = true;
OnPropertyChanged();
}
}
public int SecondValue
{
get { return _secondValue; }
set
{
_secondValue = value;
IsDirty = true;
OnPropertyChanged();
}
}
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Value = ((StrIntBlockItem)sender).Value;
SecondValue = ((StrIntBlockItem)sender).SecondValue;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
}
}

View File

@@ -0,0 +1,72 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel.BlockItemBaseTypes
{
public abstract class StringBlockItem : BlockItemBase, IAudioVisualBlockItem, IBlockItemWithTheme
{
private string _value;
private ThemeComponent _themeComponent;
protected StringBlockItem()
{
}
protected StringBlockItem(string value)
{
Value = value;
}
public override string OutputText => PrefixText + " \"" + Value + "\""
+ (ThemeComponent != null ? " # " + ThemeComponent.ComponentName : string.Empty);
public override string SummaryText => string.Empty;
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public ThemeComponent ThemeComponent
{
get { return _themeComponent; }
set
{
if (_themeComponent == value) { return; }
if (_themeComponent != null)
{
_themeComponent.ThemeComponentUpdated -= OnThemeComponentUpdated;
_themeComponent.ThemeComponentDeleted -= OnThemeComponentDeleted;
}
if (value != null)
{
value.ThemeComponentUpdated += OnThemeComponentUpdated;
value.ThemeComponentDeleted += OnThemeComponentDeleted;
}
_themeComponent = value;
OnPropertyChanged();
}
}
public string Value
{
get { return _value; }
set
{
_value = value;
IsDirty = true;
OnPropertyChanged();
}
}
private void OnThemeComponentUpdated(object sender, EventArgs e)
{
Value = ((StringThemeComponent)sender).Value;
}
private void OnThemeComponentDeleted(object sender, EventArgs e)
{
ThemeComponent = null;
}
}
}

View File

@@ -7,6 +7,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
{ {
public BackgroundColorBlockItem() public BackgroundColorBlockItem()
{ {
Color = new Color { A = 240, R = 0, G = 0, B = 0 };
} }
public BackgroundColorBlockItem(Color color) : base(color) public BackgroundColorBlockItem(Color color) : base(color)
@@ -16,6 +17,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetBackgroundColor"; public override string PrefixText => "SetBackgroundColor";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Background Color"; public override string DisplayHeading => "Background Color";
public override int SortOrder => 15; public override int SortOrder => 23;
} }
} }

View File

@@ -33,6 +33,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.MediumTurquoise; public override Color SummaryBackgroundColor => Colors.MediumTurquoise;
public override Color SummaryTextColor => Colors.Black; public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 11; public override int SortOrder => 20;
} }
} }

View File

@@ -7,6 +7,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
{ {
public BorderColorBlockItem() public BorderColorBlockItem()
{ {
Color = new Color {A = 240, R = 0, G = 0, B = 0};
} }
public BorderColorBlockItem(Color color) : base(color) public BorderColorBlockItem(Color color) : base(color)
@@ -16,6 +17,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetBorderColor"; public override string PrefixText => "SetBorderColor";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Border Color"; public override string DisplayHeading => "Border Color";
public override int SortOrder => 16; public override int SortOrder => 24;
} }
} }

View File

@@ -33,6 +33,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.MediumSeaGreen; public override Color SummaryBackgroundColor => Colors.MediumSeaGreen;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 10; public override int SortOrder => 19;
} }
} }

View File

@@ -0,0 +1,21 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class CustomSoundBlockItem : StringBlockItem
{
public CustomSoundBlockItem()
{
Value = "placeholder.mp3";
}
public CustomSoundBlockItem(string value) : base(value)
{
}
public override string PrefixText => "CustomAlertSound";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Custom Alert Sound";
public override int SortOrder => 31;
}
}

View File

@@ -0,0 +1,23 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public sealed class DisableDropSoundBlockItem : BooleanBlockItem, IAudioVisualBlockItem
{
public DisableDropSoundBlockItem()
{
}
public DisableDropSoundBlockItem(bool booleanValue) : base(booleanValue)
{
}
public override string PrefixText => "DisableDropSound";
public override string DisplayHeading => "Disable Drop Sound";
public override Color SummaryBackgroundColor => Colors.Transparent;
public override Color SummaryTextColor => Colors.Transparent;
public override int SortOrder => 28;
}
}

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Drop Level " + FilterPredicate; public override string SummaryText => "Drop Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DodgerBlue; public override Color SummaryBackgroundColor => Colors.DodgerBlue;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 9; public override int SortOrder => 15;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 100; public override int Maximum => 100;
} }

View File

@@ -0,0 +1,23 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public sealed class ElderItemBlockItem : BooleanBlockItem
{
public ElderItemBlockItem()
{
}
public ElderItemBlockItem(bool booleanValue) : base(booleanValue)
{
}
public override string PrefixText => "ElderItem";
public override string DisplayHeading => "Elder Item";
public override Color SummaryBackgroundColor => Colors.DarkGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 6;
}
}

View File

@@ -0,0 +1,23 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public sealed class ElderMapBlockItem : BooleanBlockItem
{
public ElderMapBlockItem()
{
}
public ElderMapBlockItem(bool booleanValue) : base(booleanValue)
{
}
public override string PrefixText => "ElderMap";
public override string DisplayHeading => "Elder Map";
public override Color SummaryBackgroundColor => Colors.DarkGoldenrod;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 10;
}
}

View File

@@ -16,7 +16,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetFontSize"; public override string PrefixText => "SetFontSize";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Font Size"; public override string DisplayHeading => "Font Size";
public override int SortOrder => 17; public override int SortOrder => 25;
public override int Minimum => 11; public override int Minimum => 11;
public override int Maximum => 45; public override int Maximum => 45;
} }

View File

@@ -0,0 +1,28 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class GemLevelBlockItem : NumericFilterPredicateBlockItem
{
public GemLevelBlockItem()
{
}
public GemLevelBlockItem(FilterPredicateOperator predicateOperator, int predicateOperand)
: base(predicateOperator, predicateOperand)
{
}
public override string PrefixText => "GemLevel";
public override int MaximumAllowed => 2;
public override string DisplayHeading => "Gem Level";
public override string SummaryText => "Gem Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 16;
public override int Minimum => 0;
public override int Maximum => 21;
}
}

View File

@@ -0,0 +1,38 @@
using System.Linq;
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class HasExplicitModBlockItem : StringListBlockItem
{
public override string PrefixText => "HasExplicitMod";
public override int MaximumAllowed => 8;
public override string DisplayHeading => "Has Explicit Mod";
public override string SummaryText
{
get
{
if (Items.Count > 0 && Items.Count < 4)
{
return "Item Explicit Mods: " +
Items.Aggregate(string.Empty, (current, i) => current + i + ", ").TrimEnd(' ').TrimEnd(',');
}
if (Items.Count >= 4)
{
var remaining = Items.Count - 3;
return "Item Explicit Mods: " + Items.Take(3)
.Aggregate(string.Empty, (current, i) => current + i + ", ")
.TrimEnd(' ')
.TrimEnd(',') + " (+" + remaining + " more)";
}
return "Item Explicit Mods: (none)";
}
}
public override Color SummaryBackgroundColor => Colors.MidnightBlue;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 21;
}
}

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Height " + FilterPredicate; public override string SummaryText => "Height " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.LightBlue; public override Color SummaryBackgroundColor => Colors.LightBlue;
public override Color SummaryTextColor => Colors.Black; public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 7; public override int SortOrder => 12;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 6; public override int Maximum => 6;
} }

View File

@@ -20,7 +20,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Item Level " + FilterPredicate; public override string SummaryText => "Item Level " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray; public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 13; public override int SortOrder => 14;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 100; public override int Maximum => 100;
} }

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Linked Sockets " + FilterPredicate; public override string SummaryText => "Linked Sockets " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.Gold; public override Color SummaryBackgroundColor => Colors.Gold;
public override Color SummaryTextColor => Colors.Black; public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 0; public override int SortOrder => 1;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 6; public override int Maximum => 6;
} }

View File

@@ -0,0 +1,24 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class MapIconBlockItem : IconBlockItem
{
public MapIconBlockItem()
{
Size = IconSize.Largest;
Color = IconColor.Red;
Shape = IconShape.Circle;
}
public MapIconBlockItem(IconSize size, IconColor iconColor, IconShape iconShape) : base(size, iconColor, iconShape)
{
}
public override string PrefixText => "MinimapIcon";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Minimap Icon";
public override int SortOrder => 29;
}
}

View File

@@ -0,0 +1,28 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class MapTierBlockItem : NumericFilterPredicateBlockItem
{
public MapTierBlockItem()
{
}
public MapTierBlockItem(FilterPredicateOperator predicateOperator, int predicateOperand)
: base(predicateOperator, predicateOperand)
{
}
public override string PrefixText => "MapTier";
public override int MaximumAllowed => 2;
public override string DisplayHeading => "Map Tier";
public override string SummaryText => "Map Tier " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 8;
public override int Minimum => 1;
public override int Maximum => 16;
}
}

View File

@@ -0,0 +1,23 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class PlayEffectBlockItem : EffectColorBlockItem
{
public PlayEffectBlockItem()
{
Color = EffectColor.Red;
Temporary = false;
}
public PlayEffectBlockItem(EffectColor effectColor, bool temporary) : base(effectColor, temporary)
{
}
public override string PrefixText => "PlayEffect";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Effect";
public override int SortOrder => 30;
}
}

View File

@@ -0,0 +1,22 @@
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class PositionalSoundBlockItem : StrIntBlockItem
{
public PositionalSoundBlockItem()
{
Value = "1";
SecondValue = 79;
}
public PositionalSoundBlockItem(string value, int secondValue) : base(value, secondValue)
{
}
public override string PrefixText => "PlayAlertSoundPositional";
public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Positional Alert Sound";
public override int SortOrder => 27;
}
}

View File

@@ -23,6 +23,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 3; public override int SortOrder => 3;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 20; public override int Maximum => 30;
} }
} }

View File

@@ -30,7 +30,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
((ItemRarity) FilterPredicate.PredicateOperand).GetAttributeDescription(); ((ItemRarity) FilterPredicate.PredicateOperand).GetAttributeDescription();
public override Color SummaryBackgroundColor => Colors.LightCoral; public override Color SummaryBackgroundColor => Colors.LightCoral;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 12; public override int SortOrder => 18;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => (int)ItemRarity.Unique; public override int Maximum => (int)ItemRarity.Unique;
} }

View File

@@ -0,0 +1,23 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public sealed class ShapedMapBlockItem : BooleanBlockItem
{
public ShapedMapBlockItem()
{
}
public ShapedMapBlockItem(bool booleanValue) : base(booleanValue)
{
}
public override string PrefixText => "ShapedMap";
public override string DisplayHeading => "Shaped Map";
public override Color SummaryBackgroundColor => Colors.DarkGoldenrod;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 9;
}
}

View File

@@ -0,0 +1,23 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
namespace Filtration.ObjectModel.BlockItemTypes
{
public sealed class ShaperItemBlockItem : BooleanBlockItem
{
public ShaperItemBlockItem()
{
}
public ShaperItemBlockItem(bool booleanValue) : base(booleanValue)
{
}
public override string PrefixText => "ShaperItem";
public override string DisplayHeading => "Shaper Item";
public override Color SummaryBackgroundColor => Colors.DimGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 7;
}
}

View File

@@ -39,7 +39,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override Color SummaryBackgroundColor => Colors.GhostWhite; public override Color SummaryBackgroundColor => Colors.GhostWhite;
public override Color SummaryTextColor => Colors.Black; public override Color SummaryTextColor => Colors.Black;
public override int SortOrder => 6; public override int SortOrder => 11;
private SocketColor StringToSocketColor(char socketColorString) private SocketColor StringToSocketColor(char socketColorString)
{ {

View File

@@ -2,21 +2,21 @@
namespace Filtration.ObjectModel.BlockItemTypes namespace Filtration.ObjectModel.BlockItemTypes
{ {
public class SoundBlockItem : DualIntegerBlockItem public class SoundBlockItem : StrIntBlockItem
{ {
public SoundBlockItem() public SoundBlockItem()
{ {
Value = 1; Value = "1";
SecondValue = 79; SecondValue = 79;
} }
public SoundBlockItem(int value, int secondValue) : base(value, secondValue) public SoundBlockItem(string value, int secondValue) : base(value, secondValue)
{ {
} }
public override string PrefixText => "PlayAlertSound"; public override string PrefixText => "PlayAlertSound";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Play Alert Sound"; public override string DisplayHeading => "Play Alert Sound";
public override int SortOrder => 18; public override int SortOrder => 26;
} }
} }

View File

@@ -0,0 +1,28 @@
using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes
{
public class StackSizeBlockItem : NumericFilterPredicateBlockItem
{
public StackSizeBlockItem()
{
}
public StackSizeBlockItem(FilterPredicateOperator predicateOperator, int predicateOperand)
: base(predicateOperator, predicateOperand)
{
}
public override string PrefixText => "StackSize";
public override int MaximumAllowed => 2;
public override string DisplayHeading => "Stack Size";
public override string SummaryText => "Stack Size " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.DarkSlateGray;
public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 17;
public override int Minimum => 0;
public override int Maximum => 1000;
}
}

View File

@@ -1,5 +1,6 @@
using System.Windows.Media; using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.BlockItemTypes namespace Filtration.ObjectModel.BlockItemTypes
{ {
@@ -7,6 +8,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
{ {
public TextColorBlockItem() public TextColorBlockItem()
{ {
Color = PathOfExileNamedColors.Colors[PathOfExileNamedColor.WhiteItem];
} }
public TextColorBlockItem(Color color) : base(color) public TextColorBlockItem(Color color) : base(color)
@@ -16,6 +18,6 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string PrefixText => "SetTextColor"; public override string PrefixText => "SetTextColor";
public override int MaximumAllowed => 1; public override int MaximumAllowed => 1;
public override string DisplayHeading => "Text Color"; public override string DisplayHeading => "Text Color";
public override int SortOrder => 14; public override int SortOrder => 22;
} }
} }

View File

@@ -21,7 +21,7 @@ namespace Filtration.ObjectModel.BlockItemTypes
public override string SummaryText => "Width " + FilterPredicate; public override string SummaryText => "Width " + FilterPredicate;
public override Color SummaryBackgroundColor => Colors.MediumPurple; public override Color SummaryBackgroundColor => Colors.MediumPurple;
public override Color SummaryTextColor => Colors.White; public override Color SummaryTextColor => Colors.White;
public override int SortOrder => 8; public override int SortOrder => 13;
public override int Minimum => 0; public override int Minimum => 0;
public override int Maximum => 2; public override int Maximum => 2;
} }

View File

@@ -0,0 +1,61 @@
using System.Collections.Generic;
namespace Filtration.ObjectModel.Commands
{
public interface ICommandManager
{
void ExecuteCommand(ICommand command);
void Undo(int undoLevels = 1);
void Redo(int redoLevels = 1);
}
public interface ICommandManagerInternal : ICommandManager
{
void SetScript(IItemFilterScriptInternal layout);
}
internal class CommandManager : ICommandManagerInternal
{
private readonly Stack<IUndoableCommand> _undoCommandStack = new Stack<IUndoableCommand>();
private readonly Stack<IUndoableCommand> _redoCommandStack = new Stack<IUndoableCommand>();
private IItemFilterScriptInternal _itemFilterScript;
public void SetScript(IItemFilterScriptInternal itemFilterScript)
{
_itemFilterScript = itemFilterScript;
}
public void ExecuteCommand(ICommand command)
{
command.Execute();
if (command is IUndoableCommand undoableCommand)
{
_undoCommandStack.Push(undoableCommand);
_redoCommandStack.Clear();
}
_itemFilterScript.SetIsDirty(true);
}
public void Undo(int undoLevels = 1)
{
for (var index = undoLevels; _undoCommandStack.Count > 0 && index > 0; --index)
{
var undoableCommand = _undoCommandStack.Pop();
undoableCommand.Undo();
_redoCommandStack.Push(undoableCommand);
}
_itemFilterScript.SetIsDirty(true);
}
public void Redo(int redoLevels = 1)
{
for (int index = redoLevels; _redoCommandStack.Count > 0 && index > 0; --index)
{
var undoableCommand = _redoCommandStack.Pop();
undoableCommand.Redo();
_undoCommandStack.Push(undoableCommand);
}
_itemFilterScript.SetIsDirty(true);
}
}
}

View File

@@ -0,0 +1,7 @@
namespace Filtration.ObjectModel.Commands
{
public interface ICommand
{
void Execute();
}
}

View File

@@ -0,0 +1,8 @@
namespace Filtration.ObjectModel.Commands
{
internal interface IUndoableCommand : ICommand
{
void Undo();
void Redo();
}
}

View File

@@ -0,0 +1,37 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class AddBlockCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
private IItemFilterBlock _newItemFilterBlock;
public AddBlockCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
_newItemFilterBlock = new ItemFilterBlock(_itemFilterScript);
if (_addAfterItemFilterBlock != null)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(_addAfterItemFilterBlock) + 1, _newItemFilterBlock);
}
else
{
_itemFilterScript.ItemFilterBlocks.Add(_newItemFilterBlock);
}
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_newItemFilterBlock);
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,40 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class AddCommentBlockCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
private IItemFilterCommentBlock _newItemFilterBlock;
public AddCommentBlockCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
_newItemFilterBlock = new ItemFilterCommentBlock(_itemFilterScript)
{
Comment = string.Empty
};
if (_addAfterItemFilterBlock != null)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(_addAfterItemFilterBlock) + 1, _newItemFilterBlock);
}
else
{
_itemFilterScript.ItemFilterBlocks.Add(_newItemFilterBlock);
}
}
public void Undo()
{
_itemFilterScript.ItemFilterBlocks.Remove(_newItemFilterBlock);
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,60 @@
using System.Collections.Generic;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlocksToBottomCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly List<int> _sourceIndexes;
public MoveBlocksToBottomCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase block)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = new List<int> { _itemFilterScript.ItemFilterBlocks.IndexOf(block) };
}
public MoveBlocksToBottomCommand(IItemFilterScript itemFilterScript, List<int> sourceIndexes)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = sourceIndexes;
_sourceIndexes.Sort();
}
public void Execute()
{
List<IItemFilterBlockBase> blocksToMove = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
blocksToMove.Add(_itemFilterScript.ItemFilterBlocks[_sourceIndexes[i]]);
}
for (var i = _sourceIndexes.Count - 1; i >= 0; i--)
{
_itemFilterScript.ItemFilterBlocks.RemoveAt(_sourceIndexes[i]);
}
foreach (var block in blocksToMove)
{
_itemFilterScript.ItemFilterBlocks.Add(block);
}
}
public void Undo()
{
List<IItemFilterBlockBase> blocksToMove = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
var movedIndex = _itemFilterScript.ItemFilterBlocks.Count - _sourceIndexes.Count;
blocksToMove.Add(_itemFilterScript.ItemFilterBlocks[movedIndex]);
_itemFilterScript.ItemFilterBlocks.RemoveAt(movedIndex);
}
for (var i = 0; i < _sourceIndexes.Count; i++)
{
_itemFilterScript.ItemFilterBlocks.Insert(_sourceIndexes[i], blocksToMove[i]);
}
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlocksToIndexCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private List<int> _sourceIndexes;
private int _targetIndex;
public MoveBlocksToIndexCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase block, int targetIndex)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = new List<int> { _itemFilterScript.ItemFilterBlocks.IndexOf(block) };
_targetIndex = targetIndex;
}
public MoveBlocksToIndexCommand(IItemFilterScript itemFilterScript, List<int> sourceIndexes, int targetIndex)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = sourceIndexes;
_sourceIndexes.Sort();
_targetIndex = targetIndex;
}
public void Execute()
{
List<IItemFilterBlockBase> blocksToMove = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
blocksToMove.Add(_itemFilterScript.ItemFilterBlocks[_sourceIndexes[i]]);
}
for (var i = _sourceIndexes.Count - 1; i >= 0; i--)
{
_itemFilterScript.ItemFilterBlocks.RemoveAt(_sourceIndexes[i]);
}
for (var i = 0; i < blocksToMove.Count; i++)
{
_itemFilterScript.ItemFilterBlocks.Insert(_targetIndex + i, blocksToMove[i]);
}
}
public void Undo()
{
List<IItemFilterBlockBase> blocksToMove = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
blocksToMove.Add(_itemFilterScript.ItemFilterBlocks[_targetIndex]);
_itemFilterScript.ItemFilterBlocks.RemoveAt(_targetIndex);
}
for (var i = 0; i < _sourceIndexes.Count; i++)
{
_itemFilterScript.ItemFilterBlocks.Insert(_sourceIndexes[i], blocksToMove[i]);
}
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,59 @@
using System.Collections.Generic;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class MoveBlocksToTopCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly List<int> _sourceIndexes;
public MoveBlocksToTopCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase block)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = new List<int> { _itemFilterScript.ItemFilterBlocks.IndexOf(block) };
}
public MoveBlocksToTopCommand(IItemFilterScript itemFilterScript, List<int> sourceIndexes)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = sourceIndexes;
_sourceIndexes.Sort();
}
public void Execute()
{
List<IItemFilterBlockBase> blocksToMove = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
blocksToMove.Add(_itemFilterScript.ItemFilterBlocks[_sourceIndexes[i]]);
}
for (var i = _sourceIndexes.Count - 1; i >= 0; i--)
{
_itemFilterScript.ItemFilterBlocks.RemoveAt(_sourceIndexes[i]);
}
for (var i = 0; i < _sourceIndexes.Count; i++)
{
_itemFilterScript.ItemFilterBlocks.Insert(i, blocksToMove[i]);
}
}
public void Undo()
{
List<IItemFilterBlockBase> blocksToMove = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
blocksToMove.Add(_itemFilterScript.ItemFilterBlocks[0]);
_itemFilterScript.ItemFilterBlocks.RemoveAt(0);
}
for (var i = 0; i < _sourceIndexes.Count; i++)
{
_itemFilterScript.ItemFilterBlocks.Insert(_sourceIndexes[i], blocksToMove[i]);
}
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class PasteBlocksCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly List<IItemFilterBlockBase> _pastedItemFilterBlocks;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
public PasteBlocksCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase block, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_pastedItemFilterBlocks = new List<IItemFilterBlockBase> { block };
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public PasteBlocksCommand(IItemFilterScript itemFilterScript, List<IItemFilterBlockBase> pastedItemFilterBlocks, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_pastedItemFilterBlocks = pastedItemFilterBlocks;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
if (_addAfterItemFilterBlock != null)
{
var lastAddedBlock = _addAfterItemFilterBlock;
foreach (var block in _pastedItemFilterBlocks)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(lastAddedBlock) + 1, block);
lastAddedBlock = block;
}
}
else
{
foreach (var block in _pastedItemFilterBlocks)
{
_itemFilterScript.ItemFilterBlocks.Add(block);
}
}
}
public void Undo()
{
foreach (var block in _pastedItemFilterBlocks)
{
_itemFilterScript.ItemFilterBlocks.Remove(block);
}
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class PasteSectionCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly List<IItemFilterBlockBase> _pastedItemFilterBlocks;
private readonly IItemFilterBlockBase _addAfterItemFilterBlock;
public PasteSectionCommand(IItemFilterScript itemFilterScript, List<IItemFilterBlockBase> pastedItemFilterBlocks, IItemFilterBlockBase addAfterItemFilterBlock)
{
_itemFilterScript = itemFilterScript;
_pastedItemFilterBlocks = pastedItemFilterBlocks;
_addAfterItemFilterBlock = addAfterItemFilterBlock;
}
public void Execute()
{
if (_addAfterItemFilterBlock != null)
{
var lastAddedBlock = _addAfterItemFilterBlock;
foreach(var block in _pastedItemFilterBlocks)
{
_itemFilterScript.ItemFilterBlocks.Insert(_itemFilterScript.ItemFilterBlocks.IndexOf(lastAddedBlock) + 1, block);
lastAddedBlock = block;
}
}
else
{
foreach (var block in _pastedItemFilterBlocks)
{
_itemFilterScript.ItemFilterBlocks.Add(block);
}
}
}
public void Undo()
{
foreach (var block in _pastedItemFilterBlocks)
{
_itemFilterScript.ItemFilterBlocks.Remove(block);
}
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class RemoveBlocksCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private List<IItemFilterBlockBase> _removedItemFilterBlocks;
private List<int> _sourceIndexes;
public RemoveBlocksCommand(IItemFilterScript itemFilterScript, IItemFilterBlockBase block)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = new List<int> { _itemFilterScript.ItemFilterBlocks.IndexOf(block) };
_removedItemFilterBlocks = new List<IItemFilterBlockBase> { block };
}
public RemoveBlocksCommand(IItemFilterScript itemFilterScript, List<int> sourceIndexes)
{
_itemFilterScript = itemFilterScript;
_sourceIndexes = sourceIndexes;
_sourceIndexes.Sort();
_removedItemFilterBlocks = new List<IItemFilterBlockBase>();
for (var i = 0; i < _sourceIndexes.Count; i++)
{
_removedItemFilterBlocks.Add(_itemFilterScript.ItemFilterBlocks[_sourceIndexes[i]]);
}
}
public void Execute()
{
for (var i = _sourceIndexes.Count - 1; i >= 0; i--)
{
_itemFilterScript.ItemFilterBlocks.RemoveAt(_sourceIndexes[i]);
}
}
public void Undo()
{
for (var i = 0; i < _sourceIndexes.Count; i++)
{
_itemFilterScript.ItemFilterBlocks.Insert(_sourceIndexes[i], _removedItemFilterBlocks[i]);
}
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,30 @@
using System;
namespace Filtration.ObjectModel.Commands.ItemFilterScript
{
public class SetScriptDescriptionCommand : IUndoableCommand
{
private readonly IItemFilterScript _itemFilterScript;
private readonly string _newDescription;
private string _oldDescription;
public SetScriptDescriptionCommand(IItemFilterScript itemFilterScript, string newDescription)
{
_itemFilterScript = itemFilterScript;
_newDescription = newDescription;
}
public void Execute()
{
_oldDescription = _itemFilterScript.Description;
_itemFilterScript.Description = _newDescription;
}
public void Undo()
{
_itemFilterScript.Description = _oldDescription;
}
public void Redo() => Execute();
}
}

View File

@@ -0,0 +1,20 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
public enum EffectColor
{
[Description("Red")]
Red,
[Description("Green")]
Green,
[Description("Blue")]
Blue,
[Description("Brown")]
Brown,
[Description("White")]
White,
[Description("Yellow")]
Yellow
}
}

View File

@@ -0,0 +1,26 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
/// <summary>
/// Each of the colors supported by the MinimapIcon block rule.
/// </summary>
/// <remarks>
/// The ordering here should match the ordering of the colors within the source image.
/// </remarks>
public enum IconColor
{
[Description("Blue")]
Blue,
[Description("Green")]
Green,
[Description("Brown")]
Brown,
[Description("Red")]
Red,
[Description("White")]
White,
[Description("Yellow")]
Yellow
}
}

View File

@@ -0,0 +1,26 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
/// <summary>
/// Each of the shapes supported by the MinimapIcon block rule.
/// </summary>
/// <remarks>
/// The ordering here should match the ordering of the shapes within the source image.
/// </remarks>
public enum IconShape
{
[Description("Circle")]
Circle,
[Description("Diamond")]
Diamond,
[Description("Hexagon")]
Hexagon,
[Description("Square")]
Square,
[Description("Star")]
Star,
[Description("Triangle")]
Triangle
}
}

View File

@@ -0,0 +1,20 @@
using System.ComponentModel;
namespace Filtration.ObjectModel.Enums
{
/// <summary>
/// Each of the sizes supported by the MinimapIcon block rule.
/// </summary>
/// <remarks>
/// The ordering here should match the ordering of the sizes within the source image.
/// </remarks>
public enum IconSize
{
[Description("Largest")]
Largest,
[Description("Medium")]
Medium,
[Description("Small")]
Small
}
}

View File

@@ -9,6 +9,16 @@ namespace Filtration.ObjectModel.Enums
[Description("Background")] [Description("Background")]
BackgroundColor, BackgroundColor,
[Description("Border")] [Description("Border")]
BorderColor BorderColor,
[Description("Font Size")]
FontSize,
[Description("Alert Sound")]
AlertSound,
[Description("Custom Sound")]
CustomSound,
[Description("Icon")]
Icon,
[Description("Effect")]
Effect
} }
} }

View File

@@ -0,0 +1,9 @@
namespace Filtration.ObjectModel.Factories
{
public interface IItemFilterScriptFactory
{
IItemFilterScript Create();
void Release(IItemFilterScript itemFilterScript);
}
}

View File

@@ -24,8 +24,8 @@ namespace Filtration.ObjectModel
ItemFilterBlock = itemFilterBlock; ItemFilterBlock = itemFilterBlock;
BlockAction = itemFilterBlock?.Action ?? BlockAction.Show; BlockAction = itemFilterBlock?.Action ?? BlockAction.Show;
BackgroundColor = itemFilterBlock?.DisplayBackgroundColor ?? new Color { A = 255, R = 0, G = 0, B = 0 }; BackgroundColor = itemFilterBlock?.DisplayBackgroundColor ?? new Color { A = 240, R = 0, G = 0, B = 0 };
BorderColor = itemFilterBlock?.DisplayBorderColor ?? new Color {A = 255, R = 0, G = 0, B = 0}; BorderColor = itemFilterBlock?.DisplayBorderColor ?? new Color {A = 240, R = 0, G = 0, B = 0};
FontSize = (itemFilterBlock?.DisplayFontSize ?? 34) / 1.8; FontSize = (itemFilterBlock?.DisplayFontSize ?? 34) / 1.8;
SetTextColor(); SetTextColor();

View File

@@ -31,10 +31,32 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Castle.Core, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Core.3.3.0\lib\net45\Castle.Core.dll</HintPath>
</Reference>
<Reference Include="Castle.Windsor, Version=3.4.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc, processorArchitecture=MSIL">
<HintPath>..\packages\Castle.Windsor.3.4.0\lib\net45\Castle.Windsor.dll</HintPath>
</Reference>
<Reference Include="CommonServiceLocator, Version=2.0.2.0, Culture=neutral, PublicKeyToken=489b6accfaf20ef0, processorArchitecture=MSIL">
<HintPath>..\packages\CommonServiceLocator.2.0.2\lib\net45\CommonServiceLocator.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight, Version=5.3.0.19026, Culture=neutral, PublicKeyToken=e7570ab207bcb616, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Extras, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=669f0b5e8f868abf, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Extras.dll</HintPath>
</Reference>
<Reference Include="GalaSoft.MvvmLight.Platform, Version=5.3.0.19032, Culture=neutral, PublicKeyToken=5f873c45e98af8a1, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\GalaSoft.MvvmLight.Platform.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" /> <Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" /> <Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\MvvmLightLibs.5.3.0.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
@@ -46,14 +68,30 @@
<Compile Include="BlockItemBaseTypes\BlockItemBase.cs" /> <Compile Include="BlockItemBaseTypes\BlockItemBase.cs" />
<Compile Include="BlockItemBaseTypes\BooleanBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\BooleanBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\ColorBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\ColorBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\ColorBooleanBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\DualIntegerBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\DualIntegerBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\EffectColorBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\IconBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StringBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StrIntBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\IntegerBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\IntegerBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\NumericFilterPredicateBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\NumericFilterPredicateBlockItem.cs" />
<Compile Include="BlockItemBaseTypes\StringListBlockItem.cs" /> <Compile Include="BlockItemBaseTypes\StringListBlockItem.cs" />
<Compile Include="BlockItemTypes\BackgroundColorBlockItem.cs" /> <Compile Include="BlockItemTypes\BackgroundColorBlockItem.cs" />
<Compile Include="BlockItemTypes\BaseTypeBlockItem.cs" /> <Compile Include="BlockItemTypes\BaseTypeBlockItem.cs" />
<Compile Include="BlockItemTypes\MapTierBlockItem.cs" />
<Compile Include="BlockItemTypes\PlayEffectBlockItem.cs" />
<Compile Include="BlockItemTypes\BorderColorBlockItem.cs" /> <Compile Include="BlockItemTypes\BorderColorBlockItem.cs" />
<Compile Include="BlockItemTypes\ClassBlockItem.cs" /> <Compile Include="BlockItemTypes\ClassBlockItem.cs" />
<Compile Include="BlockItemTypes\CustomSoundBlockItem.cs" />
<Compile Include="BlockItemTypes\DisableDropSoundBlockItem.cs" />
<Compile Include="BlockItemTypes\ElderMapBlockItem.cs" />
<Compile Include="BlockItemTypes\GemLevelBlockItem.cs" />
<Compile Include="BlockItemTypes\HasExplicitModBlockItem.cs" />
<Compile Include="BlockItemTypes\MapIconBlockItem.cs" />
<Compile Include="BlockItemTypes\ShapedMapBlockItem.cs" />
<Compile Include="BlockItemTypes\ShaperItemBlockItem.cs" />
<Compile Include="BlockItemTypes\ElderItemBlockItem.cs" />
<Compile Include="BlockItemTypes\CorruptedBlockItem.cs" /> <Compile Include="BlockItemTypes\CorruptedBlockItem.cs" />
<Compile Include="BlockItemTypes\DropLevelBlockItem.cs" /> <Compile Include="BlockItemTypes\DropLevelBlockItem.cs" />
<Compile Include="BlockItemTypes\FontSizeBlockItem.cs" /> <Compile Include="BlockItemTypes\FontSizeBlockItem.cs" />
@@ -65,26 +103,45 @@
<Compile Include="BlockItemTypes\RarityBlockItem.cs" /> <Compile Include="BlockItemTypes\RarityBlockItem.cs" />
<Compile Include="BlockItemTypes\SocketGroupBlockItem.cs" /> <Compile Include="BlockItemTypes\SocketGroupBlockItem.cs" />
<Compile Include="BlockItemTypes\SocketsBlockItem.cs" /> <Compile Include="BlockItemTypes\SocketsBlockItem.cs" />
<Compile Include="BlockItemTypes\PositionalSoundBlockItem.cs" />
<Compile Include="BlockItemTypes\SoundBlockItem.cs" /> <Compile Include="BlockItemTypes\SoundBlockItem.cs" />
<Compile Include="BlockItemTypes\StackSizeBlockItem.cs" />
<Compile Include="BlockItemTypes\TextColorBlockItem.cs" /> <Compile Include="BlockItemTypes\TextColorBlockItem.cs" />
<Compile Include="BlockItemTypes\WidthBlockItem.cs" /> <Compile Include="BlockItemTypes\WidthBlockItem.cs" />
<Compile Include="Commands\CommandManager.cs" />
<Compile Include="Commands\ICommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlocksToIndexCommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlocksToBottomCommand.cs" />
<Compile Include="Commands\ItemFilterScript\AddCommentBlockCommand.cs" />
<Compile Include="Commands\ItemFilterScript\MoveBlocksToTopCommand.cs" />
<Compile Include="Commands\ItemFilterScript\PasteBlocksCommand.cs" />
<Compile Include="Commands\ItemFilterScript\RemoveBlocksCommand.cs" />
<Compile Include="Commands\ItemFilterScript\SetScriptDescriptionCommand.cs" />
<Compile Include="Commands\ItemFilterScript\AddBlockCommand.cs" />
<Compile Include="Commands\IUndoableCommand.cs" />
<Compile Include="Enums\BlockAction.cs" /> <Compile Include="Enums\BlockAction.cs" />
<Compile Include="Enums\BlockItemType.cs" /> <Compile Include="Enums\BlockItemType.cs" />
<Compile Include="Enums\EffectColor.cs" />
<Compile Include="Enums\FilterPredicateOperator.cs" /> <Compile Include="Enums\FilterPredicateOperator.cs" />
<Compile Include="Enums\FilterType.cs" /> <Compile Include="Enums\FilterType.cs" />
<Compile Include="Enums\IconColor.cs" />
<Compile Include="Enums\IconShape.cs" />
<Compile Include="Enums\IconSize.cs" />
<Compile Include="Enums\ItemRarity.cs" /> <Compile Include="Enums\ItemRarity.cs" />
<Compile Include="Enums\SocketColor.cs" /> <Compile Include="Enums\SocketColor.cs" />
<Compile Include="Enums\ThemeComponentType.cs" /> <Compile Include="Enums\ThemeComponentType.cs" />
<Compile Include="Extensions\EnumHelper.cs" /> <Compile Include="Extensions\EnumHelper.cs" />
<Compile Include="Extensions\ItemRarityExtensions.cs" /> <Compile Include="Extensions\ItemRarityExtensions.cs" />
<Compile Include="Factories\IItemFilterScriptFactory.cs" />
<Compile Include="FilteredItem.cs" /> <Compile Include="FilteredItem.cs" />
<Compile Include="IAudioVisualBlockItem.cs" /> <Compile Include="IAudioVisualBlockItem.cs" />
<Compile Include="IBlockItemWithTheme.cs" />
<Compile Include="IItemFilterBlockItem.cs" /> <Compile Include="IItemFilterBlockItem.cs" />
<Compile Include="Item.cs" /> <Compile Include="Item.cs" />
<Compile Include="ItemFilterBlock.cs" /> <Compile Include="ItemFilterBlock.cs" />
<Compile Include="ItemFilterBlockGroup.cs" /> <Compile Include="ItemFilterBlockGroup.cs" />
<Compile Include="ItemFilterScript.cs" /> <Compile Include="ItemFilterScript.cs" />
<Compile Include="ItemFilterSection.cs" /> <Compile Include="ItemFilterScriptSettings.cs" />
<Compile Include="ItemSet.cs" /> <Compile Include="ItemSet.cs" />
<Compile Include="NumericFilterPredicate.cs" /> <Compile Include="NumericFilterPredicate.cs" />
<Compile Include="PathOfExileNamedColors.cs" /> <Compile Include="PathOfExileNamedColors.cs" />
@@ -94,9 +151,20 @@
<Compile Include="ReplaceColorsParameterSet.cs" /> <Compile Include="ReplaceColorsParameterSet.cs" />
<Compile Include="Socket.cs" /> <Compile Include="Socket.cs" />
<Compile Include="SocketGroup.cs" /> <Compile Include="SocketGroup.cs" />
<Compile Include="ThemeEditor\EffectColorThemeComponent.cs" />
<Compile Include="ThemeEditor\IconThemeComponent.cs" />
<Compile Include="ThemeEditor\StringThemeComponent.cs" />
<Compile Include="ThemeEditor\StrIntThemeComponent.cs" />
<Compile Include="ThemeEditor\IntegerThemeComponent.cs" />
<Compile Include="ThemeEditor\Theme.cs" /> <Compile Include="ThemeEditor\Theme.cs" />
<Compile Include="ThemeEditor\ColorThemeComponent.cs" />
<Compile Include="ThemeEditor\ThemeComponent.cs" /> <Compile Include="ThemeEditor\ThemeComponent.cs" />
<Compile Include="ThemeEditor\ThemeComponentCollection.cs" /> <Compile Include="ThemeEditor\ThemeComponentCollection.cs" />
<Compile Include="WindsorInstallers\CommandsInstaller.cs" />
<Compile Include="WindsorInstallers\ModelsInstaller.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -0,0 +1,9 @@
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel
{
public interface IBlockItemWithTheme : IItemFilterBlockItem
{
ThemeComponent ThemeComponent { get; set; }
}
}

View File

@@ -5,8 +5,6 @@ namespace Filtration.ObjectModel
{ {
public interface IItemFilterBlockItem : INotifyPropertyChanged public interface IItemFilterBlockItem : INotifyPropertyChanged
{ {
event PropertyChangedEventHandler PropertyChanged;
string PrefixText { get; } string PrefixText { get; }
string OutputText { get; } string OutputText { get; }
string DisplayHeading { get; } string DisplayHeading { get; }
@@ -16,5 +14,6 @@ namespace Filtration.ObjectModel
int MaximumAllowed { get; } int MaximumAllowed { get; }
int SortOrder { get; } int SortOrder { get; }
bool IsDirty { get; } bool IsDirty { get; }
string Comment { get; set; }
} }
} }

View File

@@ -1,47 +1,136 @@
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq; using System.Linq;
using System.Windows.Media; using System.Windows.Media;
using Filtration.ObjectModel.BlockItemBaseTypes; using Filtration.ObjectModel.BlockItemBaseTypes;
using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Commands;
using Filtration.ObjectModel.Enums; using Filtration.ObjectModel.Enums;
using Filtration.ObjectModel.Extensions; using Filtration.ObjectModel.Extensions;
namespace Filtration.ObjectModel namespace Filtration.ObjectModel
{ {
public interface IItemFilterBlock public interface IItemFilterBlock : IItemFilterBlockBase
{ {
bool Enabled { get; set; } bool Enabled { get; set; }
event EventHandler EnabledStatusChanged;
string Description { get; set; } string Description { get; set; }
ItemFilterBlockGroup BlockGroup { get; set; } ItemFilterBlockGroup BlockGroup { get; set; }
BlockAction Action { get; set; } BlockAction Action { get; set; }
ActionBlockItem ActionBlockItem { get; }
ObservableCollection<IItemFilterBlockItem> BlockItems { get; } ObservableCollection<IItemFilterBlockItem> BlockItems { get; }
Color DisplayBackgroundColor { get; } Color DisplayBackgroundColor { get; }
Color DisplayTextColor { get; } Color DisplayTextColor { get; }
Color DisplayBorderColor { get; } Color DisplayBorderColor { get; }
double DisplayFontSize { get; } double DisplayFontSize { get; }
int BlockCount(Type type); int DisplayIconSize { get; }
bool AddBlockItemAllowed(Type type); int DisplayIconColor { get; }
int DisplayIconShape { get; }
Color DisplayEffectColor { get; }
bool HasBlockItemOfType<T>(); bool HasBlockItemOfType<T>();
bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup); bool HasBlockGroupInParentHierarchy(ItemFilterBlockGroup targetBlockGroup, ItemFilterBlockGroup startingBlockGroup);
} }
public class ItemFilterBlock : IItemFilterBlock public interface IItemFilterBlockBase
{ {
private ItemFilterBlockGroup _blockGroup; bool IsEdited { get; set; }
string OriginalText { get; set; }
public ItemFilterBlock()
{
BlockItems = new ObservableCollection<IItemFilterBlockItem> {new ActionBlockItem(BlockAction.Show)};
Enabled = true;
} }
public bool Enabled { get; set; } public abstract class ItemFilterBlockBase : IItemFilterBlockBase
public string Description { get; set; } {
protected ItemFilterBlockBase()
{
}
protected ItemFilterBlockBase(IItemFilterScript parentScript)
{
CommandManager = parentScript.CommandManager;
ParentScript = parentScript;
}
public ICommandManager CommandManager { get; }
public IItemFilterScript ParentScript { get; set; }
public bool IsEdited { get; set; }
public string OriginalText { get; set; }
}
public interface IItemFilterCommentBlock : IItemFilterBlockBase
{
string Comment { get; set; }
}
public class ItemFilterCommentBlock : ItemFilterBlockBase, IItemFilterCommentBlock
{
private string _comment;
public ItemFilterCommentBlock(IItemFilterScript parentScript) : base(parentScript)
{
}
public string Comment
{
get { return _comment; }
set
{
_comment = value;
IsEdited = true;
}
}
}
public class ItemFilterBlock : ItemFilterBlockBase, IItemFilterBlock
{
private ItemFilterBlockGroup _blockGroup;
private bool _enabled;
private string _description;
internal ItemFilterBlock()
{
BlockItems = new ObservableCollection<IItemFilterBlockItem> { ActionBlockItem };
BlockItems.CollectionChanged += new NotifyCollectionChangedEventHandler(OnBlockItemsChanged);
ActionBlockItem.PropertyChanged += OnActionBlockItemChanged;
_enabled = true;
}
public ItemFilterBlock(IItemFilterScript parentScript) : base(parentScript)
{
BlockItems = new ObservableCollection<IItemFilterBlockItem> { ActionBlockItem };
BlockItems.CollectionChanged += new NotifyCollectionChangedEventHandler(OnBlockItemsChanged);
ActionBlockItem.PropertyChanged += OnActionBlockItemChanged;
_enabled = true;
}
public bool Enabled
{
get { return _enabled; }
set
{
_enabled = value;
IsEdited = true;
EnabledStatusChanged?.Invoke(null, null);
if(BlockGroup != null && BlockGroup.IsEnableChecked != value)
{
BlockGroup.IsEnableChecked = value;
}
}
}
public event EventHandler EnabledStatusChanged;
public string Description
{
get { return _description; }
set
{
_description = value;
IsEdited = true;
}
}
public ItemFilterBlockGroup BlockGroup public ItemFilterBlockGroup BlockGroup
{ {
get { return _blockGroup; } get => _blockGroup;
set set
{ {
var oldBlockGroup = _blockGroup; var oldBlockGroup = _blockGroup;
@@ -76,20 +165,34 @@ namespace Filtration.ObjectModel
{ {
var actionBlock = BlockItems.OfType<ActionBlockItem>().First(); var actionBlock = BlockItems.OfType<ActionBlockItem>().First();
actionBlock.Action = value; actionBlock.Action = value;
IsEdited = true;
} }
} }
public ActionBlockItem ActionBlockItem { get; } = new ActionBlockItem(BlockAction.Show);
public ObservableCollection<IItemFilterBlockItem> BlockItems { get; } public ObservableCollection<IItemFilterBlockItem> BlockItems { get; }
private void OnBlockItemsChanged(object sender, NotifyCollectionChangedEventArgs e)
public int BlockCount(Type type)
{ {
return BlockItems?.Count(b => b.GetType() == type) ?? 0; IsEdited = true;
}
private void OnActionBlockItemChanged(object sender, EventArgs e)
{
if (BlockGroup != null && BlockGroup.IsShowChecked != (Action == BlockAction.Show))
{
BlockGroup.IsShowChecked = (Action == BlockAction.Show);
}
} }
public bool AddBlockItemAllowed(Type type) public bool AddBlockItemAllowed(Type type)
{ {
int BlockCount()
{
return BlockItems?.Count(b => b.GetType() == type) ?? 0;
}
var blockItem = (IItemFilterBlockItem)Activator.CreateInstance(type); var blockItem = (IItemFilterBlockItem)Activator.CreateInstance(type);
return BlockCount(type) < blockItem.MaximumAllowed; return BlockCount() < blockItem.MaximumAllowed;
} }
public bool HasBlockItemOfType<T>() public bool HasBlockItemOfType<T>()
@@ -113,14 +216,23 @@ namespace Filtration.ObjectModel
private void OnBlockGroupStatusChanged(object sender, EventArgs e) private void OnBlockGroupStatusChanged(object sender, EventArgs e)
{ {
if (BlockGroup.IsChecked == false && Action == BlockAction.Show) if (BlockGroup.IsShowChecked == false && Action == BlockAction.Show)
{ {
Action = BlockAction.Hide; Action = BlockAction.Hide;
} }
else if (BlockGroup.IsChecked && Action == BlockAction.Hide) else if (BlockGroup.IsShowChecked == true && Action == BlockAction.Hide)
{ {
Action = BlockAction.Show; Action = BlockAction.Show;
} }
if (BlockGroup.IsEnableChecked == false && Enabled)
{
Enabled = false;
}
else if (BlockGroup.IsEnableChecked == true && !Enabled)
{
Enabled = true;
}
} }
public Color DisplayTextColor public Color DisplayTextColor
@@ -158,7 +270,7 @@ namespace Filtration.ObjectModel
get get
{ {
var backgroundColorBlockItem = BlockItems.OfType<BackgroundColorBlockItem>().FirstOrDefault(); var backgroundColorBlockItem = BlockItems.OfType<BackgroundColorBlockItem>().FirstOrDefault();
return backgroundColorBlockItem?.Color ?? new Color { A = 255, R = 0, G = 0, B = 0 }; return backgroundColorBlockItem?.Color ?? new Color { A = 240, R = 0, G = 0, B = 0 };
} }
} }
@@ -167,7 +279,7 @@ namespace Filtration.ObjectModel
get get
{ {
var borderColorBlockItem = BlockItems.OfType<BorderColorBlockItem>().FirstOrDefault(); var borderColorBlockItem = BlockItems.OfType<BorderColorBlockItem>().FirstOrDefault();
return borderColorBlockItem?.Color ?? new Color { A = 255, R = 0, G = 0, B = 0 }; return borderColorBlockItem?.Color ?? new Color { A = 240, R = 0, G = 0, B = 0 };
} }
} }
@@ -179,5 +291,70 @@ namespace Filtration.ObjectModel
return fontSizeBlockItem?.Value ?? 34; return fontSizeBlockItem?.Value ?? 34;
} }
} }
public int DisplayIconSize
{
get
{
var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Size;
return -1;
}
}
public int DisplayIconColor
{
get
{
var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Color;
return -1;
}
}
public int DisplayIconShape
{
get
{
var mapIconBlockItem = BlockItems.OfType<MapIconBlockItem>().FirstOrDefault();
if (mapIconBlockItem != null)
return (int)mapIconBlockItem.Shape;
return -1;
}
}
public Color DisplayEffectColor
{
get
{
var beamBlockItem = BlockItems.OfType<PlayEffectBlockItem>().FirstOrDefault();
if (beamBlockItem != null)
{
switch (beamBlockItem.Color)
{
case EffectColor.Red:
return Colors.Red;
case EffectColor.Green:
return Colors.Green;
case EffectColor.Blue:
return Colors.Blue;
case EffectColor.Brown:
return Colors.Brown;
case EffectColor.White:
return Colors.White;
case EffectColor.Yellow:
return Colors.Yellow;
}
}
return Colors.Transparent;
}
}
} }
} }

View File

@@ -5,31 +5,34 @@ namespace Filtration.ObjectModel
{ {
public class ItemFilterBlockGroup public class ItemFilterBlockGroup
{ {
private bool _isChecked; private bool? _isShowChecked;
private bool? _isEnableChecked;
public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent, bool advanced = false) public ItemFilterBlockGroup(string groupName, ItemFilterBlockGroup parent, bool advanced = false, bool isLeafNode = false)
{ {
GroupName = groupName; GroupName = groupName;
ParentGroup = parent; ParentGroup = parent;
Advanced = advanced; Advanced = advanced;
ChildGroups = new List<ItemFilterBlockGroup>(); ChildGroups = new List<ItemFilterBlockGroup>();
IsLeafNode = isLeafNode;
} }
public string GroupName { get; }
public ItemFilterBlockGroup ParentGroup { get; set; }
public List<ItemFilterBlockGroup> ChildGroups { get; }
public bool Advanced { get; }
public bool IsLeafNode { get; }
public event EventHandler BlockGroupStatusChanged; public event EventHandler BlockGroupStatusChanged;
public string GroupName { get; } public bool? IsShowChecked
public ItemFilterBlockGroup ParentGroup { get; }
public List<ItemFilterBlockGroup> ChildGroups { get; }
public bool Advanced { get; }
public bool IsChecked
{ {
get { return _isChecked; } get { return _isShowChecked; }
set set
{ {
if (value != _isChecked) if (value != _isShowChecked)
{ {
_isChecked = value; _isShowChecked = value;
// Raise an event to let blocks that have this block group assigned that // Raise an event to let blocks that have this block group assigned that
// they might need to change their Action due to the block group status changing. // they might need to change their Action due to the block group status changing.
BlockGroupStatusChanged?.Invoke(null, null); BlockGroupStatusChanged?.Invoke(null, null);
@@ -37,20 +40,85 @@ namespace Filtration.ObjectModel
} }
} }
public bool? IsEnableChecked
{
get { return _isEnableChecked; }
set
{
if (value != _isEnableChecked)
{
_isEnableChecked = value;
// Raise an event to let blocks that have this block group assigned that
// they might need to change their Enabled due to the block group status changing.
BlockGroupStatusChanged?.Invoke(null, null);
}
}
}
public void ClearStatusChangeSubscribers()
{
BlockGroupStatusChanged = null;
}
public void AddOrJoinBlockGroup(ItemFilterBlockGroup blockGroup)
{
var childIndex = ChildGroups.FindIndex(item => item.GroupName.Equals(blockGroup.GroupName));
if (!blockGroup.IsLeafNode && childIndex >= 0)
{
while(blockGroup.ChildGroups.Count > 0)
{
ChildGroups[childIndex].AddOrJoinBlockGroup(blockGroup.ChildGroups[0]);
}
}
else
{
if(blockGroup.ParentGroup != null)
{
blockGroup.ParentGroup.ChildGroups.Remove(blockGroup);
}
blockGroup.ParentGroup = this;
ChildGroups.Add(blockGroup);
}
}
public void DetachSelf(bool keepChildren)
{
if(ParentGroup == null)
return;
if(IsLeafNode && ParentGroup.ParentGroup != null && ParentGroup.ChildGroups.Count < 2)
{
ParentGroup.DetachSelf(false);
}
else
{
ParentGroup.ChildGroups.Remove(this);
if (keepChildren)
{
foreach(var child in ChildGroups)
{
ParentGroup.AddOrJoinBlockGroup(child);
}
}
ParentGroup = null;
}
}
public override string ToString() public override string ToString()
{ {
var currentBlockGroup = this; if(ParentGroup == null)
{
return string.Empty;
}
var outputString = (Advanced ? "~" : string.Empty) + GroupName; var outputString = (Advanced ? "~" : string.Empty) + GroupName;
// TODO: This is retarded, fix this. var parentOutput = ParentGroup.ToString();
if (currentBlockGroup.ParentGroup != null) if(!string.IsNullOrWhiteSpace(parentOutput))
{ {
while (currentBlockGroup.ParentGroup.ParentGroup != null) outputString = parentOutput + (IsLeafNode ? string.Empty : " - " + outputString);
{
outputString = (currentBlockGroup.ParentGroup.Advanced ? "~" : string.Empty) + currentBlockGroup.ParentGroup.GroupName + " - " + outputString;
currentBlockGroup = currentBlockGroup.ParentGroup;
}
} }
return outputString; return outputString;

View File

@@ -1,45 +1,101 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using Filtration.ObjectModel.Annotations;
using Filtration.ObjectModel.BlockItemTypes; using Filtration.ObjectModel.BlockItemTypes;
using Filtration.ObjectModel.Commands;
using Filtration.ObjectModel.ThemeEditor; using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel namespace Filtration.ObjectModel
{ {
public interface IItemFilterScript public interface IItemFilterScript : INotifyPropertyChanged
{ {
ObservableCollection<IItemFilterBlock> ItemFilterBlocks { get; } ICommandManager CommandManager { get; }
ObservableCollection<IItemFilterBlockBase> ItemFilterBlocks { get; }
ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; } ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; }
ThemeComponentCollection ThemeComponents { get; set; } ThemeComponentCollection ThemeComponents { get; set; }
string FilePath { get; set; } string FilePath { get; set; }
string Description { get; set; } string Description { get; set; }
DateTime DateModified { get; set; } DateTime DateModified { get; set; }
bool IsDirty { get; }
IItemFilterScriptSettings ItemFilterScriptSettings { get; }
List<string> Validate(); List<string> Validate();
void ReplaceColors(ReplaceColorsParameterSet replaceColorsParameterSet); void ReplaceColors(ReplaceColorsParameterSet replaceColorsParameterSet);
} }
public class ItemFilterScript : IItemFilterScript public interface IItemFilterScriptInternal : IItemFilterScript
{ {
public ItemFilterScript() void SetIsDirty(bool isDirty);
}
public class ItemFilterScript : IItemFilterScriptInternal
{ {
ItemFilterBlocks = new ObservableCollection<IItemFilterBlock>(); private bool _isDirty;
private string _description;
internal ItemFilterScript()
{
ItemFilterBlocks = new ObservableCollection<IItemFilterBlockBase>();
ItemFilterBlockGroups = new ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups = new ObservableCollection<ItemFilterBlockGroup>
{ {
new ItemFilterBlockGroup("Root", null) new ItemFilterBlockGroup("Root", null)
}; };
ThemeComponents = new ThemeComponentCollection { IsMasterCollection = true }; ThemeComponents = new ThemeComponentCollection { IsMasterCollection = true };
ItemFilterScriptSettings = new ItemFilterScriptSettings(ThemeComponents);
} }
public ObservableCollection<IItemFilterBlock> ItemFilterBlocks { get; } public ItemFilterScript(ICommandManagerInternal commandManager) : this()
{
CommandManager = commandManager;
commandManager.SetScript(this);
}
public ICommandManager CommandManager { get; }
public ObservableCollection<IItemFilterBlockBase> ItemFilterBlocks { get; }
public ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; } public ObservableCollection<ItemFilterBlockGroup> ItemFilterBlockGroups { get; }
public ThemeComponentCollection ThemeComponents { get; set; } public ThemeComponentCollection ThemeComponents { get; set; }
public IItemFilterScriptSettings ItemFilterScriptSettings { get; }
public string FilePath { get; set; } public string FilePath { get; set; }
public string Description { get; set; }
public string Description
{
get => _description;
set
{
if (value == _description) return;
_description = value;
OnPropertyChanged();
}
}
public DateTime DateModified { get; set; } public DateTime DateModified { get; set; }
public bool IsDirty
{
get => _isDirty;
private set
{
if (value == _isDirty) return;
_isDirty = value;
OnPropertyChanged();
}
}
public void SetIsDirty(bool isDirty)
{
IsDirty = isDirty;
}
public List<string> Validate() public List<string> Validate()
{ {
var validationErrors = new List<string>(); var validationErrors = new List<string>();
@@ -54,9 +110,7 @@ namespace Filtration.ObjectModel
public void ReplaceColors(ReplaceColorsParameterSet replaceColorsParameterSet) public void ReplaceColors(ReplaceColorsParameterSet replaceColorsParameterSet)
{ {
foreach ( foreach (var block in ItemFilterBlocks.OfType<ItemFilterBlock>().Where(b => BlockIsColorReplacementCandidate(replaceColorsParameterSet, b)))
var block in
ItemFilterBlocks.Where(b => BlockIsColorReplacementCandidate(replaceColorsParameterSet, b)))
{ {
if (replaceColorsParameterSet.ReplaceTextColor) if (replaceColorsParameterSet.ReplaceTextColor)
{ {
@@ -78,15 +132,9 @@ namespace Filtration.ObjectModel
private bool BlockIsColorReplacementCandidate(ReplaceColorsParameterSet replaceColorsParameterSet, IItemFilterBlock block) private bool BlockIsColorReplacementCandidate(ReplaceColorsParameterSet replaceColorsParameterSet, IItemFilterBlock block)
{ {
var textColorItem = block.HasBlockItemOfType<TextColorBlockItem>() var textColorItem = block.BlockItems.OfType<TextColorBlockItem>().FirstOrDefault();
? block.BlockItems.OfType<TextColorBlockItem>().First() var backgroundColorItem = block.BlockItems.OfType<BackgroundColorBlockItem>().FirstOrDefault();
: null; var borderColorItem = block.BlockItems.OfType<BorderColorBlockItem>().FirstOrDefault();
var backgroundColorItem = block.HasBlockItemOfType<BackgroundColorBlockItem>()
? block.BlockItems.OfType<BackgroundColorBlockItem>().First()
: null;
var borderColorItem = block.HasBlockItemOfType<BorderColorBlockItem>()
? block.BlockItems.OfType<BorderColorBlockItem>().First()
: null;
// If we don't have all of the things we want to replace, then we aren't a candidate for replacing those things. // If we don't have all of the things we want to replace, then we aren't a candidate for replacing those things.
if ((textColorItem == null && replaceColorsParameterSet.ReplaceTextColor) || if ((textColorItem == null && replaceColorsParameterSet.ReplaceTextColor) ||
@@ -109,5 +157,12 @@ namespace Filtration.ObjectModel
return true; return true;
} }
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
} }
} }

View File

@@ -0,0 +1,21 @@
using Filtration.ObjectModel.ThemeEditor;
namespace Filtration.ObjectModel
{
public interface IItemFilterScriptSettings
{
bool BlockGroupsEnabled { get; set; }
ThemeComponentCollection ThemeComponentCollection { get; }
}
public class ItemFilterScriptSettings : IItemFilterScriptSettings
{
public ItemFilterScriptSettings(ThemeComponentCollection themeComponentCollection)
{
ThemeComponentCollection = themeComponentCollection;
}
public bool BlockGroupsEnabled { get; set; }
public ThemeComponentCollection ThemeComponentCollection { get; }
}
}

View File

@@ -1,6 +0,0 @@
namespace Filtration.ObjectModel
{
public class ItemFilterSection : ItemFilterBlock
{
}
}

View File

@@ -8,36 +8,36 @@ namespace Filtration.ObjectModel
{ {
public static Dictionary<PathOfExileNamedColor, Color> Colors => new Dictionary<PathOfExileNamedColor, Color> public static Dictionary<PathOfExileNamedColor, Color> Colors => new Dictionary<PathOfExileNamedColor, Color>
{ {
{PathOfExileNamedColor.Default, new Color {A = 255, R = 127, G = 127, B = 127}}, {PathOfExileNamedColor.Default, new Color {A = 240, R = 127, G = 127, B = 127}},
{PathOfExileNamedColor.ValueDefault, new Color {A = 255, R = 255, G = 255, B = 255}}, {PathOfExileNamedColor.ValueDefault, new Color {A = 240, R = 255, G = 255, B = 255}},
{PathOfExileNamedColor.Pink, new Color {A = 255, R = 255, G = 192, B = 203}}, {PathOfExileNamedColor.Pink, new Color {A = 240, R = 255, G = 192, B = 203}},
{PathOfExileNamedColor.DodgerBlue, new Color {A = 255, R = 30, G = 144, B = 255}}, {PathOfExileNamedColor.DodgerBlue, new Color {A = 240, R = 30, G = 144, B = 255}},
{PathOfExileNamedColor.Fire, new Color {A = 255, R = 150, G = 0, B = 0}}, {PathOfExileNamedColor.Fire, new Color {A = 240, R = 150, G = 0, B = 0}},
{PathOfExileNamedColor.Cold, new Color {A = 255, R = 54, G = 100, B = 146}}, {PathOfExileNamedColor.Cold, new Color {A = 240, R = 54, G = 100, B = 146}},
{PathOfExileNamedColor.Lightning, new Color {A = 255, R = 255, G = 215, B = 0}}, {PathOfExileNamedColor.Lightning, new Color {A = 240, R = 255, G = 215, B = 0}},
{PathOfExileNamedColor.Chaos, new Color {A = 255, R = 208, G = 32, B = 144}}, {PathOfExileNamedColor.Chaos, new Color {A = 240, R = 208, G = 32, B = 144}},
{PathOfExileNamedColor.Augmented, new Color {A = 255, R = 136, G = 136, B = 255}}, {PathOfExileNamedColor.Augmented, new Color {A = 240, R = 136, G = 136, B = 255}},
{PathOfExileNamedColor.Crafted, new Color {A = 255, R = 184, G = 218, B = 242}}, {PathOfExileNamedColor.Crafted, new Color {A = 240, R = 184, G = 218, B = 242}},
{PathOfExileNamedColor.Unmet, new Color {A = 255, R = 210, G = 0, B = 0}}, {PathOfExileNamedColor.Unmet, new Color {A = 240, R = 210, G = 0, B = 0}},
{PathOfExileNamedColor.UniqueItem, new Color {A = 255, R = 175, G = 96, B = 37}}, {PathOfExileNamedColor.UniqueItem, new Color {A = 240, R = 175, G = 96, B = 37}},
{PathOfExileNamedColor.RareItem, new Color {A = 255, R = 255, G = 255, B = 119}}, {PathOfExileNamedColor.RareItem, new Color {A = 240, R = 255, G = 255, B = 119}},
{PathOfExileNamedColor.MagicItem, new Color {A = 255, R = 136, G = 136, B = 255}}, {PathOfExileNamedColor.MagicItem, new Color {A = 240, R = 136, G = 136, B = 255}},
{PathOfExileNamedColor.WhiteItem, new Color {A = 255, R = 200, G = 200, B = 200}}, {PathOfExileNamedColor.WhiteItem, new Color {A = 240, R = 200, G = 200, B = 200}},
{PathOfExileNamedColor.GemItem, new Color {A = 255, R = 27, G = 162, B = 155}}, {PathOfExileNamedColor.GemItem, new Color {A = 240, R = 27, G = 162, B = 155}},
{PathOfExileNamedColor.CurrencyItem, new Color {A = 255, R = 170, G = 158, B = 130}}, {PathOfExileNamedColor.CurrencyItem, new Color {A = 240, R = 170, G = 158, B = 130}},
{PathOfExileNamedColor.QuestItem, new Color {A = 255, R = 74, G = 230, B = 58}}, {PathOfExileNamedColor.QuestItem, new Color {A = 240, R = 74, G = 230, B = 58}},
{PathOfExileNamedColor.NemesisMod, new Color {A = 255, R = 255, G = 200, B = 0}}, {PathOfExileNamedColor.NemesisMod, new Color {A = 240, R = 255, G = 200, B = 0}},
{PathOfExileNamedColor.NemesisModOutline, new Color {A = 220, R = 255, G = 40, B = 0}}, {PathOfExileNamedColor.NemesisModOutline, new Color {A = 220, R = 255, G = 40, B = 0}},
{PathOfExileNamedColor.Title, new Color {A = 255, R = 231, G = 180, B = 120}}, {PathOfExileNamedColor.Title, new Color {A = 240, R = 231, G = 180, B = 120}},
{PathOfExileNamedColor.Corrupted, new Color {A = 255, R = 210, G = 0, B = 0}}, {PathOfExileNamedColor.Corrupted, new Color {A = 240, R = 210, G = 0, B = 0}},
{PathOfExileNamedColor.Favour, new Color {A = 255, R = 170, G = 158, B = 130}}, {PathOfExileNamedColor.Favour, new Color {A = 240, R = 170, G = 158, B = 130}},
{PathOfExileNamedColor.SupporterPackNewItem, new Color {A = 255, R = 180, G = 96, B = 0}}, {PathOfExileNamedColor.SupporterPackNewItem, new Color {A = 240, R = 180, G = 96, B = 0}},
{PathOfExileNamedColor.SupporterPackItem, new Color {A = 255, R = 163, G = 141, B = 109}}, {PathOfExileNamedColor.SupporterPackItem, new Color {A = 240, R = 163, G = 141, B = 109}},
{PathOfExileNamedColor.BloodlineMod, new Color {A = 255, R = 210, G = 0, B = 220}}, {PathOfExileNamedColor.BloodlineMod, new Color {A = 240, R = 210, G = 0, B = 220}},
{PathOfExileNamedColor.BloodlineModOutline, new Color {A = 200, R = 74, G = 0, B = 160}}, {PathOfExileNamedColor.BloodlineModOutline, new Color {A = 200, R = 74, G = 0, B = 160}},
{PathOfExileNamedColor.TormentMod, new Color {A = 255, R = 50, G = 230, B = 100}}, {PathOfExileNamedColor.TormentMod, new Color {A = 240, R = 50, G = 230, B = 100}},
{PathOfExileNamedColor.TormentModOutline, new Color {A = 200, R = 0, G = 100, B = 150}}, {PathOfExileNamedColor.TormentModOutline, new Color {A = 200, R = 0, G = 100, B = 150}},
{PathOfExileNamedColor.CantTradeorModify, new Color {A = 255, R = 210, G = 0, B = 0}}, {PathOfExileNamedColor.CantTradeorModify, new Color {A = 240, R = 210, G = 0, B = 0}},
}; };
} }

View File

@@ -1,4 +1,26 @@
using System; /* MIT License
Copyright (c) 2016 JetBrains http://www.jetbrains.com
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:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
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. */
using System;
#pragma warning disable 1591 #pragma warning disable 1591
// ReSharper disable UnusedMember.Global // ReSharper disable UnusedMember.Global
@@ -7,7 +29,6 @@
// ReSharper disable IntroduceOptionalParameters.Global // ReSharper disable IntroduceOptionalParameters.Global
// ReSharper disable MemberCanBeProtected.Global // ReSharper disable MemberCanBeProtected.Global
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable CheckNamespace
namespace Filtration.ObjectModel.Annotations namespace Filtration.ObjectModel.Annotations
{ {
@@ -16,32 +37,37 @@ namespace Filtration.ObjectModel.Annotations
/// so the check for <c>null</c> is necessary before its usage. /// so the check for <c>null</c> is necessary before its usage.
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// [CanBeNull] public object Test() { return null; } /// [CanBeNull] object Test() => null;
/// public void UseTest() { ///
/// void UseTest() {
/// var p = Test(); /// var p = Test();
/// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException' /// var s = p.ToString(); // Warning: Possible 'System.NullReferenceException'
/// } /// }
/// </code></example> /// </code></example>
[AttributeUsage( [AttributeUsage(
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event)] AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)]
public sealed class CanBeNullAttribute : Attribute { } public sealed class CanBeNullAttribute : Attribute { }
/// <summary> /// <summary>
/// Indicates that the value of the marked element could never be <c>null</c>. /// Indicates that the value of the marked element could never be <c>null</c>.
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// [NotNull] public object Foo() { /// [NotNull] object Foo() {
/// return null; // Warning: Possible 'null' assignment /// return null; // Warning: Possible 'null' assignment
/// } /// }
/// </code></example> /// </code></example>
[AttributeUsage( [AttributeUsage(
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event)] AttributeTargets.Delegate | AttributeTargets.Field | AttributeTargets.Event |
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.GenericParameter)]
public sealed class NotNullAttribute : Attribute { } public sealed class NotNullAttribute : Attribute { }
/// <summary> /// <summary>
/// Indicates that collection or enumerable value does not contain null elements. /// Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task
/// and Lazy classes to indicate that the value of a collection item, of the Task.Result property
/// or of the Lazy.Value property can never be null.
/// </summary> /// </summary>
[AttributeUsage( [AttributeUsage(
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
@@ -49,7 +75,9 @@ namespace Filtration.ObjectModel.Annotations
public sealed class ItemNotNullAttribute : Attribute { } public sealed class ItemNotNullAttribute : Attribute { }
/// <summary> /// <summary>
/// Indicates that collection or enumerable value can contain null elements. /// Can be appplied to symbols of types derived from IEnumerable as well as to symbols of Task
/// and Lazy classes to indicate that the value of a collection item, of the Task.Result property
/// or of the Lazy.Value property can be null.
/// </summary> /// </summary>
[AttributeUsage( [AttributeUsage(
AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property |
@@ -63,8 +91,9 @@ namespace Filtration.ObjectModel.Annotations
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// [StringFormatMethod("message")] /// [StringFormatMethod("message")]
/// public void ShowError(string message, params object[] args) { /* do something */ } /// void ShowError(string message, params object[] args) { /* do something */ }
/// public void Foo() { ///
/// void Foo() {
/// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string /// ShowError("Failed: {0}"); // Warning: Non-existing argument in format string
/// } /// }
/// </code></example> /// </code></example>
@@ -76,22 +105,24 @@ namespace Filtration.ObjectModel.Annotations
/// <param name="formatParameterName"> /// <param name="formatParameterName">
/// Specifies which parameter of an annotated method should be treated as format-string /// Specifies which parameter of an annotated method should be treated as format-string
/// </param> /// </param>
public StringFormatMethodAttribute(string formatParameterName) public StringFormatMethodAttribute([NotNull] string formatParameterName)
{ {
FormatParameterName = formatParameterName; FormatParameterName = formatParameterName;
} }
public string FormatParameterName { get; private set; } [NotNull] public string FormatParameterName { get; private set; }
} }
/// <summary> /// <summary>
/// For a parameter that is expected to be one of the limited set of values. /// For a parameter that is expected to be one of the limited set of values.
/// Specify fields of which type should be used as values for this parameter. /// Specify fields of which type should be used as values for this parameter.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field)] [AttributeUsage(
AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Field,
AllowMultiple = true)]
public sealed class ValueProviderAttribute : Attribute public sealed class ValueProviderAttribute : Attribute
{ {
public ValueProviderAttribute(string name) public ValueProviderAttribute([NotNull] string name)
{ {
Name = name; Name = name;
} }
@@ -105,7 +136,7 @@ namespace Filtration.ObjectModel.Annotations
/// the parameter of <see cref="System.ArgumentNullException"/>. /// the parameter of <see cref="System.ArgumentNullException"/>.
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// public void Foo(string param) { /// void Foo(string param) {
/// if (param == null) /// if (param == null)
/// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol /// throw new ArgumentNullException("par"); // Warning: Cannot resolve symbol
/// } /// }
@@ -131,10 +162,12 @@ namespace Filtration.ObjectModel.Annotations
/// <example><code> /// <example><code>
/// public class Foo : INotifyPropertyChanged { /// public class Foo : INotifyPropertyChanged {
/// public event PropertyChangedEventHandler PropertyChanged; /// public event PropertyChangedEventHandler PropertyChanged;
///
/// [NotifyPropertyChangedInvocator] /// [NotifyPropertyChangedInvocator]
/// protected virtual void NotifyChanged(string propertyName) { ... } /// protected virtual void NotifyChanged(string propertyName) { ... }
/// ///
/// private string _name; /// string _name;
///
/// public string Name { /// public string Name {
/// get { return _name; } /// get { return _name; }
/// set { _name = value; NotifyChanged("LastName"); /* Warning */ } /// set { _name = value; NotifyChanged("LastName"); /* Warning */ }
@@ -153,12 +186,12 @@ namespace Filtration.ObjectModel.Annotations
public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute public sealed class NotifyPropertyChangedInvocatorAttribute : Attribute
{ {
public NotifyPropertyChangedInvocatorAttribute() { } public NotifyPropertyChangedInvocatorAttribute() { }
public NotifyPropertyChangedInvocatorAttribute(string parameterName) public NotifyPropertyChangedInvocatorAttribute([NotNull] string parameterName)
{ {
ParameterName = parameterName; ParameterName = parameterName;
} }
public string ParameterName { get; private set; } [CanBeNull] public string ParameterName { get; private set; }
} }
/// <summary> /// <summary>
@@ -174,15 +207,16 @@ namespace Filtration.ObjectModel.Annotations
/// <item>Value ::= true | false | null | notnull | canbenull</item> /// <item>Value ::= true | false | null | notnull | canbenull</item>
/// </list> /// </list>
/// If method has single input parameter, it's name could be omitted.<br/> /// If method has single input parameter, it's name could be omitted.<br/>
/// Using <c>halt</c> (or <c>void</c>/<c>nothing</c>, which is the same) /// Using <c>halt</c> (or <c>void</c>/<c>nothing</c>, which is the same) for method output
/// for method output means that the methos doesn't return normally.<br/> /// means that the methos doesn't return normally (throws or terminates the process).<br/>
/// <c>canbenull</c> annotation is only applicable for output parameters.<br/> /// Value <c>canbenull</c> is only applicable for output parameters.<br/>
/// You can use multiple <c>[ContractAnnotation]</c> for each FDT row, /// You can use multiple <c>[ContractAnnotation]</c> for each FDT row, or use single attribute
/// or use single attribute with rows separated by semicolon.<br/> /// with rows separated by semicolon. There is no notion of order rows, all rows are checked
/// for applicability and applied per each program state tracked by R# analysis.<br/>
/// </syntax> /// </syntax>
/// <examples><list> /// <examples><list>
/// <item><code> /// <item><code>
/// [ContractAnnotation("=> halt")] /// [ContractAnnotation("=&gt; halt")]
/// public void TerminationMethod() /// public void TerminationMethod()
/// </code></item> /// </code></item>
/// <item><code> /// <item><code>
@@ -190,17 +224,17 @@ namespace Filtration.ObjectModel.Annotations
/// public void Assert(bool condition, string text) // regular assertion method /// public void Assert(bool condition, string text) // regular assertion method
/// </code></item> /// </code></item>
/// <item><code> /// <item><code>
/// [ContractAnnotation("s:null => true")] /// [ContractAnnotation("s:null =&gt; true")]
/// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty() /// public bool IsNullOrEmpty(string s) // string.IsNullOrEmpty()
/// </code></item> /// </code></item>
/// <item><code> /// <item><code>
/// // A method that returns null if the parameter is null, /// // A method that returns null if the parameter is null,
/// // and not null if the parameter is not null /// // and not null if the parameter is not null
/// [ContractAnnotation("null => null; notnull => notnull")] /// [ContractAnnotation("null =&gt; null; notnull =&gt; notnull")]
/// public object Transform(object data) /// public object Transform(object data)
/// </code></item> /// </code></item>
/// <item><code> /// <item><code>
/// [ContractAnnotation("s:null=>false; =>true,result:notnull; =>false, result:null")] /// [ContractAnnotation("=&gt; true, result: notnull; =&gt; false, result: null")]
/// public bool TryParse(string s, out Person result) /// public bool TryParse(string s, out Person result)
/// </code></item> /// </code></item>
/// </list></examples> /// </list></examples>
@@ -216,7 +250,8 @@ namespace Filtration.ObjectModel.Annotations
ForceFullStates = forceFullStates; ForceFullStates = forceFullStates;
} }
public string Contract { get; private set; } [NotNull] public string Contract { get; private set; }
public bool ForceFullStates { get; private set; } public bool ForceFullStates { get; private set; }
} }
@@ -225,14 +260,15 @@ namespace Filtration.ObjectModel.Annotations
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// [LocalizationRequiredAttribute(true)] /// [LocalizationRequiredAttribute(true)]
/// public class Foo { /// class Foo {
/// private string str = "my string"; // Warning: Localizable string /// string str = "my string"; // Warning: Localizable string
/// } /// }
/// </code></example> /// </code></example>
[AttributeUsage(AttributeTargets.All)] [AttributeUsage(AttributeTargets.All)]
public sealed class LocalizationRequiredAttribute : Attribute public sealed class LocalizationRequiredAttribute : Attribute
{ {
public LocalizationRequiredAttribute() : this(true) { } public LocalizationRequiredAttribute() : this(true) { }
public LocalizationRequiredAttribute(bool required) public LocalizationRequiredAttribute(bool required)
{ {
Required = required; Required = required;
@@ -250,8 +286,9 @@ namespace Filtration.ObjectModel.Annotations
/// <example><code> /// <example><code>
/// [CannotApplyEqualityOperator] /// [CannotApplyEqualityOperator]
/// class NoEquality { } /// class NoEquality { }
///
/// class UsesNoEquality { /// class UsesNoEquality {
/// public void Test() { /// void Test() {
/// var ca1 = new NoEquality(); /// var ca1 = new NoEquality();
/// var ca2 = new NoEquality(); /// var ca2 = new NoEquality();
/// if (ca1 != null) { // OK /// if (ca1 != null) { // OK
@@ -269,9 +306,10 @@ namespace Filtration.ObjectModel.Annotations
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// [BaseTypeRequired(typeof(IComponent)] // Specify requirement /// [BaseTypeRequired(typeof(IComponent)] // Specify requirement
/// public class ComponentAttribute : Attribute { } /// class ComponentAttribute : Attribute { }
///
/// [Component] // ComponentAttribute requires implementing IComponent interface /// [Component] // ComponentAttribute requires implementing IComponent interface
/// public class MyComponent : IComponent { } /// class MyComponent : IComponent { }
/// </code></example> /// </code></example>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
[BaseTypeRequired(typeof(Attribute))] [BaseTypeRequired(typeof(Attribute))]
@@ -308,6 +346,7 @@ namespace Filtration.ObjectModel.Annotations
} }
public ImplicitUseKindFlags UseKindFlags { get; private set; } public ImplicitUseKindFlags UseKindFlags { get; private set; }
public ImplicitUseTargetFlags TargetFlags { get; private set; } public ImplicitUseTargetFlags TargetFlags { get; private set; }
} }
@@ -334,6 +373,7 @@ namespace Filtration.ObjectModel.Annotations
} }
[UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; } [UsedImplicitly] public ImplicitUseKindFlags UseKindFlags { get; private set; }
[UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; } [UsedImplicitly] public ImplicitUseTargetFlags TargetFlags { get; private set; }
} }
@@ -377,12 +417,13 @@ namespace Filtration.ObjectModel.Annotations
public sealed class PublicAPIAttribute : Attribute public sealed class PublicAPIAttribute : Attribute
{ {
public PublicAPIAttribute() { } public PublicAPIAttribute() { }
public PublicAPIAttribute([NotNull] string comment) public PublicAPIAttribute([NotNull] string comment)
{ {
Comment = comment; Comment = comment;
} }
public string Comment { get; private set; } [CanBeNull] public string Comment { get; private set; }
} }
/// <summary> /// <summary>
@@ -398,15 +439,51 @@ namespace Filtration.ObjectModel.Annotations
/// The same as <c>System.Diagnostics.Contracts.PureAttribute</c>. /// The same as <c>System.Diagnostics.Contracts.PureAttribute</c>.
/// </summary> /// </summary>
/// <example><code> /// <example><code>
/// [Pure] private int Multiply(int x, int y) { return x * y; } /// [Pure] int Multiply(int x, int y) => x * y;
/// public void Foo() { ///
/// const int a = 2, b = 2; /// void M() {
/// Multiply(a, b); // Waring: Return value of pure method is not used /// Multiply(123, 42); // Waring: Return value of pure method is not used
/// } /// }
/// </code></example> /// </code></example>
[AttributeUsage(AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Method)]
public sealed class PureAttribute : Attribute { } public sealed class PureAttribute : Attribute { }
/// <summary>
/// Indicates that the return value of method invocation must be used.
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public sealed class MustUseReturnValueAttribute : Attribute
{
public MustUseReturnValueAttribute() { }
public MustUseReturnValueAttribute([NotNull] string justification)
{
Justification = justification;
}
[CanBeNull] public string Justification { get; private set; }
}
/// <summary>
/// Indicates the type member or parameter of some type, that should be used instead of all other ways
/// to get the value that type. This annotation is useful when you have some "context" value evaluated
/// and stored somewhere, meaning that all other ways to get this value must be consolidated with existing one.
/// </summary>
/// <example><code>
/// class Foo {
/// [ProvidesContext] IBarService _barService = ...;
///
/// void ProcessNode(INode node) {
/// DoSomething(node, node.GetGlobalServices().Bar);
/// // ^ Warning: use value of '_barService' field
/// }
/// }
/// </code></example>
[AttributeUsage(
AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter | AttributeTargets.Method |
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.GenericParameter)]
public sealed class ProvidesContextAttribute : Attribute { }
/// <summary> /// <summary>
/// Indicates that a parameter is a path to a file or a folder within a web project. /// Indicates that a parameter is a path to a file or a folder within a web project.
/// Path can be relative or absolute, starting from web root (~). /// Path can be relative or absolute, starting from web root (~).
@@ -415,12 +492,13 @@ namespace Filtration.ObjectModel.Annotations
public sealed class PathReferenceAttribute : Attribute public sealed class PathReferenceAttribute : Attribute
{ {
public PathReferenceAttribute() { } public PathReferenceAttribute() { }
public PathReferenceAttribute([PathReference] string basePath)
public PathReferenceAttribute([NotNull, PathReference] string basePath)
{ {
BasePath = basePath; BasePath = basePath;
} }
public string BasePath { get; private set; } [CanBeNull] public string BasePath { get; private set; }
} }
/// <summary> /// <summary>
@@ -484,7 +562,7 @@ namespace Filtration.ObjectModel.Annotations
/// Allows specifying a macro that will be executed for a <see cref="SourceTemplateAttribute">source template</see> /// Allows specifying a macro that will be executed for a <see cref="SourceTemplateAttribute">source template</see>
/// parameter when the template is expanded. /// parameter when the template is expanded.
/// </summary> /// </summary>
public string Expression { get; set; } [CanBeNull] public string Expression { get; set; }
/// <summary> /// <summary>
/// Allows specifying which occurrence of the target parameter becomes editable when the template is deployed. /// Allows specifying which occurrence of the target parameter becomes editable when the template is deployed.
@@ -500,73 +578,73 @@ namespace Filtration.ObjectModel.Annotations
/// Identifies the target parameter of a <see cref="SourceTemplateAttribute">source template</see> if the /// Identifies the target parameter of a <see cref="SourceTemplateAttribute">source template</see> if the
/// <see cref="MacroAttribute"/> is applied on a template method. /// <see cref="MacroAttribute"/> is applied on a template method.
/// </summary> /// </summary>
public string Target { get; set; } [CanBeNull] public string Target { get; set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class AspMvcAreaMasterLocationFormatAttribute : Attribute public sealed class AspMvcAreaMasterLocationFormatAttribute : Attribute
{ {
public AspMvcAreaMasterLocationFormatAttribute(string format) public AspMvcAreaMasterLocationFormatAttribute([NotNull] string format)
{ {
Format = format; Format = format;
} }
public string Format { get; private set; } [NotNull] public string Format { get; private set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class AspMvcAreaPartialViewLocationFormatAttribute : Attribute public sealed class AspMvcAreaPartialViewLocationFormatAttribute : Attribute
{ {
public AspMvcAreaPartialViewLocationFormatAttribute(string format) public AspMvcAreaPartialViewLocationFormatAttribute([NotNull] string format)
{ {
Format = format; Format = format;
} }
public string Format { get; private set; } [NotNull] public string Format { get; private set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class AspMvcAreaViewLocationFormatAttribute : Attribute public sealed class AspMvcAreaViewLocationFormatAttribute : Attribute
{ {
public AspMvcAreaViewLocationFormatAttribute(string format) public AspMvcAreaViewLocationFormatAttribute([NotNull] string format)
{ {
Format = format; Format = format;
} }
public string Format { get; private set; } [NotNull] public string Format { get; private set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class AspMvcMasterLocationFormatAttribute : Attribute public sealed class AspMvcMasterLocationFormatAttribute : Attribute
{ {
public AspMvcMasterLocationFormatAttribute(string format) public AspMvcMasterLocationFormatAttribute([NotNull] string format)
{ {
Format = format; Format = format;
} }
public string Format { get; private set; } [NotNull] public string Format { get; private set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class AspMvcPartialViewLocationFormatAttribute : Attribute public sealed class AspMvcPartialViewLocationFormatAttribute : Attribute
{ {
public AspMvcPartialViewLocationFormatAttribute(string format) public AspMvcPartialViewLocationFormatAttribute([NotNull] string format)
{ {
Format = format; Format = format;
} }
public string Format { get; private set; } [NotNull] public string Format { get; private set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true)]
public sealed class AspMvcViewLocationFormatAttribute : Attribute public sealed class AspMvcViewLocationFormatAttribute : Attribute
{ {
public AspMvcViewLocationFormatAttribute(string format) public AspMvcViewLocationFormatAttribute([NotNull] string format)
{ {
Format = format; Format = format;
} }
public string Format { get; private set; } [NotNull] public string Format { get; private set; }
} }
/// <summary> /// <summary>
@@ -579,12 +657,13 @@ namespace Filtration.ObjectModel.Annotations
public sealed class AspMvcActionAttribute : Attribute public sealed class AspMvcActionAttribute : Attribute
{ {
public AspMvcActionAttribute() { } public AspMvcActionAttribute() { }
public AspMvcActionAttribute(string anonymousProperty)
public AspMvcActionAttribute([NotNull] string anonymousProperty)
{ {
AnonymousProperty = anonymousProperty; AnonymousProperty = anonymousProperty;
} }
public string AnonymousProperty { get; private set; } [CanBeNull] public string AnonymousProperty { get; private set; }
} }
/// <summary> /// <summary>
@@ -596,12 +675,13 @@ namespace Filtration.ObjectModel.Annotations
public sealed class AspMvcAreaAttribute : Attribute public sealed class AspMvcAreaAttribute : Attribute
{ {
public AspMvcAreaAttribute() { } public AspMvcAreaAttribute() { }
public AspMvcAreaAttribute(string anonymousProperty)
public AspMvcAreaAttribute([NotNull] string anonymousProperty)
{ {
AnonymousProperty = anonymousProperty; AnonymousProperty = anonymousProperty;
} }
public string AnonymousProperty { get; private set; } [CanBeNull] public string AnonymousProperty { get; private set; }
} }
/// <summary> /// <summary>
@@ -614,12 +694,13 @@ namespace Filtration.ObjectModel.Annotations
public sealed class AspMvcControllerAttribute : Attribute public sealed class AspMvcControllerAttribute : Attribute
{ {
public AspMvcControllerAttribute() { } public AspMvcControllerAttribute() { }
public AspMvcControllerAttribute(string anonymousProperty)
public AspMvcControllerAttribute([NotNull] string anonymousProperty)
{ {
AnonymousProperty = anonymousProperty; AnonymousProperty = anonymousProperty;
} }
public string AnonymousProperty { get; private set; } [CanBeNull] public string AnonymousProperty { get; private set; }
} }
/// <summary> /// <summary>
@@ -649,7 +730,7 @@ namespace Filtration.ObjectModel.Annotations
/// ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method. /// ASP.NET MVC attribute. Allows disabling inspections for MVC views within a class or a method.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class AspMvcSupressViewErrorAttribute : Attribute { } public sealed class AspMvcSuppressViewErrorAttribute : Attribute { }
/// <summary> /// <summary>
/// ASP.NET MVC attribute. Indicates that a parameter is an MVC display template. /// ASP.NET MVC attribute. Indicates that a parameter is an MVC display template.
@@ -677,13 +758,27 @@ namespace Filtration.ObjectModel.Annotations
/// <summary> /// <summary>
/// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter /// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter
/// is an MVC view. If applied to a method, the MVC view name is calculated implicitly /// is an MVC view component. If applied to a method, the MVC view name is calculated implicitly
/// from the context. Use this attribute for custom wrappers similar to /// from the context. Use this attribute for custom wrappers similar to
/// <c>System.Web.Mvc.Controller.View(Object)</c>. /// <c>System.Web.Mvc.Controller.View(Object)</c>.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)]
public sealed class AspMvcViewAttribute : Attribute { } public sealed class AspMvcViewAttribute : Attribute { }
/// <summary>
/// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter
/// is an MVC view component name.
/// </summary>
[AttributeUsage(AttributeTargets.Parameter)]
public sealed class AspMvcViewComponentAttribute : Attribute { }
/// <summary>
/// ASP.NET MVC attribute. If applied to a parameter, indicates that the parameter
/// is an MVC view component view. If applied to a method, the MVC view component view name is default.
/// </summary>
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Method)]
public sealed class AspMvcViewComponentViewAttribute : Attribute { }
/// <summary> /// <summary>
/// ASP.NET MVC attribute. When applied to a parameter of an attribute, /// ASP.NET MVC attribute. When applied to a parameter of an attribute,
/// indicates that this parameter is an MVC action name. /// indicates that this parameter is an MVC action name.
@@ -702,12 +797,13 @@ namespace Filtration.ObjectModel.Annotations
public sealed class HtmlElementAttributesAttribute : Attribute public sealed class HtmlElementAttributesAttribute : Attribute
{ {
public HtmlElementAttributesAttribute() { } public HtmlElementAttributesAttribute() { }
public HtmlElementAttributesAttribute(string name)
public HtmlElementAttributesAttribute([NotNull] string name)
{ {
Name = name; Name = name;
} }
public string Name { get; private set; } [CanBeNull] public string Name { get; private set; }
} }
[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)] [AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property)]
@@ -730,9 +826,10 @@ namespace Filtration.ObjectModel.Annotations
public sealed class RazorSectionAttribute : Attribute { } public sealed class RazorSectionAttribute : Attribute { }
/// <summary> /// <summary>
/// Indicates how method invocation affects content of the collection. /// Indicates how method, constructor invocation or property access
/// over collection type affects content of the collection.
/// </summary> /// </summary>
[AttributeUsage(AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property)]
public sealed class CollectionAccessAttribute : Attribute public sealed class CollectionAccessAttribute : Attribute
{ {
public CollectionAccessAttribute(CollectionAccessType collectionAccessType) public CollectionAccessAttribute(CollectionAccessType collectionAccessType)
@@ -824,6 +921,16 @@ namespace Filtration.ObjectModel.Annotations
[AttributeUsage(AttributeTargets.Parameter)] [AttributeUsage(AttributeTargets.Parameter)]
public sealed class RegexPatternAttribute : Attribute { } public sealed class RegexPatternAttribute : Attribute { }
/// <summary>
/// Prevents the Member Reordering feature from tossing members of the marked class.
/// </summary>
/// <remarks>
/// The attribute must be mentioned in your member reordering patterns
/// </remarks>
[AttributeUsage(
AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum)]
public sealed class NoReorderAttribute : Attribute { }
/// <summary> /// <summary>
/// XAML attribute. Indicates the type that has <c>ItemsSource</c> property and should be treated /// XAML attribute. Indicates the type that has <c>ItemsSource</c> property and should be treated
/// as <c>ItemsControl</c>-derived type, to enable inner items <c>DataContext</c> type resolve. /// as <c>ItemsControl</c>-derived type, to enable inner items <c>DataContext</c> type resolve.
@@ -832,7 +939,7 @@ namespace Filtration.ObjectModel.Annotations
public sealed class XamlItemsControlAttribute : Attribute { } public sealed class XamlItemsControlAttribute : Attribute { }
/// <summary> /// <summary>
/// XAML attibute. Indicates the property of some <c>BindingBase</c>-derived type, that /// XAML attribute. Indicates the property of some <c>BindingBase</c>-derived type, that
/// is used to bind some item of <c>ItemsControl</c>-derived type. This annotation will /// is used to bind some item of <c>ItemsControl</c>-derived type. This annotation will
/// enable the <c>DataContext</c> type resolve for XAML bindings for such properties. /// enable the <c>DataContext</c> type resolve for XAML bindings for such properties.
/// </summary> /// </summary>
@@ -846,14 +953,15 @@ namespace Filtration.ObjectModel.Annotations
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public sealed class AspChildControlTypeAttribute : Attribute public sealed class AspChildControlTypeAttribute : Attribute
{ {
public AspChildControlTypeAttribute(string tagName, Type controlType) public AspChildControlTypeAttribute([NotNull] string tagName, [NotNull] Type controlType)
{ {
TagName = tagName; TagName = tagName;
ControlType = controlType; ControlType = controlType;
} }
public string TagName { get; private set; } [NotNull] public string TagName { get; private set; }
public Type ControlType { get; private set; }
[NotNull] public Type ControlType { get; private set; }
} }
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]
@@ -873,7 +981,7 @@ namespace Filtration.ObjectModel.Annotations
Attribute = attribute; Attribute = attribute;
} }
public string Attribute { get; private set; } [NotNull] public string Attribute { get; private set; }
} }
[AttributeUsage(AttributeTargets.Property)] [AttributeUsage(AttributeTargets.Property)]
@@ -890,25 +998,37 @@ namespace Filtration.ObjectModel.Annotations
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class RazorImportNamespaceAttribute : Attribute public sealed class RazorImportNamespaceAttribute : Attribute
{ {
public RazorImportNamespaceAttribute(string name) public RazorImportNamespaceAttribute([NotNull] string name)
{ {
Name = name; Name = name;
} }
public string Name { get; private set; } [NotNull] public string Name { get; private set; }
} }
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class RazorInjectionAttribute : Attribute public sealed class RazorInjectionAttribute : Attribute
{ {
public RazorInjectionAttribute(string type, string fieldName) public RazorInjectionAttribute([NotNull] string type, [NotNull] string fieldName)
{ {
Type = type; Type = type;
FieldName = fieldName; FieldName = fieldName;
} }
public string Type { get; private set; } [NotNull] public string Type { get; private set; }
public string FieldName { get; private set; }
[NotNull] public string FieldName { get; private set; }
}
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public sealed class RazorDirectiveAttribute : Attribute
{
public RazorDirectiveAttribute([NotNull] string directive)
{
Directive = directive;
}
[NotNull] public string Directive { get; private set; }
} }
[AttributeUsage(AttributeTargets.Method)] [AttributeUsage(AttributeTargets.Method)]
@@ -925,13 +1045,4 @@ namespace Filtration.ObjectModel.Annotations
[AttributeUsage(AttributeTargets.Parameter)] [AttributeUsage(AttributeTargets.Parameter)]
public sealed class RazorWriteMethodParameterAttribute : Attribute { } public sealed class RazorWriteMethodParameterAttribute : Attribute { }
/// <summary>
/// Prevents the Member Reordering feature from tossing members of the marked class.
/// </summary>
/// <remarks>
/// The attribute must be mentioned in your member reordering patterns
/// </remarks>
[AttributeUsage(AttributeTargets.All)]
public sealed class NoReorder : Attribute { }
} }

View File

@@ -1,4 +1,5 @@
using System.Reflection; using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
@@ -33,3 +34,9 @@ using System.Runtime.InteropServices;
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: InternalsVisibleTo("Filtration.ItemFilterPreview.Tests")]
[assembly: InternalsVisibleTo("Filtration.ObjectModel.Tests")]
[assembly: InternalsVisibleTo("Filtration.Parser.Tests")]
[assembly: InternalsVisibleTo("Filtration.Tests")]
[assembly: InternalsVisibleTo("Filtration.ThemeEditor.Tests")]

View File

@@ -0,0 +1,35 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class ColorThemeComponent : ThemeComponent
{
private Color _color;
public ColorThemeComponent(ThemeComponentType componentType, string componentName, Color componentColor)
{
if (componentName == null || componentColor == null)
{
throw new ArgumentException("Null parameters not allowed in ColorThemeComponent constructor");
}
ComponentType = componentType;
Color = componentColor;
ComponentName = componentName;
}
public Color Color
{
get { return _color; }
set
{
_color = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@@ -0,0 +1,47 @@
using System;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class EffectColorThemeComponent : ThemeComponent
{
private EffectColor _effectColor;
private bool _temporary;
public EffectColorThemeComponent(ThemeComponentType componentType, string componentName, EffectColor componentEffectColor, bool componentTemporary)
{
if (componentName == null)
{
throw new ArgumentException("Null parameters not allowed in EffectColorThemeComponent constructor");
}
ComponentType = componentType;
ComponentName = componentName;
EffectColor = componentEffectColor;
Temporary = componentTemporary;
}
public EffectColor EffectColor
{
get { return _effectColor; }
set
{
_effectColor = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public bool Temporary
{
get { return _temporary; }
set
{
_temporary = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@@ -0,0 +1,60 @@
using System;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class IconThemeComponent : ThemeComponent
{
private IconSize _iconSize;
private IconColor _iconColor;
private IconShape _iconShape;
public IconThemeComponent(ThemeComponentType componentType, string componentName, IconSize componentIconSize, IconColor componentIconColor, IconShape componentIconShape)
{
if (componentName == null)
{
throw new ArgumentException("Null parameters not allowed in IconThemeComponent constructor");
}
ComponentType = componentType;
ComponentName = componentName;
IconSize = componentIconSize;
IconColor = componentIconColor;
IconShape = componentIconShape;
}
public IconSize IconSize
{
get { return _iconSize; }
set
{
_iconSize = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public IconColor IconColor
{
get { return _iconColor; }
set
{
_iconColor = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public IconShape IconShape
{
get { return _iconShape; }
set
{
_iconShape = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@@ -0,0 +1,35 @@
using System;
using System.Windows.Media;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class IntegerThemeComponent : ThemeComponent
{
private int _value;
public IntegerThemeComponent(ThemeComponentType componentType, string componentName, int componentValue)
{
if (componentName == null)
{
throw new ArgumentException("Null parameters not allowed in IntegerThemeComponent constructor");
}
ComponentType = componentType;
Value = componentValue;
ComponentName = componentName;
}
public int Value
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@@ -0,0 +1,47 @@
using System;
using Filtration.ObjectModel.Enums;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class StrIntThemeComponent : ThemeComponent
{
private string _value;
private int _secondValue;
public StrIntThemeComponent(ThemeComponentType componentType, string componentName, string componentValue, int componentSecondValue)
{
if (componentName == null || componentValue == null)
{
throw new ArgumentException("Null parameters not allowed in StrIntThemeComponent constructor");
}
ComponentType = componentType;
Value = componentValue;
SecondValue = componentSecondValue;
ComponentName = componentName;
}
public string Value
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public int SecondValue
{
get { return _secondValue; }
set
{
_secondValue = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
}
}

View File

@@ -0,0 +1,104 @@
using System;
using System.Collections.ObjectModel;
using System.Linq;
using Filtration.ObjectModel.Enums;
using GalaSoft.MvvmLight.Command;
using Microsoft.Win32;
namespace Filtration.ObjectModel.ThemeEditor
{
[Serializable]
public class StringThemeComponent : ThemeComponent
{
private string _value;
public static ObservableCollection<string> _customSoundsAvailable;
public StringThemeComponent(ThemeComponentType componentType, string componentName, string componentValue)
{
if (componentName == null || componentValue == null)
{
throw new ArgumentException("Null parameters not allowed in StringThemeComponent constructor");
}
ComponentType = componentType;
Value = componentValue;
ComponentName = componentName;
if (_customSoundsAvailable == null || _customSoundsAvailable.Count < 1)
{
_customSoundsAvailable = new ObservableCollection<string>();
var poeFolderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).ToString() + @"\My Games\Path of Exile\";
if(System.IO.Directory.Exists(poeFolderPath))
{
var poeFolderFiles = System.IO.Directory.GetFiles(poeFolderPath).Where(
s => s.EndsWith(".mp3")
|| s.EndsWith(".wav")
|| s.EndsWith(".wma")
|| s.EndsWith(".3gp")
|| s.EndsWith(".aag")
|| s.EndsWith(".m4a")
|| s.EndsWith(".ogg")
).OrderBy(f => f);
foreach (var file in poeFolderFiles)
{
_customSoundsAvailable.Add(file.Replace(poeFolderPath, ""));
}
}
}
if(string.IsNullOrWhiteSpace(Value))
{
Value = _customSoundsAvailable.Count > 0 ? _customSoundsAvailable[0] : "";
}
else if (_customSoundsAvailable.IndexOf(Value) < 0)
{
_customSoundsAvailable.Add(Value);
}
CustomSoundFileDialogCommand = new RelayCommand(OnCustomSoundFileDialog);
}
public RelayCommand CustomSoundFileDialogCommand { get; set; }
public ObservableCollection<string> CustomSoundsAvailable => _customSoundsAvailable;
public string Value
{
get { return _value; }
set
{
_value = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
private void OnCustomSoundFileDialog()
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.DefaultExt = ".mp3";
var poePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments).ToString() + @"\My Games\Path of Exile\";
fileDialog.InitialDirectory = poePath;
Nullable<bool> result = fileDialog.ShowDialog();
if (result == true)
{
var fileName = fileDialog.FileName;
if (fileName.StartsWith(poePath))
{
fileName = fileName.Replace(poePath, "");
}
if (CustomSoundsAvailable.IndexOf(fileName) < 0)
{
CustomSoundsAvailable.Add(fileName);
OnPropertyChanged(nameof(CustomSoundsAvailable));
}
Value = fileName;
}
}
}
}

View File

@@ -32,7 +32,17 @@ namespace Filtration.ObjectModel.ThemeEditor
public void AddComponent(ThemeComponentType componentType, string componentName, Color componentColor) public void AddComponent(ThemeComponentType componentType, string componentName, Color componentColor)
{ {
_components.Add(new ThemeComponent(componentType, componentName, componentColor)); _components.Add(new ColorThemeComponent(componentType, componentName, componentColor));
}
public void AddComponent(ThemeComponentType componentType, string componentName, int componentValue)
{
_components.Add(new IntegerThemeComponent(componentType, componentName, componentValue));
}
public void AddComponent(ThemeComponentType componentType, string componentName, string componentValue, int componentSecondValue)
{
_components.Add(new StrIntThemeComponent(componentType, componentName, componentValue, componentSecondValue));
} }
} }
} }

View File

@@ -10,8 +10,7 @@ namespace Filtration.ObjectModel.ThemeEditor
[Serializable] [Serializable]
public class ThemeComponent : INotifyPropertyChanged public class ThemeComponent : INotifyPropertyChanged
{ {
private Color _color; protected EventHandler _themeComponentUpdatedEventHandler;
private EventHandler _themeComponentUpdatedEventHandler;
private readonly object _eventLock = new object(); private readonly object _eventLock = new object();
public ThemeComponent() public ThemeComponent()
@@ -19,18 +18,6 @@ namespace Filtration.ObjectModel.ThemeEditor
} }
public ThemeComponent(ThemeComponentType componentType, string componentName, Color componentColor)
{
if (componentName == null || componentColor == null)
{
throw new ArgumentException("Null parameters not allowed in ThemeComponent constructor");
}
ComponentType = componentType;
Color = componentColor;
ComponentName = componentName;
}
// By implementing a custom event accessor here we can keep the UsageCount up to date. // By implementing a custom event accessor here we can keep the UsageCount up to date.
public event EventHandler ThemeComponentUpdated public event EventHandler ThemeComponentUpdated
{ {
@@ -58,17 +45,6 @@ namespace Filtration.ObjectModel.ThemeEditor
public string ComponentName { get; set; } public string ComponentName { get; set; }
public ThemeComponentType ComponentType{ get; set; } public ThemeComponentType ComponentType{ get; set; }
public Color Color
{
get { return _color; }
set
{
_color = value;
OnPropertyChanged();
_themeComponentUpdatedEventHandler?.Invoke(this, EventArgs.Empty);
}
}
public int UsageCount public int UsageCount
{ {
get get

Some files were not shown because too many files have changed in this diff Show More