* Add embedded MCP server exposing MapMap control over local HTTP
Adds a native Model Context Protocol server (QHttpServer, JSON-RPC 2.0)
running on the GUI thread, exposing sources, layers, playback, project
I/O and state read-back to MCP clients at http://localhost:<port>/mcp.
The port is configurable via QSettings (mcpListeningPort, default 49452)
and a new -m/--mcp-port CLI flag; 0 disables the server. Requires the
QtHttpServer module (and its QtWebSockets dependency).
Add port preference UI
Adapt McpServer to Paint->Source and Mapping->Layer renames. Fix
QHttpServer::listen() removal in Qt 6.11 by using QTcpServer::listen()
with QHttpServer::bind(). Add MCP port spinbox to Preferences Controls
tab (0 disables the server).
* Make MCP server build optional when qthttpserver is unavailable
Use qtHaveModule(httpserver) to conditionally enable MCP support,
guarded by HAVE_MCP preprocessor define throughout the codebase.
This fixes CI builds on platforms without the Qt HttpServer module.
* Add create_layer tool to MCP server for triangle, quad and ellipse shapes
Move addMesh/addTriangle/addEllipse from private to public slots in
MainWindow so the MCP server can call them directly.
* Add Claude Code skill for controlling MapMap via MCP
* Add set_vertices MCP tool and update skill doc
Allows setting the output shape vertices of a layer via MCP.
Documents vertex ordering and the new tool in the skill file.
* Guard mcpListeningPort write in writeSettings with HAVE_MCP
The member variable is only declared under #ifdef HAVE_MCP,
so writing it in writeSettings also needs the guard to fix
the build when qthttpserver is unavailable.
- Guard all toStrongRef() calls with null checks to prevent crashes
- Save project files atomically (write to .tmp, then rename)
- Fix macOS CI workflow typo that broke test discovery
- Remove duplicate main.qrc entry in mapmap.pro
- Upgrade C++ standard from c++11 to c++17
- Replace NULL with nullptr throughout our code
- Remove stale FIXME comment and duplicate #include
Replace the placeholder TestMaths (which only exercised Qt's
QString::toUpper) with unit tests that cover production code:
- TestMaths: degree/radian conversion, wrapAround, distance helpers, xOr
- TestUtil: map_float/map_int range mapping and clipping, isNumeric,
fileExists/eraseFile
- TestUidAllocator: sequential allocation, lowest-id reuse, reserve, free
- TestShape: vertex accessors, getCenter, includesPoint, translate,
applyTransform, polygon round-trip
The test project compiles the real MapMap sources under test and runs
all suites from a single binary via a custom QtTest runner.
Util.cpp uses glTexCoord2f and glVertex2f, which require -lopengl32
on Windows. The main project already links this via src.pri, but the
test project manages its own linkage independently.
Aligns C++ class names with the terminology already used in the GUI,
project file format, and OSC interface. MappingManager class keeps
its name. Old project files with TextureMapping/ColorMapping class
names are supported via MetaObjectRegistry aliases. OSC paths change
from /paint/ and /mapping/ to /source/ and /layer/.
Settings domain changed from mapmap.info to artpluscode.com for
QSettings and macOS bundle identifier. Website URL split into its
own constant pointing to mapmapteam.github.io. Contact email
updated to mapmap@artpluscode.com.
Alexandre Quessy is now listed first as lead developer across all
contributor files. Sofian Audry role updated to original lead
developer to honor their founding contribution.
The previous implementation used end()-1 on a potentially empty QList,
causing an invalid iterator and a Qt assertion failure. The iterator
was also invalidated after each erase() call, making the loop UB.
Replace with the standard Qt model reset pattern.
Replace QDomDocument-based XML serialization with Qt built-in
QJsonDocument/QJsonObject/QJsonArray. Project files (.mmp) are now
saved as human-readable JSON.
File format renames for clarity:
- paints -> sources
- mappings -> layers
- paintId -> sourceId
Remove QT += xml dependency (JSON classes are in QtCore).
OSC support now uses the bundled oscpack library, not liblo. Remove
all leftover liblo references from source, CI configs, and docs.
Also fixes a memory leak: osc_timer deletion was guarded by
HAVE_OSC which was never defined.
QOSC_LIBRARY is never defined since qosc is compiled directly into the
app, so QOSC_EXPORT was expanding to Q_DECL_IMPORT (__declspec(dllimport)
on Windows), causing undefined __imp_ symbol references at link time.
Delete the three old qt-*.yml workflows (disabled, Qt 5.12) and
replace with new macos-build.yml and windows-build.yml using Qt 6.
All three platforms now build on push/PR to dev and master branches.
Delete obsolete GStreamer video backend source files
(VideoUriDecodeBinImpl, VideoV4l2SrcImpl, VideoShmSrcImpl),
the GStreamer macOS URL resource, and clean up all remaining
GStreamer mentions in INSTALL.md, README.md, TODO, CI workflows,
build scripts, and source comments. CHANGELOG entries are preserved
as historical record.
Replace the GStreamer media backend with Qt 6 Multimedia (QMediaPlayer,
QVideoSink, QAudioOutput, QCamera, QMediaCaptureSession). This removes
a heavy native dependency and brings the codebase onto a supported Qt
version.
Key changes:
- New VideoPlayerImpl class using QMediaPlayer/QVideoSink for file playback
- Rewrite CameraSurface (QVideoSink) and CameraImpl (QMediaCaptureSession)
- Drop VideoShmSrcImpl, VideoUriDecodeBinImpl, VideoV4l2SrcImpl
- QGLWidget → QOpenGLWidget, QDesktopWidget → QScreen
- QRegExp → QRegularExpression throughout (including qtpropertybrowser)
- Fix all Qt 5→6 API breakages (endl, toAscii, qCopy, QMutexLocker
template, enterEvent, QWeakPointer::data, QVariant helpers, etc.)
- Update build scripts for Qt 6 on macOS