InkFlow
A modern infinite whiteboard application built with Python and PySide6.
π Project Status
InkFlow is currently in active development. The foundation of the application has been built, focusing on creating a scalable architecture that will support multiple drawing tools and future features.
Features Implemented till date
Pen Tool
- Smooth freehand drawing
- Rounded stroke caps
- Rounded joins for natural handwriting
- Adjustable pen width
- Automatic stroke creation using
QPainterPath
β’ Single Click Dot Drawing
InkFlow automatically detects when the mouse is clicked without movement and draws a perfectly centered filled dot instead of creating an empty stroke.
Infinite Canvas
The application currently provides a large virtual drawing area using QGraphicsScene, allowing users to freely move around while drawing.
Current scene size:
5000 Γ 5000 px
This will later evolve into a dynamically expanding infinite canvas.
Panning
Navigate around the canvas using:
- Middle Mouse Button + Drag
- Hold Space + Left Mouse Drag
The camera moves independently of the drawing system, allowing a smooth workflow similar to professional whiteboard applications.
Zoom
Implemented mouse-wheel zoom with:
- Zoom centered around the mouse cursor
- Geometric zoom progression
- Minimum zoom limit
- Maximum zoom limit
This provides smooth navigation without distortion.
Architecture
One of the major goals of InkFlow is maintaining a clean and extensible architecture.
Instead of placing all functionality inside a single Canvas class, responsibilities have been separated.
MainWindow
β
βββ Canvas
β
βββ Camera (Pan & Zoom)
βββ Scene Management
βββ Tool System
β
βββ Active Tool
Tool System
InkFlow has a modular tool architecture, which makes it easier to maintain.
Current hierarchy:
BaseTool
β
βββ PenTool
Each tool is responsible for implementing its own:
- Mouse Press
- Mouse Move
- Mouse Release
This allows future tools to be added without modifying the core canvas.
Tool Registry
Canvas maintains a registry of available tools.
Example:
self.tools = {
"pen": PenTool(self)
}
The active tool is simply a reference to one of these objects.
self.active_tool = self.tools["pen"]
This makes switching tools straightforward while preserving each toolβs internal state.
Current Project Structure
InkFlow/
β
βββ main.py
β
βββ ui/
β βββ main_window.py
β βββ canvas.py
β
βββ tools/
β βββ base_tool.py
β βββ pen_tool.py
β
βββ assets/
Current Development Goals
- Build a modular tool system
- Keep the codebase clean and scalable
- Separate UI logic from drawing logic
- Prepare the project for future expansion
Planned Features
The following features are planned for future versions:
- Tool Toolbar
- Eraser Tool
- Rectangle Tool
- Circle Tool
- Line Tool
- Arrow Tool
- Text Tool
- Selection Tool
- Color Picker
- Brush Size Controls
- Undo / Redo
- Layers
- Infinite Dynamic Canvas
- Save / Load Projects
- Export to PNG
- Export to PDF
- Keyboard Shortcuts
- Custom Themes
Design Philosophy
InkFlow is being designed with long-term maintainability in mind.
Instead of building features as one large class, the project follows an object-oriented architecture where each component has a single responsibility.
This approach makes adding new tools and features significantly easier while keeping the codebase organized and maintainable.
Controls:-
Panning = Mouse scroll wheel button
= space bar + mouse left click button
Drawing = left mouse button
- 3 devlogs
- 4h