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>
118#include <QThreadStorage>
123#include <config-seexpr.h>
124#include <config-safe-asserts.h>
129#include <config-use-surface-color-management-api.h>
131#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
134#include <QPlatformSurfaceEvent>
140const QTime appStartTime(QTime::currentTime());
144struct AppRecursionInfo {
145 ~AppRecursionInfo() {
150 int eventRecursionCount {0};
151 std::queue<KisSynchronizedConnectionEvent> postponedSynchronizationEvents;
154struct AppRecursionGuard {
155 AppRecursionGuard(AppRecursionInfo *info)
158 m_info->eventRecursionCount++;
163 m_info->eventRecursionCount--;
166 AppRecursionInfo *m_info {0};
187 bool batchRun {
false};
226 QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath());
228 setApplicationDisplayName(
"Krita");
229 setApplicationName(
"krita");
232 setOrganizationDomain(
"krita.org");
235 setApplicationVersion(version);
238 if (qgetenv(
"KRITA_NO_STYLE_OVERRIDE").isEmpty()) {
240#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
245 if (!styles.contains(style()->objectName().toLower())) {
246 Q_FOREACH (
const QString & style, styles) {
247 if (!setStyle(style)) {
248 qDebug() <<
"No" << style <<
"available.";
251 qDebug() <<
"Set style" << style;
260 if(widgetStyleFromConfig !=
"") {
261 qApp->setStyle(widgetStyleFromConfig);
262#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
263 }
else if (style()->objectName().toLower() ==
"macintosh") {
265 qApp->setStyle(
"fusion");
268 }
else if (style()->objectName().toLower() ==
"macos") {
270 qApp->setStyle(
"fusion");
276 qDebug() <<
"Style override disabled, using" << style()->objectName();
291#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
297 struct PlatformWindowCreationFilter : QObject
299 using QObject::QObject;
301 bool eventFilter(QObject *watched, QEvent *event)
override {
302 if (event->type() == QEvent::PlatformSurface) {
303 QWidget *widget = qobject_cast<QWidget*>(watched);
304 if (!widget)
return false;
310 if (watched->property(
"krita_skip_srgb_surface_manager_assignment").toBool()) {
314 QPlatformSurfaceEvent *surfaceEvent =
static_cast<QPlatformSurfaceEvent*
>(event);
315 if (surfaceEvent->surfaceEventType() == QPlatformSurfaceEvent::SurfaceCreated) {
316 QWindow *nativeWindow = widget->windowHandle();
329 this->installEventFilter(
new PlatformWindowCreationFilter(
this));
333#if defined(Q_OS_WIN) && defined(ENV32BIT)
334typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
336LPFN_ISWOW64PROCESS fnIsWow64Process;
340 BOOL bIsWow64 = FALSE;
346 fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
347 GetModuleHandle(TEXT(
"kernel32")),
"IsWow64Process");
349 if(0 != fnIsWow64Process)
351 if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
385#if defined HAVE_SEEXPR
405 if (
event->type() == QEvent::FileOpen) {
406 QFileOpenEvent *openEvent =
static_cast<QFileOpenEvent *
>(
event);
411 return QApplication::event(
event);
420 QStringList() <<
"application/x-krita-paintoppreset"));
448#if defined HAVE_SEEXPR
454 i18nc(
"Resource type name",
"Layer styles"),
455 QStringList() <<
"application/x-photoshop-style"));
465 QString databaseLocation = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
469 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Fatal error"), i18n(
"%1\n\nKrita will quit now.",
KisResourceCacheDb::lastError()));
475 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Fatal error"),
KisResourceLocator::instance()->errorMessages().join(
'\n') + i18n(
"\n\nKrita will quit now."));
504 if (isWow64() && !cfg.
readEntry(
"WarnedAbout32Bits",
false)) {
505 QMessageBox::information(qApp->activeWindow(),
506 i18nc(
"@title:window",
"Krita: Warning"),
507 i18n(
"You are running a 32 bits build on a 64 bits Windows.\n"
508 "This is not recommended.\n"
509 "Please download and install the x64 build instead."));
517 if (opengl ==
"OPENGL_NOT_TRIED" ) {
520 else if (opengl !=
"OPENGL_SUCCESS" && opengl !=
"TRY_OPENGL") {
530 const bool exportAs = args.
exportAs();
534 d->batchRun = (exportAs || exportSequence || !exportFileName.isEmpty());
535 const bool needsMainWindow = (!exportAs && !exportSequence);
537 bool showmainWindow = (!exportAs && !exportSequence);
539 const bool showSplashScreen = !
d->batchRun && qEnvironmentVariableIsEmpty(
"NOSPLASH");
540 if (showSplashScreen &&
d->splashScreen) {
541 d->splashScreen->show();
542 d->splashScreen->repaint();
546 KConfigGroup group(KSharedConfig::openConfig(),
"theme");
553 Q_UNUSED(resetStarting);
573 if (needsMainWindow) {
579 bool sessionNeeded =
true;
582 if (!args.
session().isEmpty()) {
585 showmainWindow =
false;
586 sessionNeeded =
false;
589 KConfigGroup sessionCfg = KSharedConfig::openConfig()->group(
"session");
590 const QString &sessionName = sessionCfg.readEntry(
"previousSession");
603 windowLayout->applyLayout();
609 if (showmainWindow) {
616 d->mainWindow->restoreWorkspace(workspace);
621 d->mainWindow->viewManager()->switchCanvasOnly(
true);
625 d->mainWindow->showFullScreen();
631 short int numberOfOpenDocuments = 0;
655 d->mainWindow->addViewAndNotifyLoadingCompleted(doc);
660 int argsCount = args.
filenames().count();
663 for (
int argNumber = 0; argNumber < argsCount; argNumber++) {
664 QString fileName = args.
filenames().at(argNumber);
672 ++numberOfOpenDocuments;
679 if (outputMimetype ==
"application/octetstream") {
680 dbgKrita << i18n(
"Mimetype not found, try using the -mimetype option") << Qt::endl;
686 bool result = doc->
openPath(fileName);
690 QTimer::singleShot(0,
this, SLOT(quit()));
694 if (exportFileName.isEmpty()) {
695 errKrita <<
"Export destination is not specified for" << fileName <<
"Please specify export destination with --export-filename option";
696 QTimer::singleShot(0,
this, SLOT(quit()));
700 qApp->processEvents();
706 errKrita <<
"Could not export " << fileName <<
"to" << exportFileName <<
":" << doc->
errorMessage();
708 QTimer::singleShot(0,
this, SLOT(quit()));
711 else if (exportSequence) {
715 qApp->processEvents();
718 errKrita <<
"This file has no animation." << Qt::endl;
719 QTimer::singleShot(0,
this, SLOT(quit()));
724 int sequenceStart = 0;
727 qDebug() <<
ppVar(exportFileName);
738 qDebug() <<
ppVar(result);
741 errKrita << i18n(
"Failed to render animation frames!") << Qt::endl;
744 QTimer::singleShot(0,
this, SLOT(quit()));
747 else if (
d->mainWindow) {
748 if (QFileInfo(fileName).fileName().endsWith(
".bundle", Qt::CaseInsensitive)) {
749 d->mainWindow->installBundle(fileName);
754 if (
d->mainWindow->openDocument(fileName, flags)) {
756 numberOfOpenDocuments++;
766 if (
d->mainWindow->viewManager()->image()){
769 d->mainWindow->viewManager()->image()->nextLayerName(i18n(
"File layer")),
OPACITY_OPAQUE_U8);
770 QFileInfo fi(fileLayer->
path());
773 adapter.
addNode(fileLayer,
d->mainWindow->viewManager()->activeNode()->
parent(),
774 d->mainWindow->viewManager()->activeNode());
777 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita:Warning"),
778 i18n(
"Cannot add %1 as a file layer: the file does not exist.", fileLayer->
path()));
782 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita:Warning"),
783 i18n(
"Cannot add the file layer: no document is open.\n\n"
784"You can create a new document using the --new-image option, or you can open an existing file.\n\n"
785"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)."));
788 QMessageBox::warning(qApp->activeWindow(), i18nc(
"@title:window",
"Krita: Warning"),
789 i18n(
"Cannot add the file layer: no document is open.\n"
790 "You can either create a new file using the --new-image option, or you can open an existing file."));
796 if (
d->splashScreen) {
797 d->splashScreen->displayLinks(
true);
798 d->splashScreen->displayRecentFiles(
true);
801 Q_FOREACH(
const QByteArray &message,
d->earlyRemoteArguments) {
808 if (!
d->earlyFileOpenEvents.isEmpty()) {
810 Q_FOREACH(QString fileName,
d->earlyFileOpenEvents) {
811 d->mainWindow->openDocument(fileName, QFlags<KisMainWindow::OpenFlag>());
831 d->splashScreen = qobject_cast<KisSplashScreen*>(splashScreen);
836 if (
d->splashScreen) {
837 d->splashScreen->setLoadingText(textToLoad);
838 d->splashScreen->repaint();
844 if (
d->splashScreen) {
846 d->splashScreen->hide();
861 AppRecursionInfo &info = s_recursionInfo->localData();
865 AppRecursionGuard guard(&info);
869 if (info.eventRecursionCount > 1) {
875 result = QApplication::notify(receiver,
event);
878 result = QApplication::notify(receiver,
event);
882 if (!info.eventRecursionCount) {
889 }
catch (std::exception &e) {
890 qWarning(
"Error %s sending event %i to object %s",
891 e.what(),
event->type(), qPrintable(receiver->objectName()));
893 qWarning(
"Error <unknown> sending event %i to object %s",
894 event->type(), qPrintable(receiver->objectName()));
901 AppRecursionInfo &info = s_recursionInfo->localData();
903 while (!info.postponedSynchronizationEvents.empty()) {
905 AppRecursionGuard guard(&info);
910 info.postponedSynchronizationEvents.pop();
913 qWarning() <<
"WARNING: the destination object of KisSynchronizedConnection has been destroyed during postponed delivery";
917 QApplication::notify(typedEvent.
destination, &typedEvent);
923 if (qEnvironmentVariableIsSet(
"STEAMAPPID") || qEnvironmentVariableIsSet(
"SteamAppId")) {
927 if (applicationDirPath().toLower().contains(
"steam")) {
956#if !defined(HIDE_SAFE_ASSERTS) || defined(CRASH_ON_SAFE_ASSERTS)
958 auto verifyTypeRegistered = [] (
const char *type) {
959 const int typeId = QMetaType::type(type);
962 qFatal(
"ERROR: type-id for metatype %s is not found", type);
965 if (!QMetaType::isRegistered(typeId)) {
966 qFatal(
"ERROR: metatype %s is not registered", type);
970 verifyTypeRegistered(
"KisBrushSP");
971 verifyTypeRegistered(
"KoSvgText::AutoValue");
972 verifyTypeRegistered(
"KoSvgText::BackgroundProperty");
973 verifyTypeRegistered(
"KoSvgText::StrokeProperty");
974 verifyTypeRegistered(
"KoSvgText::TextTransformInfo");
975 verifyTypeRegistered(
"KoSvgText::TextIndentInfo");
976 verifyTypeRegistered(
"KoSvgText::TabSizeInfo");
977 verifyTypeRegistered(
"KoSvgText::LineHeightInfo");
978 verifyTypeRegistered(
"KisPaintopLodLimitations");
979 verifyTypeRegistered(
"KisImageSP");
980 verifyTypeRegistered(
"KisImageSignalType");
981 verifyTypeRegistered(
"KisNodeSP");
982 verifyTypeRegistered(
"KisNodeList");
983 verifyTypeRegistered(
"KisPaintDeviceSP");
984 verifyTypeRegistered(
"KisTimeSpan");
985 verifyTypeRegistered(
"KoColor");
986 verifyTypeRegistered(
"KoResourceSP");
987 verifyTypeRegistered(
"KoResourceCacheInterfaceSP");
988 verifyTypeRegistered(
"KisAsyncAnimationRendererBase::CancelReason");
989 verifyTypeRegistered(
"KisGridConfig");
990 verifyTypeRegistered(
"KisGuidesConfig");
991 verifyTypeRegistered(
"KisUpdateInfoSP");
992 verifyTypeRegistered(
"KisToolChangesTrackerDataSP");
993 verifyTypeRegistered(
"QVector<QImage>");
994 verifyTypeRegistered(
"SnapshotDirInfoList");
995 verifyTypeRegistered(
"TransformTransactionProperties");
996 verifyTypeRegistered(
"ToolTransformArgs");
997 verifyTypeRegistered(
"QPainterPath");
1006 const int argsCount = args.
filenames().count();
1007 bool documentCreated =
false;
1014 d->mainWindow->addViewAndNotifyLoadingCompleted(doc);
1017 if (argsCount > 0) {
1019 for (
int argNumber = 0; argNumber < argsCount; ++argNumber) {
1020 QString filename = args.
filenames().at(argNumber);
1025 else if (QFile(filename).exists()) {
1027 documentCreated |= mainWindow->
openDocument(filename, flags);
1034 if (argsCount > 0 && !documentCreated){
1036 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1037 i18n(
"Couldn't open file %1",args.
filenames().at(argsCount - 1)));
1043 QFileInfo fi(fileLayer->
path());
1046 adapter.
addNode(fileLayer,
d->mainWindow->viewManager()->activeNode()->
parent(),
1047 d->mainWindow->viewManager()->activeNode());
1050 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1051 i18n(
"Cannot add %1 as a file layer: the file does not exist.", fileLayer->
path()));
1055 QMessageBox::warning(mainWindow, i18nc(
"@title:window",
"Krita:Warning"),
1056 i18n(
"Cannot add the file layer: no document is open."));
1065 KisMainWindow *mw = qobject_cast<KisMainWindow*>(qApp->activeWindow());
1071 const QByteArray unpackedMessage =
1072 QByteArray::fromBase64(message.toLatin1());
1075 d->earlyRemoteArguments << unpackedMessage;
1083 if (!
d->mainWindow) {
1084 d->earlyFileOpenEvents.append(url);
1089 d->mainWindow->openDocument(url, flags);
1095 if (enabled && !
d->longPressEventFilter) {
1097 installEventFilter(
d->longPressEventFilter);
1098 }
else if (!enabled &&
d->longPressEventFilter) {
1099 removeEventFilter(
d->longPressEventFilter);
1100 d->longPressEventFilter->deleteLater();
1101 d->longPressEventFilter =
nullptr;
1107 if (
d->batchRun)
return;
1118 QStringList autosaveFiles = dir.entryList(filters, QDir::Files | QDir::Hidden);
1121 filters =
QStringList() << QString(
"krita-*-*-autosave.kra");
1122 autosaveFiles += dir.entryList(filters, QDir::Files);
1125 if (autosaveFiles.size() > 0) {
1126 if (
d->splashScreen) {
1128 d->splashScreen->hide();
1131 QDialog::DialogCode result = (QDialog::DialogCode)
d->autosaveDialog->exec();
1133 if (result == QDialog::Accepted) {
1134 QStringList filesToRecover =
d->autosaveDialog->recoverableFiles();
1135 Q_FOREACH (
const QString &autosaveFile, autosaveFiles) {
1136 if (!filesToRecover.contains(autosaveFile)) {
1137 KisUsageLogger::log(QString(
"Removing autosave file %1").arg(dir.absolutePath() +
"/" + autosaveFile));
1138 QFile::remove(dir.absolutePath() +
"/" + autosaveFile);
1141 autosaveFiles = filesToRecover;
1143 autosaveFiles.clear();
1146 if (autosaveFiles.size() > 0) {
1148 Q_FOREACH (
const QString &autoSaveFile, autosaveFiles) {
1149 const QString path = dir.absolutePath() + QLatin1Char(
'/') + autoSaveFile;
1150 autosavePaths << path;
1152 if (
d->mainWindow) {
1153 Q_FOREACH (
const QString &path, autosavePaths) {
1160 delete d->autosaveDialog;
1161 d->autosaveDialog =
nullptr;
1167 QString templatePath;
1169 if (QFile::exists(fileName)) {
1170 templatePath = fileName;
1171 dbgUI <<
"using full path...";
1174 QString desktopName(fileName);
1175 const QString templatesResourcePath = QStringLiteral(
"templates/");
1178 if (paths.isEmpty()) {
1182 if (paths.isEmpty()) {
1183 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1184 i18n(
"No template found for: %1", desktopName));
1185 }
else if (paths.count() > 1) {
1186 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1187 i18n(
"Too many templates found for: %1", desktopName));
1189 templatePath = paths.at(0);
1193 if (!templatePath.isEmpty()) {
1194 KDesktopFile templateInfo(templatePath);
1198 dbgUI <<
"Template loaded...";
1202 QMessageBox::critical(qApp->activeWindow(), i18nc(
"@title:window",
"Krita"),
1203 i18n(
"Template %1 failed to load.", fileName));
1214 KSharedConfigPtr config = KSharedConfig::openConfig();
1215 config->markAsClean();
1218 const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
1219 QString kritarcPath = configPath + QStringLiteral(
"/kritarc");
1221 QFile kritarcFile(kritarcPath);
1223 if (kritarcFile.exists()) {
1224 if (kritarcFile.open(QFile::ReadWrite)) {
1225 QString backupKritarcPath = kritarcPath + QStringLiteral(
".backup");
1227 QFile backupKritarcFile(backupKritarcPath);
1229 if (backupKritarcFile.exists()) {
1230 backupKritarcFile.remove();
1233 QMessageBox::information(qApp->activeWindow(),
1234 i18nc(
"@title:window",
"Krita"),
1235 i18n(
"Krita configurations reset!\n\n"
1236 "Backup file was created at: %1\n\n"
1237 "Restart Krita for changes to take effect.",
1239 QMessageBox::Ok, QMessageBox::Ok);
1242 kritarcFile.rename(backupKritarcPath);
1244 kritarcFile.close();
1247 QMessageBox::warning(qApp->activeWindow(),
1248 i18nc(
"@title:window",
"Krita"),
1249 i18n(
"Failed to clear %1\n\n"
1250 "Please make sure no other program is using the file and try again.",
1252 QMessageBox::Ok, QMessageBox::Ok);
1258 config->reparseConfiguration();
1262 KConfigGroup cfg = KSharedConfig::openConfig()->group(
"MainWindow");
1264 QString currentWorkspace = cfg.readEntry<QString>(
"CurrentWorkspace",
"Default");
1269 d->mainWindow->restoreWorkspace(workspace);
1275 bool ok = QMessageBox::question(qApp->activeWindow(),
1276 i18nc(
"@title:window",
"Krita"),
1277 i18n(
"Do you want to clear the settings file?"),
1278 QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes;
1286 return d->extendedModifiersPluginInterface.data();
1292 if (!
d->androidDonations) {
1294 d->androidDonations->syncState();
1296 return d->androidDonations;
QList< QString > QStringList
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
const quint8 OPACITY_OPAQUE_U8
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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 FilterEffects
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()