Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file added GT.RText-Release/GT.NDB0.Core.dll
Binary file not shown.
Binary file added GT.RText-Release/GT.RText.Core.dll
Binary file not shown.
Binary file added GT.RText-Release/GT.RText.exe
Binary file not shown.
6 changes: 6 additions & 0 deletions GT.RText-Release/GT.RText.exe.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
Binary file added GT.RText-Release/GT.Shared.dll
Binary file not shown.
72 changes: 72 additions & 0 deletions GT.RText-Release/README.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
GT.RText v1.9.4 - Enhanced Edition
=====================================

IMPORTANT NOTICE
----------------
This is a MODIFIED version of the original GT.RText by xfileFIN
Original author: xfileFIN - Copyright © 2022
Enhanced by: Derek W after requested by a friend - 2025
This version includes additional features not present in the original

OVERVIEW
--------
Gran Turismo RText Editor with enhanced features including:
- CSV Import/Export functionality for bulk editing
- Pure black dark theme with dark title bar
- Custom icon support
- English interface and improved usability

CREDITS
-------
• Original GT.RText: xfileFIN - 2022
• Enhanced Edition: Derek W - 2025
• Additional Features: CSV Import/Export, Dark Theme, UI Improvements

SYSTEM REQUIREMENTS
-------------------
- Windows 10/11
- .NET Framework 4.7.2 or higher
- 50MB free disk space

INSTALLATION
------------
1. Extract all files to a folder of your choice
2. Ensure all DLL files are in the same folder as GT.RText.exe
3. Run GT.RText.exe

FEATURES
--------
Dark Theme: Pure black interface with dark window title bar
CSV Import: Import text entries for bulk editing from CSV files
CSV Export: Export category data to CSV format for backup/editing
Icon Support: Custom application icon (app.ico)
English Interface: Fully translated interface and comments
Enhanced Compatibility: Works with Excel CSV formats

USAGE
-----
1. Open a Gran Turismo RText file (.rt03, .rt04, .rt05, ._50tr)
2. Right-click on a category to access Import/Export options
3. Use "Import this category from CSV" for bulk updates
4. Use "Export this category to CSV" for data backup
5. CSV format: RecNo,Label,String (Excel compatible)

CSV IMPORT FORMAT
-----------------
RecNo,Label,String
1,LABEL_NAME,Display Text Here
2,ANOTHER_LABEL,Another Text Here

TROUBLESHOOTING
---------------
- If the app doesn't start, install .NET Framework 4.7.2
- Ensure all DLL files are in the same folder
- Run as Administrator if file access issues occur

VERSION HISTORY
========================================
Build Date: August 26, 2025
Build Version: v1.9.4
Original Author: xfileFIN (eventHorizon) © 2022
Enhanced by: Derek W © 2025
Built with: Visual Studio 2022, MSBuild 17.13
Binary file added GT.RText-Release/app.ico
Binary file not shown.
12 changes: 3 additions & 9 deletions GT.RText.sln
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33103.184
# Visual Studio Version 16
VisualStudioVersion = 16.0.29709.97
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GT.RText", "GT.RText\GT.RText.csproj", "{9E8B67DF-F7CD-458C-848B-2B148466224E}"
EndProject
Expand All @@ -14,9 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
.editorconfig = .editorconfig
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GT.NDB0.Core", "GT.NDB0\GT.NDB0.Core.csproj", "{EE1ACABD-0580-41F9-A56D-2676F2E6D608}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GT.RText.Comparer", "GT.RText.Comparer\GT.RText.Comparer.csproj", "{B4F8A315-F0EA-4B86-AE62-681AA5CD873E}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GT.NDB0.Core", "GT.NDB0\GT.NDB0.Core.csproj", "{EE1ACABD-0580-41F9-A56D-2676F2E6D608}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand All @@ -40,10 +38,6 @@ Global
{EE1ACABD-0580-41F9-A56D-2676F2E6D608}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE1ACABD-0580-41F9-A56D-2676F2E6D608}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE1ACABD-0580-41F9-A56D-2676F2E6D608}.Release|Any CPU.Build.0 = Release|Any CPU
{B4F8A315-F0EA-4B86-AE62-681AA5CD873E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B4F8A315-F0EA-4B86-AE62-681AA5CD873E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B4F8A315-F0EA-4B86-AE62-681AA5CD873E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B4F8A315-F0EA-4B86-AE62-681AA5CD873E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
260 changes: 260 additions & 0 deletions GT.RText/DarkTheme.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
using System;
using System.Drawing;
using System.Windows.Forms;

namespace GT.RText
{
/// <summary>
/// Class to apply dark theme to Windows Forms controls
/// </summary>
public static class DarkTheme
{
// Dark theme colors
public static readonly Color DarkBackground = Color.Black;
public static readonly Color DarkSecondaryBackground = Color.FromArgb(20, 20, 20);
public static readonly Color DarkControlBackground = Color.FromArgb(15, 15, 15);
public static readonly Color DarkForeground = Color.White;
public static readonly Color DarkBorder = Color.FromArgb(40, 40, 40);
public static readonly Color DarkSelection = Color.FromArgb(0, 122, 204);
public static readonly Color DarkMenuBackground = Color.FromArgb(20, 20, 20);
public static readonly Color DarkMenuForeground = Color.White;
public static readonly Color DarkStatusBackground = Color.FromArgb(0, 122, 204);

/// <summary>
/// Applies dark theme to the main form and all its controls
/// </summary>
/// <param name="form">Form to be modified</param>
public static void ApplyDarkTheme(Form form)
{
// Configure main form
form.BackColor = DarkBackground;
form.ForeColor = DarkForeground;

// Apply theme to all controls recursively
ApplyDarkThemeToControls(form.Controls);
}

/// <summary>
/// Applies dark theme to a collection of controls recursively
/// </summary>
/// <param name="controls">Control collection</param>
private static void ApplyDarkThemeToControls(Control.ControlCollection controls)
{
foreach (Control control in controls)
{
ApplyDarkThemeToControl(control);

// Apply recursively to child controls
if (control.HasChildren)
{
ApplyDarkThemeToControls(control.Controls);
}
}
}

/// <summary>
/// Applies dark theme to a specific control
/// </summary>
/// <param name="control">Control to be modified</param>
private static void ApplyDarkThemeToControl(Control control)
{
try
{
switch (control)
{
case MenuStrip menuStrip:
ApplyDarkThemeToMenuStrip(menuStrip);
break;

case ContextMenuStrip contextMenu:
ApplyDarkThemeToContextMenu(contextMenu);
break;

case StatusStrip statusStrip:
ApplyDarkThemeToStatusStrip(statusStrip);
break;

case TabControl tabControl:
ApplyDarkThemeToTabControl(tabControl);
break;

case ListView listView:
ApplyDarkThemeToListView(listView);
break;

case TextBox textBox:
ApplyDarkThemeToTextBox(textBox);
break;

case Button button:
ApplyDarkThemeToButton(button);
break;

case Panel panel:
ApplyDarkThemeToPanel(panel);
break;

case GroupBox groupBox:
ApplyDarkThemeToGroupBox(groupBox);
break;

case Label label:
ApplyDarkThemeToLabel(label);
break;

default:
// Apply basic theme for non-specific controls
control.BackColor = DarkBackground;
control.ForeColor = DarkForeground;
break;
}
}
catch (Exception)
{
// Ignore errors from controls that don't support color changes
}
}

private static void ApplyDarkThemeToMenuStrip(MenuStrip menuStrip)
{
menuStrip.BackColor = DarkMenuBackground;
menuStrip.ForeColor = DarkMenuForeground;
menuStrip.Renderer = new DarkMenuRenderer();

foreach (ToolStripItem item in menuStrip.Items)
{
ApplyDarkThemeToMenuItem(item);
}
}

private static void ApplyDarkThemeToContextMenu(ContextMenuStrip contextMenu)
{
contextMenu.BackColor = DarkMenuBackground;
contextMenu.ForeColor = DarkMenuForeground;
contextMenu.Renderer = new DarkMenuRenderer();

foreach (ToolStripItem item in contextMenu.Items)
{
ApplyDarkThemeToMenuItem(item);
}
}

private static void ApplyDarkThemeToMenuItem(ToolStripItem item)
{
item.BackColor = DarkMenuBackground;
item.ForeColor = DarkMenuForeground;

if (item is ToolStripMenuItem menuItem && menuItem.HasDropDownItems)
{
foreach (ToolStripItem subItem in menuItem.DropDownItems)
{
ApplyDarkThemeToMenuItem(subItem);
}
}
}

private static void ApplyDarkThemeToStatusStrip(StatusStrip statusStrip)
{
statusStrip.BackColor = DarkSecondaryBackground;
statusStrip.ForeColor = DarkForeground;
statusStrip.Renderer = new DarkStatusStripRenderer();

foreach (ToolStripItem item in statusStrip.Items)
{
item.BackColor = DarkSecondaryBackground;
item.ForeColor = DarkForeground;
}
}

private static void ApplyDarkThemeToTabControl(TabControl tabControl)
{
tabControl.BackColor = DarkBackground;
tabControl.ForeColor = DarkForeground;

foreach (TabPage tabPage in tabControl.TabPages)
{
tabPage.BackColor = DarkBackground;
tabPage.ForeColor = DarkForeground;
}
}

private static void ApplyDarkThemeToListView(ListView listView)
{
listView.BackColor = DarkControlBackground;
listView.ForeColor = DarkForeground;
listView.BorderStyle = BorderStyle.FixedSingle;
}

private static void ApplyDarkThemeToTextBox(TextBox textBox)
{
textBox.BackColor = DarkControlBackground;
textBox.ForeColor = DarkForeground;
textBox.BorderStyle = BorderStyle.FixedSingle;
}

private static void ApplyDarkThemeToButton(Button button)
{
button.BackColor = DarkSecondaryBackground;
button.ForeColor = DarkForeground;
button.FlatStyle = FlatStyle.Flat;
button.FlatAppearance.BorderColor = DarkBorder;
button.FlatAppearance.MouseOverBackColor = DarkSelection;
}

private static void ApplyDarkThemeToPanel(Panel panel)
{
panel.BackColor = DarkBackground;
panel.ForeColor = DarkForeground;
}

private static void ApplyDarkThemeToGroupBox(GroupBox groupBox)
{
groupBox.BackColor = DarkBackground;
groupBox.ForeColor = DarkForeground;
}

private static void ApplyDarkThemeToLabel(Label label)
{
label.BackColor = Color.Transparent;
label.ForeColor = DarkForeground;
}
}

/// <summary>
/// Renderer personalizado para menus em tema escuro
/// </summary>
public class DarkMenuRenderer : ToolStripProfessionalRenderer
{
public DarkMenuRenderer() : base(new DarkMenuColorTable()) { }
}

/// <summary>
/// Renderer personalizado para status strip em tema escuro
/// </summary>
public class DarkStatusStripRenderer : ToolStripProfessionalRenderer
{
public DarkStatusStripRenderer() : base(new DarkMenuColorTable()) { }
}

/// <summary>
/// Tabela de cores personalizada para menus em tema escuro
/// </summary>
public class DarkMenuColorTable : ProfessionalColorTable
{
public override Color MenuItemSelected => DarkTheme.DarkSelection;
public override Color MenuItemSelectedGradientBegin => DarkTheme.DarkSelection;
public override Color MenuItemSelectedGradientEnd => DarkTheme.DarkSelection;
public override Color MenuItemPressedGradientBegin => DarkTheme.DarkSelection;
public override Color MenuItemPressedGradientEnd => DarkTheme.DarkSelection;
public override Color MenuItemBorder => DarkTheme.DarkBorder;
public override Color MenuBorder => DarkTheme.DarkBorder;
public override Color MenuStripGradientBegin => DarkTheme.DarkMenuBackground;
public override Color MenuStripGradientEnd => DarkTheme.DarkMenuBackground;
public override Color ToolStripDropDownBackground => DarkTheme.DarkMenuBackground;
public override Color ImageMarginGradientBegin => DarkTheme.DarkMenuBackground;
public override Color ImageMarginGradientMiddle => DarkTheme.DarkMenuBackground;
public override Color ImageMarginGradientEnd => DarkTheme.DarkMenuBackground;
public override Color SeparatorDark => DarkTheme.DarkBorder;
public override Color SeparatorLight => DarkTheme.DarkBorder;
}
}
Loading