Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
75c06cd
Add ParagraphDetection setting and toggle to settings UI
TheJoeFin Apr 9, 2026
935ea79
Add paragraph detection OCR tests and helpers
TheJoeFin Apr 9, 2026
b2fac53
Add ParagraphDetection to settings diagnostics output
TheJoeFin Apr 9, 2026
2963cbc
Add paragraph detection for WinAI OCR space-joining langs
TheJoeFin Apr 9, 2026
60fbf82
Improve paragraph detection in GrabFrame OCR output
TheJoeFin Apr 9, 2026
e3fccf8
Add table document model and spreadsheet undo/redo support
TheJoeFin Apr 25, 2026
535ec66
Add markdown utilities and async file read support
TheJoeFin Apr 25, 2026
89827ba
Replace SaveTextFile with SaveHistoryTextFileBlocking
TheJoeFin Apr 25, 2026
34b80c9
Add comprehensive unit tests for editor and markdown logic
TheJoeFin Apr 25, 2026
8bc93d3
Expand allowed Bash patterns for pdm CLI commands
TheJoeFin Apr 25, 2026
d06540f
Add spreadsheet and markdown editing modes to EditTextWindow
TheJoeFin Apr 25, 2026
77ba7f2
Update dependencies and add document file associations
TheJoeFin Apr 25, 2026
46ab38f
fix: apply PR review feedback - CodeSpan, table cell newlines, URI sa…
Copilot Apr 25, 2026
216b104
Expand EditTextWindow actions and add action catalog tests
TheJoeFin Apr 25, 2026
d65e500
Enhance spreadsheet editing and text transform support
TheJoeFin Apr 25, 2026
42ecbd5
Remove pointless test checking values in AllButtons collection
TheJoeFin Apr 25, 2026
4a619f8
Merge pull request #643 from TheJoeFin/format-modes
TheJoeFin Apr 25, 2026
6f93d78
Add PDF OCR support and context menu integration
TheJoeFin Apr 25, 2026
be3b874
Add PDF text selection and navigation to GrabFrame
TheJoeFin Apr 25, 2026
3d49a18
Add PDF support to GrabFrame and update file checks
TheJoeFin Apr 25, 2026
02fec33
Add tests for file type classification and PDF rendering
TheJoeFin Apr 25, 2026
4a0b99a
Add "Open File..." option to NotifyIcon context menu
TheJoeFin Apr 27, 2026
a81f2dd
Refactor file filters and improve spacebar pan in GrabFrame
TheJoeFin Apr 27, 2026
3ec02aa
Refactor ZoomBorder panning and event handling
TheJoeFin Apr 27, 2026
c2407f7
Enhance file open and drag-and-drop support
TheJoeFin Apr 27, 2026
b2a2efa
Add unit tests for file dialog filters and drag-drop
TheJoeFin Apr 27, 2026
06b256e
Improve pan/zoom UX and focus handling in GrabFrame
TheJoeFin Apr 28, 2026
2766e95
Add clipboard tests
TheJoeFin Apr 30, 2026
da3ee2d
improve the way the clipboard can handle html table data and more
TheJoeFin Apr 30, 2026
a8b61c9
send table data to etw properly
TheJoeFin Apr 30, 2026
5721793
improve perf and options around markdown
TheJoeFin Apr 30, 2026
9e8aeb1
enhance the find and replace to be compatible with etw spreadsheet mode
TheJoeFin Apr 30, 2026
493b304
update github actions
TheJoeFin May 2, 2026
2091e93
remove unused file
TheJoeFin May 2, 2026
38b679f
Simplify Markdig pipeline with UseAdvancedExtensions
TheJoeFin May 2, 2026
703f09f
Fix review comments: disposal, race conditions, cache eviction, find/…
Copilot May 2, 2026
5f4772a
Optimize: materialize native rects once before OCR predicate
Copilot May 2, 2026
d1cabc5
Support PDFs in folder OCR, improve menu usability
TheJoeFin May 2, 2026
fceb621
Add Cut/Copy/Paste support to spreadsheet editor
TheJoeFin May 5, 2026
17e8809
Merge pull request #644 from TheJoeFin/gf-pdfs
TheJoeFin May 5, 2026
16c3daa
Add Ctrl+C copy support to spreadsheet DataGrid
TheJoeFin May 10, 2026
d7cc178
Add RequiresCopilotPlus to ButtonInfo, update AI actions
TheJoeFin May 10, 2026
d747245
Enhance history menu with icons and improved headers
TheJoeFin May 10, 2026
4a5186e
Enhance recent history menu with icons and longer snippets
TheJoeFin May 10, 2026
7451e73
Add filter box to BottomBarSettings left command list
TheJoeFin May 10, 2026
1418ef4
Restore tray icon after Explorer restarts
TheJoeFin May 14, 2026
e45add7
Expand Bash allow list for bin/pdm CLI commands
TheJoeFin May 14, 2026
4d5975c
Add regular settings sidecar support to SettingsService
TheJoeFin May 14, 2026
0d0cf58
Refactor search logic; add TextSearchUtilities class
TheJoeFin May 14, 2026
436a522
Add per-cell text wrapping support to spreadsheet editor
TheJoeFin May 14, 2026
58e30a0
Enable spreadsheet mode for EditTextWindow in table mode
TheJoeFin May 14, 2026
391cb71
Add table edit state and view scale utilities
TheJoeFin May 16, 2026
096f0c2
Add manual table separator support and precision updates
TheJoeFin May 16, 2026
c6922ff
Add manual table editing, paragraph OCR, and zoom support
TheJoeFin May 16, 2026
c3943f5
Update async/cancellation, null checks, and warnings
TheJoeFin May 17, 2026
969fe4f
Refactor tests, nullability, and update copyright year
TheJoeFin May 17, 2026
0c782eb
Refresh managed JSON settings after import
TheJoeFin May 17, 2026
59fbbd8
Update app version to 4.14.0
TheJoeFin May 17, 2026
28c4d25
Update docs to .NET 10.0, refactor startup args, docs
TheJoeFin May 17, 2026
27e4a37
Remove Moq package from test project dependencies
TheJoeFin May 17, 2026
ba1b619
Add BUILT-WITH.md and third-party license notices
TheJoeFin May 17, 2026
c0c1eaa
Add Licenses window and third-party package catalog
TheJoeFin May 17, 2026
2fa5240
Redesign FirstRunWindow onboarding experience
TheJoeFin May 17, 2026
fb5a92d
Update NuGet package versions in main and test projects
TheJoeFin May 17, 2026
d9cf0bd
Update NotifyIcon window management and visibility
TheJoeFin May 17, 2026
9749f53
Hide NotifyIconWindow from Alt+Tab and taskbar
TheJoeFin May 19, 2026
c7103d0
Add setting to normalize line endings on paste
TheJoeFin May 19, 2026
71255d6
normalize line endings on paste, and simplify the enter behavior of s…
TheJoeFin May 19, 2026
afd69ac
Split up the paragraph detection on the grab frame to balance against…
TheJoeFin May 20, 2026
3df3d6a
Update labels and help for calc/date math features
TheJoeFin May 20, 2026
2a4f10a
Add duration conversion and target unit support to date math
TheJoeFin May 20, 2026
b6ffae6
Add pace unit support and pace/speed conversion logic
TheJoeFin May 20, 2026
91a213d
Add JoinLines and ShuffleLines string methods with tests
TheJoeFin May 20, 2026
c6674dc
Add JoinLinesWindow for advanced line joining UI
TheJoeFin May 20, 2026
195b071
Add Shuffle and Join Lines features to EditTextWindow
TheJoeFin May 20, 2026
f99d3e4
Implement IDisposable for WindowResizer, update P/Invoke
TheJoeFin May 21, 2026
c70253f
Refactor HistoryService: IDisposable, cleanup, menu handling
TheJoeFin May 21, 2026
a289764
Refactor event handling and cleanup in Find/WordBorder
TheJoeFin May 21, 2026
f2f43d9
Add explicit cleanup for windows and resource disposal
TheJoeFin May 21, 2026
0021942
Allow Bash directory listing commands in allowed list
TheJoeFin May 21, 2026
dfafa8a
Allow PowerShell dotnet build commands in settings
TheJoeFin May 21, 2026
d7c15bc
Add "Join Lines" and "Shuffle Lines" buttons
TheJoeFin May 21, 2026
a59a281
Update NuGet package versions in project files
TheJoeFin May 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .claude/settings.local.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
"Bash(curl -o bin/pdm https://app.produckmap.com/cli/pdm)",
"Bash(chmod +x bin/pdm)",
"Bash(bin/pdm ui-element:*)",
"Bash(bin/pdm *)"
"Bash(pdm api *)",
"Bash(bin/pdm *)",
"Bash(Get-ChildItem -Path \"D:/source/TheJoeFin/Text-Grab/Text-Grab/\" -Directory)",
"Bash(Select-Object Name)",
"PowerShell(dotnet build *)"
],
"deny": []
}
Expand Down
20 changes: 0 additions & 20 deletions .codetesting/AnalysisReport_20260125_220624_678.md

This file was deleted.

16 changes: 8 additions & 8 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Text Grab - GitHub Copilot Instructions

Text Grab is a Windows-specific .NET 9.0 WPF OCR (Optical Character Recognition) application that extracts text from images using Windows APIs. It provides multiple modes for text capture including full-screen grab, grab frame, edit text window, and quick lookup.
Text Grab is a Windows-specific .NET 10.0 WPF OCR (Optical Character Recognition) application that extracts text from images using Windows APIs. It provides multiple modes for text capture including full-screen grab, grab frame, edit text window, and quick lookup.

**ALWAYS reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.**

Expand All @@ -17,15 +17,15 @@ Text Grab is a Windows-specific .NET 9.0 WPF OCR (Optical Character Recognition)
### Prerequisites (Windows Only)
For full development on Windows:
- Windows 10/11 with Windows 10 SDK 22621.0
- Visual Studio 2019/2022 with workloads:
- Visual Studio 2022 with workloads:
- "Universal Windows Platform Development"
- ".NET desktop development"
- ".NET cross-platform development"
- **OR** .NET 9.0 SDK: https://dotnet.microsoft.com/download/dotnet/9.0
- **OR** .NET 10.0 SDK: https://dotnet.microsoft.com/download/dotnet/10.0

### Cross-Platform Dependency Validation
For non-Windows environments (validation only):
- Install .NET 9.0: `curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --version 9.0.101`
- Install .NET 10.0: `curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --version 10.0.100`
- Add to PATH: `export PATH="$HOME/.dotnet:$PATH"`

### Build Commands
Expand All @@ -49,7 +49,7 @@ For non-Windows environments (validation only):
### Running the Application (Windows Only)
- Debug in Visual Studio: Set Text-Grab-Package as startup project, press F5
- Command line debug: `dotnet run --project Text-Grab/Text-Grab.csproj`
- Production executable: `Text-Grab/bin/Release/net9.0-windows10.0.22621.0/Text-Grab.exe`
- Production executable: `Text-Grab/bin/Release/net10.0-windows10.0.22621.0/Text-Grab.exe`

### CLI Usage (Windows Only)
The application supports command-line arguments:
Expand Down Expand Up @@ -83,7 +83,7 @@ The application supports command-line arguments:
## Key Project Structure

### Primary Components
- **Text-Grab/**: Main WPF application (.NET 9.0)
- **Text-Grab/**: Main WPF application (.NET 10.0)
- **Text-Grab-Package/**: Windows application packaging project (.wapproj)
- **Tests/**: XUnit test suite with WPF support
- **.github/workflows/buildDev.yml**: CI/CD pipeline (Windows-only)
Expand Down Expand Up @@ -158,7 +158,7 @@ dotnet test Tests/Tests.csproj
.\build-unpackaged.ps1

# Non-Windows Validation Only (ALWAYS include -p:EnableWindowsTargeting=true)
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --version 9.0.101
curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --version 10.0.100
export PATH="$HOME/.dotnet:$PATH"
dotnet restore Text-Grab.sln -p:EnableWindowsTargeting=true
# Note: Full build will fail - only restore and dependency validation possible
Expand All @@ -173,4 +173,4 @@ dotnet restore Text-Grab.sln -p:EnableWindowsTargeting=true
- **Performance** matters for OCR operations - profile changes that affect image processing
- **Package references** - only add new package references when absolutely needed or explicitly asked

Remember: This is a Windows-native application leveraging platform-specific APIs. Development and testing should primarily occur on Windows systems.
Remember: This is a Windows-native application leveraging platform-specific APIs. Development and testing should primarily occur on Windows systems.
12 changes: 6 additions & 6 deletions .github/workflows/Release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: '9.0.x'
global-json-file: global.json

- name: Install dependencies
run: dotnet restore ${{ env.PROJECT_PATH }}
Expand Down Expand Up @@ -231,25 +231,25 @@ jobs:
}

- name: Upload build artifact (x64 framework-dependent)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Text-Grab-win-x64-framework-dependent
path: ${{ env.BUILD_X64 }}

- name: Upload build artifact (x64 self-contained)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Text-Grab-win-x64-self-contained
path: ${{ steps.compute.outputs.archive_x64_sc }}

- name: Upload build artifact (ARM64 framework-dependent)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Text-Grab-win-arm64-framework-dependent
path: ${{ env.BUILD_ARM64 }}

- name: Upload build artifact (ARM64 self-contained)
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Text-Grab-win-arm64-self-contained
path: ${{ steps.compute.outputs.archive_arm64_sc }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/buildDev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: "9.0.x"
global-json-file: global.json
- name: Install dependencies
run: dotnet restore ${{ env.PROJECT_PATH }}
- name: Build
Expand All @@ -33,7 +33,7 @@ jobs:
run: dotnet publish ${{ env.PROJECT_PATH }} -c Release --self-contained -r win-x64 -p:PublishSingleFile=true -p:EnableMsixTooling=true -o publish

- name: Upload artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: Text-Grab
path: .\publish
4 changes: 2 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/Text-Grab/bin/Debug/net6.0-windows10.0.20348.0/Text-Grab.exe",
"program": "${workspaceFolder}/Text-Grab/bin/Debug/net10.0-windows10.0.22621.0/Text-Grab.exe",
"args": [],
"cwd": "${workspaceFolder}/Text-Grab",
"console": "internalConsole",
Expand All @@ -21,4 +21,4 @@
"request": "attach"
}
]
}
}
39 changes: 39 additions & 0 deletions BUILT-WITH.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Built With

Text Grab depends on the direct NuGet packages listed below.

- **Scope** identifies whether a package is used by the app, the tests, or both.
- **Notice** links to a bundled local notice file when one ships with Text Grab, or to the upstream project license file otherwise.
- **Project** links to the upstream project home or repository.
- Test-only packages are documented for completeness, but they are not part of normal end-user app builds.

The same package inventory is also available from the app's **About → Licenses** flow.

| Package | Version | Scope | License | Notice | Project | Notes |
| --- | --- | --- | --- | --- | --- | --- |
| CliWrap | 3.10.1 | App | MIT | [Open](https://github.com/Tyrrrz/CliWrap/blob/master/License.txt) | [Project](https://github.com/Tyrrrz/CliWrap) | — |
| Dapplo.Windows.User32 | 2.0.89 | App | MIT | [Open](https://github.com/dapplo/Dapplo.Windows/blob/master/LICENSE) | [Project](https://github.com/dapplo/Dapplo.Windows) | — |
| Humanizer.Core | 3.0.10 | App | MIT | [Open](https://github.com/Humanizr/Humanizer/blob/main/license.txt) | [Project](https://github.com/Humanizr/Humanizer) | — |
| Magick.NET-Q16-AnyCPU | 14.12.0 | App | Apache-2.0 | [Open](https://github.com/dlemstra/Magick.NET/blob/main/License.txt) | [Project](https://github.com/dlemstra/Magick.NET) | — |
| Magick.NET.SystemDrawing | 8.0.20 | App | Apache-2.0 | [Open](https://github.com/dlemstra/Magick.NET/blob/main/License.txt) | [Project](https://github.com/dlemstra/Magick.NET) | — |
| Magick.NET.SystemWindowsMedia | 8.0.20 | App | Apache-2.0 | [Open](https://github.com/dlemstra/Magick.NET/blob/main/License.txt) | [Project](https://github.com/dlemstra/Magick.NET) | — |
| Markdig | 1.1.3 | App | BSD-2-Clause | [Open](ThirdPartyNotices/licenses/Markdig-license.txt) | [Project](https://github.com/xoofx/markdig) | Bundled to satisfy BSD-2-Clause binary redistribution notice requirements. |
| Microsoft.Toolkit.Uwp.Notifications | 7.1.3 | App | MIT | [Open](https://github.com/CommunityToolkit/WindowsCommunityToolkit/blob/main/License.md) | [Project](https://github.com/CommunityToolkit/WindowsCommunityToolkit) | — |
| Microsoft.WindowsAppSDK.AI | 1.8.70 | App | Microsoft license terms | [Open](ThirdPartyNotices/licenses/Microsoft.WindowsAppSDK-license.txt) | [Project](https://github.com/microsoft/windowsappsdk) | Package ships Microsoft Windows App SDK license terms. |
| Microsoft.WindowsAppSDK.Foundation | 1.8.260415000 | App | Microsoft license terms | [Open](ThirdPartyNotices/licenses/Microsoft.WindowsAppSDK-license.txt) | [Project](https://github.com/microsoft/windowsappsdk) | Package ships Microsoft Windows App SDK license terms. |
| Microsoft.WindowsAppSDK.Runtime | 1.8.260416003 | App | Microsoft license terms | [Open](ThirdPartyNotices/licenses/Microsoft.WindowsAppSDK-license.txt) | [Project](https://github.com/microsoft/windowsappsdk) | Package ships Microsoft Windows App SDK license terms. |
| Microsoft.WindowsAppSDK.WinUI | 1.8.260415005 | App | Microsoft license terms | [Open](ThirdPartyNotices/licenses/Microsoft.WindowsAppSDK-license.txt) | [Project](https://github.com/microsoft/windowsappsdk) | Package ships Microsoft Windows App SDK license terms. |
| NCalcAsync | 5.12.0 | App, Tests | MIT | [Open](https://github.com/ncalc/ncalc/blob/master/LICENSE) | [Project](https://github.com/ncalc/ncalc) | Shared by the application and the test project. |
| PdfPig | 0.1.14 | App | Apache-2.0 | [Open](https://github.com/UglyToad/PdfPig/blob/master/LICENSE) | [Project](https://github.com/UglyToad/PdfPig) | — |
| UnitsNet | 5.75.0 | App | MIT-0 | [Open](https://github.com/angularsen/UnitsNet/blob/master/LICENSE) | [Project](https://github.com/angularsen/UnitsNet) | — |
| WPF-UI | 4.2.1 | App | MIT | [Open](https://github.com/lepoco/wpfui/blob/main/LICENSE) | [Project](https://github.com/lepoco/wpfui) | — |
| WPF-UI.Tray | 4.2.1 | App | MIT | [Open](https://github.com/lepoco/wpfui/blob/main/LICENSE) | [Project](https://github.com/lepoco/wpfui) | — |
| ZXing.Net | 0.16.11 | App | Apache-2.0 | [Open](https://github.com/micjahn/ZXing.Net/blob/master/COPYING) | [Project](https://github.com/micjahn/ZXing.Net) | — |
| ZXing.Net.Bindings.Windows.Compatibility | 0.16.14 | App | Apache-2.0 | [Open](https://github.com/micjahn/ZXing.Net/blob/master/COPYING) | [Project](https://github.com/micjahn/ZXing.Net) | — |
| BenchmarkDotNet | 0.15.8 | Tests | MIT | [Open](https://github.com/dotnet/BenchmarkDotNet/blob/master/LICENSE.md) | [Project](https://github.com/dotnet/BenchmarkDotNet) | Test-only dependency. |
| coverlet.collector | 10.0.0 | Tests | MIT | [Open](https://github.com/coverlet-coverage/coverlet/blob/master/LICENSE) | [Project](https://github.com/coverlet-coverage/coverlet) | Test-only dependency. |
| Microsoft.NET.Test.Sdk | 18.4.0 | Tests | MIT | [Open](https://github.com/microsoft/vstest/blob/main/LICENSE) | [Project](https://github.com/microsoft/vstest) | Test-only dependency. |
| Microsoft.VisualStudio.DiagnosticsHub.BenchmarkDotNetDiagnosers | 18.7.37220.1 | Tests | Microsoft license terms | [Open](ThirdPartyNotices/licenses/Microsoft.VisualStudio.DiagnosticsHub.BenchmarkDotNetDiagnosers-LICENSE.md) | [Project](https://learn.microsoft.com/visualstudio/profiling/) | Visual Studio benchmarking tooling; test-only dependency. |
| xunit.runner.visualstudio | 3.1.5 | Tests | Apache-2.0 | [Open](https://github.com/xunit/visualstudio.xunit/blob/main/License.txt) | [Project](https://github.com/xunit/visualstudio.xunit) | Test-only dependency. |
| Xunit.StaFact | 3.0.13 | Tests | MS-PL | [Open](https://github.com/AArnott/Xunit.StaFact/blob/main/LICENSE) | [Project](https://github.com/AArnott/Xunit.StaFact) | Test-only dependency. |
| xunit.v3 | 3.2.2 | Tests | Apache-2.0 | [Open](https://github.com/xunit/xunit/blob/main/LICENSE) | [Project](https://github.com/xunit/xunit) | Test-only dependency. |
Loading
Loading