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>
141#if defined(Q_OS_ANDROID) && KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
146const QTime appStartTime(QTime::currentTime());
150struct AppRecursionInfo {
151 ~AppRecursionInfo() {
156 int eventRecursionCount {0};
157 std::queue<KisSynchronizedConnectionEvent> postponedSynchronizationEvents;
160struct AppRecursionGuard {
161 AppRecursionGuard(AppRecursionInfo *info)
164 m_info->eventRecursionCount++;
169 m_info->eventRecursionCount--;
172 AppRecursionInfo *m_info {0};
193 bool batchRun {
false};
199#if KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
234 qputenv(
"QT_QUICK_BACKEND",
"software");
240 QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());
250 if (!widgetStyleFromConfig.isEmpty()) {
251 qApp->setStyle(widgetStyleFromConfig);
252#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
255 qApp->setStyle(
"fusion");
258 }
else if (style()->objectName().toLower() ==
"macos" ||
defaultStyle ==
"windowsvista") {
260 qApp->setStyle(
"fusion");
276#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
282 struct PlatformWindowCreationFilter : QObject
284 using QObject::QObject;
286 bool eventFilter(QObject *watched, QEvent *event)
override {
287 if (event->type() == QEvent::PlatformSurface) {
288 QWidget *widget = qobject_cast<QWidget*>(watched);
289 if (!widget)
return false;
295 if (watched->property(
"krita_skip_srgb_surface_manager_assignment").toBool()) {
299 QPlatformSurfaceEvent *surfaceEvent =
static_cast<QPlatformSurfaceEvent*
>(event);
300 if (surfaceEvent->surfaceEventType() == QPlatformSurfaceEvent::SurfaceCreated) {
301 QWindow *nativeWindow = widget->windowHandle();
314 this->installEventFilter(
new PlatformWindowCreationFilter(
this));
318#if defined(Q_OS_WIN) && defined(ENV32BIT)
319typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
321LPFN_ISWOW64PROCESS fnIsWow64Process;
325 BOOL bIsWow64 = FALSE;
331 fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
332 GetModuleHandle(TEXT(
"kernel32")),
"IsWow64Process");
334 if(0 != fnIsWow64Process)
336 if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
371#if defined HAVE_SEEXPR
391 if (
event->type() == QEvent::FileOpen) {
392 QFileOpenEvent *openEvent =
static_cast<QFileOpenEvent *
>(
event);
397 return QApplication::event(
event);
408 QStringList() <<
"application/x-krita-paintoppreset"));
436#if defined HAVE_SEEXPR
442 i18nc(
"Resource type name",
"Layer styles"),
443 QStringList() <<
"application/x-photoshop-style"));
454 QString databaseLocation = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
458 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Fatal error"), i18n(
"%1\n\nKrita will quit now.",
KisResourceCacheDb::lastError()));
464 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Fatal error"),
KisResourceLocator::instance()->errorMessages().join(
'\n') + i18n(
"\n\nKrita will quit now."));
497 QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus,
false);
499 QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus,
true);
505 if (isWow64() && !cfg.
readEntry(
"WarnedAbout32Bits",
false)) {
506 QMessageBox::information(qApp->activeWindow(),
507 i18nc(
"@title:window",
"Krita: Warning"),
508 i18n(
"You are running a 32 bits build on a 64 bits Windows.\n"
509 "This is not recommended.\n"
510 "Please download and install the x64 build instead."));
518 if (opengl ==
"OPENGL_NOT_TRIED" ) {
521 else if (opengl !=
"OPENGL_SUCCESS" && opengl !=
"TRY_OPENGL") {
529#if defined(Q_OS_ANDROID) && KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
535 const bool exportAs = args.
exportAs();
539 d->batchRun = (exportAs || exportSequence || !exportFileName.isEmpty());
540 const bool needsMainWindow = (!exportAs && !exportSequence);
542 bool showmainWindow = (!exportAs && !exportSequence);
545 const bool showSplashScreen = !
d->batchRun && qEnvironmentVariableIsEmpty(
"NOSPLASH");
546 if (showSplashScreen &&
d->splashScreen) {
547 d->splashScreen->show();
548 d->splashScreen->repaint();
553 KConfigGroup group(KSharedConfig::openConfig(),
"theme");
560 Q_UNUSED(resetStarting);
580 if (needsMainWindow) {
586 bool sessionNeeded =
true;
589 if (!args.
session().isEmpty()) {
592 showmainWindow =
false;
593 sessionNeeded =
false;
596 KConfigGroup sessionCfg = KSharedConfig::openConfig()->group(
"session");
597 const QString &sessionName = sessionCfg.readEntry(
"previousSession");
610 windowLayout->applyLayout();
616 if (showmainWindow) {
623 d->mainWindow->restoreWorkspace(workspace);
628 d->mainWindow->viewManager()->switchCanvasOnly(
true);
632 d->mainWindow->showFullScreen();
663#if KRITA_QT_HAS_ANDROID_EMULATE_MOUSE_BUTTONS_FOR_PAGE_UP_DOWN
664 auto setPageUpDownMouseButtonEmulationWorkaround = [](
bool enabled) {
665 QCoreApplication::setKritaAttribute(KRITA_QATTRIBUTE_ANDROID_EMULATE_MOUSE_BUTTONS_FOR_PAGE_UP_DOWN, enabled);
668 &KisConfigNotifier::sigUsePageUpDownMouseButtonEmulationWorkaroundChanged,
670 setPageUpDownMouseButtonEmulationWorkaround);
671 setPageUpDownMouseButtonEmulationWorkaround(cfg.usePageUpDownMouseButtonEmulationWorkaround());
680#if KRITA_QT_HAS_ANDROID_EMULATE_MOUSE_BUTTONS_FOR_HIGH_FUNCTION_KEYS
681 QCoreApplication::setKritaAttribute(KRITA_QATTRIBUTE_ANDROID_EMULATE_MOUSE_BUTTONS_FOR_HIGH_FUNCTION_KEYS,
true);
682 auto setHighFunctionKeyMouseButtonEmulationWorkaround = [](
bool enabled) {
686 &KisConfigNotifier::sigUseHighFunctionKeyMouseButtonEmulationWorkaroundChanged,
688 setHighFunctionKeyMouseButtonEmulationWorkaround);
689 setHighFunctionKeyMouseButtonEmulationWorkaround(cfg.useHighFunctionKeyMouseButtonEmulationWorkaround());
696#if KRITA_QT_HAS_ANDROID_IGNORE_HISTORIC_TABLET_EVENTS
697 auto setIgnoreHistoricTabletEventsWorkaround = [](
bool enabled) {
698 QCoreApplication::setKritaAttribute(KRITA_QATTRIBUTE_ANDROID_IGNORE_HISTORIC_TABLET_EVENTS, enabled);
701 &KisConfigNotifier::sigUseIgnoreHistoricTabletEventsWorkaroundChanged,
703 setIgnoreHistoricTabletEventsWorkaround);
704 setIgnoreHistoricTabletEventsWorkaround(cfg.useIgnoreHistoricTabletEventsWorkaround());
712 d->mainWindow->addViewAndNotifyLoadingCompleted(doc);
717 int argsCount = args.
filenames().count();
720 for (
int argNumber = 0; argNumber < argsCount; argNumber++) {
721 QString fileName = args.
filenames().at(argNumber);
734 if (outputMimetype ==
"application/octetstream") {
735 dbgKrita << i18n(
"Mimetype not found, try using the -mimetype option") << Qt::endl;
741 bool result = doc->
openPath(fileName);
745 QTimer::singleShot(0,
this, SLOT(quit()));
749 if (exportFileName.isEmpty()) {
750 errKrita <<
"Export destination is not specified for" << fileName <<
"Please specify export destination with --export-filename option";
751 QTimer::singleShot(0,
this, SLOT(quit()));
755 qApp->processEvents();
761 errKrita <<
"Could not export " << fileName <<
"to" << exportFileName <<
":" << doc->
errorMessage();
763 QTimer::singleShot(0,
this, SLOT(quit()));
766 else if (exportSequence) {
770 qApp->processEvents();
773 errKrita <<
"This file has no animation." << Qt::endl;
774 QTimer::singleShot(0,
this, SLOT(quit()));
779 int sequenceStart = 0;
782 qDebug() <<
ppVar(exportFileName);
793 qDebug() <<
ppVar(result);
796 errKrita << i18n(
"Failed to render animation frames!") << Qt::endl;
799 QTimer::singleShot(0,
this, SLOT(quit()));
802 else if (
d->mainWindow) {
803 if (QFileInfo(fileName).fileName().endsWith(
".bundle", Qt::CaseInsensitive)) {
804 d->mainWindow->installBundle(fileName);
809 d->mainWindow->openDocument(fileName, flags);
818 if (
d->mainWindow->viewManager()->image()){
821 d->mainWindow->viewManager()->image()->nextLayerName(i18n(
"File layer")),
OPACITY_OPAQUE_U8);
822 QFileInfo fi(fileLayer->
path());
825 adapter.
addNode(fileLayer,
d->mainWindow->viewManager()->activeNode()->
parent(),
826 d->mainWindow->viewManager()->activeNode());
829 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita:Warning"),
830 i18n(
"Cannot add %1 as a file layer: the file does not exist.", fileLayer->
path()));
834 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita:Warning"),
835 i18n(
"Cannot add the file layer: no document is open.\n\n"
836"You can create a new document using the --new-image option, or you can open an existing file.\n\n"
837"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)."));
840 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Warning"),
841 i18n(
"Cannot add the file layer: no document is open.\n"
842 "You can either create a new file using the --new-image option, or you can open an existing file."));
848 if (
d->splashScreen) {
849 d->splashScreen->displayLinks(
true);
850 d->splashScreen->displayRecentFiles(
true);
853 Q_FOREACH(
const QByteArray &message,
d->earlyRemoteArguments) {
860 if (!
d->earlyFileOpenEvents.isEmpty()) {
862 Q_FOREACH(QString fileName,
d->earlyFileOpenEvents) {
863 d->mainWindow->openDocument(fileName, QFlags<KisMainWindow::OpenFlag>());
883 d->splashScreen = qobject_cast<KisSplashScreen*>(splashScreen);
888 if (
d->splashScreen) {
889 d->splashScreen->setLoadingText(textToLoad);
890 d->splashScreen->repaint();
902 if (
d->splashScreen) {
904 d->splashScreen->hide();
919 AppRecursionInfo &info = s_recursionInfo->localData();
923 AppRecursionGuard guard(&info);
927 if (info.eventRecursionCount > 1) {
933 result = QApplication::notify(receiver,
event);
936 result = QApplication::notify(receiver,
event);
940 if (!info.eventRecursionCount) {
947 }
catch (std::exception &e) {
948 qWarning(
"Error %s sending event %i to object %s",
949 e.what(),
event->type(), qPrintable(receiver->objectName()));
951 qWarning(
"Error <unknown> sending event %i to object %s",
952 event->type(), qPrintable(receiver->objectName()));
959 AppRecursionInfo &info = s_recursionInfo->localData();
961 while (!info.postponedSynchronizationEvents.empty()) {
963 AppRecursionGuard guard(&info);
968 info.postponedSynchronizationEvents.pop();
971 qWarning() <<
"WARNING: the destination object of KisSynchronizedConnection has been destroyed during postponed delivery";
975 QApplication::notify(typedEvent.
destination, &typedEvent);
981 if (qEnvironmentVariableIsSet(
"STEAMAPPID") || qEnvironmentVariableIsSet(
"SteamAppId")) {
985 if (applicationDirPath().toLower().contains(
"steam")) {
1014#if !defined(HIDE_SAFE_ASSERTS) || defined(CRASH_ON_SAFE_ASSERTS)
1016 auto verifyTypeRegistered = [] (
const char *type) {
1017 const int typeId = QMetaType::type(type);
1020 qFatal(
"ERROR: type-id for metatype %s is not found", type);
1023 if (!QMetaType::isRegistered(typeId)) {
1024 qFatal(
"ERROR: metatype %s is not registered", type);
1028 verifyTypeRegistered(
"KisBrushSP");
1029 verifyTypeRegistered(
"KoSvgText::AutoValue");
1030 verifyTypeRegistered(
"KoSvgText::BackgroundProperty");
1031 verifyTypeRegistered(
"KoSvgText::StrokeProperty");
1032 verifyTypeRegistered(
"KoSvgText::TextTransformInfo");
1033 verifyTypeRegistered(
"KoSvgText::TextIndentInfo");
1034 verifyTypeRegistered(
"KoSvgText::TabSizeInfo");
1035 verifyTypeRegistered(
"KoSvgText::LineHeightInfo");
1036 verifyTypeRegistered(
"KisPaintopLodLimitations");
1037 verifyTypeRegistered(
"KisImageSP");
1038 verifyTypeRegistered(
"KisImageSignalType");
1039 verifyTypeRegistered(
"KisNodeSP");
1040 verifyTypeRegistered(
"KisNodeList");
1041 verifyTypeRegistered(
"KisPaintDeviceSP");
1042 verifyTypeRegistered(
"KisTimeSpan");
1043 verifyTypeRegistered(
"KoColor");
1044 verifyTypeRegistered(
"KoResourceSP");
1045 verifyTypeRegistered(
"KoResourceCacheInterfaceSP");
1046 verifyTypeRegistered(
"KisAsyncAnimationRendererBase::CancelReason");
1047 verifyTypeRegistered(
"KisGridConfig");
1048 verifyTypeRegistered(
"KisGuidesConfig");
1049 verifyTypeRegistered(
"KisUpdateInfoSP");
1050 verifyTypeRegistered(
"KisToolChangesTrackerDataSP");
1051 verifyTypeRegistered(
"QVector<QImage>");
1052 verifyTypeRegistered(
"SnapshotDirInfoList");
1053 verifyTypeRegistered(
"TransformTransactionProperties");
1054 verifyTypeRegistered(
"ToolTransformArgs");
1055 verifyTypeRegistered(
"QPainterPath");
1064 const int argsCount = args.
filenames().count();
1065 bool documentCreated =
false;
1072 d->mainWindow->addViewAndNotifyLoadingCompleted(doc);
1075 if (argsCount > 0) {
1077 for (
int argNumber = 0; argNumber < argsCount; ++argNumber) {
1078 QString filename = args.
filenames().at(argNumber);
1083 else if (QFile(filename).exists()) {
1085 documentCreated |= mainWindow->
openDocument(filename, flags);
1092 if (argsCount > 0 && !documentCreated){
1094 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1095 i18n(
"Couldn't open file %1",args.
filenames().at(argsCount - 1)));
1101 QFileInfo fi(fileLayer->
path());
1104 adapter.
addNode(fileLayer,
d->mainWindow->viewManager()->activeNode()->
parent(),
1105 d->mainWindow->viewManager()->activeNode());
1108 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1109 i18n(
"Cannot add %1 as a file layer: the file does not exist.", fileLayer->
path()));
1113 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1114 i18n(
"Cannot add the file layer: no document is open."));
1123 KisMainWindow *mw = qobject_cast<KisMainWindow*>(qApp->activeWindow());
1129 const QByteArray unpackedMessage =
1130 QByteArray::fromBase64(message.toLatin1());
1133 d->earlyRemoteArguments << unpackedMessage;
1141 if (!
d->mainWindow) {
1142 d->earlyFileOpenEvents.append(url);
1147 d->mainWindow->openDocument(url, flags);
1153 if (enabled && !
d->longPressEventFilter) {
1155 installEventFilter(
d->longPressEventFilter);
1156 }
else if (!enabled &&
d->longPressEventFilter) {
1157 removeEventFilter(
d->longPressEventFilter);
1158 d->longPressEventFilter->deleteLater();
1159 d->longPressEventFilter =
nullptr;
1165 if (
d->batchRun)
return;
1176 QStringList autosaveFiles = dir.entryList(filters, QDir::Files | QDir::Hidden);
1179 filters =
QStringList() << QString(
"krita-*-*-autosave.kra");
1180 autosaveFiles += dir.entryList(filters, QDir::Files);
1183 if (autosaveFiles.size() > 0) {
1184 if (
d->splashScreen) {
1189 QDialog::DialogCode result = (QDialog::DialogCode)
d->autosaveDialog->exec();
1191 if (result == QDialog::Accepted) {
1192 QStringList filesToRecover =
d->autosaveDialog->recoverableFiles();
1193 Q_FOREACH (
const QString &autosaveFile, autosaveFiles) {
1194 if (!filesToRecover.contains(autosaveFile)) {
1195 KisUsageLogger::log(QString(
"Removing autosave file %1").arg(dir.absolutePath() +
"/" + autosaveFile));
1196 QFile::remove(dir.absolutePath() +
"/" + autosaveFile);
1199 autosaveFiles = filesToRecover;
1201 autosaveFiles.clear();
1204 if (autosaveFiles.size() > 0) {
1206 Q_FOREACH (
const QString &autoSaveFile, autosaveFiles) {
1207 const QString path = dir.absolutePath() + QLatin1Char(
'/') + autoSaveFile;
1208 autosavePaths << path;
1210 if (
d->mainWindow) {
1211 Q_FOREACH (
const QString &path, autosavePaths) {
1218 delete d->autosaveDialog;
1219 d->autosaveDialog =
nullptr;
1225 QString templatePath;
1227 if (QFile::exists(fileName)) {
1228 templatePath = fileName;
1229 dbgUI <<
"using full path...";
1232 QString desktopName(fileName);
1233 const QString templatesResourcePath = QStringLiteral(
"templates/");
1236 if (paths.isEmpty()) {
1240 if (paths.isEmpty()) {
1241 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1242 i18n(
"No template found for: %1", desktopName));
1243 }
else if (paths.count() > 1) {
1244 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1245 i18n(
"Too many templates found for: %1", desktopName));
1247 templatePath = paths.at(0);
1251 if (!templatePath.isEmpty()) {
1252 KDesktopFile templateInfo(templatePath);
1256 dbgUI <<
"Template loaded...";
1260 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1261 i18n(
"Template %1 failed to load.", fileName));
1272 KSharedConfigPtr config = KSharedConfig::openConfig();
1273 config->markAsClean();
1276 const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
1277 QString kritarcPath = configPath + QStringLiteral(
"/kritarc");
1279 QFile kritarcFile(kritarcPath);
1281 if (kritarcFile.exists()) {
1282 if (kritarcFile.open(QFile::ReadWrite)) {
1283 QString backupKritarcPath = kritarcPath + QStringLiteral(
".backup");
1285 QFile backupKritarcFile(backupKritarcPath);
1287 if (backupKritarcFile.exists()) {
1288 backupKritarcFile.remove();
1291 QMessageBox::information(qApp->activeWindow(),
1292 i18nc(
"@title:window",
"Krita"),
1293 i18n(
"Krita configurations reset!\n\n"
1294 "Backup file was created at: %1\n\n"
1295 "Restart Krita for changes to take effect.",
1297 QMessageBox::Ok, QMessageBox::Ok);
1300 kritarcFile.rename(backupKritarcPath);
1302 kritarcFile.close();
1305 QMessageBox::warning(qApp->activeWindow(),
1306 i18nc(
"@title:window",
"Krita"),
1307 i18n(
"Failed to clear %1\n\n"
1308 "Please make sure no other program is using the file and try again.",
1310 QMessageBox::Ok, QMessageBox::Ok);
1316 config->reparseConfiguration();
1320 KConfigGroup cfg = KSharedConfig::openConfig()->group(
"MainWindow");
1322 QString currentWorkspace = cfg.readEntry<QString>(
"CurrentWorkspace",
"Default");
1327 d->mainWindow->restoreWorkspace(workspace);
1333 bool ok = QMessageBox::question(qApp->activeWindow(),
1334 i18nc(
"@title:window",
"Krita"),
1335 i18n(
"Do you want to clear the settings file?"),
1336 QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes;
1344 return d->extendedModifiersPluginInterface.data();
1350 if (!
d->androidDonations) {
1352 d->androidDonations->syncState();
1354 return d->androidDonations;
1359#if KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
1362 return d->androidScaling;
QList< QString > QStringList
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
const quint8 OPACITY_OPAQUE_U8
void setCurrentTheme(const QString &name)
static KisActionRegistry * instance()
static void setLoaded(bool loaded)
static void showDonationDialog(bool splash)
static void setLoadingText(const QString &text)
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
IconsInMenu iconsInMenu(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
static QVariantHash defaultStyle
QIcon loadIcon(const QString &name)
bool isRunningInPackage()
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()