Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
37a3aaa
Add lc_focus to top-level sdk header for consistency
pplupo May 13, 2026
5f9f206
ADD: jsonview plugin branch
pplupo May 20, 2026
228589d
Fix jsonview crash/error dialog on invalid json or non-json files
pplupo May 25, 2026
2beeae6
Merge branch 'master' into jsonview
pplupo May 26, 2026
3779446
feat(wlx): Add Kate (KTextEditor) rich editor plugin
pplupo May 12, 2026
f73dd95
Use header files from top-level sdk directory
pplupo May 13, 2026
6c32aa1
feat(wlx/kate): group case conversions under submenu, add new case st…
pplupo May 27, 2026
756aaea
Merge branch 'fix-jsonview-invalid-number'
pplupo May 27, 2026
e286f5b
feat(wlx/logview): implement regex-based line background and foregrou…
pplupo May 26, 2026
8b5fbd6
Merge branch 'kate-case-conversion'
pplupo May 27, 2026
0b5197a
feat(wlx/kate): integrate all editor branches into kate base
pplupo May 28, 2026
c2256ba
Merge kate-merged: integrate editor-features, fix-redo-and-write-lock…
pplupo May 28, 2026
d6702d0
Add wayland_qt_base: Qt6 Wayland plugin component library
pplupo Jun 6, 2026
106dcea
Refactor EditableGridWidget to QTableView + QAbstractItemModel
pplupo Jun 6, 2026
96e6e79
Add GridMode enum: MemoryDocument vs LiveDatabase strategy
pplupo Jun 6, 2026
e9e0119
structview: Unified Structured Text WLX plugin (JSON, XML, INI)
pplupo Jun 6, 2026
76445b7
dbview: Transactional Database WLX plugin (SQLite)
pplupo Jun 6, 2026
8f6d94e
structview: implement CBOR engine
pplupo Jun 8, 2026
bc17289
dbview: multi-engine architecture (SQLite, DuckDB, LevelDB, RocksDB)
pplupo Jun 8, 2026
bd0468c
wayland_qt_base: shared UI components for unified plugin layout
pplupo Jun 8, 2026
a5ade29
Merge plugin-platform: shared UI components (FilterRowWidget, PluginS…
pplupo Jun 8, 2026
db3d4ea
structview: hierarchical tree navigation + YAML/TOML/CBOR support
pplupo Jun 8, 2026
27314ae
Merge plugin-platform: shared UI components
pplupo Jun 8, 2026
87f3970
dbview: integrate shared UI components (FilterRowWidget, PluginStatus…
pplupo Jun 8, 2026
abe1720
dbview: integrate QSortFilterProxyModel for per-column filtering and …
pplupo Jun 8, 2026
9768cdd
wayland_qt_base: support QSortFilterProxyModel in EditableGridWidget …
pplupo Jun 8, 2026
ded3d6e
Merge branch 'plugin-platform' into structview
pplupo Jun 8, 2026
78f3726
Merge branch 'plugin-platform' into dbview
pplupo Jun 8, 2026
e32db05
Fix wayland_qt_base AUTOMOC by including headers in target sources
pplupo Jun 9, 2026
3a5bd53
Fix wayland_qt_base AUTOMOC by including headers in target sources
pplupo Jun 9, 2026
3f60e1d
Fix toml++ missing symbols by enabling header-only implementation
pplupo Jun 9, 2026
e4ac944
Fix AUTOMOC for structview by adding headers
pplupo Jun 9, 2026
d709900
Fix AUTOMOC for dbview by adding headers
pplupo Jun 9, 2026
61da147
Fix AUTOMOC: use explicit header listing instead of glob for reliable…
pplupo Jun 9, 2026
c2cfaf0
Fix AUTOMOC: explicitly list headers to exclude RocksDbEngine when di…
pplupo Jun 9, 2026
b2a82e7
Fix crash: create FocusManager before setupToolbar to prevent null de…
pplupo Jun 10, 2026
2aeb7d6
Fix crash: null-guard FocusManager in PluginToolBar + correct init or…
pplupo Jun 10, 2026
ad1fb07
Cherry-pick: null-guard FocusManager in PluginToolBar
pplupo Jun 10, 2026
7806aa9
Fix crash on table switch: detach model from view before engine delet…
pplupo Jun 10, 2026
f8379c5
Fix use-after-free: explicit destructor to detach model chain before …
pplupo Jun 10, 2026
b0df408
Fix crash: stop recreating EditableGridWidget on table switch (it rep…
pplupo Jun 10, 2026
d4495b0
Add global exception logger: CrashLogger in wayland_qt_base, wrap all…
pplupo Jun 10, 2026
4a8e6e9
Add global exception logger: CrashLogger in wayland_qt_base, wrap all…
pplupo Jun 10, 2026
9dd867b
Remove XHTML/CFG/CONF/SVG/PLIST from detect string; add YAML parse di…
pplupo Jun 10, 2026
b7c0f23
Fix null m_grid crash: create EditableGridWidget once in setupUi
pplupo Jun 10, 2026
8c669dd
Fix crash-on-close: disconnect signals in destructor; add diagnostics…
pplupo Jun 10, 2026
63e19f0
Fix crash-on-close: disconnect signals and deactivate FocusManager in…
pplupo Jun 10, 2026
eb80ebe
Fix filter alignment: add vertical header spacer; fix status bar overlap
pplupo Jun 10, 2026
74213a6
Replace FilterRowWidget with FilterableHeaderView: filters embedded i…
pplupo Jun 10, 2026
3d19363
Replace FilterRowWidget with FilterableHeaderView in dbview: filters …
pplupo Jun 10, 2026
b4a5b30
Fix YAML parsing by using system yaml-cpp package, and fix status bar…
pplupo Jun 10, 2026
34ef07a
Implement sequential row numbers and standardize column headers (remo…
pplupo Jun 11, 2026
2620160
Support optional header labels in FilterableHeaderView and use it in …
pplupo Jun 11, 2026
3bcc935
Rename wayland_qt_base to wlxbase_wlqt and update references
pplupo Jun 11, 2026
18600fd
docs: add Double Commander Plugin Manager architectural & functional …
pplupo Jun 11, 2026
34ca3af
Implement sorting support for DuckDB columns in dbview
pplupo Jun 11, 2026
55d379b
Fix DuckDB column sorting by delegating sort to source model in custo…
pplupo Jun 11, 2026
1ad7b23
Merge structview branch
pplupo Jun 11, 2026
6f0618c
Merge structview into dbview branch, renaming wayland_qt_base to wlxb…
pplupo Jun 11, 2026
cb7b9de
Merge dbview branch containing wlxbase_wlqt base rename and database …
pplupo Jun 11, 2026
85219e4
Implement toolbar icons, text, and fix structview compilation
pplupo Jun 12, 2026
6b06244
Add plugman from doublecmd_plugman
pplupo Jun 16, 2026
49bf54b
Implement virtual extension string for WCX plugins
pplupo Jun 16, 2026
1c41277
Fix compilation error with string splitting
pplupo Jun 16, 2026
3cf8a3c
Merge upstream/master
pplupo Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[submodule "plugin-platform"]
path = plugin-platform
url = https://github.com/pplupo/doublecmd_plugins
branch = plugin-platform
7 changes: 7 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,13 @@ install -m 644 wdx/mediainfo/luajit/*.lua release/wdx/mediainfo/
install -m 644 wdx/translitwdx/translitwdx.lua release/wdx/translitwdx/
install -m 644 wdx/translitwdx/readme.txt release/wdx/translitwdx/

# jsonview
mkdir -p release/wlx/jsonview
make -C wlx/jsonview/src clean all
install -m 644 wlx/jsonview/jsonview_qt6.wlx release/wlx/jsonview/
cp -r wlx/jsonview/langs release/wlx/jsonview/
install -m 644 wlx/jsonview/*.md release/wlx/jsonview/
install -m 644 wlx/jsonview/*.png release/wlx/jsonview/
# logview
mkdir -p release/wlx/logview
mkdir -p wlx/logview/build
Expand Down
1 change: 1 addition & 0 deletions plugin-platform
Submodule plugin-platform added at 96e6e7
12 changes: 12 additions & 0 deletions plugman/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
lib/
backup/
*.o
*.ppu
*.compiled
*.exe
*.res
plugman
link*.res
*.lps
test/test_core
test/test_core.o
42 changes: 42 additions & 0 deletions plugman/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Double Commander Plugin Manager

Standalone Lazarus/Qt6 plugin manager for [Double Commander](https://doublecmd.sourceforge.io/).

## Features

- **Install** — extract archives, copy plugin binaries, register in `doublecmd.xml`
- **Uninstall** — remove XML nodes and plugin directories
- **Enable / Disable** — relocate nodes to `<DisabledPlugins>` (with JSON reconciliation)
- **Ordering** — reorder plugin priority in XML
- **Tweak** — WCX `<Flags>` bitmask and WLX/WDX `<DetectString>` editing
- **Updates** — URL binding, HTTP HEAD polling, backup/rollback
- **Restart** — graceful DC shutdown before config writes

Metadata (URLs, ETags, rollback state) is stored in `~/.config/doublecmd/plugman.json`.

## Build

Requirements: Lazarus 3.x / FPC 3.2+, `libQt6Pas`, OpenSSL.

```bash
cd doublecmd_plugman
lazbuild --build-mode=Release --widgetset=qt6 plugman.lpi
```

Run `./plugman`.

## Configuration

Settings are stored in `~/.config/doublecmd/plugman.ini`. Override:

- Config directory (where `doublecmd.xml` lives)
- Commander path / executable
- External editor for plugin `.ini`/`.conf` files

## JSON schema

See `default/plugman.json` for the template.

## Platform

Primary target: **Linux / Qt6 / Wayland**.
5 changes: 5 additions & 0 deletions plugman/default/plugman.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"schema_version": 1,
"last_updated": "2026-06-16T00:00:00Z",
"plugins": []
}
178 changes: 178 additions & 0 deletions plugman/plugman.lpi
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="/"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<AutoCreateForms Value="True"/>
<Title Value="Double Commander Plugin Manager"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
</General>
<BuildModes Count="2">
<Item1 Name="Debug" Default="True"/>
<Item2 Name="Release">
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="plugman"/>
</Target>
<SearchPaths>
<OtherUnitFiles Value="src;src/core;src/ops;src/update;src/ui"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
</SearchPaths>
<CodeGeneration>
<SmartLinkUnit Value="True"/>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="False"/>
</Debugging>
</Linking>
<LCLWidgetType Value="qt6"/>
</CompilerOptions>
</Item2>
</BuildModes>
<RequiredPackages Count="1">
<Item1>
<PackageName Value="LCL"/>
</Item1>
</RequiredPackages>
<Units Count="21">
<Unit0>
<Filename Value="plugman.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="src/uMainForm.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmMain"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="uMainForm"/>
</Unit1>
<Unit2>
<Filename Value="src/core/uPluginTypes.pas"/>
<IsPartOfProject Value="True"/>
</Unit2>
<Unit3>
<Filename Value="src/core/uDcPaths.pas"/>
<IsPartOfProject Value="True"/>
</Unit3>
<Unit4>
<Filename Value="src/core/uPlugmanJson.pas"/>
<IsPartOfProject Value="True"/>
</Unit4>
<Unit5>
<Filename Value="src/core/uDcXml.pas"/>
<IsPartOfProject Value="True"/>
</Unit5>
<Unit6>
<Filename Value="src/core/uPluginScanner.pas"/>
<IsPartOfProject Value="True"/>
</Unit6>
<Unit7>
<Filename Value="src/ops/uDcRestart.pas"/>
<IsPartOfProject Value="True"/>
</Unit7>
<Unit8>
<Filename Value="src/ops/uPluginInstall.pas"/>
<IsPartOfProject Value="True"/>
</Unit8>
<Unit9>
<Filename Value="src/ops/uPluginUninstall.pas"/>
<IsPartOfProject Value="True"/>
</Unit9>
<Unit10>
<Filename Value="src/ops/uPluginEnable.pas"/>
<IsPartOfProject Value="True"/>
</Unit10>
<Unit11>
<Filename Value="src/ops/uPluginOrder.pas"/>
<IsPartOfProject Value="True"/>
</Unit11>
<Unit12>
<Filename Value="src/ops/uPluginTweak.pas"/>
<IsPartOfProject Value="True"/>
</Unit12>
<Unit13>
<Filename Value="src/update/uHttpCheck.pas"/>
<IsPartOfProject Value="True"/>
</Unit13>
<Unit14>
<Filename Value="src/update/uPluginUpdate.pas"/>
<IsPartOfProject Value="True"/>
</Unit14>
<Unit15>
<Filename Value="src/update/uPluginRollback.pas"/>
<IsPartOfProject Value="True"/>
</Unit15>
<Unit16>
<Filename Value="src/ui/fTweakPacker.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmTweakPacker"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit16>
<Unit17>
<Filename Value="src/ui/fTweakLister.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmTweakLister"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit17>
<Unit18>
<Filename Value="src/ui/fUpdateConfirm.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmUpdateConfirm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit18>
<Unit19>
<Filename Value="src/ui/fUrlBind.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmUrlBind"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit19>
<Unit20>
<Filename Value="src/ui/fSettings.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="frmSettings"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit20>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<Target>
<Filename Value="plugman"/>
</Target>
<SearchPaths>
<OtherUnitFiles Value="src;src/core;src/ops;src/update;src/ui"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)-$(LCLWidgetType)"/>
</SearchPaths>
<Parsing>
<SyntaxOptions>
<SyntaxMode Value="Delphi"/>
<AllowNestedProcVars Value="True"/>
</SyntaxOptions>
</Parsing>
<CodeGeneration>
<TargetCPU Value="x86_64"/>
<TargetOS Value="linux"/>
</CodeGeneration>
<LCLWidgetType Value="qt6"/>
</CompilerOptions>
<Debugging>
<IncludeSystemVars Value="True"/>
</Debugging>
</CONFIG>
20 changes: 20 additions & 0 deletions plugman/plugman.lpr
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
program plugman;

{$mode objfpc}{$H+}

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces,
Forms,
uMainForm;

begin
RequireDerivedFormResource := True;
Application.Scaled := True;
Application.Title := 'Double Commander Plugin Manager';
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
Loading