Skip to content

V4.2.0 Release - #188

Merged
mukunku merged 22 commits into
mainfrom
v4.2.0-release
Aug 3, 2026
Merged

V4.2.0 Release#188
mukunku merged 22 commits into
mainfrom
v4.2.0-release

Conversation

@mukunku

@mukunku mukunku commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Summary

This PR:

  • Adds debouncing to the Field Selection Dialog's filter text box (#187)
  • ParquetViewer will now obtain a soft file lock from the file system (#101) (#132) (#185)
    • Generally allowed: renaming, modifying, and deleting
    • Restrictions:
      • File replace operations are not allowed unfortunately
      • If opening a folder, the folder itself cannot be renamed
    • The title bar will now show (DELETED) or (MODIFIED) accordingly based on what happened to the open file(s)
    • New CTRL+R shortcut to trigger a file reload
  • Implements word wrapping (#180)
    • Right click the column header of a text field with cut off text to enable
  • Improves field name masking when gathering analytics

@mukunku
mukunku requested a review from Copilot July 13, 2026 01:18
@github-actions

github-actions Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Unit Test Results

✔️ Tests 95 / 101 (0 failed, 6 skipped) - passed in 3.1s
🔍 click here for more details

✏️ updated for commit 314676c

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR prepares the v4.2.0 release by improving large-field UX (debounced filtering), switching Parquet file access to non-locking reads, and adding UI affordances (word wrap + title-bar indicators) alongside localization and dependency updates.

Changes:

  • Debounce the Field Selection Dialog filter textbox to prevent UI stalls on large schemas.
  • Open Parquet files via non-locking streams and add periodic “deleted/modified” title-bar detection.
  • Add a per-column “Wrap Text” context-menu option and update resources/translations + package versions.

Reviewed changes

Copilot reviewed 17 out of 20 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/ParquetViewer/Resources/Strings.tr.resx Adds Turkish strings for deleted/modified title suffixes and wrap-text menu item.
src/ParquetViewer/Resources/Strings.resx Adds default strings/comments for deleted/modified title suffixes and wrap-text menu item.
src/ParquetViewer/Resources/Strings.Designer.cs Exposes new localized string properties.
src/ParquetViewer/Properties/AssemblyInfo.cs Bumps AssemblyVersion to 4.2.0.0.
src/ParquetViewer/MainForm.resx Adds timer component metadata for file integrity checking.
src/ParquetViewer/MainForm.EventHandlers.cs Implements timer tick logic to detect deleted/modified sources and update the window title.
src/ParquetViewer/MainForm.Designer.cs Adds/enables a periodic WinForms Timer for integrity checks.
src/ParquetViewer/MainForm.cs Resets last-modified tracking when swapping engines/loading.
src/ParquetViewer/FieldSelectionDialog.resx Updates designer serialization for the new delayed textbox control.
src/ParquetViewer/FieldSelectionDialog.Designer.cs Replaces filter TextBox with DelayedOnChangedTextBox and wires delayed event.
src/ParquetViewer/FieldSelectionDialog.cs Switches filter handler to delayed text-changed event.
src/ParquetViewer/Controls/ParquetGridView.cs Adds wrap-text context-menu option + adjusts autosize sampling; adds helper methods.
src/ParquetViewer/Analytics/AllEvents.cs Minor type simplification for ExceptionEvent.Exception.
src/ParquetViewer.Engine/Types/IByteArrayValue.cs Removes unused using directives.
src/ParquetViewer.Engine/IParquetEngine.cs Adds GetOpenParquetFilePaths() for integrity monitoring.
src/ParquetViewer.Engine.ParquetNET/ParquetEngine.Processor.cs Wraps ParquetException to adjust field-path quoting in messages.
src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs Switches to non-locking FileStream-based reader creation; tracks file paths per reader.
src/ParquetViewer.Engine.DuckDB/ParquetEngine.cs Implements GetOpenParquetFilePaths() for DuckDB engine.
src/Directory.Packages.props Updates Arrow/MiniExcel/Parquet.Net versions.
.github/ISSUE_TEMPLATE/translation_template.csv Updates translation template entries (including new strings and reordered QuickPeek entries).
Files not reviewed (3)
  • src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
  • src/ParquetViewer/MainForm.Designer.cs: Generated file
  • src/ParquetViewer/Resources/Strings.Designer.cs: Generated file
Comments suppressed due to low confidence (2)

src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs:106

  • The FileStream created for non-locking reads is leaked if ParquetReader.CreateAsync throws (the stream is not disposed in the catch). This can keep file handles open and exhaust resources after repeated failures.
            try
            {
                var readOnlyNonLockingStream = new FileStream(parquetFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
                var parquetReader = await ParquetReader.CreateAsync(readOnlyNonLockingStream, _defaultParquetOptions, false, cancellationToken);
                return new ParquetEngine(parquetFilePath, (parquetFilePath, parquetReader));
            }
            catch (Exception ex)
            {
                throw new FileReadException(ex);
            }

src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs:136

  • OpenFolderAsync leaks the FileStream for any file that fails during ParquetReader.CreateAsync (or later in the try block) because the stream is never disposed in the catch path. This can leave many handles open when scanning a folder with unreadable files.
                try
                {
                    var readOnlyNonLockingStream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
                    var parquetReader = await ParquetReader.CreateAsync(readOnlyNonLockingStream, _defaultParquetOptions, false, cancellationToken);
                    if (!fileGroups.ContainsKey(parquetReader.Schema))
                    {
                        fileGroups.Add(parquetReader.Schema, new List<(string, ParquetReader)>());
                    }

                    fileGroups[parquetReader.Schema].Add((file, parquetReader));
                }
                catch (Exception ex)
                {
                    skippedFiles.Add(System.IO.Path.GetRelativePath(folderPath, file), ex);
                }

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs Outdated
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer/Controls/ParquetGridView.cs
Comment thread src/ParquetViewer/Controls/ParquetGridView.cs
@mukunku
mukunku requested a review from Copilot July 13, 2026 02:54

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 21 changed files in this pull request and generated 3 comments.

Files not reviewed (3)
  • src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
  • src/ParquetViewer/MainForm.Designer.cs: Generated file
  • src/ParquetViewer/Resources/Strings.Designer.cs: Generated file

Comment thread src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs Outdated
Comment thread src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 21 changed files in this pull request and generated 2 comments.

Files not reviewed (3)
  • src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
  • src/ParquetViewer/MainForm.Designer.cs: Generated file
  • src/ParquetViewer/Resources/Strings.Designer.cs: Generated file

Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 21 changed files in this pull request and generated 5 comments.

Files not reviewed (3)
  • src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
  • src/ParquetViewer/MainForm.Designer.cs: Generated file
  • src/ParquetViewer/Resources/Strings.Designer.cs: Generated file

Comment thread src/ParquetViewer/MainForm.cs Outdated
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs
Comment thread src/ParquetViewer.Engine.ParquetNET/ParquetEngine.cs

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 21 changed files in this pull request and generated 4 comments.

Files not reviewed (3)
  • src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
  • src/ParquetViewer/MainForm.Designer.cs: Generated file
  • src/ParquetViewer/Resources/Strings.Designer.cs: Generated file

Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer/MainForm.cs Outdated
Comment thread src/ParquetViewer/MainForm.cs Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 21 changed files in this pull request and generated 2 comments.

Files not reviewed (3)
  • src/ParquetViewer/FieldSelectionDialog.Designer.cs: Generated file
  • src/ParquetViewer/MainForm.Designer.cs: Generated file
  • src/ParquetViewer/Resources/Strings.Designer.cs: Generated file

Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
Comment thread src/ParquetViewer/MainForm.EventHandlers.cs Outdated
- uses: ncipollo/release-action@v1
with:
artifacts: "signed-package/ParquetViewer.exe,signed-package/ParquetViewer_SelfContained.exe"
artifacts: "/signed-package/ParquetViewer.exe,/signed-package/ParquetViewer_SelfContained.exe"

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The release action keeps failing to find the signed exe's so going to give this a try for next release

@mukunku
mukunku merged commit 308f119 into main Aug 3, 2026
1 of 4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants