Skip to content

Commit a28c222

Browse files
authored
docs: update README and bump to v2.0 (#151)
## Summary - Rewrite README to match current File/Edit/Plugins menu structure - Add keyboard shortcuts table and menu reference - Document bundled plugins (XML Viewer, Clip Inspector) and plugin authoring - Bump MinVer to v2.0 across all projects (SharpFM, Plugin, Plugin.Sample, Plugin.XmlViewer) - Add `Version` property to `IPanelPlugin` interface, shown in Plugin Manager UI - Fix asset path for project restructure ## Test plan - [x] `dotnet build && dotnet test` passes (198 tests) - [x] Plugin Manager shows version for each loaded plugin - [x] README accurately reflects current menu layout and workflows
1 parent f64e4ad commit a28c222

File tree

12 files changed

+108
-47
lines changed

12 files changed

+108
-47
lines changed

README.md

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,100 @@
11
# SharpFM
22

3-
SharpFM is a cross-platform (Mac, Windows, Linux) FileMaker Pro Developer Utility to help when migrating FileMaker code between FileMaker files, sharing FileMaker code with other developers, or simply see what's happening under the hood. This means you can copy scripts, layouts, tables, etc (anything you can copy/paste in FileMaker) across machine barriers like Remote Desktop, Citrix/XenApp or anything that can copy plain text between machines, save them for later, change them if you want, then finally re-paste them into the same or other FileMaker file.
3+
SharpFM is a cross-platform (Mac, Windows, Linux) FileMaker Pro Developer Utility for migrating FileMaker code between files, sharing code with other developers, or inspecting what's happening under the hood. Copy scripts, layouts, tables, and fields from FileMaker Pro, edit them in structured editors, and paste them back -- across machine barriers like Remote Desktop, Citrix, or anything that supports plain text.
44

55
## Getting Started
66

7-
Note: SharpFM and FileMaker must be running on the same computer. In order to share or move a clip across machine barriers, you must share the text based XML version.
7+
Head over to [Releases](https://github.com/fuzzzerd/SharpFM/releases) and grab the latest version for your platform (Windows, Mac, Linux).
88

9-
- Head over to [Releases](https://github.com/fuzzzerd/SharpFM/releases), grab the latest version (binaries for Windows, Mac, Linux are all available there).
9+
SharpFM and FileMaker must be running on the same computer. To share clips across machines, use the XML files directly.
1010

1111
### Importing Clips from FileMaker
1212

13-
- Open SharpFM.
14-
- Switch over to FileMaker.
15-
- Copy something to the clipboard (scripts, tables, layouts, etc).
16-
- Switch back to SharpFM.
17-
- Use **File > New > From Clipboard** (`Ctrl+V`) to import the clip.
18-
- The clip appears in the left panel with the appropriate editor on the right.
13+
1. Open SharpFM and FileMaker side by side.
14+
2. In FileMaker, copy something to the clipboard (scripts, tables, layouts, etc).
15+
3. In SharpFM, use **Edit > Paste from FileMaker** (`Ctrl+V`).
16+
4. The clip appears in the left panel with the appropriate editor on the right.
1917

2018
### Exporting Clips to FileMaker
2119

22-
- Select a clip in the left panel.
23-
- Use **File > Save > Selected clip to Clipboard** (`Ctrl+Shift+C`).
24-
- Switch to FileMaker and open the appropriate destination (Database Manager, Script Workspace, Layout mode, etc).
25-
- Paste as you normally would.
20+
1. Select a clip in the left panel.
21+
2. Use **Edit > Copy to FileMaker** (`Ctrl+Shift+C`).
22+
3. Switch to FileMaker and open the appropriate destination (Database Manager, Script Workspace, Layout mode, etc).
23+
4. Paste as you normally would.
24+
25+
### Creating New Clips
26+
27+
- **File > New Script** (`Ctrl+N`) -- creates an empty script clip with the FmScript editor.
28+
- **File > New Table** (`Ctrl+Shift+N`) -- creates an empty table clip with the DataGrid editor.
2629

2730
### Editing Scripts
2831

29-
- Select a script clip or create one with **File > New > Script** (`Ctrl+N`).
30-
- The script editor shows a plain-text representation of the script steps with FmScript syntax highlighting.
31-
- Edit the script text directly; changes are synced back to the underlying XML.
32+
Select a script clip to open the plain-text script editor with FmScript syntax highlighting, autocomplete, bracket matching, and validation diagnostics. Edit the script text directly -- changes sync to the underlying XML automatically.
3233

3334
### Editing Tables
3435

35-
- Select a table clip or create one with **File > New > Table** (`Ctrl+Shift+N`).
36-
- The table editor shows a DataGrid with columns for Field Name, Type, Kind, Required, Unique, and Comment.
37-
- Click **+ Add Field** to add a new field, then edit its properties inline.
38-
- Select a field and click **Remove** or press `Delete` to remove it.
39-
- Change a field's Kind to Calculated or Summary, then click **Edit Calculation...** to open the calculation editor.
36+
Select a table clip to open the DataGrid editor with columns for Field Name, Type, Kind, Required, Unique, and Comment. Use **+ Add Field** to add fields, **Remove** or `Delete` to remove them. Change a field's Kind to Calculated or Summary, then click **Edit Calculation...** for the calculation editor.
4037

4138
### Viewing Raw XML
4239

43-
- Select any clip and use **View > Show XML** (`Ctrl+Shift+X`) to open the raw XML in a separate window.
44-
- Edits made in the XML window are synced back to the clip when the window is closed.
40+
Use the **XML Viewer** plugin (`Ctrl+Shift+X`) to open a live XML panel alongside any structured editor. Edits in either direction sync automatically -- change the script and the XML updates, edit the XML and the script rebuilds.
41+
42+
### Saving and Loading Clips
43+
44+
SharpFM persists clips as XML files in a local folder.
4545

46-
### Saving and Sharing Clips
46+
- **File > Save All** (`Ctrl+S`) -- saves all clips to the current folder.
47+
- **File > Open Folder...** -- load clips from a different folder.
48+
- Clip files are plain XML and can be shared via git, email, or any text-based tool.
4749

48-
SharpFM persists clips between sessions as XML files in a local folder.
50+
## Keyboard Shortcuts
4951

50-
- Use **File > Save > Save All To Folder** (`Ctrl+S`) to save all clips.
51-
- Use **File > Open Folder** to load clips from a different folder.
52-
- The clip files are plain XML and can be shared via git, email, or any text-based tool.
52+
| Shortcut | Action |
53+
|----------|--------|
54+
| `Ctrl+N` | New Script |
55+
| `Ctrl+Shift+N` | New Table |
56+
| `Ctrl+V` | Paste from FileMaker |
57+
| `Ctrl+Shift+C` | Copy to FileMaker |
58+
| `Ctrl+S` | Save All |
59+
| `Ctrl+Shift+X` | Toggle XML Viewer |
60+
61+
## Menu Reference
62+
63+
| Menu | Items |
64+
|------|-------|
65+
| **File** | New Script, New Table, Open Folder..., Save All, Exit |
66+
| **Edit** | Paste from FileMaker, Copy to FileMaker, Copy as C# Class |
67+
| **Plugins** | Loaded plugins (toggle panels), Manage Plugins... |
5368

5469
## Features
5570

56-
- [x] Copy FileMaker Scripts, Tables, or Layouts From FileMaker Pro to their XML representation and back into FileMaker.
57-
- [x] Store FileMaker Scripts, Tables, and Layouts to xml files that can be shared via git, email or other text based tools.
58-
- [x] Edit raw FileMaker XML code (scripts, layouts, tables) with ability to paste changes back into FileMaker.
59-
- [x] Use AvaloniaEdit for XML editing with XML syntax highlighting.
60-
- [x] Plain-text script editor with FmScript syntax highlighting.
61-
- [x] DataGrid table/field editor with inline editing, calculation editor, and type/kind selection.
62-
- [x] View and edit raw XML alongside structured editors.
71+
- Copy FileMaker Scripts, Tables, Fields, and Layouts to their XML representation and back.
72+
- Persist clips as XML files shareable via git, email, or other text-based tools.
73+
- Plain-text script editor with FmScript syntax highlighting, autocomplete, and validation.
74+
- DataGrid table/field editor with inline editing, calculation editor, and type/kind selection.
75+
- Live bidirectional XML viewer -- edit XML or structured data, both stay in sync.
76+
- Extensible plugin architecture for adding custom panels and tools.
6377

6478
## Plugins
6579

66-
SharpFM supports plugins via the `SharpFM.Plugin` contract library. Plugins implement `IPanelPlugin` and are loaded from the `plugins/` directory at startup. You can also install and manage plugins from the **View > Manage Plugins...** menu.
80+
SharpFM supports plugins via the `SharpFM.Plugin` contract library. Plugins are loaded from the `plugins/` directory at startup and can be managed from **Plugins > Manage Plugins...**.
81+
82+
### Bundled Plugins
6783

68-
A sample "Clip Inspector" plugin is included to demonstrate the plugin API.
84+
- **XML Viewer** -- Live XML panel with syntax highlighting and bidirectional sync (`Ctrl+Shift+X`).
85+
- **Clip Inspector** -- Displays clip metadata (name, type, element count, size).
6986

7087
### Writing a Plugin
7188

72-
1. Create a new .NET 8 class library referencing `SharpFM.Plugin`.
73-
2. Implement `IPanelPlugin` — provide an `Id`, `DisplayName`, and `CreatePanel()` returning an Avalonia `Control`.
74-
3. Use `IPluginHost` in `Initialize()` to observe clip selection and push XML updates.
75-
4. Build your DLL and drop it in the `plugins/` directory.
89+
1. Create a .NET 8 class library referencing `SharpFM.Plugin`.
90+
2. Implement `IPanelPlugin` -- provide an `Id`, `DisplayName`, `CreatePanel()` returning an Avalonia `Control`.
91+
3. Use `IPluginHost` in `Initialize()` to observe clip selection changes and content updates.
92+
4. Optionally register keyboard shortcuts via `KeyBindings` and custom menu actions via `MenuActions`.
93+
5. Build the DLL and drop it in the `plugins/` directory.
7694

7795
See `src/SharpFM.Plugin.Sample/` for a complete working example.
7896

79-
### License
97+
### Plugin License
8098

8199
While SharpFM is licensed under GPL v3, plugins that communicate solely through the interfaces in `SharpFM.Plugin` are not required to be GPL-licensed. See the plugin interface source files for the full exception clause.
82100

@@ -91,6 +109,6 @@ Logs are stored in `${specialfolder:folder=CommonApplicationData}\SharpFM` and a
91109

92110
## App Icon
93111

94-
![Sharp FM](Assets/noun-sharp-teeth-monster-4226695.small.png)
112+
![Sharp FM](src/SharpFM/Assets/noun-sharp-teeth-monster-4226695.small.png)
95113

96114
sharp teeth monster by Kanyanee Watanajitkasem from [Noun Project](https://thenounproject.com/browse/icons/term/sharp-teeth-monster/) (CC BY 3.0)

src/SharpFM.Plugin.Sample/ClipInspectorPlugin.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Reflection;
34
using Avalonia.Controls;
45
using SharpFM.Plugin;
56

@@ -9,6 +10,7 @@ public class ClipInspectorPlugin : IPanelPlugin
910
{
1011
public string Id => "clip-inspector";
1112
public string DisplayName => "Clip Inspector";
13+
public string Version => GetType().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "0.0.0";
1214
public IReadOnlyList<PluginKeyBinding> KeyBindings => [];
1315
public IReadOnlyList<PluginMenuAction> MenuActions => [];
1416

src/SharpFM.Plugin.Sample/SharpFM.Plugin.Sample.csproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
<LangVersion>latest</LangVersion>
66
</PropertyGroup>
77

8+
<PropertyGroup>
9+
<MinVerMinimumMajorMinor>2.0</MinVerMinimumMajorMinor>
10+
<MinVerTagPrefix>v</MinVerTagPrefix>
11+
<MinVerDefaultPreReleaseIdentifiers>beta.0</MinVerDefaultPreReleaseIdentifiers>
12+
</PropertyGroup>
13+
814
<ItemGroup>
915
<ProjectReference Include="..\SharpFM.Plugin\SharpFM.Plugin.csproj" />
1016
</ItemGroup>
@@ -13,5 +19,9 @@
1319
<PackageReference Include="Avalonia" Version="11.2.4" />
1420
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.2.4" />
1521
<PackageReference Include="FluentAvaloniaUI" Version="2.2.0" />
22+
<PackageReference Include="MinVer" Version="6.0.0">
23+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
24+
<PrivateAssets>all</PrivateAssets>
25+
</PackageReference>
1626
</ItemGroup>
1727
</Project>

src/SharpFM.Plugin.XmlViewer/SharpFM.Plugin.XmlViewer.csproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
<LangVersion>latest</LangVersion>
66
</PropertyGroup>
77

8+
<PropertyGroup>
9+
<MinVerMinimumMajorMinor>2.0</MinVerMinimumMajorMinor>
10+
<MinVerTagPrefix>v</MinVerTagPrefix>
11+
<MinVerDefaultPreReleaseIdentifiers>beta.0</MinVerDefaultPreReleaseIdentifiers>
12+
</PropertyGroup>
13+
814
<ItemGroup>
915
<ProjectReference Include="..\SharpFM.Plugin\SharpFM.Plugin.csproj" />
1016
</ItemGroup>
@@ -16,5 +22,9 @@
1622
<PackageReference Include="TextMateSharp.Grammars" Version="1.0.66" />
1723
<PackageReference Include="AvaloniaEdit.TextMate" Version="11.1.0" />
1824
<PackageReference Include="FluentAvaloniaUI" Version="2.2.0" />
25+
<PackageReference Include="MinVer" Version="6.0.0">
26+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
27+
<PrivateAssets>all</PrivateAssets>
28+
</PackageReference>
1929
</ItemGroup>
2030
</Project>

src/SharpFM.Plugin.XmlViewer/XmlViewerPlugin.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Reflection;
34
using Avalonia.Controls;
45
using SharpFM.Plugin;
56

@@ -9,6 +10,7 @@ public class XmlViewerPlugin : IPanelPlugin
910
{
1011
public string Id => "xml-viewer";
1112
public string DisplayName => "XML Viewer";
13+
public string Version => GetType().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "0.0.0";
1214

1315
private IPluginHost? _host;
1416
private XmlViewerViewModel? _viewModel;

src/SharpFM.Plugin/IPanelPlugin.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@ public interface IPanelPlugin : IDisposable
2020
string Id { get; }
2121

2222
/// <summary>
23-
/// Display name shown in the View menu (e.g. "Clip Inspector").
23+
/// Display name shown in the Plugins menu (e.g. "Clip Inspector").
2424
/// </summary>
2525
string DisplayName { get; }
2626

27+
/// <summary>
28+
/// Plugin version string (e.g. "2.0.0-beta.0"). Shown in the Plugin Manager UI.
29+
/// Typically derived from the assembly's informational version.
30+
/// </summary>
31+
string Version { get; }
32+
2733
/// <summary>
2834
/// Create the panel control to be hosted in the main window sidebar.
2935
/// Called once after <see cref="Initialize"/>.

src/SharpFM.Plugin/SharpFM.Plugin.csproj

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,17 @@
55
<LangVersion>latest</LangVersion>
66
</PropertyGroup>
77

8+
<PropertyGroup>
9+
<MinVerMinimumMajorMinor>2.0</MinVerMinimumMajorMinor>
10+
<MinVerTagPrefix>v</MinVerTagPrefix>
11+
<MinVerDefaultPreReleaseIdentifiers>beta.0</MinVerDefaultPreReleaseIdentifiers>
12+
</PropertyGroup>
13+
814
<ItemGroup>
915
<PackageReference Include="Avalonia" Version="11.2.4" />
16+
<PackageReference Include="MinVer" Version="6.0.0">
17+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
18+
<PrivateAssets>all</PrivateAssets>
19+
</PackageReference>
1020
</ItemGroup>
1121
</Project>

src/SharpFM/PluginManager/PluginManagerViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ private void Notify([CallerMemberName] string name = "") =>
1515
public IPanelPlugin Plugin { get; }
1616
public string Id => Plugin.Id;
1717
public string DisplayName => Plugin.DisplayName;
18+
public string PluginVersion => Plugin.Version;
1819
public string AssemblyName => Plugin.GetType().Assembly.GetName().Name ?? "(unknown)";
1920

2021
private bool _isActive;

src/SharpFM/PluginManager/PluginManagerWindow.axaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
<TextBlock Classes="Fluent2Body" Text="{Binding DisplayName}" FontWeight="SemiBold" />
3131
<TextBlock Classes="Fluent2Caption" Opacity="0.7">
3232
<TextBlock.Text>
33-
<MultiBinding StringFormat="{}{0} ({1})">
33+
<MultiBinding StringFormat="{}{0} v{1}">
3434
<Binding Path="Id" />
35-
<Binding Path="AssemblyName" />
35+
<Binding Path="PluginVersion" />
3636
</MultiBinding>
3737
</TextBlock.Text>
3838
</TextBlock>

src/SharpFM/SharpFM.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
</Target>
4040

4141
<PropertyGroup>
42-
<MinVerMinimumMajorMinor>1.0</MinVerMinimumMajorMinor>
42+
<MinVerMinimumMajorMinor>2.0</MinVerMinimumMajorMinor>
4343
<MinVerTagPrefix>v</MinVerTagPrefix>
4444
<MinVerDefaultPreReleaseIdentifiers>beta.0</MinVerDefaultPreReleaseIdentifiers>
4545
</PropertyGroup>

0 commit comments

Comments
 (0)