26#include <QStandardPaths>
32#include <QProcessEnvironment>
35#include <QStyleFactory>
39#include <QImageReader>
40#include <QImageWriter>
43#include <klocalizedstring.h>
44#include <kdesktopfile.h>
46#include <kconfiggroup.h>
119#include <QThreadStorage>
124#include <config-seexpr.h>
125#include <config-safe-asserts.h>
130#include <config-qt-patches-present.h>
131#include <config-use-surface-color-management-api.h>
133#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
136#include <QPlatformSurfaceEvent>
142const QTime appStartTime(QTime::currentTime());
146struct AppRecursionInfo {
147 ~AppRecursionInfo() {
152 int eventRecursionCount {0};
153 std::queue<KisSynchronizedConnectionEvent> postponedSynchronizationEvents;
156struct AppRecursionGuard {
157 AppRecursionGuard(AppRecursionInfo *info)
160 m_info->eventRecursionCount++;
165 m_info->eventRecursionCount--;
168 AppRecursionInfo *m_info {0};
189 bool batchRun {
false};
228 QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());
230 setApplicationDisplayName(
"Krita");
231 setApplicationName(
"krita");
234 setOrganizationDomain(
"krita.org");
237 setApplicationVersion(version);
242 if (qgetenv(
"KRITA_NO_STYLE_OVERRIDE").isEmpty()) {
244#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
249 if (!styles.contains(style()->objectName().toLower())) {
250 Q_FOREACH (
const QString & style, styles) {
251 if (!setStyle(style)) {
252 qDebug() <<
"No" << style <<
"available.";
255 qDebug() <<
"Set style" << style;
264 if(widgetStyleFromConfig !=
"") {
265 qApp->setStyle(widgetStyleFromConfig);
266#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
267 }
else if (style()->objectName().toLower() ==
"macintosh") {
269 qApp->setStyle(
"fusion");
272 }
else if (style()->objectName().toLower() ==
"macos") {
274 qApp->setStyle(
"fusion");
280 qDebug() <<
"Style override disabled, using" << style()->objectName();
295#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
301 struct PlatformWindowCreationFilter : QObject
303 using QObject::QObject;
305 bool eventFilter(QObject *watched, QEvent *event)
override {
306 if (event->type() == QEvent::PlatformSurface) {
307 QWidget *widget = qobject_cast<QWidget*>(watched);
308 if (!widget)
return false;
314 if (watched->property(
"krita_skip_srgb_surface_manager_assignment").toBool()) {
318 QPlatformSurfaceEvent *surfaceEvent =
static_cast<QPlatformSurfaceEvent*
>(event);
319 if (surfaceEvent->surfaceEventType() == QPlatformSurfaceEvent::SurfaceCreated) {
320 QWindow *nativeWindow = widget->windowHandle();
333 this->installEventFilter(
new PlatformWindowCreationFilter(
this));
337#if defined(Q_OS_WIN) && defined(ENV32BIT)
338typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
340LPFN_ISWOW64PROCESS fnIsWow64Process;
344 BOOL bIsWow64 = FALSE;
350 fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
351 GetModuleHandle(TEXT(
"kernel32")),
"IsWow64Process");
353 if(0 != fnIsWow64Process)
355 if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
388#if defined HAVE_SEEXPR
408 if (
event->type() == QEvent::FileOpen) {
409 QFileOpenEvent *openEvent =
static_cast<QFileOpenEvent *
>(
event);
414 return QApplication::event(
event);
423 QStringList() <<
"application/x-krita-paintoppreset"));
451#if defined HAVE_SEEXPR
457 i18nc(
"Resource type name",
"Layer styles"),
458 QStringList() <<
"application/x-photoshop-style"));
469 QString databaseLocation = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
473 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Fatal error"), i18n(
"%1\n\nKrita will quit now.",
KisResourceCacheDb::lastError()));
479 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Fatal error"),
KisResourceLocator::instance()->errorMessages().join(
'\n') + i18n(
"\n\nKrita will quit now."));
508 if (isWow64() && !cfg.
readEntry(
"WarnedAbout32Bits",
false)) {
509 QMessageBox::information(qApp->activeWindow(),
510 i18nc(
"@title:window",
"Krita: Warning"),
511 i18n(
"You are running a 32 bits build on a 64 bits Windows.\n"
512 "This is not recommended.\n"
513 "Please download and install the x64 build instead."));
521 if (opengl ==
"OPENGL_NOT_TRIED" ) {
524 else if (opengl !=
"OPENGL_SUCCESS" && opengl !=
"TRY_OPENGL") {
534 const bool exportAs = args.
exportAs();
538 d->batchRun = (exportAs || exportSequence || !exportFileName.isEmpty());
539 const bool needsMainWindow = (!exportAs && !exportSequence);
541 bool showmainWindow = (!exportAs && !exportSequence);
543 const bool showSplashScreen = !
d->batchRun && qEnvironmentVariableIsEmpty(
"NOSPLASH");
544 if (showSplashScreen &&
d->splashScreen) {
545 d->splashScreen->show();
546 d->splashScreen->repaint();
550 KConfigGroup group(KSharedConfig::openConfig(),
"theme");
557 Q_UNUSED(resetStarting);
577 if (needsMainWindow) {
583 bool sessionNeeded =
true;
586 if (!args.
session().isEmpty()) {
589 showmainWindow =
false;
590 sessionNeeded =
false;
593 KConfigGroup sessionCfg = KSharedConfig::openConfig()->group(
"session");
594 const QString &sessionName = sessionCfg.readEntry(
"previousSession");
607 windowLayout->applyLayout();
613 if (showmainWindow) {
620 d->mainWindow->restoreWorkspace(workspace);
625 d->mainWindow->viewManager()->switchCanvasOnly(
true);
629 d->mainWindow->showFullScreen();
635 short int numberOfOpenDocuments = 0;
658#if KRITA_QT_HAS_ANDROID_EMULATE_MOUSE_BUTTONS_FOR_PAGE_UP_DOWN
659 auto setPageUpDownMouseButtonEmulationWorkaround = [](
bool enabled) {
660 QCoreApplication::setKritaAttribute(KRITA_QATTRIBUTE_ANDROID_EMULATE_MOUSE_BUTTONS_FOR_PAGE_UP_DOWN, enabled);
663 &KisConfigNotifier::sigUsePageUpDownMouseButtonEmulationWorkaroundChanged,
665 setPageUpDownMouseButtonEmulationWorkaround);
666 setPageUpDownMouseButtonEmulationWorkaround(cfg.usePageUpDownMouseButtonEmulationWorkaround());
673#if KRITA_QT_HAS_ANDROID_IGNORE_HISTORIC_TABLET_EVENTS
674 auto setIgnoreHistoricTabletEventsWorkaround = [](
bool enabled) {
675 QCoreApplication::setKritaAttribute(KRITA_QATTRIBUTE_ANDROID_IGNORE_HISTORIC_TABLET_EVENTS, enabled);
678 &KisConfigNotifier::sigUseIgnoreHistoricTabletEventsWorkaroundChanged,
680 setIgnoreHistoricTabletEventsWorkaround);
681 setIgnoreHistoricTabletEventsWorkaround(cfg.usePageUpDownMouseButtonEmulationWorkaround());
689 d->mainWindow->addViewAndNotifyLoadingCompleted(doc);
694 int argsCount = args.
filenames().count();
697 for (
int argNumber = 0; argNumber < argsCount; argNumber++) {
698 QString fileName = args.
filenames().at(argNumber);
706 ++numberOfOpenDocuments;
713 if (outputMimetype ==
"application/octetstream") {
714 dbgKrita << i18n(
"Mimetype not found, try using the -mimetype option") << Qt::endl;
720 bool result = doc->
openPath(fileName);
724 QTimer::singleShot(0,
this, SLOT(quit()));
728 if (exportFileName.isEmpty()) {
729 errKrita <<
"Export destination is not specified for" << fileName <<
"Please specify export destination with --export-filename option";
730 QTimer::singleShot(0,
this, SLOT(quit()));
734 qApp->processEvents();
740 errKrita <<
"Could not export " << fileName <<
"to" << exportFileName <<
":" << doc->
errorMessage();
742 QTimer::singleShot(0,
this, SLOT(quit()));
745 else if (exportSequence) {
749 qApp->processEvents();
752 errKrita <<
"This file has no animation." << Qt::endl;
753 QTimer::singleShot(0,
this, SLOT(quit()));
758 int sequenceStart = 0;
761 qDebug() <<
ppVar(exportFileName);
772 qDebug() <<
ppVar(result);
775 errKrita << i18n(
"Failed to render animation frames!") << Qt::endl;
778 QTimer::singleShot(0,
this, SLOT(quit()));
781 else if (
d->mainWindow) {
782 if (QFileInfo(fileName).fileName().endsWith(
".bundle", Qt::CaseInsensitive)) {
783 d->mainWindow->installBundle(fileName);
788 if (
d->mainWindow->openDocument(fileName, flags)) {
790 numberOfOpenDocuments++;
800 if (
d->mainWindow->viewManager()->image()){
803 d->mainWindow->viewManager()->image()->nextLayerName(i18n(
"File layer")),
OPACITY_OPAQUE_U8);
804 QFileInfo fi(fileLayer->
path());
807 adapter.
addNode(fileLayer,
d->mainWindow->viewManager()->activeNode()->
parent(),
808 d->mainWindow->viewManager()->activeNode());
811 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita:Warning"),
812 i18n(
"Cannot add %1 as a file layer: the file does not exist.", fileLayer->
path()));
816 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita:Warning"),
817 i18n(
"Cannot add the file layer: no document is open.\n\n"
818"You can create a new document using the --new-image option, or you can open an existing file.\n\n"
819"If you instead want to add the file layer to a document in an already running instance of Krita, check the \"Allow only one instance of Krita\" checkbox in the settings (Settings -> General -> Window)."));
822 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Warning"),
823 i18n(
"Cannot add the file layer: no document is open.\n"
824 "You can either create a new file using the --new-image option, or you can open an existing file."));
830 if (
d->splashScreen) {
831 d->splashScreen->displayLinks(
true);
832 d->splashScreen->displayRecentFiles(
true);
835 Q_FOREACH(
const QByteArray &message,
d->earlyRemoteArguments) {
842 if (!
d->earlyFileOpenEvents.isEmpty()) {
844 Q_FOREACH(QString fileName,
d->earlyFileOpenEvents) {
845 d->mainWindow->openDocument(fileName, QFlags<KisMainWindow::OpenFlag>());
865 d->splashScreen = qobject_cast<KisSplashScreen*>(splashScreen);
870 if (
d->splashScreen) {
871 d->splashScreen->setLoadingText(textToLoad);
872 d->splashScreen->repaint();
878 if (
d->splashScreen) {
880 d->splashScreen->hide();
895 AppRecursionInfo &info = s_recursionInfo->localData();
899 AppRecursionGuard guard(&info);
903 if (info.eventRecursionCount > 1) {
909 result = QApplication::notify(receiver,
event);
912 result = QApplication::notify(receiver,
event);
916 if (!info.eventRecursionCount) {
923 }
catch (std::exception &e) {
924 qWarning(
"Error %s sending event %i to object %s",
925 e.what(),
event->type(), qPrintable(receiver->objectName()));
927 qWarning(
"Error <unknown> sending event %i to object %s",
928 event->type(), qPrintable(receiver->objectName()));
935 AppRecursionInfo &info = s_recursionInfo->localData();
937 while (!info.postponedSynchronizationEvents.empty()) {
939 AppRecursionGuard guard(&info);
944 info.postponedSynchronizationEvents.pop();
947 qWarning() <<
"WARNING: the destination object of KisSynchronizedConnection has been destroyed during postponed delivery";
951 QApplication::notify(typedEvent.
destination, &typedEvent);
957 if (qEnvironmentVariableIsSet(
"STEAMAPPID") || qEnvironmentVariableIsSet(
"SteamAppId")) {
961 if (applicationDirPath().toLower().contains(
"steam")) {
990#if !defined(HIDE_SAFE_ASSERTS) || defined(CRASH_ON_SAFE_ASSERTS)
992 auto verifyTypeRegistered = [] (
const char *type) {
993 const int typeId = QMetaType::type(type);
996 qFatal(
"ERROR: type-id for metatype %s is not found", type);
999 if (!QMetaType::isRegistered(typeId)) {
1000 qFatal(
"ERROR: metatype %s is not registered", type);
1004 verifyTypeRegistered(
"KisBrushSP");
1005 verifyTypeRegistered(
"KoSvgText::AutoValue");
1006 verifyTypeRegistered(
"KoSvgText::BackgroundProperty");
1007 verifyTypeRegistered(
"KoSvgText::StrokeProperty");
1008 verifyTypeRegistered(
"KoSvgText::TextTransformInfo");
1009 verifyTypeRegistered(
"KoSvgText::TextIndentInfo");
1010 verifyTypeRegistered(
"KoSvgText::TabSizeInfo");
1011 verifyTypeRegistered(
"KoSvgText::LineHeightInfo");
1012 verifyTypeRegistered(
"KisPaintopLodLimitations");
1013 verifyTypeRegistered(
"KisImageSP");
1014 verifyTypeRegistered(
"KisImageSignalType");
1015 verifyTypeRegistered(
"KisNodeSP");
1016 verifyTypeRegistered(
"KisNodeList");
1017 verifyTypeRegistered(
"KisPaintDeviceSP");
1018 verifyTypeRegistered(
"KisTimeSpan");
1019 verifyTypeRegistered(
"KoColor");
1020 verifyTypeRegistered(
"KoResourceSP");
1021 verifyTypeRegistered(
"KoResourceCacheInterfaceSP");
1022 verifyTypeRegistered(
"KisAsyncAnimationRendererBase::CancelReason");
1023 verifyTypeRegistered(
"KisGridConfig");
1024 verifyTypeRegistered(
"KisGuidesConfig");
1025 verifyTypeRegistered(
"KisUpdateInfoSP");
1026 verifyTypeRegistered(
"KisToolChangesTrackerDataSP");
1027 verifyTypeRegistered(
"QVector<QImage>");
1028 verifyTypeRegistered(
"SnapshotDirInfoList");
1029 verifyTypeRegistered(
"TransformTransactionProperties");
1030 verifyTypeRegistered(
"ToolTransformArgs");
1031 verifyTypeRegistered(
"QPainterPath");
1040 const int argsCount = args.
filenames().count();
1041 bool documentCreated =
false;
1048 d->mainWindow->addViewAndNotifyLoadingCompleted(doc);
1051 if (argsCount > 0) {
1053 for (
int argNumber = 0; argNumber < argsCount; ++argNumber) {
1054 QString filename = args.
filenames().at(argNumber);
1059 else if (QFile(filename).exists()) {
1061 documentCreated |= mainWindow->
openDocument(filename, flags);
1068 if (argsCount > 0 && !documentCreated){
1070 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1071 i18n(
"Couldn't open file %1",args.
filenames().at(argsCount - 1)));
1077 QFileInfo fi(fileLayer->
path());
1080 adapter.
addNode(fileLayer,
d->mainWindow->viewManager()->activeNode()->
parent(),
1081 d->mainWindow->viewManager()->activeNode());
1084 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1085 i18n(
"Cannot add %1 as a file layer: the file does not exist.", fileLayer->
path()));
1089 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1090 i18n(
"Cannot add the file layer: no document is open."));
1099 KisMainWindow *mw = qobject_cast<KisMainWindow*>(qApp->activeWindow());
1105 const QByteArray unpackedMessage =
1106 QByteArray::fromBase64(message.toLatin1());
1109 d->earlyRemoteArguments << unpackedMessage;
1117 if (!
d->mainWindow) {
1118 d->earlyFileOpenEvents.append(url);
1123 d->mainWindow->openDocument(url, flags);
1129 if (enabled && !
d->longPressEventFilter) {
1131 installEventFilter(
d->longPressEventFilter);
1132 }
else if (!enabled &&
d->longPressEventFilter) {
1133 removeEventFilter(
d->longPressEventFilter);
1134 d->longPressEventFilter->deleteLater();
1135 d->longPressEventFilter =
nullptr;
1141 if (
d->batchRun)
return;
1152 QStringList autosaveFiles = dir.entryList(filters, QDir::Files | QDir::Hidden);
1155 filters =
QStringList() << QString(
"krita-*-*-autosave.kra");
1156 autosaveFiles += dir.entryList(filters, QDir::Files);
1159 if (autosaveFiles.size() > 0) {
1160 if (
d->splashScreen) {
1162 d->splashScreen->hide();
1165 QDialog::DialogCode result = (QDialog::DialogCode)
d->autosaveDialog->exec();
1167 if (result == QDialog::Accepted) {
1168 QStringList filesToRecover =
d->autosaveDialog->recoverableFiles();
1169 Q_FOREACH (
const QString &autosaveFile, autosaveFiles) {
1170 if (!filesToRecover.contains(autosaveFile)) {
1171 KisUsageLogger::log(QString(
"Removing autosave file %1").arg(dir.absolutePath() +
"/" + autosaveFile));
1172 QFile::remove(dir.absolutePath() +
"/" + autosaveFile);
1175 autosaveFiles = filesToRecover;
1177 autosaveFiles.clear();
1180 if (autosaveFiles.size() > 0) {
1182 Q_FOREACH (
const QString &autoSaveFile, autosaveFiles) {
1183 const QString path = dir.absolutePath() + QLatin1Char(
'/') + autoSaveFile;
1184 autosavePaths << path;
1186 if (
d->mainWindow) {
1187 Q_FOREACH (
const QString &path, autosavePaths) {
1194 delete d->autosaveDialog;
1195 d->autosaveDialog =
nullptr;
1201 QString templatePath;
1203 if (QFile::exists(fileName)) {
1204 templatePath = fileName;
1205 dbgUI <<
"using full path...";
1208 QString desktopName(fileName);
1209 const QString templatesResourcePath = QStringLiteral(
"templates/");
1212 if (paths.isEmpty()) {
1216 if (paths.isEmpty()) {
1217 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1218 i18n(
"No template found for: %1", desktopName));
1219 }
else if (paths.count() > 1) {
1220 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1221 i18n(
"Too many templates found for: %1", desktopName));
1223 templatePath = paths.at(0);
1227 if (!templatePath.isEmpty()) {
1228 KDesktopFile templateInfo(templatePath);
1232 dbgUI <<
"Template loaded...";
1236 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1237 i18n(
"Template %1 failed to load.", fileName));
1248 KSharedConfigPtr config = KSharedConfig::openConfig();
1249 config->markAsClean();
1252 const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
1253 QString kritarcPath = configPath + QStringLiteral(
"/kritarc");
1255 QFile kritarcFile(kritarcPath);
1257 if (kritarcFile.exists()) {
1258 if (kritarcFile.open(QFile::ReadWrite)) {
1259 QString backupKritarcPath = kritarcPath + QStringLiteral(
".backup");
1261 QFile backupKritarcFile(backupKritarcPath);
1263 if (backupKritarcFile.exists()) {
1264 backupKritarcFile.remove();
1267 QMessageBox::information(qApp->activeWindow(),
1268 i18nc(
"@title:window",
"Krita"),
1269 i18n(
"Krita configurations reset!\n\n"
1270 "Backup file was created at: %1\n\n"
1271 "Restart Krita for changes to take effect.",
1273 QMessageBox::Ok, QMessageBox::Ok);
1276 kritarcFile.rename(backupKritarcPath);
1278 kritarcFile.close();
1281 QMessageBox::warning(qApp->activeWindow(),
1282 i18nc(
"@title:window",
"Krita"),
1283 i18n(
"Failed to clear %1\n\n"
1284 "Please make sure no other program is using the file and try again.",
1286 QMessageBox::Ok, QMessageBox::Ok);
1292 config->reparseConfiguration();
1296 KConfigGroup cfg = KSharedConfig::openConfig()->group(
"MainWindow");
1298 QString currentWorkspace = cfg.readEntry<QString>(
"CurrentWorkspace",
"Default");
1303 d->mainWindow->restoreWorkspace(workspace);
1309 bool ok = QMessageBox::question(qApp->activeWindow(),
1310 i18nc(
"@title:window",
"Krita"),
1311 i18n(
"Do you want to clear the settings file?"),
1312 QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes;
1320 return d->extendedModifiersPluginInterface.data();
1326 if (!
d->androidDonations) {
1328 d->androidDonations->syncState();
1330 return d->androidDonations;
QList< QString > QStringList
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
const quint8 OPACITY_OPAQUE_U8
void setCurrentTheme(const QString &name)
static KisActionRegistry * instance()
QVector< QByteArray > earlyRemoteArguments
QPointer< KisSplashScreen > splashScreen
QScopedPointer< KisExtendedModifiersMapperPluginInterface > extendedModifiersPluginInterface
QPointer< KisMainWindow > mainWindow
QVector< QString > earlyFileOpenEvents
ResetStarting(KisSplashScreen *splash, int fileCount)
QPointer< KisSplashScreen > m_splash
Base class for the Krita app.
bool notify(QObject *receiver, QEvent *event) override
Overridden to handle exceptions from event handlers.
void setSplashScreenLoadingText(const QString &)
bool event(QEvent *event) override
virtual bool start(const KisApplicationArguments &args)
void remoteArguments(const QString &message)
void executeRemoteArguments(QByteArray message, KisMainWindow *mainWindow)
KisApplication(const QString &key, int &argc, char **argv)
KisExtendedModifiersMapperPluginInterface * extendedModifiersPluginInterface()
void slotSetLongPress(bool enabled)
void setSplashScreen(QWidget *splash)
void fileOpenRequested(const QString &url)
QScopedPointer< Private > d
~KisApplication() override
void initializeGlobals(const KisApplicationArguments &args)
void checkAutosaveFiles()
bool createNewDocFromTemplate(const QString &fileName, KisMainWindow *m_mainWindow)
bool isStoreApplication()
static void verifyMetatypeRegistration()
void processPostponedSynchronizationEvents()
Result regenerateRange(KisViewManager *viewManager) override
start generation of frames and (if not in batch mode) show the dialog
void setBatchMode(bool value)
setting batch mode to true will prevent any dialogs or message boxes from showing on screen....
static QString autoSaveLocation()
void sigLongPressChanged(bool enabled)
static KisConfigNotifier * instance()
QString widgetStyle(bool defaultValue=false)
void setCanvasState(const QString &state) const
void writeEntry(const QString &name, const T &value)
SessionOnStartup sessionOnStartup(bool defaultValue=false) const
bool longPressEnabled(bool defaultValue=false) const
T readEntry(const QString &name, const T &defaultValue=T())
QString canvasState(bool defaultValue=false) const
void setFileBatchMode(const bool batchMode)
QString errorMessage() const
bool exportDocumentSync(const QString &path, const QByteArray &mimeType, KisPropertiesConfigurationSP exportConfiguration=0)
bool openPath(const QString &path, OpenFlags flags=None)
openPath Open a Path
The KisFileLayer class loads a particular file as a layer into the layer stack.
static KisFilterRegistry * instance()
static KisGeneratorRegistry * instance()
const KisTimeSpan & documentPlaybackRange() const
documentPlaybackRange
bool hasAnimation() const
KisImageAnimationInterface * animationInterface() const
QString nextLayerName(const QString &baseName="") const
bool openDocument(const QString &path, OpenFlags flags)
KisViewManager * viewManager
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
static QString mimeTypeForSuffix(const QString &suffix)
Find the mimetype for a given extension. The extension may have the form "*.xxx" or "xxx".
void addNode(KisNodeSP node, KisNodeSP parent, KisNodeSP aboveThis, KisImageLayerAddCommand::Flags flags=KisImageLayerAddCommand::DoRedoUpdates|KisImageLayerAddCommand::DoUndoUpdates)
static KisPaintOpRegistry * instance()
QList< QPointer< KisMainWindow > > mainWindows
static KisPart * instance()
bool restoreSession(const QString &sessionName)
void addDocument(KisDocument *document, bool notify=true)
KisMainWindow * currentMainwindow() const
KisDocument * createDocument() const
void showSessionManager()
KisMainWindow * createMainWindow(QUuid id=QUuid())
static void performHouseKeepingOnExit()
perform optimize and vacuum when necessary
static void deleteTemporaryResources()
Delete all storages that are Unknown or Memory and all resources that are marked temporary or belong ...
static bool initialize(const QString &location)
initializes the database and updates the scheme if necessary. Does not actually fill the database wit...
static QString lastError()
lastError returns the last SQL error.
The KisResourceLoaderRegistry class manages the loader plugins for resources. Every resource can be l...
static KisResourceLoaderRegistry * instance()
void registerFixup(int priority, ResourceCacheFixup *fixup)
LocatorError initialize(const QString &installationResourcesLocation)
initialize Setup the resource locator for use.
static KisResourceLocator * instance()
static KisResourceServerProvider * instance()
KoResourceServer< KisWorkspaceResource > * workspaceServer()
KoResourceServer< KisWindowLayoutResource > * windowLayoutServer()
static KisSRGBSurfaceColorSpaceManager * tryCreateForCurrentPlatform(QWidget *widget)
static void clearUnitManagerBuilder()
static void setDefaultUnitManagerBuilder(KisSpinBoxUnitManagerBuilder *pBuilder)
set a builder the factory can use. The factory should take on the lifecycle of the builder,...
static void registerSynchronizedEventBarrier(std::function< void()> callback)
static void log(const QString &message)
Logs with date/time.
static QString screenInformation()
Returns information about all available screens.
static void writeSysInfo(const QString &message)
Writes to the system information file and Krita log.
KisImageWSP image() const
Return the image this view is displaying.
static KoDockRegistry * instance()
static QString getAppDataLocation()
static void addAssetType(const QString &type, const char *basetype, const QString &relativeName, bool priority=true)
static QString getApplicationRoot()
static QStringList findAllAssets(const QString &type, const QString &filter=QString(), SearchOptions options=NoSearchOptions)
static QString saveLocation(const QString &type, const QString &suffix=QString(), bool create=true)
QSharedPointer< T > resource(const QString &md5, const QString &fileName, const QString &name)
resource retrieves a resource. If the md5sum is not empty, the resource will only be retrieved if a r...
static KoShapeRegistry * instance()
The QtSingleApplication class provides an API to detect and communicate with running instances of an ...
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
constexpr const char * currentUnderlyingStyleNameProperty
QIcon loadIcon(const QString &name)
bool isRunningInPackage()
KRITAVERSION_EXPORT QString versionString(bool checkGit=false)
const QString StopGradients
const QString KritaPaintOpPresets
const QString SegmentedGradients
const QString FontFamilies
const QString LayerStyles
const QString SeExprScripts
const QString WindowLayouts
const QString PaintOpPresets
void setMouseCoalescingEnabled(bool enabled)
static KisApplicationArguments deserialize(QByteArray &serialized)
KisDocument * createDocumentFromArguments() const
Event type used for synchronizing connection in KisSynchronizedConnection.
const QPointer< QObject > destination
static KoColorSpaceRegistry * instance()