KDE’s Gitlab setup has a branch naming rule that I always forget
about – branch names should start with work/ if you want
the server to allow you to rebase and push rebased commits (that is,
only work branches can be --force pushed
to).
I had to abandon and open new PRs a few times now because of
this.
Something like this is easy to check on the client side with
pre-commit hooks. (a pre-push hook can also be
used, but I like the check to be as early as possible)
A simple hook script that checks your branch name starts with
work/YOUR_USER_NAME (I like to have the username in the
branch name) is rather simple to write:
#!/bin/bash
REPO_URL=$(git remote get-url origin)
KDE_REPO_HOST="invent.kde.org"
if [[ "${REPO_URL}" == *"${KDE_REPO_HOST}"* ]]; then
BRANCH=$(git rev-parse --abbrev-ref HEAD)
BRANCH_REGEX="^work/$USER/.*$"
if ! [[ $BRANCH =~ $BRANCH_REGEX ]]; then
echo "Your commit was rejected due to its name '$BRANCH', should start with 'work/$USER'"
exit 1
fi
fi
It checks that the Git repository is on invent.kde.org,
and if it is, it checks if the current branch follows the desired naming
scheme.
KDEGitCommitHooks
But the question is where to put this script?
Saving it as .git/hooks/pre-commit in the cloned source
directory would work in general, but there are two problems:
Manually putting it into every single cloned KDE source directory on
your system would be a pain;
KDEGitCommitHooks, which is used by many KDE projects,
will overwrite the custom pre-commit hook script you
define.
The second issue is not a problem since a few hours ago.
KDEGitCommitHooks (a part of the
extra-cmake-modules framework) now generates a
pre-commit hook that, additionally to what it used to do
before, executes all the custom scripts you place in the
.git/hooks/pre-commit.d/ directory.
So, if a project uses KDEGitCommitHooks you can save the
aforementioned script as
.git/hooks/pre-commit.d/kde-branches-should-start-with-work.sh
and it should be automatically executed any time you create a new commit
(after KDEGitCommitHooks updates the main
pre-commit hook in your project).
For projects that do not use KDEGitCommitHooks, you will
need to add a pre-commit hook that executes scripts in
pre-commit.d, but more on that in a moment.
Git templates
The first problem remains – putting this into a few hundred local
source directories is a pain and error-prone.
Fortunately, Git allows creating a template directory structure which
will be reproduced for any repository you init or
clone.
I placed my template files into ~/.git_templates_global
and added these two lines to ~/.gitconfig:
[init]
templatedir = ~/.git_templates_global
I have two KDE-related hook scripts there.
The above one is saved as
~/.git_templates_global/hooks/pre-commit.d/kde-branches-should-start-with-work.
And the second file is the default mainpre-commit
(~/.git_templates_global/hooks/pre-commit) script:
#!/usr/bin/env bash
# If the user has custom commit hooks defined in pre-commit.d directory,
# execute them
PRE_COMMIT_D_DIR="$(dirname "$0")/pre-commit.d/"
if [ -d "$PRE_COMMIT_D_DIR" ]; then
for PRE_COMMIT_D_HOOK in "$PRE_COMMIT_D_DIR"/*; do
./"$PRE_COMMIT_D_HOOK"
RESULT=$?
if [ $RESULT != 0 ]; then
echo "$PRE_COMMIT_D_HOOK returned non-zero: $RESULT, commit aborted"
exit $RESULT
fi
done
fi
exit 0
It tries to run all the scripts in pre-commit.d and
reports if any of them fail.
This default mainpre-commit script will be
used in projects that do not use KDEGitCommitHooks. In the
projects that do, KDEGitCommitHooks will replace it with a
script that executes everything in pre-commit.d same as
this one does, but with a few extra steps.
I’m currently backpacking in the Balkans and, considering that it’s been such a
long time since I wrote a blog post on my blog, I figured it was a good
idea to write about it.
As I am traveling, I am also field testing KDE
Itinerary and sending patches as I buy new my tickets and reserve my hostels.
Ljubiana, Slovenia
My first stop was in the capital of Slovenia, Ljubljana. I went there by train
from Berlin. I first took the night train to Graz and then an intercity train
to Ljubljana. And while the connection was perfect and there was no delay, the
whole journey took almost 19 hours.
Night Jet
Sleeping car in the night jet
I stayed only one night in Ljubljana in the party hostel Zzz and I enjoyed my time
there quite a bit. Thanks to the Hostelworld
app, it was super easy to find a group of fellow solo travelers to enjoy the
evening with. We went to a food market and I had some delicious local pasta.
Street in Ljubiana
Castel
Food market
Another view of the food market
The food at the food market
The food at the food market
Rijeka, Croatia
My second stop was in Rijeka, the third biggest city in Croatia. I also took the
train to get there. The city itself is very beautiful, same for the beaches.
But I didn’t really like that the city has a massive sea port splitting the
city center from the beaches. The hostel experience was the most disapointing of
the whole trip so far.
Small port of Rijeka
Small stairs going to a swimming spot in Rijeka
Sunset from the swimming spot
The sea
Split, Croatia
My next stop was in Split, the second largest city in Croatia. While there was
a train connection from Rijeka to Split, I decided to take the bus as the train
was significantly slower than the bus. I stayed at the Hostel Old Town.
I really had a blast in Split. The city is very old, with Greek, Roman,
Byzantine, and Venetian influence. I met a cool group of American/Norwegian travelers in
a hostel bar and got dragged to the Ultra festival, which was an amazing
experience.
Small allway in the old town of Split
Old fortification
Small town scare
Another old building
Picture of the festival
Group picture of the people I meet at the festival
Chilling out the day after the festival in the shades of a tree
The day after, I went to a boat party which was equally a blast.
Boat party
Boat party with the sunset
Drinking a reasonable amount of Aperol
Dancing with a stick
More dancing
Group photo at the end
A script element has been removed to ensure Planet works properly. Please find it in the original post.A script element has been removed to ensure Planet works properly. Please find it in the original post.
Last weekend I attended the Transitous Hack Weekend in Berlin.
This was the first time we ran such an event for Transitous, and with quite a few
more people attending than expected it most probably will not have been the last one either.
DELFI Family & Friends Day
Immediately prior to the Transitous Hack Weekend there was the 2nd DELFI “Family & Friends Day”,
for which a number of participants had been in Berlin anyway. DELFI
is the entity providing the aggregated national public transport static and realtime schedule data for Germany,
which is important input for Transitous.
Extent and quality of that data have room for improvement, so having many members of the community there to
lobby for changes helps. And while there’s certainly awareness and willingness among the people
doing the work, the complex processes and structures with many different public and private stakeholders don’t
exactly yield great agility.
Transitous Hack Weekend
For the Transitous Hack Weekend Wikimedia Deutschland had kindly allowed us to use their
WikiBär venue. Special thanks also to Jannis, Theo and Felix
for cooking for the entire group during the weekend, which not only kept us all well fed but also made the event
particularly efficient and allowed us to cover a wide range of topics in the short time, as you can see below.
Transitous Hack Weekend in progress (6 more participants not pictured). (CC0-1.0)
Topics
Legal setup
Transitous isn’t attached to any legal entity so far, which is a challenge when it comes to handling money,
signing contracts or providing official data protection contacts. Eventually this needs to change.
Setting up our own foundation is of course an option, but that implies (duplicated) work and continuous cost
that similar organizations have already covered. Therefore our preferred approach would be to attach Transitous
to an existing likeminded foundation.
Usage policy
Transitous so far had no official rules on who can use it, and how. As long as it was primarily used by FOSS applications
that wasn’t much of a problem, as that’s exactly what it is intended for. And even better, most of those were
even actively contributing to Transitous in some form.
However we recently also got requests from non-FOSS and/or commercial users, which is not what Transitous is intended
for. This is now being documented here.
For everyone else nothing should really change here, just please make sure you send proper client identification e.g.
in a User-Agent header.
Data normalization and augmentation
There’s various reasons why we might want to modify the schedule data that goes into Transitous, it being incomplete,
inconsistent ways of naming/labeling things between different data sources, or things just being outright wrong. Ideally
all that gets resolved upstream, but that’s slow at best in most cases, and sometimes just not possible.
We were therefore discussing ideas on a declarative pattern matching/transformation rule system to define
such modification in a way that remains maintainable when facing thousands of continuously changing datasets.
That still needs a bit more design work I think, but would allow to solve a number of current issues:
Unify route/trip names. How bad this can get can currently be observed e.g. with long distance trains in Germany
and Eurostar services.
Normalize the mode of transport types across different sources. This would allow to fix Flixtrains being
classified as regional train services for example.
Augment agency/operator contact information, for use in integrated upstream issue reporting.
Add or normalize line colors, and eventually add line, mode and operator logos.
Computing missing route shapes also fits into this, although that’s a bit special as it requires a much more elaborate computation
than just modifying textual CSV cells.
Collaboration with other data aggregators
When Transitous started it was entirely unclear whether it would be able to ever scale beyond pure station-to-station
public transport routing. We are way past that point meanwhile, with more and more things being added for full intermodal
door-to-door routing. Many of those imply building similar dataset catalogs as we have for the public transport schedule data.
While we can do that, there’s often overlapping projects in those areas already, and our preferred solution would be to
rather join forces. That is, collect and aggregate all input data there and consume it from that single source.
This includes:
Availability of sharing vehicles (from GBFS feeds or converted from other sources). Looking at Citybikes for that.
Elevator status data, which can be crucial for wheelchair routing.
Looking at accessibility.cloud for that, the same source KDE Itinerary already uses.
Availability of parking spaces, which then can be considered when routing with a bike or car. Looking at ParkAPI for that.
Realtime road traffic data and dynamic roadsign data, which is useful for road routing. There seem to be some recent developments on this from CoMaps.
We also discovered a few data sets I had no idea where even available anywhere,
like live positions of (free) taxis,
which could allow new routing options. (Also, lots of Kegelrobben data,
the use of which in a transportation context eludes me so far).
External communication
Transitous now has a Mastodon account! We’ll use that for service alerts, project updates
and to share posts about related applications or events.
If you want to stay up to date on Transitous’ growing coverage and are up for a small Python coding task, a script
to generate a list of coverage additions within the last week would help a lot with providing regular updates there.
We’d also like to have blog feed on the website, which would need to be set up but more importantly requires a few people
committing to actually producing regular long-form content.
Documentation and onboarding
With a few people attending who weren’t neck-deep in Transitous or MOTIS code already,
we had valuable fresh perspectives on the documentation and onboarding experience.
Both documentation and the usability and error handling of the tools in the import pipeline have benefited from this
already, and there’s more improvements that yet have to be integrated.
Realtime data from vehicle positions
As realtime delay/disruption data still isn’t as widely available as basic schedule data, there’s high interest in
computing that from vehicle positions. That’s essentially also what the “official” sources do, just that those can
also take higher-level information about network operations, track closures, etc as well as human intervention/planning into account.
Vehicle position data tends to be more available, and can be obtained in various more or less creative ways:
Some operators publish those as GTFS-RT feeds or at least in some proprietary form for displaying on their own website.
Some systems send openly readable radio messages containing vehicle positions, such as AIS on ferries,
ADS-B in aircraft as well as various radio protocols for
trams and busses.
Crowd-sourcing from within traveler apps such as Träwelling or Itinerary,
which know which train you are on already anyway and have access to GPS.
With the foundation we meanwhile have with Transitous, there’s also ideas and wishes that are
now coming into reach:
Integrate elevation data for walk/bike/wheelchair routing.
Support for ride sharing as an additional mode of transportation.
Support “temporary POIs” such as events in geocoding.
Showing interactive network line maps, as e.g. done by LOOM.
Support for localized stop names and service alerts.
Easily embeddable JS components for departure boards or fixed-destination routing for our events.
This is probably the most exciting part for me personally, I’m very happy to see people pushing
beyond just a replacement for proprietary routing APIs :)
Earlier this year i got the opportunity to attend and also present a talk at kde conference india 2025 which was held in gandhinagar gujarat from april 4th to 6th, this was my first kde conference and i got to learn a lot about kde by attending various talks and even presenting at the conference, in this blog post i will share about my experience attending the conference and my learnings and also about my talk that i presented.
What is KDE?
For those who are not familiar with kde, so initially it started as a desktop environment for linux known as (k desktop environment) but now over the years it has grown so much that it is now a open source organization with a large community of developers who uses, develops and promote kde software.
you may have heard about some popular kde projects like:
Plasma linux desktop environmet most popular and customizable kde software.
Kdenlive the video editing software from kde which is also used in hollywood
Okular a versatile document viewer.
Krita one of the best digital painting and illustration tools available.
But KDE is not just limited to its awesome software tools, it is also a community of vibrant developers who create, use these tools and make an impact in the world of opensource and software.
my talk was focused on sustainability and greener software and how kde eco a project of kde community which mainly focuses on sustainability in software and hardware believes in a greener future for technology, is making a impact with its projects like kecolab, kde eco test, opt green and other projects in building greener, sustainable software.
Further i talked about how kecolab helps developers measure the energy consuption of their software, which is very helpful in creating and optimizing software to write such a code that consumes less energy and kecolab helps you in measuring that, there are other project also like be4foss (Blauer Engel for Free and Open Source Software) which is like a certificaiton given to the software with low energy consumption and with high impact in sustainability and greener software, so the whole talk was about empowering sustanabiltiy and how kde eco shaping the future of software.
Community: Learning, Networking, and Inspiration
Apart from all these things, attending the KDE conference was also a great experience for me, where I got to listen to talks from various speakers. One talk that I particularly enjoyed was on 'Embracing FOSS in EdTech,' where I learned how free and open-source software should be used in the education system and how it's already happening on a small scale. I found this concept really interesting.
At the conference, I had the opportunity to meet someone who was very passionate about KDE and open source software. They had come all the way from Australia, specifically to attend this conference and give a talk. I gained a lot of knowledge and was really impressed when I learned how free and open source software is used in Australia, even at the elementary school level.
This was my overall experience attending and presenting at the kde india conference, i hope you like this blog post and got to learn something from my experience and if you are also looking to get into open source communities and be a part of, just get involved you can do that any time, kde is very welcoming for new contributors, so just get started contribute learn and have fun.
Every week we cover the highlights of what’s happening in the world of KDE Plasma and its associated apps like Discover, System Monitor, and more.
This week we continues the feature work for Plasma 6.5, landing a major visual change that has been years in the wanting: rounded bottom corners for windows! Check it out below, along with other goodies:
Notable New Features
Plasma 6.5.0
Breeze-decorated windows now have their bottom corners rounded by KWin automatically! This feature is on by default, but can be turned off if you preferred the older style. (Vlad Zahorodnii, link 1, link 2, and link 3)
Notable UI Improvements
Plasma 6.5.0
The sidebars in Discover and System Monitor are now resizable. And they also remember the size you choose in the state config file, not the settings config file. (Marco Martin, link 1, link 2 and link 3)
The Disks & Devices widget now lets you mount a disk without checking for errors, or manually check for errors without mounting. These can be useful for huge disks full of stuff where you know everything is fine, which otherwise take a while to check for updates while mounting. (Bohdan Onofriichuk, link)
Started working on a project to improve the ordering of search results in KRunner. Changes made so far include not increasing the priority for KDE apps and items marked as favorites, both of which tended to make the results feel more random. More changes will be coming soon; this is not the end! (Harald Sitter, link 1 and link 2)
Plasma‘s Weather Report widget now fetches weather data immediately upon waking from sleep when the computer was sleeping for more than 30 minutes. (Bohdan Onofriichuk, link)
When you start creating a user on System Settings’ Users page, there‘s now a “Cancel” button you can click on to easily stop the process and go back. (Rémi Piau, link)
Gear 25.08.0
In Plasma‘s Disks & Devices widget, optical discs no longer display the option to open them in Partition Manager, because this makes no sense. (Joshua Goins, link)
Frameworks 6.17
The NavigationTabButton component — which is used on various System Settings pages as well as a bunch of QtQuick-based apps — now used a more obvious style to communicate keyboard focus, improving accessibility. (Devin Lin, link)
Notable Bug Fixes
Plasma 6.4.4
Fixed a bug that caused the Volume Controls page (accessed from System Settings‘ Sound page) to never enter narrow mode when displayed with longer text than would normally fit on the page, which can happen when using various languages other than English. (Méven Car, link)
Plasma 6.5.0
With HDR mode turned on, the cursor on the lock screen is now dimmed in the expected way when the rest of the screens dims. (Xaver Hugl, link)
Frameworks 6.17
Worked around some Qt issues in Kirigami that could cause apps to crash when using software rendering. (Vlad Zahorodnii, link)
The very common Kirigami.FormLayout component used throughout System Settings and other KDE apps no longer flickers a tiny bit the first time it‘s shown on a page. (Niccolò Venerandi, link)
Added some more autotests to verify Plasma‘s ability to load various parts of itself. (Nicolas Fella, link 1, link 2)
Made KWin less trusting of colorimetry coming from screens‘ EDID data, because it‘s wrong enough of the time that it doesn‘t make sense to use by default. (Xaver Hugl, link)
Data for the size of the file dialog window is now stored in the state config file, not the settings config file. (Nicolas Fella, link)
How You Can Help
KDE has become important in the world, and your time and contributions have helped us get there. As we grow, we need your support to keep KDE sustainable.
You can help KDE by becoming an active community member and getting involved somehow. Each contributor makes a huge difference in KDE — you are not a number or a cog in a machine! You don’t have to be a programmer, either; many other opportunities exist!
You can also help us by making a donation! A monetary contribution of any size will help us cover operational costs, salaries, travel expenses for contributors, and in general just keep KDE bringing Free Software to the world.
This year’s Akademy will take place in Berlin, hosted at the Technische Universität Berlin, both in person and online.
Akademy starts with a welcome event on Friday, 5 September, followed by two full days of talks on Saturday, 6 and Sunday, 7 September, then four days of dedicated BoFs, workshops, meetings, and trainings from Monday, 8 through Thursday, 11 September. Expect a community day trip midweek.
The schedule highlights:
Talks covering KDE Frameworks, Plasma, Applications and how KDE can empower digital sovereignty, robust communities, and open development.
In-depth sessions on embedded Linux, Plasma innovations, KDE’s eco efforts, backends & frontends, and beyond.
Community-driven workshops and BoFs cultivating collaboration and project momentum throughout the week.
This hybrid event model continues to grow, embracing both onsite attendance and remote participation, allowing contributors from around the globe to connect and engage.
Venue & Registration Details:
Venue: Technische Universität Berlin
In-person + Online: 6–11 September (with the welcome event on 5 September).
Registration is open and free!
You can explore the full program on Akademy’s website. Stay tuned for our keynotes announcement!
graph TD subgraph 操作系统屏幕 A["QMainWindow<br/>(顶层Widget, 原生窗口句柄: XID/HWND)"] end
subgraph A [QMainWindow] B[QMenuBar] C[QToolBar] D[CentralWidget] E[QStatusBar] end subgraph D [CentralWidget] F{"QGridLayout<br/>(布局管理器)"} G[QPushButton] H[QLineEdit] end
A --> B A --> C A --> D A --> E D --> F F --> G F --> H
style A fill:#dae8fc,stroke:#6c8ebf,stroke-width:2px style F fill:#e1d5e7,stroke:#9673a6,stroke-width:1px,stroke-dasharray: 5 5
graph TD subgraph 操作系统屏幕 A["QGraphicsView<br/>(顶层Widget, 原生窗口句柄: XID/HWND)"] end
subgraph A ["QGraphicsView - “取景器”"] subgraph B ["QGraphicsScene - “无限画布”"] C["QGraphicsRectItem<br/>(x:10, y:20, rotation:15deg)"] D["QGraphicsTextItem<br/>(x:150, y:100, scale:1.5)"] E["QGraphicsPixmapItem<br/>(x:80, y:180, z-value:1)"] F["QGraphicsEllipseItem<br/>(x:-50, y:90, z-value:2)"] end end
D --- C E --- D F --- E
linkStyle 0,1,2 stroke-width:0px;
style A fill:#dae8fc,stroke:#6c8ebf,stroke-width:2px style B fill:#d5e8d4,stroke:#82b366,stroke-width:2px,stroke-dasharray: 5 5 style C fill:#f8cecc,stroke:#b85450 style D fill:#f8cecc,stroke:#b85450 style E fill:#f8cecc,stroke:#b85450 style F fill:#f8cecc,stroke:#b85450
sequenceDiagram participant U as 用户 participant OS as 操作系统 (X11/Wayland) participant V as QGraphicsView participant P as QGraphicsProxyWidget participant W as QPushButton (被代理)
graph TD A["QGraphicsScene请求重绘代理项"] --> B{"QGraphicsProxyWidget::paint() 被调用"}; B --> C["<b>步骤一:</b>在内存中准备一块'影子画布'<br/>(QPixmap)"]; C --> D["<b>步骤二:</b>调用内部widget->render(...)<br/>命令控件将自己画在这块画布上"]; D --> E["<b>步骤三:</b>QPushButton完成绘制<br/>'影子画布'上现在有了按钮的图像"]; E --> F["<b>步骤四:</b>ProxyWidget将最终的画布内容<br/>作为一个普通图片绘制到场景中<br/>(此时可应用旋转、缩放等变换)"]; F --> G["绘制完成"];
几何状态同步(Geometry State Synchronization):QGraphicsProxyWidget持续监听其内部QWidget的尺寸策略(Size Policy)和几何变化。当QWidget因内部布局变化而希望改变大小时,代理项会相应地更新自己在QGraphicsScene中的边界框(Bounding Rectangle)。反之,当代理项在场景中被用户或动画系统缩放、变形时,它也会将这种几何变换信息传递给内部的QWidget,触发其布局的重新计算。这种双向的几何状态同步,保证了两个世界在视觉和布局上的一致性。
The shell history can quickly become polluted with commands that are
only relevant for specific projects. Running specific unit tests from
project A, starting docker with services needed for project B, etc.
There are some Bash and Zsh scripts that allow you to have separate
histories for each directory you’re in which can be useful in situations
such as these, but the issue is that you get separate histories for each
directory instead of for each project. This means that you would get one
history when you are in project’s root directory, and another when
you’re in some subdirectory of said project.
Instead of creating a separate history for each directory you change
to, it creates separate histories only for directories that are ‘tagged’
with some custom file, be it .git, .envrc or
something else (it is customizable).
For any directory you change to, it will check if that directory or
any of its parents (it will search for the closest parent) contain the
‘tag’ file and it will use that directory as the project root thus
creating a separate history for it.
Installation and
configuration
You just create an array named PER_PROJECT_HISTORY_TAGS
that contains all the file names you want to be used for detecting the
project roots:
declare -a PER_PROJECT_HISTORY_TAGS
PER_PROJECT_HISTORY_TAGS=(.envrc .should_have_per_project_history)
declare -r PER_PROJECT_HISTORY_TAGS
In the example above, any directory that I defined custom environment
variables for using direnv’s .envrc will be treated as
project roots, along with any directory explicitly tagged with
.should_have_per_project_history.
This is useful when you have several source repositories inside of a
single project that should all have a common history, so you can’t use
.git as a tag to detect the project root.
If you don’t define your own tags, the default ones will be used
(.git .hg .jj .stack-work .cabal .cargo .envrc .per_project_history).
Then you just source the per-project-history.zsh file
from the plugin’s
repository.
Or, if you use a plugin manager, add
ivan-cukic/zsh-per-project-history to the list of plugins.
For Zinit, it would look like this:
Dmitry spent time improving framerate of the canvas on Qt6, and implemented support for reading modifier keys while Krita is out of focus on Wayland (MR!2409, MR!2406).
For the July Art Challenge, winner @Katamaheen has chosen "Cool Rides" as the theme. Design a vehicle, optionally add fictional sponsorship logos as suggested by @Mythmaker, and let's race!
Featured Artwork
Best of Krita-Artists - May/June 2025
This month's Best of Krita-Artists Nominations thread received 22 nominations of forum members' artwork. When the poll closed, these five wonderful works made their way onto the Krita-Artists featured artwork banner:
Krita is Free and Open Source Software developed by an international team of sponsored developers and volunteer contributors. That means anyone can help make Krita better!
Support Krita financially by making a one-time or monthly monetary donation. Or donate your time and Get Involved with testing, development, translation, documentation, and more. Last but not least, you can spread the word! Share your Krita artworks, resources, and tips with others, and show the world what Krita can do.
Other Notable Changes
Other notable changes in Krita's development builds from June 6, 2025 - July 16, 2025.
Stable branch (5.2.10):
Animation: Static opacity changes now properly clear animation cache. (bug report) (Change, by Emmet O'Neill)
Animation: Fix incorrect scaling of animated transform mask values. (bug report, CCbug report) (Change, by Emmet O'Neill)
Keyboard Input: Implement option for ignoring of F13-F24 keys on Windows, to avoid problems with certain apps (such as WeeChat) sending unbalanced fake F22 keypresses that confuse the input system. (bug report) (Change, by Dmitry Kazakov)
Unstable branch (5.3.0-prealpha):
File Formats: WebP: Add options to force convert to sRGB embed ICC profile. (wish bug report) (Change, by Rasyuqa A H)
File Formats: JPEG-XL: Improve image mode export options, import multi-page images as layers. (Change, by Rasyuqa A H)
Nightly Builds
Pre-release versions of Krita are built every day for testing new changes.
Cantor is a powerful scientific computing front-end in the KDE ecosystem, providing users with a unified and friendly interface for mathematical and statistical analysis.
Currently, Cantor’s worksheet cells are based on a custom implementation using QTextDocument. While this approach meets basic needs, it has revealed its limitations in terms of feature expansion and long-term maintenance. To fundamentally enhance the editing experience, simplify the codebase, and embrace the advanced technology of the KDE Frameworks, this project plans to deeply integrate the feature-rich KTextEditor component into Cantor, completely replacing the existing cell implementation.
This core upgrade will bring a suite of long-awaited, powerful features to Cantor, including:
Enhanced Multi-line Editing: Significantly improves the editing experience for complex, multi-line code blocks. This includes more robust syntax highlighting, accurate bracket matching, and a more stable editing environment, resolving key issues present in the current implementation.
Vi Mode: Provides native Vi-style text editing for users accustomed to Vim’s efficient workflow, significantly improving editing speed.
Improved Syntax Highlighting: Supports more comprehensive and precise code coloring rules, making complex mathematical and programming expressions clearer and easier to read.
Smart Auto-indent: Enhances code formatting capabilities, making it exceptionally convenient to write structured scripts and multi-line formulas.
Code Completion: Intelligently suggests variables, functions, and keywords, thereby speeding up input and reducing syntax errors.
Spell Check: Ensures the accuracy of text comments and documentation, which is crucial for writing rigorous formula explanations and reports.
By integrating KTextEditor, Cantor will not only optimize the user’s workflow but also reduce code redundancy and improve the project’s overall maintainability. This move will further strengthen the Cantor and KDE ecosystems, providing users with a smoother and more unified experience across different KDE applications.
Why this is needed
As scientific computing demands become increasingly complex, a modern, full-featured editor is essential for boosting productivity. The current custom implementation has become a bottleneck hindering Cantor’s future development:
High Maintenance Cost: Maintaining a custom editor component consumes significant development resources and struggles to keep pace with the advancements in modern editors.
Difficult to Extend: Implementing complex features like Vi mode or advanced code completion on the existing architecture is akin to “reinventing the wheel”—it’s inefficient and prone to introducing new bugs.
Failure to Leverage the Ecosystem: The KDE Frameworks already provide the very mature and powerful KTextEditor component. Not utilizing it is a waste of available resources. Integrating KTextEditor means Cantor can directly benefit from the years of effort and refinement the entire KDE community has invested in this component.
Current Status: Phase 1 Complete
The first phase of the project has been completed. We have successfully introduced Cantor into the core of KTextEditor and achieved the following key results:
Core replacement completed:We created a new WorksheetTextEditorItem class, which acts as a proxy for KTextEditor::View, successfully replacing the old QTextDocument-based cell implementation.
Basic functions available:Users can already perform basic operations such as text input and code execution in the new cells, proving the feasibility of the integration solution.
short text
multi-line display
integration of KTextEditor features:Basic syntax highlighting and text editing features are now available in new cells.
Python
Maxima
Lua
Event Handling and UI Interaction: Core user interactions such as mouse events and drag-and-drop functionality for worksheet entries are working as expected within the new framework.
drag
shotcut key
The Road Ahead: The Plan for Phase 2
With the foundation now firmly in place, the second phase of the project will focus on unlocking the full potential of KTextEditor and refining the user experience. The planned work includes:
Activating Advanced Editor Features: We will progressively enable and configure KTextEditor’s sophisticated features, including Vi Mode, integrated Spell Check, and smart indentation rules, ensuring they are seamlessly integrated into the Cantor workflow.
Connecting Backend-driven Code Completion: A major goal is to connect Cantor’s various computation backends (e.g., Python, R, Octave) to the KTextEditor code completion framework. This will provide users with context-aware, intelligent suggestions.
Bug Fixing and UX Polishing: We will systematically address any remaining issues from the initial integration, focusing on perfecting UI/UX details like focus management, text selection, and context menu consistency.
Comprehensive Testing: Rigorous regression testing will be conducted across all features—new and existing—to guarantee the stability and reliability of Cantor following this major architectural upgrade.