Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMainWindow Class Reference

Main window for Krita. More...

#include <KisMainWindow.h>

+ Inheritance diagram for KisMainWindow:

Public Types

enum  OpenFlag { None = 0 , Import = 0x1 , BatchMode = 0x2 , RecoveryFile = 0x4 }
 
- Public Types inherited from KXmlGuiWindow
enum  StandardWindowOption {
  ToolBar = 1 , Keys = 2 , StatusBar = 4 , Save = 8 ,
  Create = 16 , Default = ToolBar | Keys | StatusBar | Save | Create
}
 
- Public Types inherited from KisKXMLGUIClient
enum  ReverseStateChange { StateNoReverse , StateReverse }
 

Public Slots

bool checkActiveBundlesAvailable ()
 checkActiveStorages checks whether there is at least one bundle available and at least one paintop preset.
 
bool checkPaintOpAvailable ()
 
void clearRecentFiles ()
 
void newOptionWidgets (KoCanvasController *controller, const QList< QPointer< QWidget > > &optionWidgetList)
 
KisView * newView (QObject *document, QMdiSubWindow *subWindow=0)
 
void notifyChildViewDestroyed (KisView *view)
 
void removeRecentFile (QString url)
 
void setActiveView (KisView *view)
 Set the active view, this will update the undo/redo actions.
 
void setCanvasDetached (bool detached)
 
void slotChangeInterfaceScale ()
 
void slotFileNew ()
 
void slotFileOpen (bool isImporting=false)
 
void slotFileOpenRecent (const QUrl &)
 
void slotFileSave ()
 
void slotPreferences ()
 slotPreferences open the preferences dialog
 
void slotShowSessionManager ()
 
void subWindowActivated ()
 
void synchronizeDynamicActions ()
 
void unsetActiveView ()
 
void viewFullscreen (bool fullScreen)
 
void windowFocused ()
 
- Public Slots inherited from KXmlGuiWindow
virtual void configureToolbars ()
 
virtual void slotStateChanged (const QString &newstate)
 
void slotStateChanged (const QString &newstate, bool reverse)
 
- Public Slots inherited from KisKMainWindow
void appHelpActivated (void)
 
void setSettingsDirty ()
 

Signals

void activeViewChanged ()
 emitted when the current view has changed
 
void documentSaved ()
 
void guiLoadingFinished ()
 
void keyBindingsChanged ()
 This signal is emitted when the shortcut key configuration has changed.
 
void loadCompleted ()
 
void restoringDone ()
 This signal is emitted right after the docker states have been successfully restored from config.
 
void themeChanged ()
 This signal is emitted when the color theme changes.
 

Public Member Functions

KisActionManager * actionManager ()
 
KisView * activeView () const
 
KisView * addViewAndNotifyLoadingCompleted (KisDocument *document, QMdiSubWindow *subWindow=0)
 
bool canvasDetached () const
 
QList< KoCanvasObserverBase * > canvasObservers () const override
 
QWidget * canvasWindow () const
 
QMenu * createPopupMenu () override
 
QDockWidget * dockWidget (const QString &id)
 
QList< QDockWidget * > dockWidgets () const
 Return the list of dock widgets belonging to this main window.
 
QTabBar * findTabBarHACK ()
 
bool hackIsSaving () const
 
QUuid id () const
 
bool installBundle (const QString &fileName) const
 Copy the given file into the bundle directory.
 
 KisMainWindow (QUuid id=QUuid())
 
QImage layoutThumbnail ()
 layoutThumbnail
 
bool openDocument (const QString &path, OpenFlags flags)
 
 Private (KisMainWindow *parent, QUuid id)
 
KoCanvasResourceProvider * resourceManager () const
 
bool restoreWorkspace (KoResourceSP res)
 
bool restoreWorkspaceState (const QByteArray &state)
 
bool saveDocument (KisDocument *document, bool saveas, bool isExporting, bool isAdvancedExporting=false)
 
void saveWindowState (bool restoreNormalState=false)
 
void showDocument (KisDocument *document)
 
QStringList showOpenFileDialog (bool isImporting)
 
virtual void showView (KisView *view, QMdiSubWindow *subWindow=0)
 showView shows the given view, in subWindow if not null, in a new tab otherwise.
 
void showWelcomeScreen (bool show)
 
int viewCount () const
 
KisViewManager * viewManager () const
 
const KConfigGroup & windowStateConfig () const
 
 ~KisMainWindow () override
 
 ~Private ()
 
- Public Member Functions inherited from KXmlGuiWindow
void applyMainWindowSettings (const KConfigGroup &config) override
 
void createGUI (const QString &xmlfile=QString())
 
void createStandardStatusBarAction ()
 
void finalizeGUI (bool force)
 
void finalizeGUI (KisKXMLGUIClient *client) override
 
virtual KisKXMLGUIFactory * guiFactory ()
 
bool isHelpMenuEnabled () const
 
bool isStandardToolBarMenuEnabled () const
 
 KXmlGuiWindow (QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
 
void setHelpMenuEnabled (bool showHelpMenu=true)
 
void setStandardToolBarMenuEnabled (bool enable)
 
void setupGUI (const QSize &defaultSize, StandardWindowOptions options=Default, const QString &xmlfile=QString())
 
void setupGUI (StandardWindowOptions options=Default, const QString &xmlfile=QString())
 
void setupToolbarMenuActions ()
 
QAction * toolBarMenuAction ()
 
 ~KXmlGuiWindow () override
 Destructor.
 
- Public Member Functions inherited from KisKMainWindow
KConfigGroup autoSaveConfigGroup () const
 
QString autoSaveGroup () const
 
bool autoSaveSettings () const
 
QString dbusName () const
 
bool hasMenuBar ()
 
 KisKMainWindow (QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
 
void resetAutoSaveSettings ()
 
bool restore (int number, bool show=true)
 
void saveMainWindowSettings (KConfigGroup &config)
 
void setAutoSaveSettings (const KConfigGroup &group, bool saveWindowSize=true)
 
void setAutoSaveSettings (const QString &groupName=QLatin1String("MainWindow"), bool saveWindowSize=true)
 
KisToolBar * toolBar (const QString &name=QString())
 
QList< KisToolBar * > toolBars () const
 
 ~KisKMainWindow () override
 Destructor.
 
- Public Member Functions inherited from KisKXMLGUIBuilder
KisKXMLGUIClient * builderClient () const
 
virtual QStringList containerTags () const
 
virtual QWidget * createContainer (QWidget *parent, int index, const QDomElement &element, QAction *&containerAction)
 
virtual QAction * createCustomElement (QWidget *parent, int index, const QDomElement &element)
 
virtual QStringList customTags () const
 
 KisKXMLGUIBuilder (QWidget *widget)
 
virtual void removeContainer (QWidget *container, QWidget *parent, QDomElement &element, QAction *containerAction)
 
virtual void removeCustomElement (QWidget *parent, QAction *action)
 
void setBuilderClient (KisKXMLGUIClient *client)
 
QWidget * widget ()
 
virtual ~KisKXMLGUIBuilder ()
 
- Public Member Functions inherited from KisKXMLGUIClient
QAction * action (const char *name) const
 
virtual QAction * action (const QDomElement &element) const
 
virtual KisKActionCollection * actionCollection () const
 
void addStateActionDisabled (const QString &state, const QString &action)
 
void addStateActionEnabled (const QString &state, const QString &action)
 
void beginXMLPlug (QWidget *)
 
QList< KisKXMLGUIClient * > childClients ()
 
KisKXMLGUIBuilder * clientBuilder () const
 
virtual QString componentName () const
 
virtual QDomDocument domDocument () const
 
void endXMLPlug ()
 
KisKXMLGUIFactory * factory () const
 
StateChange getActionsToChangeForState (const QString &state)
 
void insertChildClient (KisKXMLGUIClient *child)
 
 KisKXMLGUIClient ()
 
 KisKXMLGUIClient (KisKXMLGUIClient *parent)
 
virtual QString localXMLFile () const
 
KisKXMLGUIClient * parentClient () const
 
void plugActionList (const QString &name, const QList< QAction * > &actionList)
 
void prepareXMLUnplug (QWidget *)
 
void reloadXML ()
 
void removeChildClient (KisKXMLGUIClient *child)
 
void replaceXMLFile (const QString &xmlfile, const QString &localxmlfile, bool merge=false)
 
void setClientBuilder (KisKXMLGUIBuilder *builder)
 
void setFactory (KisKXMLGUIFactory *factory)
 
void setXMLGUIBuildDocument (const QDomDocument &doc)
 
void unplugActionList (const QString &name)
 
virtual QString xmlFile () const
 
QDomDocument xmlguiBuildDocument () const
 
virtual ~KisKXMLGUIClient ()
 
- Public Member Functions inherited from KoCanvasSupervisor
 KoCanvasSupervisor ()
 
virtual ~KoCanvasSupervisor ()
 

Static Public Member Functions

static void swapWorkspaces (KisMainWindow *a, KisMainWindow *b)
 
- Static Public Member Functions inherited from KisKMainWindow
static bool canBeRestored (int number)
 
static const QString classNameOfToplevel (int number)
 
static QList< KisKMainWindow * > memberList ()
 
- Static Public Member Functions inherited from KisKXMLGUIClient
static QString findMostRecentXMLFile (const QStringList &files, QString &doc)
 

Public Attributes

QMap< QString, QAction * > actionMap
 
QMdiSubWindow * activeSubWindow {nullptr}
 
QPointer< KisView > activeView
 
KisSignalAutoConnectionsStore activeViewConnections
 
KisCanvasWindow * canvasWindow {nullptr}
 
KisAction * close {nullptr}
 
KisAction * closeAll {nullptr}
 
KateCommandBar * commandBar {nullptr}
 
KisAction * commandBarAction {nullptr}
 
QCloseEvent * deferredClosingEvent {nullptr}
 
QByteArray dockerStateBeforeHiding
 
KActionMenu * dockWidgetMenu {nullptr}
 
QMap< QString, QDockWidget * > dockWidgetsMap
 
KisSignalMapper * documentMapper {nullptr}
 
KActionMenu * documentMenu {nullptr}
 
KisAction * expandingSpacers [2]
 
KisAction * exportFile {nullptr}
 
KisAction * exportFileAdvance {nullptr}
 
bool firstTime {true}
 
KisAction * fullScreenMode {nullptr}
 
KisKHelpMenu * helpMenu {nullptr}
 
QUuid id
 
KisAction * importAnimation {nullptr}
 
KisAction * importFile {nullptr}
 
KisAction * importVideoAnimation {nullptr}
 
QByteArray lastExportedFormat
 
QString lastExportLocation
 
QMdiArea * mdiArea {nullptr}
 
KisAction * mdiCascade {nullptr}
 
KisAction * mdiNextWindow {nullptr}
 
KisAction * mdiPreviousWindow {nullptr}
 
KisAction * mdiTile {nullptr}
 
KisAction * newWindow {nullptr}
 
KisMainWindow * q {nullptr}
 
KRecentFilesAction * recentFiles {nullptr}
 
KisAction * redo {nullptr}
 
KisAction * renderAnimation {nullptr}
 
KisAction * renderAnimationAgain {nullptr}
 
KisAction * resetConfigurations {nullptr}
 
KisAction * saveAction {nullptr}
 
KisAction * saveActionAs {nullptr}
 
QMutex savingEntryMutex
 
KisAction * showDocumentInfo {nullptr}
 
KisAction * showSessionManager {nullptr}
 
QActionGroup * styleActions {nullptr}
 
KActionMenu * styleMenu {nullptr}
 
QScopedPointer< KisSignalCompressorWithParam< int > > tabSwitchCompressor
 
Digikam::ThemeManager * themeManager {nullptr}
 
KisAction * toggleDetachCanvas {nullptr}
 
KisAction * toggleDockers {nullptr}
 
KisAction * toggleDockerTitleBars {nullptr}
 
QList< QAction * > toolbarList
 
KoToolDocker * toolOptionsDocker {nullptr}
 
KisAction * undo {nullptr}
 
QScopedPointer< KisUndoActionsUpdateManager > undoActionsUpdateManager
 
KisViewManager * viewManager {nullptr}
 
KisWelcomePageWidget * welcomePage {nullptr}
 
QScrollArea * welcomeScroller {nullptr}
 
QStackedWidget * widgetStack {nullptr}
 
KisSignalMapper * windowMapper {nullptr}
 
KActionMenu * windowMenu {nullptr}
 
bool windowSizeDirty {false}
 
KConfigGroup windowStateConfig
 
QUuid workspaceBorrowedBy
 
KActionMenu * workspaceMenu {nullptr}
 
KisResourceModel * workspacemodel {nullptr}
 

Protected Member Functions

void closeEvent (QCloseEvent *e) override
 
void dragLeaveEvent (QDragLeaveEvent *event) override
 
void dragMoveEvent (QDragMoveEvent *event) override
 
void resizeEvent (QResizeEvent *e) override
 
void showEvent (QShowEvent *event) override
 
bool windowsLayoutSavingAllowed () const override
 
- Protected Member Functions inherited from KXmlGuiWindow
bool event (QEvent *event) override
 
- Protected Member Functions inherited from KisKMainWindow
void closeEvent (QCloseEvent *) override
 
bool event (QEvent *event) override
 
 KisKMainWindow (KisKMainWindowPrivate &dd, QWidget *parent, Qt::WindowFlags f)
 
virtual bool queryClose ()
 
virtual void readGlobalProperties (KConfig *sessionConfig)
 
virtual void readProperties (const KConfigGroup &)
 
bool readPropertiesInternal (KConfig *, int)
 
virtual void saveGlobalProperties (KConfig *sessionConfig)
 
virtual void saveProperties (KConfigGroup &)
 
void savePropertiesInternal (KConfig *, int)
 
bool settingsDirty () const
 
- Protected Member Functions inherited from KisKXMLGUIBuilder
virtual void virtual_hook (int id, void *data)
 
- Protected Member Functions inherited from KisKXMLGUIClient
void loadStandardsXmlFile ()
 
virtual void setComponentName (const QString &componentName, const QString &componentDisplayName)
 
void setDOMDocument (const QDomDocument &document, bool merge=false)
 
void setLocalXMLFile (const QString &file)
 
void setXML (const QString &document, bool merge=false)
 
void setXMLFile (const QString &file, bool merge=false, bool setXMLDoc=true)
 
virtual void stateChanged (const QString &newstate, ReverseStateChange reverse=StateNoReverse)
 
virtual void virtual_hook (int id, void *data)
 

Private Slots

void checkSanity ()
 
void closeCurrentWindow ()
 
void configChanged ()
 
void forceDockTabFonts ()
 
void importAnimation ()
 
void importVideoAnimation ()
 
void initializeGeometry ()
 
void newWindow ()
 
void openCommandBar ()
 
void orientationChanged ()
 
void redo ()
 
void renderAnimation ()
 
void renderAnimationAgain ()
 
void restoreWorkspace ()
 
void setActiveSubWindow (QWidget *window)
 
virtual void showAboutApplication ()
 showAboutApplication show the about box
 
void showDockerTitleBars (bool show)
 
void showErrorAndDie ()
 Quits Krita with error message from m_errorMessage.
 
void showManual ()
 
void slotConfigureToolbars ()
 
void slotDocumentInfo ()
 
void slotExportAdvance ()
 
void slotExportFile ()
 
bool slotFileCloseAll ()
 
void slotFileQuit ()
 
void slotFileSaveAs ()
 
void slotImportFile ()
 
void slotLoadCanceled (const QString &)
 
void slotLoadCompleted ()
 
void slotNewToolbarConfig ()
 
void slotResetConfigurations ()
 
void slotSaveCanceled (const QString &)
 
void slotSaveCompleted ()
 
void slotStoragesWarning (const QString &location=QString())
 
void slotThemeChanged ()
 
void slotToolbarToggled (bool toggle)
 
void slotUpdateReadWriteMode (bool readWrite)
 
void slotUpdateSaveActionTitle (const QString &documentPath)
 
void slotUpdateWidgetStyle ()
 
void slotXmlGuiMakingChanges (bool finished)
 
void switchTab (int index)
 
void toggleDockersVisibility (bool visible, bool onWelcomePage=false)
 
void undo ()
 
void updateSubwindowFlags ()
 
void updateTheme ()
 
void updateWindowMenu ()
 

Private Member Functions

QPointer< KisView > activeKisView ()
 
void addView (KisView *view, QMdiSubWindow *subWindow=0)
 
void adjustLayoutForWelcomePage ()
 
void applyActionIconOverridesFromLocalXML ()
 
void applyToolBarLayout ()
 
QByteArray borrowWorkspace (KisMainWindow *borrower)
 
void createActions ()
 
QDockWidget * createDockWidget (KoDockFactoryBase *factory)
 
void customizeTabBar ()
 
void dragLeave ()
 
void dragMove (QDragMoveEvent *event)
 
bool openDocumentInternal (const QString &path, KisMainWindow::OpenFlags f=KisMainWindow::OpenFlags())
 
void saveWindowSettings ()
 
void setMainWindowLayoutForCurrentMainWidget (int widgetIndex, bool widgetIndexChanged)
 
- Private Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Private Attributes

Private *const d
 
bool m_dieOnError
 
QString m_errorMessage
 
- Private Attributes inherited from Private
KisCanvas2 * canvas
 
int displayedFrame
 
int intendedFrame
 

Friends

class KisPart
 
class KisWelcomePageWidget
 

Additional Inherited Members

- Protected Slots inherited from KXmlGuiWindow
virtual void saveNewToolbarConfig ()
 
- Protected Slots inherited from KisKMainWindow
void saveAutoSaveSettings ()
 
- Static Protected Member Functions inherited from KisKXMLGUIClient
static QString standardsXmlFileLocation ()
 
- Protected Attributes inherited from KisKMainWindow
KisKMainWindowPrivate *const k_ptr
 
- Properties inherited from KXmlGuiWindow
QString autoSaveGroup
 
bool autoSaveSettings
 
bool hasMenuBar
 
bool standardToolBarMenuEnabled
 
- Properties inherited from KisKMainWindow
QString autoSaveGroup
 
bool autoSaveSettings
 
bool hasMenuBar
 

Detailed Description

Main window for Krita.

This class is used to represent a main window within a Krita session. Each main window contains a menubar and some toolbars, and potentially several views of several canvases.

Definition at line 190 of file KisMainWindow.cpp.

Member Enumeration Documentation

◆ OpenFlag

Enumerator
None 
Import 
BatchMode 
RecoveryFile 

Definition at line 51 of file KisMainWindow.h.

51 {
52 None = 0,
53 Import = 0x1,
54 BatchMode = 0x2,
55 RecoveryFile = 0x4
56 };

Constructor & Destructor Documentation

◆ ~Private()

KisMainWindow::~Private ( )
inline

Definition at line 228 of file KisMainWindow.cpp.

228 {
229 qDeleteAll(toolbarList);
230 }
QList< QAction * > toolbarList

◆ KisMainWindow()

KisMainWindow::KisMainWindow ( QUuid id = QUuid())
explicit

Initializes a Krita main window (with its basic GUI etc.).

Definition at line 364 of file KisMainWindow.cpp.

365 : KXmlGuiWindow()
366 , d(new Private(this, uuid))
367{
368 KisScopedPerformanceLogger perfLog(QStringLiteral("KisMainWindow::KisMainWindow"));
369
370 KAcceleratorManager::setNoAccel(this);
371
372 d->workspacemodel = new KisResourceModel(ResourceType::Workspaces, this);
373 connect(d->workspacemodel, SIGNAL(modelReset()), this, SLOT(updateWindowMenu()));
374 connect(d->workspacemodel, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(updateWindowMenu()));
375 connect(d->workspacemodel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(updateWindowMenu()));
376
377 d->viewManager = new KisViewManager(this, actionCollection());
378 KConfigGroup group( KSharedConfig::openConfig(), "theme");
379#ifndef Q_OS_HAIKU
380 d->themeManager = new Digikam::ThemeManager(group.readEntry("Theme", "Krita dark"), this);
381#endif
382 d->windowStateConfig = KSharedConfig::openConfig()->group("MainWindow");
383
385 setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
386 setDockNestingEnabled(true);
387#ifdef Q_OS_ANDROID
388 // On Android, the animations for docks and menus are not only slow, but
389 // also can cause crashes in some circumstances. Turning them off feels
390 // better and avoids those.
391 setAnimated(false);
392#endif
393
394 qApp->setStartDragDistance(25); // 25 px is a distance that works well for Tablet and Mouse events
395
396 connect(this, SIGNAL(restoringDone()), this, SLOT(forceDockTabFonts()));
397 connect(this, SIGNAL(themeChanged()), d->viewManager, SLOT(updateIcons()));
398 connect(this, SIGNAL(themeChanged()), KoToolManager::instance(), SLOT(themeChanged()));
399 connect(KisPart::instance(), SIGNAL(documentClosed(QString)), SLOT(updateWindowMenu()));
400 connect(KisPart::instance(), SIGNAL(documentOpened(QString)), SLOT(updateWindowMenu()));
401 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), this, SLOT(configChanged()));
402
404 KoPluginLoader::instance()->load("Krita/ViewPlugin", KoPluginLoader::PluginsConfig(), d->viewManager, false);
405
406 // Load the per-application plugins (Right now, only Python) We do this only once, when the first mainwindow is being created.
407 KoPluginLoader::instance()->load("Krita/ApplicationPlugin", KoPluginLoader::PluginsConfig(), qApp, true);
408
409 KoToolBoxFactory toolBoxFactory;
410 QDockWidget *toolbox = createDockWidget(&toolBoxFactory);
411
412 KisConfig cfg(true);
413 if (cfg.toolOptionsInDocker()) {
414 ToolDockerFactory toolDockerFactory;
415 d->toolOptionsDocker = qobject_cast<KoToolDocker*>(createDockWidget(&toolDockerFactory));
416 if (d->toolOptionsDocker) {
417 d->toolOptionsDocker->toggleViewAction()->setEnabled(true);
418 }
419 }
420
421 QMap<QString, QAction*> dockwidgetActions;
422
423 if (toolbox) {
424 dockwidgetActions[toolbox->toggleViewAction()->text()] = toolbox->toggleViewAction();
425 }
426
427 for (KoDockFactoryBase *factory : KoDockRegistry::instance()->sortedDockWidgetFactories()) {
428 QDockWidget *dw = createDockWidget(factory);
429 if (dw) {
430 dockwidgetActions[dw->toggleViewAction()->text()] = dw->toggleViewAction();
431 }
432 }
433
434 if (d->toolOptionsDocker) {
435 dockwidgetActions[d->toolOptionsDocker->toggleViewAction()->text()] = d->toolOptionsDocker->toggleViewAction();
436 }
438
439 Q_FOREACH (QString title, dockwidgetActions.keys()) {
440 d->dockWidgetMenu->addAction(dockwidgetActions[title]);
441 }
442
443
444 // Style menu actions
445 d->styleActions = new QActionGroup(this);
446 QAction * action;
447
448#ifndef Q_OS_ANDROID
449
450 Q_FOREACH (QString styleName, QStyleFactory::keys()) {
451
452 action = new QAction(styleName, d->styleActions);
453 action->setCheckable(true);
454 d->actionMap.insert(styleName, action);
455 d->styleMenu->addAction(d->actionMap.value(styleName));
456 }
457
458 // select the config value, or the current style if that does not exist
459 QString styleFromConfig = cfg.widgetStyle().toLower();
460 QString styleToSelect = styleFromConfig.isEmpty() ? style()->objectName().toLower() : styleFromConfig;
461
462 Q_FOREACH (auto key, d->actionMap.keys()) {
463 if(key.toLower() == styleToSelect) { // does the key match selection
464 d->actionMap.value(key)->setChecked(true);
465 }
466 }
467
468 connect(d->styleActions, SIGNAL(triggered(QAction*)),
469 this, SLOT(slotUpdateWidgetStyle()));
470#endif
471
472 // Load all the actions from the tool plugins
473 // ToolBoxDocker needs them when at setViewManager()
474 Q_FOREACH(KoToolFactoryBase *toolFactory, KoToolRegistry::instance()->values()) {
475 toolFactory->createActions(actionCollection());
476 }
477
478
479 Q_FOREACH (QDockWidget *wdg, dockWidgets()) {
480 if ((wdg->features() & QDockWidget::DockWidgetClosable) == 0) {
481 wdg->setVisible(true);
482 }
483 }
484
485 Q_FOREACH (KoCanvasObserverBase* observer, canvasObservers()) {
486 observer->setObservedCanvas(0);
487 KisMainwindowObserver* mainwindowObserver = dynamic_cast<KisMainwindowObserver*>(observer);
488 if (mainwindowObserver) {
489 mainwindowObserver->setViewManager(d->viewManager);
490 }
491 }
492
493 d->mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
494 d->mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
495 d->mdiArea->setTabPosition(QTabWidget::North);
496 d->mdiArea->setTabsClosable(true);
497 d->mdiArea->setAcceptDrops(true);
498
499 themeChanged(); // updates icon styles
500
501 setCentralWidget(d->widgetStack);
502 d->widgetStack->setCurrentIndex(0);
503
504 connect(d->mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(subWindowActivated()));
505 connect(d->windowMapper, SIGNAL(mapped(QWidget*)), this, SLOT(setActiveSubWindow(QWidget*)));
506 connect(d->documentMapper, SIGNAL(mapped(QObject*)), this, SLOT(newView(QObject*)));
507
508 d->canvasWindow = new KisCanvasWindow(this);
509 actionCollection()->addAssociatedWidget(d->canvasWindow);
510
512
513 // the welcome screen needs to grab actions...so make sure this line goes after the createAction() so they exist
514 d->welcomePage->setMainWindow(this);
515
516 d->recentFiles->setRecentFilesModel(&KisRecentDocumentsModelWrapper::instance()->model());
517
520
521 if (isHelpMenuEnabled() && !d->helpMenu) {
522 d->helpMenu = new KisKHelpMenu(this, KAboutData::applicationData(), false);
523
524 // workaround-less version:
525 // d->helpMenu = new KisKHelpMenu(this, QString()/*unused*/, false);
526
527 // The difference between using KisKActionCollection->addAction() is that
528 // these actions do not get tied to the MainWindow. What does this all do?
529 KisKActionCollection *actions = d->viewManager->actionCollection();
530 QAction *helpContentsAction = d->helpMenu->action(KisKHelpMenu::menuHelpContents);
531 QAction *whatsThisAction = d->helpMenu->action(KisKHelpMenu::menuWhatsThis);
532 QAction *reportBugAction = d->helpMenu->action(KisKHelpMenu::menuReportBug);
533 QAction *switchLanguageAction = d->helpMenu->action(KisKHelpMenu::menuSwitchLanguage);
534 QAction *aboutAppAction = d->helpMenu->action(KisKHelpMenu::menuAboutApp);
535 QAction *aboutKdeAction = d->helpMenu->action(KisKHelpMenu::menuAboutKDE);
536
537 if (helpContentsAction) {
538 actions->addAction(helpContentsAction->objectName(), helpContentsAction);
539 }
540 if (whatsThisAction) {
541 actions->addAction(whatsThisAction->objectName(), whatsThisAction);
542 }
543 if (reportBugAction) {
544 actions->addAction(reportBugAction->objectName(), reportBugAction);
545 }
546 if (switchLanguageAction) {
547 actions->addAction(switchLanguageAction->objectName(), switchLanguageAction);
548 }
549 if (aboutAppAction) {
550 actions->addAction(aboutAppAction->objectName(), aboutAppAction);
551 }
552 if (aboutKdeAction) {
553 actions->addAction(aboutKdeAction->objectName(), aboutKdeAction);
554 }
555
556 connect(d->helpMenu, SIGNAL(showAboutApplication()), SLOT(showAboutApplication()));
557 }
558
559 // Custom handling of help action for manual URL outside docs.kde.org.
560 QAction *helpAction = actionCollection()->action("help_contents");
561 helpAction->disconnect(SIGNAL(triggered()));
562 connect(helpAction, SIGNAL(triggered()), this, SLOT(showManual()));
563
564#if 0
565 //check for colliding shortcuts
566 QSet<QKeySequence> existingShortcuts;
567 Q_FOREACH (QAction* action, actionCollection()->actions()) {
568 if(action->shortcut() == QKeySequence(0)) {
569 continue;
570 }
571 dbgKrita << "shortcut " << action->text() << " " << action->shortcut();
572 Q_ASSERT(!existingShortcuts.contains(action->shortcut()));
573 existingShortcuts.insert(action->shortcut());
574 }
575#endif
576
578
579 // Make sure the python plugins create their actions in time
581
582 // If we have customized the toolbars, load that first
583 setLocalXMLFile(KoResourcePaths::locateLocal("data", "krita5.xmlgui"));
584 setXMLFile(":/kxmlgui5/krita5.xmlgui");
585
586 guiFactory()->addClient(this);
588 connect(guiFactory(), SIGNAL(makingChanges(bool)), SLOT(slotXmlGuiMakingChanges(bool)));
589
590 // Create and plug toolbar list for Settings menu
592 Q_FOREACH (QWidget* it, guiFactory()->containers("ToolBar")) {
593 KisToolBar * toolBar = ::qobject_cast<KisToolBar *>(it);
594 if (toolBar) {
595 KToggleAction* act = new KToggleAction(i18n("Show %1 Toolbar", toolBar->windowTitle()), this);
596 actionCollection()->addAction(toolBar->objectName().toUtf8(), act);
597 act->setCheckedState(KGuiItem(i18n("Hide %1 Toolbar", toolBar->windowTitle())));
598 connect(act, SIGNAL(toggled(bool)), this, SLOT(slotToolbarToggled(bool)));
599 act->setChecked(!toolBar->isHidden());
600 toolbarList.append(act);
601 } else {
602 warnUI << "Toolbar list contains a " << it->metaObject()->className() << " which is not a toolbar!";
603 }
604 }
605
606 plugActionList("toolbarlist", toolbarList);
607 d->toolbarList = toolbarList;
608
610
611 d->viewManager->updateGUI();
612 d->viewManager->updateIcons();
613
614 QTimer::singleShot(1000, Qt::CoarseTimer, this, SLOT(checkSanity()));
615
616 {
617 using namespace std::placeholders; // For _1 placeholder
618 std::function<void (int)> callback(
619 std::bind(&KisMainWindow::switchTab, this, _1));
620
621 d->tabSwitchCompressor.reset(
623 }
624
625
626 if (cfg.readEntry("CanvasOnlyActive", false)) {
627 QString currentWorkspace = cfg.readEntry<QString>("CurrentWorkspace", "Default");
629 KisWorkspaceResourceSP workspace = rserver->resource("", "", currentWorkspace);
630 if (workspace) {
631 restoreWorkspace(workspace);
632 }
633 cfg.writeEntry("CanvasOnlyActive", false);
634 menuBar()->setVisible(true);
635 }
636
637 this->winId(); // Ensures the native window has been created.
638
639#ifdef Q_OS_ANDROID
640 // HACK: This prevents the mainWindow from going beyond the screen with no
641 // way to bring it back. Apparently the size doesn't matter here as long as
642 // it remains fixed?
643 setFixedSize(KisApplication::primaryScreen()->availableGeometry().size());
644
645 QScreen *s = QGuiApplication::primaryScreen();
646 s->setOrientationUpdateMask(Qt::LandscapeOrientation|Qt::InvertedLandscapeOrientation|Qt::PortraitOrientation|Qt::InvertedPortraitOrientation);
647 connect(s, SIGNAL(orientationChanged(Qt::ScreenOrientation)), this, SLOT(orientationChanged()));
648
649#if KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
650 // When the screen's UI scale changes, we have to hide and show it to get
651 // its contents to update, otherwise it fails to re-render altogether.
653 if (androidScaling) {
654 connect(androidScaling,
656 this,
657 &KisMainWindow::slotFlashWindowHack,
658 Qt::QueuedConnection);
659 }
660#endif
661
662 // When Krita starts, Java side sends an event to set applicationState() to active. But, before
663 // the event could reach KisApplication's platform integration, it is cleared by KisOpenGLModeProber::probeFormat.
664 // So, we send it manually when MainWindow shows up.
665 QAndroidJniObject::callStaticMethod<void>("org/qtproject/qt5/android/QtNative", "setApplicationState", "(I)V", Qt::ApplicationActive);
666#endif
667
668 setAcceptDrops(true);
669 QTabBar *tabBar = d->findTabBarHACK();
670 if (tabBar) {
671 tabBar->setElideMode(Qt::ElideRight);
672 // load customized tab style
674 tabBar->setExpanding(true);
675 tabBar->setAcceptDrops(true);
676 tabBar->setChangeCurrentOnDrag(true);
677 }
678
679 applyMainWindowSettings(d->windowStateConfig);
680}
PythonPluginManager * instance
void setStandardToolBarMenuEnabled(bool enable)
void applyMainWindowSettings(const KConfigGroup &config) override
virtual KisKXMLGUIFactory * guiFactory()
bool isHelpMenuEnabled() const
KXmlGuiWindow(QWidget *parent=0, Qt::WindowFlags f=Qt::WindowFlags())
void sigInterfaceScaleChanged()
static KisAndroidScaling * instance()
static KisConfigNotifier * instance()
A container for a set of QAction objects.
Q_INVOKABLE QAction * addAction(const QString &name, QAction *action)
QAction * action(int index) const
void addAssociatedWidget(QWidget *widget)
Standard KDE help menu with dialog boxes.
Definition khelpmenu.h:106
KisToolBar * toolBar(const QString &name=QString())
void setLocalXMLFile(const QString &file)
QAction * action(const char *name) const
KisKXMLGUIFactory * factory() const
void setXMLFile(const QString &file, bool merge=false, bool setXMLDoc=true)
void plugActionList(const QString &name, const QList< QAction * > &actionList)
virtual KisKActionCollection * actionCollection() const
void addClient(KisKXMLGUIClient *client)
virtual void showAboutApplication()
showAboutApplication show the about box
void applyActionIconOverridesFromLocalXML()
void slotUpdateWidgetStyle()
void setActiveSubWindow(QWidget *window)
QList< KoCanvasObserverBase * > canvasObservers() const override
void themeChanged()
This signal is emitted when the color theme changes.
KisView * newView(QObject *document, QMdiSubWindow *subWindow=0)
void slotXmlGuiMakingChanges(bool finished)
void newOptionWidgets(KoCanvasController *controller, const QList< QPointer< QWidget > > &optionWidgetList)
QList< QDockWidget * > dockWidgets() const
Return the list of dock widgets belonging to this main window.
QDockWidget * createDockWidget(KoDockFactoryBase *factory)
Private *const d
void restoringDone()
This signal is emitted right after the docker states have been successfully restored from config.
void switchTab(int index)
void slotToolbarToggled(bool toggle)
The KisMainwindowObserver class is an interface for dock widgets that want to keep track of the main ...
virtual void setViewManager(KisViewManager *kisview)=0
static KisPart * instance()
Definition KisPart.cpp:130
void notifyMainWindowIsBeingCreated(KisMainWindow *mainWindow)
notifyMainWindowIsBeingCreated emits the sigMainWindowCreated signal
Definition KisPart.cpp:269
static KisRecentDocumentsModelWrapper * instance()
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
static KisResourceServerProvider * instance()
KoResourceServer< KisWorkspaceResource > * workspaceServer()
Floatable toolbar with auto resize.
Definition ktoolbar.h:47
void setObservedCanvas(KoCanvasBase *canvas)
void load(const QString &serviceType, const PluginsConfig &config=PluginsConfig(), QObject *owner=0, bool cache=true)
static KoPluginLoader * instance()
static QString locateLocal(const QString &type, const QString &filename, bool createDir=false)
QList< QAction * > createActions(KisKActionCollection *actionCollection)
static KoToolManager * instance()
Return the toolmanager singleton.
static KoToolRegistry * instance()
#define dbgKrita
Definition kis_debug.h:49
#define warnUI
Definition kis_debug.h:101
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
int size(const Forest< T > &forest)
Definition KisForest.h:1232
const QString Workspaces

References KisKXMLGUIClient::action(), KisKActionCollection::action(), KisKXMLGUIClient::actionCollection(), KisKActionCollection::addAction(), KisKActionCollection::addAssociatedWidget(), KisKXMLGUIFactory::addClient(), applyActionIconOverridesFromLocalXML(), KXmlGuiWindow::applyMainWindowSettings(), applyToolBarLayout(), canvasObservers(), checkSanity(), configChanged(), createActions(), KoToolFactoryBase::createActions(), createDockWidget(), customizeTabBar(), d, dbgKrita, dockWidgets(), KisKXMLGUIClient::factory(), KisSignalCompressor::FIRST_INACTIVE, forceDockTabFonts(), KXmlGuiWindow::guiFactory(), KoDockRegistry::instance(), KoToolManager::instance(), KoToolRegistry::instance(), KisConfigNotifier::instance(), KoPluginLoader::instance(), KisAndroidScaling::instance(), KisPart::instance(), KisResourceServerProvider::instance(), KisRecentDocumentsModelWrapper::instance(), KXmlGuiWindow::isHelpMenuEnabled(), KoPluginLoader::load(), KoResourcePaths::locateLocal(), KisKHelpMenu::menuAboutApp, KisKHelpMenu::menuAboutKDE, KisKHelpMenu::menuHelpContents, KisKHelpMenu::menuReportBug, KisKHelpMenu::menuSwitchLanguage, KisKHelpMenu::menuWhatsThis, newOptionWidgets(), newView(), KisPart::notifyMainWindowIsBeingCreated(), orientationChanged(), KisKXMLGUIClient::plugActionList(), KisConfig::readEntry(), restoreWorkspace(), restoringDone(), setActiveSubWindow(), KisKXMLGUIClient::setLocalXMLFile(), KoCanvasObserverBase::setObservedCanvas(), KXmlGuiWindow::setStandardToolBarMenuEnabled(), KisMainwindowObserver::setViewManager(), KisKXMLGUIClient::setXMLFile(), showAboutApplication(), showManual(), KisAndroidScaling::sigInterfaceScaleChanged(), slotToolbarToggled(), slotUpdateWidgetStyle(), slotXmlGuiMakingChanges(), KoDockRegistry::sortedDockWidgetFactories(), subWindowActivated(), switchTab(), themeChanged(), KisKMainWindow::toolBar(), toolbarList, KisConfig::toolOptionsInDocker(), updateWindowMenu(), void(), warnUI, KisConfig::widgetStyle(), ResourceType::Workspaces, KisResourceServerProvider::workspaceServer(), and KisConfig::writeEntry().

◆ ~KisMainWindow()

KisMainWindow::~KisMainWindow ( )
override

Destructor.

Destructor of KisView accesses KisViewManager is multiple ways, directly and via KoToolManager. Hence we should destroy all the subwindows before we actually destroy the view manager.

Please note that we cannot just close() the subwindows, becasue they are deleted with deleteLater(), which may postpone their destruction till after KisViewManager's death.

Definition at line 682 of file KisMainWindow.cpp.

683{
684 // Q_FOREACH (QAction *ac, actionCollection()->actions()) {
685 // QAction *action = qobject_cast<QAction*>(ac);
686 // if (action) {
687 // qDebug() << "<Action"
688 // << "\n\tname=" << action->objectName()
689 // << "\n\ticon=" << action->icon().name()
690 // << "\n\ttext=" << action->text().replace("&", "&amp;")
691 // << "\n\twhatsThis=" << action->whatsThis()
692 // << "\n\ttoolTip=" << action->toolTip().replace("<html>", "").replace("</html>", "")
693 // << "\n\ticonText=" << action->iconText().replace("&", "&amp;")
694 // << "\n\tshortcut=" << action->shortcut().toString()
695 // << "\n\tisCheckable=" << QString((action->isChecked() ? "true" : "false"))
696 // << "\n\tstatusTip=" << action->statusTip()
697 // << "\n/>\n" ;
698 // }
699 // else {
700 // dbgKrita << "Got a non-qaction:" << ac->objectName();
701 // }
702 // }
703
713 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
714 if (subwin) {
715 (void) subwin->close();
716 delete subwin;
717 }
718 }
719
720 // The doc and view might still exist (this is the case when closing the window)
722
723 delete d->viewManager;
724 delete d;
725
726}
void removeMainWindow(KisMainWindow *mainWindow)
Definition KisPart.cpp:438

References d, KisPart::instance(), KisPart::removeMainWindow(), and void().

Member Function Documentation

◆ actionManager()

KisActionManager * KisMainWindow::actionManager ( )
inline

Definition at line 332 of file KisMainWindow.cpp.

332 {
333 return viewManager->actionManager();
334 }
KisViewManager * viewManager
KisActionManager * actionManager() const

◆ activeKisView()

QPointer< KisView > KisMainWindow::activeKisView ( )
private

Definition at line 3033 of file KisMainWindow.cpp.

3034{
3035 if (!d->mdiArea) return 0;
3036 QMdiSubWindow *activeSubWindow = d->mdiArea->activeSubWindow();
3037 //dbgKrita << "activeKisView" << activeSubWindow;
3038 if (!activeSubWindow) return 0;
3039 return qobject_cast<KisView*>(activeSubWindow->widget());
3040}
QMdiSubWindow * activeSubWindow

References activeSubWindow, and d.

◆ activeView()

KisView * KisMainWindow::activeView ( ) const
Returns
the currently active view

◆ activeViewChanged

void KisMainWindow::activeViewChanged ( )
signal

emitted when the current view has changed

◆ addView()

void KisMainWindow::addView ( KisView * view,
QMdiSubWindow * subWindow = 0 )
private

Add a the given view to the list of views of this mainwindow. This is a private implementation. For public usage please use newView() and addViewAndNotifyLoadingCompleted().

Definition at line 737 of file KisMainWindow.cpp.

738{
739 if (d->activeView == view && !subWindow) return;
740
741 if (d->activeView) {
742 d->activeView->disconnect(this);
743 }
744
745 // register the newly created view in the input manager
747
748 showView(view, subWindow);
749 Q_EMIT restoringDone();
750
751// QTabBar *tabBar = d->findTabBarHACK();
752// Q_FOREACH(QObject *c, tabBar->children()) {
753// if (QWidget *w = qobject_cast<QWidget*>(c)) {
754// w->setAcceptDrops(true);
755// }
756// }
757}
void addTrackedCanvas(KisCanvas2 *canvas)
virtual void showView(KisView *view, QMdiSubWindow *subWindow=0)
showView shows the given view, in subWindow if not null, in a new tab otherwise.
KisInputManager * inputManager() const
Filters events and sends them to canvas actions.
KisCanvas2 * canvasBase() const
Definition KisView.cpp:431

References KisInputManager::addTrackedCanvas(), KisView::canvasBase(), d, KisViewManager::inputManager(), restoringDone(), showView(), and viewManager.

◆ addViewAndNotifyLoadingCompleted()

KisView * KisMainWindow::addViewAndNotifyLoadingCompleted ( KisDocument * document,
QMdiSubWindow * subWindow = 0 )

Definition at line 1195 of file KisMainWindow.cpp.

1197{
1198 showWelcomeScreen(false); // see workaround in function header
1199
1200 KisView *view = KisPart::instance()->createView(document, d->viewManager, this);
1201 addView(view, subWindow);
1202
1203 Q_EMIT guiLoadingFinished();
1204
1205#ifdef Q_OS_ANDROID
1206 // HACK: When opening documents on Android, the main window sometimes fails
1207 // to update until the application is shunted to the background and brought
1208 // back or the menu bar is fiddled with. Flickering the window fixes this.
1209 // Having a docker that uses QML somehow also fixes this, so this hack is
1210 // gone again in 5.3 with the introduction of the text properties docker.
1211 // UNHACK: But not on Xiaomi devices! There flickering the window makes it
1212 // sorta exit fullscreen, adding black bars at the top and bottom. Just
1213 // opening a document seems to work fine on these devices though, it delays
1214 // for a moment then displays fine, so just skip this there I guess.
1216 slotFlashWindowHack();
1217 }
1218#endif
1219
1220 return view;
1221}
void guiLoadingFinished()
void showWelcomeScreen(bool show)
void addView(KisView *view, QMdiSubWindow *subWindow=0)
KisView * createView(KisDocument *document, KisViewManager *viewManager, QWidget *parent)
Definition KisPart.cpp:275

References addView(), KisPart::createView(), d, guiLoadingFinished(), KisPart::instance(), KisAndroidUtils::looksLikeXiaomiDevice(), and showWelcomeScreen().

◆ adjustLayoutForWelcomePage()

void KisMainWindow::adjustLayoutForWelcomePage ( )
private

Definition at line 1733 of file KisMainWindow.cpp.

1734{
1735 // This makes sure we don't save window state when we're in welcome page mode, because all the dockers
1736 // etc are hidden while the user is here.
1738
1739 toggleDockersVisibility(false, true);
1740 if (statusBar()) {
1741 statusBar()->hide();
1742 }
1743 QList<QToolBar *> toolbars = findChildren<QToolBar *>();
1744 for (QToolBar *toolbar : toolbars) {
1745 if (toolbar->objectName() != "mainToolBar") {
1746 toolbar->hide();
1747 }
1748 }
1749}
void resetAutoSaveSettings()
void toggleDockersVisibility(bool visible, bool onWelcomePage=false)

References KisKMainWindow::resetAutoSaveSettings(), and toggleDockersVisibility().

◆ applyActionIconOverridesFromLocalXML()

void KisMainWindow::applyActionIconOverridesFromLocalXML ( )
private

Definition at line 3379 of file KisMainWindow.cpp.

3380{
3381 QString xmlPath = KoResourcePaths::locateLocal("data", "krita5.xmlgui");
3382 QFile file(xmlPath);
3383 if (!file.exists()) {
3384 return;
3385 }
3386
3387 QDomDocument doc;
3388 if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) {
3389 return;
3390 }
3391
3392 QDomNodeList overridesList = doc.elementsByTagName(QStringLiteral("ActionIconOverrides"));
3393 if (!overridesList.isEmpty()) {
3394 QDomElement overridesElement = overridesList.at(0).toElement();
3395 QDomNodeList actions = overridesElement.elementsByTagName(QStringLiteral("Action"));
3396 for (int i = 0; i < actions.count(); ++i) {
3397 QDomElement actionElement = actions.at(i).toElement();
3398 QString name = actionElement.attribute(QStringLiteral("name"));
3399 QString icon = actionElement.attribute(QStringLiteral("icon"));
3400 if (!name.isEmpty() && !icon.isEmpty()) {
3401 QAction *qa = actionCollection()->action(name);
3402 if (qa) {
3403 qa->setIcon(KisIconUtils::loadIcon(icon));
3404 }
3405 }
3406 }
3407 }
3408}
const char * name(StandardAction id)
QIcon loadIcon(const QString &name)

References KisKActionCollection::action(), KisKXMLGUIClient::actionCollection(), KisIconUtils::loadIcon(), and KoResourcePaths::locateLocal().

◆ applyToolBarLayout()

void KisMainWindow::applyToolBarLayout ( )
private

Definition at line 3234 of file KisMainWindow.cpp.

3235{
3236 Q_FOREACH (KisToolBar *toolBar, toolBars()) {
3237 toolBar->layout()->setSpacing(4);
3238 toolBar->setStyleSheet("QToolBar { border: none }"); // has a border in "Fusion" style that people don't like
3239
3240 // Hide text for buttons with an icon in the toolbar
3241 Q_FOREACH (QAction *ac, toolBar->actions()){
3242 if (ac->icon().pixmap(QSize(1,1)).isNull() == false){
3243 ac->setPriority(QAction::LowPriority);
3244 } else {
3245 ac->setIcon(QIcon());
3246 }
3247 }
3248 }
3249}
QList< KisToolBar * > toolBars() const

References KisKMainWindow::toolBar(), and KisKMainWindow::toolBars().

◆ borrowWorkspace()

QByteArray KisMainWindow::borrowWorkspace ( KisMainWindow * borrower)
private

Definition at line 2143 of file KisMainWindow.cpp.

2144{
2145 QByteArray currentWorkspace = saveState();
2146
2147 if (!d->workspaceBorrowedBy.isNull()) {
2148 if (other->id() == d->workspaceBorrowedBy) {
2149 // We're swapping our original workspace back
2150 d->workspaceBorrowedBy = QUuid();
2151 return currentWorkspace;
2152 } else {
2153 // Get our original workspace back before swapping with a third window
2154 KisMainWindow *borrower = KisPart::instance()->windowById(d->workspaceBorrowedBy);
2155 if (borrower) {
2156 QByteArray originalLayout = borrower->borrowWorkspace(this);
2157 borrower->restoreWorkspaceState(currentWorkspace);
2158
2159 d->workspaceBorrowedBy = other->id();
2160 return originalLayout;
2161 }
2162 }
2163 }
2164
2165 d->workspaceBorrowedBy = other->id();
2166 return currentWorkspace;
2167}
Main window for Krita.
bool restoreWorkspaceState(const QByteArray &state)
QByteArray borrowWorkspace(KisMainWindow *borrower)
KisMainWindow * windowById(QUuid id) const
Definition KisPart.cpp:478
KRITAWIDGETUTILS_EXPORT void saveState(QWidget *parent, const QString &dialogName)
saveState saves the state for the specified widgets

References borrowWorkspace(), d, id, KisPart::instance(), restoreWorkspaceState(), and KisPart::windowById().

◆ canvasDetached()

bool KisMainWindow::canvasDetached ( ) const

Definition at line 1040 of file KisMainWindow.cpp.

1041{
1042 return centralWidget() != d->widgetStack;
1043}

References d.

◆ canvasObservers()

QList< KoCanvasObserverBase * > KisMainWindow::canvasObservers ( ) const
overridevirtual

Implements KoCanvasSupervisor.

Definition at line 2611 of file KisMainWindow.cpp.

2612{
2614
2615 observers.append(static_cast<KoCanvasObserverBase*>(KisPart::instance()->playbackEngine()));
2616
2617 Q_FOREACH (QDockWidget *docker, dockWidgets()) {
2618 KoCanvasObserverBase *observer = dynamic_cast<KoCanvasObserverBase*>(docker);
2619 if (observer) {
2620 observers << observer;
2621 }
2622 else {
2623 warnKrita << docker << "is not a canvas observer";
2624 }
2625 }
2626
2627 return observers;
2628}
#define warnKrita
Definition kis_debug.h:94

References dockWidgets(), KisPart::instance(), and warnKrita.

◆ canvasWindow()

QWidget * KisMainWindow::canvasWindow ( ) const

The top-level window used for a detached canvas.

◆ checkActiveBundlesAvailable

bool KisMainWindow::checkActiveBundlesAvailable ( )
slot

checkActiveStorages checks whether there is at least one bundle available and at least one paintop preset.

Definition at line 3356 of file KisMainWindow.cpp.

3357{
3359 proxy.setSourceModel(KisStorageModel::instance());
3361 QStringList()
3363
3364 return (proxy.rowCount() > 0);
3365}
QList< QString > QStringList
static QString storageTypeToUntranslatedString(StorageType storageType)
@ ByStorageType
Pass a string list of storage types.
void setFilter(FilterType filterType, QVariant filter)
static KisStorageModel * instance()

References KisResourceStorage::Bundle, KisStorageFilterProxyModel::ByStorageType, KisStorageModel::instance(), KisStorageFilterProxyModel::setFilter(), and KisResourceStorage::storageTypeToUntranslatedString().

◆ checkPaintOpAvailable

bool KisMainWindow::checkPaintOpAvailable ( )
slot

◆ checkSanity

void KisMainWindow::checkSanity ( )
privateslot

Definition at line 3000 of file KisMainWindow.cpp.

3001{
3002 // print error if the lcms engine is not available
3003 if (!KoColorSpaceEngineRegistry::instance()->contains("icc")) {
3004 // need to wait 1 event since exiting here would not work.
3005 m_errorMessage = i18n("The Krita LittleCMS color management plugin is not installed. Krita will quit now.");
3006 m_dieOnError = true;
3007 QTimer::singleShot(0, this, SLOT(showErrorAndDie()));
3008 return;
3009 }
3010
3012
3013 // window is created signal (used in Python)
3014 // there must be some asynchronous things happening in the constructor, because the window cannot
3015 // be referenced until after this timeout is done
3017}
void slotStoragesWarning(const QString &location=QString())
void showErrorAndDie()
Quits Krita with error message from m_errorMessage.
QString m_errorMessage
void sigMainWindowCreated()
static KoColorSpaceEngineRegistry * instance()

References KoColorSpaceEngineRegistry::instance(), KisPart::instance(), m_dieOnError, m_errorMessage, showErrorAndDie(), KisPart::sigMainWindowCreated(), and slotStoragesWarning().

◆ clearRecentFiles

void KisMainWindow::clearRecentFiles ( )
slot

clears the list of the recent files

Definition at line 1076 of file KisMainWindow.cpp.

1077{
1079}
static KisRecentFilesManager * instance()

References KisRecentFilesManager::clear(), and KisRecentFilesManager::instance().

◆ closeCurrentWindow

void KisMainWindow::closeCurrentWindow ( )
privateslot

Definition at line 2992 of file KisMainWindow.cpp.

2993{
2994 if (d->mdiArea->currentSubWindow()) {
2995 d->mdiArea->currentSubWindow()->close();
2996 d->actionManager()->updateGUI();
2997 }
2998}

References d.

◆ closeEvent()

void KisMainWindow::closeEvent ( QCloseEvent * e)
overrideprotected

Definition at line 1575 of file KisMainWindow.cpp.

1576{
1577 if (hackIsSaving()) {
1578 e->setAccepted(false);
1579 return;
1580 }
1581
1582 if (!KisPart::instance()->closingSession()) {
1583 QAction *action= d->viewManager->actionCollection()->action("view_show_canvas_only");
1584 if ((action) && (action->isChecked())) {
1585 action->setChecked(false);
1586 }
1587
1588 // Save session when last window is closed
1589 if (KisPart::instance()->mainwindowCount() == 1) {
1590 bool closeAllowed = KisPart::instance()->closeSession();
1591
1592 if (!closeAllowed) {
1593 e->setAccepted(false);
1594 return;
1595 }
1596 }
1597 }
1598
1599 d->mdiArea->closeAllSubWindows();
1600
1601 QList<QMdiSubWindow*> childrenList = d->mdiArea->subWindowList();
1602
1603 if (childrenList.isEmpty()) {
1604 // TODO: that assignment looks really suspicious, because `e`
1605 // is destroyed right after the exit of this function
1606 d->deferredClosingEvent = e;
1607 d->canvasWindow->close();
1608 } else {
1609 e->setAccepted(false);
1610 }
1611}
bool hackIsSaving() const
bool closeSession(bool keepWindows=false)
Definition KisPart.cpp:380

References KisKXMLGUIClient::action(), KisPart::closeSession(), d, hackIsSaving(), and KisPart::instance().

◆ configChanged

void KisMainWindow::configChanged ( )
privateslot

Dirty workaround for a bug in Qt (checked on Qt 5.6.1):

If you make a window "Show on top" and then switch to the tabbed mode the window will continue to be painted in its initial "mid-screen" position. It will persist here until you explicitly switch to its tab.

Definition at line 2899 of file KisMainWindow.cpp.

2900{
2901 KisConfig cfg(true);
2902 QMdiArea::ViewMode viewMode = (QMdiArea::ViewMode)cfg.readEntry<int>("mdi_viewmode", (int)QMdiArea::TabbedView);
2903 d->mdiArea->setViewMode(viewMode);
2904 //Do it here to avoid the wrong icon briefly flashing
2906
2907 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
2908 subwin->setOption(QMdiSubWindow::RubberBandMove, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
2909 subwin->setOption(QMdiSubWindow::RubberBandResize, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
2910 if (viewMode == QMdiArea::TabbedView) {
2911 subwin->setWindowState(Qt::WindowMaximized);
2912 }
2913
2921 if (viewMode == QMdiArea::TabbedView) {
2922 Qt::WindowFlags oldFlags = subwin->windowFlags();
2923 Qt::WindowFlags flags = oldFlags;
2924
2925 flags &= ~Qt::WindowStaysOnTopHint;
2926 flags &= ~Qt::WindowStaysOnBottomHint;
2927
2928 if (flags != oldFlags) {
2929 subwin->setWindowFlags(flags);
2930 subwin->showMaximized();
2931 }
2932 }
2933 }
2934#ifdef Q_OS_MACOS
2936#endif
2937
2938 KConfigGroup group( KSharedConfig::openConfig(), "theme");
2939#ifndef Q_OS_HAIKU
2940 d->themeManager->setCurrentTheme(group.readEntry("Theme", "Krita dark"));
2941#endif
2942 d->actionManager()->updateGUI();
2943
2944 QString s = cfg.getMDIBackgroundColor();
2946 QBrush brush(c.toQColor());
2947 d->mdiArea->setBackground(brush);
2948
2949 QString backgroundImage = cfg.getMDIBackgroundImage();
2950 if (backgroundImage != "") {
2951 QImage image(backgroundImage);
2952 QBrush brush(image);
2953 d->mdiArea->setBackground(brush);
2954 }
2955
2956 d->mdiArea->update();
2957
2958 qApp->setFont(KisUiFont::normalFont());
2959
2960 Q_FOREACH (QObject* widget, children()) {
2961 if (widget->inherits("QDockWidget")) {
2962 QDockWidget* dw = static_cast<QDockWidget*>(widget);
2963 dw->setFont(KisUiFont::dockFont());
2964 }
2965 }
2966}
void updateSubwindowFlags()
static KoColor fromXML(const QDomElement &elt, const QString &channelDepthId)
Definition KoColor.cpp:350
void toQColor(QColor *c) const
a convenience method for the above.
Definition KoColor.cpp:198
QFont normalFont()
Gets a font for normal UI widgets to use.
Definition KisUiFont.cpp:81
QFont dockFont()
Gets a font with a smallish font size for dock widgets to use.
Definition KisUiFont.cpp:98

References customizeTabBar(), d, KisUiFont::dockFont(), KoColor::fromXML(), KisConfig::getMDIBackgroundColor(), KisConfig::getMDIBackgroundImage(), KisUiFont::normalFont(), KisConfig::readEntry(), KoColor::toQColor(), updateSubwindowFlags(), KisConfig::useOpenGL(), and KisKXMLGUIBuilder::widget().

◆ createActions()

void KisMainWindow::createActions ( )
private

Definition at line 3070 of file KisMainWindow.cpp.

3071{
3072 KisActionManager *actionManager = d->actionManager();
3073
3074
3075
3080 d->fullScreenMode = actionManager->createStandardAction(KStandardAction::FullScreen, this, SLOT(viewFullscreen(bool)));
3081
3082 d->recentFiles = KStandardAction::openRecent(this, SLOT(slotFileOpenRecent(QUrl)), actionCollection());
3083
3085 d->saveAction->setActivationFlags(KisAction::IMAGE_IS_WRITABLE);
3086
3088 d->saveActionAs->setActivationFlags(KisAction::ACTIVE_IMAGE);
3089
3091 d->undo->setActivationFlags(KisAction::ACTIVE_IMAGE);
3092
3094 d->redo->setActivationFlags(KisAction::ACTIVE_IMAGE);
3095
3096 d->undoActionsUpdateManager.reset(new KisUndoActionsUpdateManager(d->undo, d->redo));
3097 d->undoActionsUpdateManager->setCurrentDocument(d->activeView ? d->activeView->document() : 0);
3098
3099 d->importAnimation = actionManager->createAction("file_import_animation");
3100 connect(d->importAnimation, SIGNAL(triggered()), this, SLOT(importAnimation()));
3101
3102 // Importing video requires ffmpeg, which is not available on Android.
3103#ifndef Q_OS_ANDROID
3104 d->importVideoAnimation = actionManager->createAction("file_import_video_animation");
3105 connect(d->importVideoAnimation, SIGNAL(triggered()), this, SLOT(importVideoAnimation()));
3106#endif
3107
3108 d->renderAnimation = actionManager->createAction("render_animation");
3109 d->renderAnimation->setActivationFlags(KisAction::IMAGE_HAS_ANIMATION);
3110 connect( d->renderAnimation, SIGNAL(triggered()), this, SLOT(renderAnimation()));
3111
3112 d->renderAnimationAgain = actionManager->createAction("render_animation_again");
3113 d->renderAnimationAgain->setActivationFlags(KisAction::IMAGE_HAS_ANIMATION);
3114 connect( d->renderAnimationAgain, SIGNAL(triggered()), this, SLOT(renderAnimationAgain()));
3115
3116 d->closeAll = actionManager->createAction("file_close_all");
3117 connect(d->closeAll, SIGNAL(triggered()), this, SLOT(slotFileCloseAll()));
3118
3119 d->importFile = actionManager->createAction("file_import_file");
3120 d->importFile->setActivationFlags(KisAction::IMAGE_IS_WRITABLE);
3121 connect(d->importFile, SIGNAL(triggered(bool)), this, SLOT(slotImportFile()));
3122
3123 d->exportFile = actionManager->createAction("file_export_file");
3124 connect(d->exportFile, SIGNAL(triggered(bool)), this, SLOT(slotExportFile()));
3125
3126 d->exportFileAdvance = actionManager->createAction("file_export_advanced");
3127 connect(d->exportFileAdvance, SIGNAL(triggered(bool)), this, SLOT(slotExportAdvance()));
3128
3129 /* The following entry opens the document information dialog. Since the action is named so it
3130 intends to show data this entry should not have a trailing ellipses (...). */
3131 d->showDocumentInfo = actionManager->createAction("file_documentinfo");
3132 connect(d->showDocumentInfo, SIGNAL(triggered(bool)), this, SLOT(slotDocumentInfo()));
3133#ifndef Q_OS_HAIKU
3134 d->themeManager->setThemeMenuAction(new KActionMenu(i18nc("@action:inmenu", "&Themes"), this));
3135 d->themeManager->registerThemeActions(actionCollection());
3136 connect(d->themeManager, SIGNAL(signalThemeChanged()), this, SLOT(slotThemeChanged()), Qt::QueuedConnection);
3137 connect(this, SIGNAL(themeChanged()), d->welcomePage, SLOT(slotUpdateThemeColors()), Qt::UniqueConnection);
3138#endif
3139 d->toggleDockers = actionManager->createAction("view_toggledockers");
3140
3141
3142 KisConfig(true).showDockers(true);
3143 d->toggleDockers->setChecked(true);
3144 connect(d->toggleDockers, SIGNAL(toggled(bool)), SLOT(toggleDockersVisibility(bool)));
3145
3146 d->resetConfigurations = actionManager->createAction("reset_configurations");
3147 connect(d->resetConfigurations, SIGNAL(triggered()), this, SLOT(slotResetConfigurations()));
3148
3149#ifndef Q_OS_ANDROID
3150 d->toggleDetachCanvas = actionManager->createAction("view_detached_canvas");
3151 d->toggleDetachCanvas->setChecked(false);
3152 connect(d->toggleDetachCanvas, SIGNAL(toggled(bool)), SLOT(setCanvasDetached(bool)));
3153#endif
3154 setCanvasDetached(false);
3155
3156 d->toggleDockerTitleBars = actionManager->createAction("view_toggledockertitlebars");
3157 d->toggleDockerTitleBars->setChecked(KisConfig(false).showDockerTitleBars());
3158 connect(d->toggleDockerTitleBars, SIGNAL(toggled(bool)), SLOT(showDockerTitleBars(bool)));
3159
3160 actionCollection()->addAction("settings_dockers_menu", d->dockWidgetMenu);
3161 actionCollection()->addAction("window", d->windowMenu);
3162
3163 actionCollection()->addAction("style_menu", d->styleMenu); // for widget styles: breeze, fusion, etc
3164
3165 d->mdiCascade = actionManager->createAction("windows_cascade");
3166 connect(d->mdiCascade, SIGNAL(triggered()), d->mdiArea, SLOT(cascadeSubWindows()));
3167
3168 d->mdiTile = actionManager->createAction("windows_tile");
3169 connect(d->mdiTile, SIGNAL(triggered()), d->mdiArea, SLOT(tileSubWindows()));
3170
3171 d->mdiNextWindow = actionManager->createAction("windows_next");
3172 connect(d->mdiNextWindow, SIGNAL(triggered()), d->mdiArea, SLOT(activateNextSubWindow()));
3173
3174 d->mdiPreviousWindow = actionManager->createAction("windows_previous");
3175 connect(d->mdiPreviousWindow, SIGNAL(triggered()), d->mdiArea, SLOT(activatePreviousSubWindow()));
3176
3177#ifdef Q_OS_ANDROID
3178 d->showDonationManagementDialog = actionManager->createAction("manage_donations");
3179 connect(d->showDonationManagementDialog,
3180 &QAction::triggered,
3181 this,
3182 &KisMainWindow::slotShowDonationManagementDialog);
3183
3185 if (androidDonations) {
3186 d->manageSubscriptions = actionManager->createAction("manage_subscriptions");
3187 connect(d->manageSubscriptions,
3188 &QAction::triggered,
3189 androidDonations,
3191 connect(androidDonations,
3193 this,
3194 &KisMainWindow::slotShowDonationManagementDialog,
3195 Qt::QueuedConnection);
3196 }
3197#if KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
3199 if (androidScaling && androidScaling->isSupported()) {
3200 d->changeInterfaceScale = actionManager->createAction("change_interface_scale");
3201 connect(d->changeInterfaceScale, &QAction::triggered, this, &KisMainWindow::slotChangeInterfaceScale);
3202 }
3203#endif
3204#else
3205 d->newWindow = actionManager->createAction("view_newwindow");
3206 connect(d->newWindow, SIGNAL(triggered(bool)), this, SLOT(newWindow()));
3207#endif
3208
3210
3211 d->showSessionManager = actionManager->createAction("file_sessions");
3212 connect(d->showSessionManager, SIGNAL(triggered(bool)), this, SLOT(slotShowSessionManager()));
3213
3214 d->commandBarAction = actionManager->createAction("command_bar_open");
3215 connect(d->commandBarAction, SIGNAL(triggered(bool)), this, SLOT(openCommandBar()));
3216
3218
3219 for (int i = 0; i < 2; i++) {
3220 d->expandingSpacers[i] = new KisAction(i18n("Expanding Spacer"));
3221 d->expandingSpacers[i]->setDefaultWidget(new QWidget(this));
3222 d->expandingSpacers[i]->defaultWidget()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
3223 actionManager->addAction(QString("expanding_spacer_%1").arg(i), d->expandingSpacers[i]);
3224 }
3225
3226 {
3227 using namespace KisWidgetConnectionUtils;
3228
3229 QAction *action = actionManager->createAction("lock_toolbars");
3231 }
3232}
A KisActionManager class keeps track of KisActions. These actions are always associated with the GUI....
KisAction * createAction(const QString &name)
void addAction(const QString &name, KisAction *action)
KisAction * createStandardAction(KStandardAction::StandardAction, const QObject *receiver, const char *member)
@ ACTIVE_IMAGE
Activate if there is at least one image.
Definition kis_action.h:43
@ IMAGE_IS_WRITABLE
Activate KisDocument::isReadWrite() is active.
Definition kis_action.h:62
@ IMAGE_HAS_ANIMATION
Activate if the image has an animation.
Definition kis_action.h:58
static KisAndroidDonations * instance()
void sigShowDonationManagementDialogRequested()
bool isSupported() const
bool showDockers(bool defaultValue=false) const
KisActionManager * actionManager()
void setCanvasDetached(bool detached)
KisAction * newWindow
void slotConfigureToolbars()
KisAction * renderAnimation
void slotShowSessionManager()
void slotResetConfigurations()
KisAction * renderAnimationAgain
void slotPreferences()
slotPreferences open the preferences dialog
void slotFileOpenRecent(const QUrl &)
void slotFileOpen(bool isImporting=false)
KisAction * undo
void slotChangeInterfaceScale()
void viewFullscreen(bool fullScreen)
void showDockerTitleBars(bool show)
KisAction * importAnimation
KisAction * importVideoAnimation
KisAction * redo
static KisToolBarStateModel * toolBarStateModel()
KRecentFilesAction * openRecent(const QObject *recvr, const char *slot, QObject *parent)
void connectControl(KisCompositeOpListWidget *widget, QObject *source, const char *property)

References KisKXMLGUIClient::action(), KisKXMLGUIClient::actionCollection(), actionManager(), KisAction::ACTIVE_IMAGE, KisActionManager::addAction(), KisKActionCollection::addAction(), KStandardAction::Close, closeCurrentWindow(), KStandardAction::ConfigureToolbars, KisActionManager::createAction(), KisActionManager::createStandardAction(), d, KStandardAction::FullScreen, KisAction::IMAGE_HAS_ANIMATION, KisAction::IMAGE_IS_WRITABLE, importAnimation, importVideoAnimation, KisAndroidDonations::instance(), KisAndroidScaling::instance(), KisAndroidScaling::isSupported(), KStandardAction::New, newWindow, KStandardAction::Open, openCommandBar(), KStandardAction::openRecent(), KStandardAction::Preferences, KStandardAction::Quit, redo, KStandardAction::Redo, renderAnimation, renderAnimationAgain, KStandardAction::Save, KStandardAction::SaveAs, setCanvasDetached(), KisConfig::showDockers(), showDockerTitleBars(), KisAndroidDonations::sigShowDonationManagementDialogRequested(), slotChangeInterfaceScale(), slotConfigureToolbars(), slotDocumentInfo(), slotExportAdvance(), slotExportFile(), slotFileCloseAll(), slotFileNew(), slotFileOpen(), slotFileOpenRecent(), slotFileQuit(), slotFileSave(), slotFileSaveAs(), slotImportFile(), KisAndroidDonations::slotManageSubscriptions(), slotPreferences(), slotResetConfigurations(), slotShowSessionManager(), slotThemeChanged(), themeChanged(), toggleDockersVisibility(), KisToolBar::toolBarStateModel(), undo, KStandardAction::Undo, and viewFullscreen().

◆ createDockWidget()

QDockWidget * KisMainWindow::createDockWidget ( KoDockFactoryBase * factory)
private

Returns the dockwidget specified by the factory. If the dock widget doesn't exist yet it's created. Add a "view_palette_action_menu" action to your view menu if you want to use closable dock widgets.

Parameters
factorythe factory used to create the dock widget if needed
Returns
the dock widget specified by factory (may be 0)

Definition at line 2465 of file KisMainWindow.cpp.

2466{
2467 QDockWidget* dockWidget = 0;
2468 const bool showTitlebars = KisConfig(false).showDockerTitleBars();
2469
2470 if (!d->dockWidgetsMap.contains(factory->id())) {
2471 KisScopedPerformanceLogger perfLog(QStringLiteral("KisMainWindow::createDockWidget(%1)").arg(factory->id()));
2472 dockWidget = factory->createDockWidget();
2473 KAcceleratorManager::setNoAccel(dockWidget);
2474
2475 // It is quite possible that a dock factory cannot create the dock; don't
2476 // do anything in that case.
2477 if (!dockWidget) {
2478 warnKrita << "Could not create docker for" << factory->id();
2479 return 0;
2480 }
2481
2482 KoDockWidgetTitleBar *titleBar = dynamic_cast<KoDockWidgetTitleBar*>(dockWidget->titleBarWidget());
2483
2484 // Check if the dock widget is supposed to be collapsible
2485 if (!dockWidget->titleBarWidget()) {
2486 titleBar = new KoDockWidgetTitleBar(dockWidget);
2487 dockWidget->setTitleBarWidget(titleBar);
2488 }
2489 if (titleBar) {
2490 titleBar->setFont(KisUiFont::dockFont());
2491 }
2492
2493 if (dockWidget->titleBarWidget() && !dockWidget->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2494 dockWidget->titleBarWidget()->setVisible(KisConfig(true).showDockerTitleBars());
2495 }
2496
2497 dockWidget->setObjectName(factory->id());
2498 dockWidget->setParent(this);
2499 if (!showTitlebars) {
2500 if (dockWidget->titleBarWidget() && !dockWidget->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2501 dockWidget->titleBarWidget()->setVisible(false);
2502 }
2503 dockWidget->setFeatures(QDockWidget::NoDockWidgetFeatures);
2504 }
2505 if (dockWidget->widget() && dockWidget->widget()->layout())
2506 dockWidget->widget()->layout()->setContentsMargins(1, 1, 1, 1);
2507
2508 Qt::DockWidgetArea side = Qt::RightDockWidgetArea;
2509 bool visible = true;
2510
2511 switch (factory->defaultDockPosition()) {
2513 dockWidget->setFloating(true); // position nicely?
2514 break;
2516 side = Qt::TopDockWidgetArea; break;
2518 side = Qt::LeftDockWidgetArea; break;
2520 side = Qt::BottomDockWidgetArea; break;
2522 side = Qt::RightDockWidgetArea; break;
2524 default:
2525 side = Qt::RightDockWidgetArea;
2526 visible = false;
2527 }
2528
2529 KConfigGroup group = d->windowStateConfig.group("DockWidget " + factory->id());
2530 side = static_cast<Qt::DockWidgetArea>(group.readEntry("DockArea", static_cast<int>(side)));
2531 if (side == Qt::NoDockWidgetArea) side = Qt::RightDockWidgetArea;
2532
2533 addDockWidget(side, dockWidget);
2534 if (!visible) {
2535 dockWidget->hide();
2536 }
2537
2538 bool locked = group.readEntry("Locked", false);
2539 if (titleBar && locked) {
2540 titleBar->setLocked(true);
2541 }
2542 else if ( dockWidget->titleBarWidget()->inherits("KisUtilityTitleBar") && locked){
2543 KisUtilityTitleBar *utilityTitleBar = dynamic_cast<KisUtilityTitleBar*>(dockWidget->titleBarWidget());
2544 utilityTitleBar->setLocked(true);
2545 }
2546
2547 d->dockWidgetsMap.insert(factory->id(), dockWidget);
2548 }
2549 else {
2550 dockWidget = d->dockWidgetsMap[factory->id()];
2551 }
2552
2553#ifdef Q_OS_MACOS
2554 dockWidget->setAttribute(Qt::WA_MacSmallSize, true);
2555#endif
2556 dockWidget->setFont(KisUiFont::dockFont());
2557
2558 connect(dockWidget, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(forceDockTabFonts()));
2559
2560 return dockWidget;
2561}
bool showDockerTitleBars(bool defaultValue=false) const
QDockWidget * dockWidget(const QString &id)
A special utility titlebar with a title and controls, as well as a central area for adding frequently...
@ DockRight
Right of the centra widget.
@ DockTop
Above the central widget.
@ DockBottom
Below the central widget.
@ DockMinimized
Not docked, but reachable via the menu.
@ DockLeft
Left of the centra widget.
@ DockTornOff
Floating as its own top level window.
A custom title bar for dock widgets.

References d, KoDockFactoryBase::DockBottom, KisUiFont::dockFont(), KoDockFactoryBase::DockLeft, KoDockFactoryBase::DockMinimized, KoDockFactoryBase::DockRight, KoDockFactoryBase::DockTop, KoDockFactoryBase::DockTornOff, dockWidget(), KisKXMLGUIClient::factory(), forceDockTabFonts(), KisUtilityTitleBar::setLocked(), KoDockWidgetTitleBar::setLocked(), KisConfig::showDockerTitleBars(), showDockerTitleBars(), and warnKrita.

◆ createPopupMenu()

QMenu * KisMainWindow::createPopupMenu ( )
override

Definition at line 728 of file KisMainWindow.cpp.

729{
730 return 0;
731}

◆ customizeTabBar()

void KisMainWindow::customizeTabBar ( )
private

Definition at line 998 of file KisMainWindow.cpp.

999{
1000 // update MDI area theme
1001 // Tab close button override
1002 // just switch this icon out for all OSs so it is easier to see
1003 QString closeButtonImageUrl;
1004 QString closeButtonHoverColor;
1006 closeButtonImageUrl = QStringLiteral(":/dark_close-tab.svg");
1007 closeButtonHoverColor = QStringLiteral("lightcoral");
1008 } else {
1009 closeButtonImageUrl = QStringLiteral(":/light_close-tab.svg");
1010 closeButtonHoverColor = QStringLiteral("darkred");
1011 }
1012 QString tabStyleSheet = QStringLiteral(R"(
1013 QTabBar::close-button {
1014 image: url(%1);
1015 padding: 1.5px;
1016 border-radius: 3px;
1017 }
1018 QTabBar::close-button:hover {
1019 background-color: %2;
1020 }
1021 QTabBar::close-button:pressed {
1022 background-color: red;
1023 }
1024
1025 QHeaderView::section {
1026 padding: 7px;
1027 }
1028
1029 )")
1030 .arg(closeButtonImageUrl, closeButtonHoverColor);
1031
1032
1033 QTabBar* tabBar = d->findTabBarHACK();
1034 if (tabBar) {
1035 tabBar->setStyleSheet(tabStyleSheet);
1036 }
1037
1038}

References d, and KisIconUtils::useDarkIcons().

◆ dockWidget()

QDockWidget * KisMainWindow::dockWidget ( const QString & id)

Definition at line 2605 of file KisMainWindow.cpp.

2606{
2607 if (!d->dockWidgetsMap.contains(id)) return 0;
2608 return d->dockWidgetsMap[id];
2609}

References d, and id.

◆ dockWidgets()

QList< QDockWidget * > KisMainWindow::dockWidgets ( ) const

Return the list of dock widgets belonging to this main window.

Definition at line 2600 of file KisMainWindow.cpp.

2601{
2602 return d->dockWidgetsMap.values();
2603}

References d.

◆ documentSaved

void KisMainWindow::documentSaved ( )
signal

This signal is emitted if the document has been saved successfully.

◆ dragLeave()

void KisMainWindow::dragLeave ( )
private

Definition at line 1805 of file KisMainWindow.cpp.

1806{
1807 if (d->tabSwitchCompressor->isActive()) {
1808 d->tabSwitchCompressor->stop();
1809 }
1810}

References d.

◆ dragLeaveEvent()

void KisMainWindow::dragLeaveEvent ( QDragLeaveEvent * event)
overrideprotected

Definition at line 1666 of file KisMainWindow.cpp.

1667{
1668 dragLeave();
1669 event->accept();
1670}

References dragLeave().

◆ dragMove()

void KisMainWindow::dragMove ( QDragMoveEvent * event)
private

Definition at line 1783 of file KisMainWindow.cpp.

1784{
1785 QTabBar *tabBar = d->findTabBarHACK();
1786
1787 if (!tabBar && d->mdiArea->viewMode() == QMdiArea::TabbedView) {
1788 qWarning() << "WARNING!!! Cannot find QTabBar in the main window! Looks like Qt has changed behavior. Drag & Drop between multiple tabs might not work properly (tabs will not switch automatically)!";
1789 }
1790
1791 if (tabBar && tabBar->isVisible()) {
1792 QPoint pos = tabBar->mapFromGlobal(mapToGlobal(event->pos()));
1793 if (tabBar->rect().contains(pos)) {
1794 const int tabIndex = tabBar->tabAt(pos);
1795
1796 if (tabIndex >= 0 && tabBar->currentIndex() != tabIndex) {
1797 d->tabSwitchCompressor->start(tabIndex);
1798 }
1799 } else if (d->tabSwitchCompressor->isActive()) {
1800 d->tabSwitchCompressor->stop();
1801 }
1802 }
1803}
bool event(QEvent *event) override

References d, and KXmlGuiWindow::event().

◆ dragMoveEvent()

void KisMainWindow::dragMoveEvent ( QDragMoveEvent * event)
overrideprotected

Definition at line 1660 of file KisMainWindow.cpp.

1661{
1662 dragMove(event);
1663 event->accept();
1664}
void dragMove(QDragMoveEvent *event)

References dragMove(), and KXmlGuiWindow::event().

◆ findTabBarHACK()

QTabBar * KisMainWindow::findTabBarHACK ( )
inline

Definition at line 336 of file KisMainWindow.cpp.

336 {
337 QObjectList objects = mdiArea->children();
338 Q_FOREACH (QObject *object, objects) {
339 QTabBar *bar = qobject_cast<QTabBar*>(object);
340 if (bar) {
341 return bar;
342 }
343 }
344 return 0;
345 }
QMdiArea * mdiArea

◆ forceDockTabFonts

void KisMainWindow::forceDockTabFonts ( )
privateslot

Definition at line 2563 of file KisMainWindow.cpp.

2564{
2565 Q_FOREACH (QObject *child, children()) {
2566 if (child->inherits("QTabBar")) {
2567 ((QTabBar *)child)->setFont(KisUiFont::dockFont());
2568 }
2569 }
2570}

References KisUiFont::dockFont().

◆ guiLoadingFinished

void KisMainWindow::guiLoadingFinished ( )
signal

◆ hackIsSaving()

bool KisMainWindow::hackIsSaving ( ) const

Shows if the main window is saving anything right now. If the user presses Ctrl+W too fast, then the document can be close before the saving is completed. I'm not sure if it is fixable in any way without avoiding using processEvents() everywhere (DK)

Don't use it unless you have no option.

Definition at line 1285 of file KisMainWindow.cpp.

1286{
1287 std::unique_lock<QMutex> l(d->savingEntryMutex, std::try_to_lock);
1288 return !l.owns_lock();
1289}

References d.

◆ id()

QUuid KisMainWindow::id ( ) const

◆ importAnimation

void KisMainWindow::importAnimation ( )
privateslot

◆ importVideoAnimation

void KisMainWindow::importVideoAnimation ( )
privateslot

◆ initializeGeometry

void KisMainWindow::initializeGeometry ( )
privateslot

Definition at line 3251 of file KisMainWindow.cpp.

3252{
3253 // if the user didn's specify the geometry on the command line (does anyone do that still?),
3254 // we first figure out some good default size and restore the x,y position. See bug 285804Z.
3255 KConfigGroup cfg = d->windowStateConfig;
3256 QByteArray geom = QByteArray::fromBase64(cfg.readEntry("ko_geometry", QByteArray()));
3257 if (!restoreGeometry(geom)) {
3258 QRect desk = this->screen()->availableGeometry();
3259
3260 quint32 x = desk.x();
3261 quint32 y = desk.y();
3262 quint32 w = 0;
3263 quint32 h = 0;
3264
3265 // Default size -- maximize on small screens, something useful on big screens
3266 const int deskWidth = desk.width();
3267 if (deskWidth > 1024) {
3268 // a nice width, and slightly less than total available
3269 // height to compensate for the window decs
3270 w = (deskWidth / 3) * 2;
3271 h = (desk.height() / 3) * 2;
3272 }
3273 else {
3274 w = desk.width();
3275 h = desk.height();
3276 }
3277
3278 x += (desk.width() - w) / 2;
3279 y += (desk.height() - h) / 2;
3280
3281 move(x,y);
3282 setGeometry(geometry().x(), geometry().y(), w, h);
3283 }
3284#ifdef Q_OS_ANDROID
3285 // We handle full-screening differently on Android, see viewFullScreen.
3287#else
3288 bool fullScreen = isFullScreen();
3289#endif
3290 d->fullScreenMode->setChecked(fullScreen);
3291}
KToggleFullScreenAction * fullScreen(const QObject *recvr, const char *slot, QWidget *window, QObject *parent)

References d, and KisAndroidUtils::isInFullScreen().

◆ installBundle()

bool KisMainWindow::installBundle ( const QString & fileName) const

Copy the given file into the bundle directory.

Definition at line 1291 of file KisMainWindow.cpp.

1292{
1293 QFileInfo from(fileName);
1294 QFileInfo to(QStringLiteral("%1/%2").arg(KoResourcePaths::getAppDataLocation(), from.fileName()));
1295 if (to.exists()) {
1296 QFile::remove(to.canonicalFilePath());
1297 }
1298 return QFile::copy(fileName, to.absoluteFilePath());
1299}
static QString getAppDataLocation()

References KoResourcePaths::getAppDataLocation().

◆ keyBindingsChanged

void KisMainWindow::keyBindingsChanged ( )
signal

This signal is emitted when the shortcut key configuration has changed.

◆ layoutThumbnail()

QImage KisMainWindow::layoutThumbnail ( )

layoutThumbnail

Returns
image for the workspaces.

Definition at line 1301 of file KisMainWindow.cpp.

1302{
1303 int size = 256;
1304 qreal scale = qreal(size)/qreal(qMax(geometry().width(), geometry().height()));
1305 QImage layoutThumbnail = QImage(qRound(geometry().width()*scale), qRound(geometry().height()*scale), QImage::Format_ARGB32);
1306 QPainter gc(&layoutThumbnail);
1307 gc.fillRect(0, 0, layoutThumbnail.width(), layoutThumbnail.height(), this->palette().dark());
1308
1309 Q_FOREACH(const QObject *child, children()) {
1310 if (child->isWidgetType()) {
1311 const QWidget *w = static_cast<const QWidget *>(child);
1312
1313 if (w->isVisible() && !w->property("_kis_excludeFromLayoutThumbnail").toBool()) {
1314 QRect wRect = QRectF(w->geometry().x()*scale
1315 , w->geometry().y()*scale
1316 , w->geometry().width()*scale
1317 , w->geometry().height()*scale
1318 ).toRect();
1319
1320 wRect = wRect.intersected(layoutThumbnail.rect().adjusted(-1, -1, -1, -1));
1321
1322 gc.setBrush(this->palette().window());
1323 if (w == d->widgetStack) {
1324 gc.setBrush(d->mdiArea->background());
1325 }
1326 gc.setPen(this->palette().windowText().color());
1327 gc.drawRect(wRect);
1328 }
1329 }
1330 }
1331 gc.end();
1332 return layoutThumbnail;
1333}
QImage layoutThumbnail()
layoutThumbnail

References d, and layoutThumbnail().

◆ loadCompleted

void KisMainWindow::loadCompleted ( )
signal

This signal is emitted when this windows has finished loading of a document. The document may be opened in another window in the end. In this case, the signal means there is no link between the window and the document anymore.

◆ newOptionWidgets

void KisMainWindow::newOptionWidgets ( KoCanvasController * controller,
const QList< QPointer< QWidget > > & optionWidgetList )
slot

Update the option widgets to the argument ones, removing the currently set widgets.

Definition at line 3042 of file KisMainWindow.cpp.

3043{
3044 KIS_ASSERT_RECOVER_NOOP(controller == KoToolManager::instance()->activeCanvasController());
3045 bool isOurOwnView = false;
3046
3047 Q_FOREACH (QPointer<KisView> view, KisPart::instance()->views()) {
3048 if (view && view->canvasController() == controller) {
3049 isOurOwnView = view->mainWindow() == this;
3050 }
3051 }
3052
3053 if (!isOurOwnView) return;
3054
3055 Q_FOREACH (QWidget *w, optionWidgetList) {
3056#ifdef Q_OS_MACOS
3057 w->setAttribute(Qt::WA_MacSmallSize, true);
3058#endif
3059 w->setFont(KisUiFont::dockFont());
3060 }
3061
3062 if (d->toolOptionsDocker) {
3063 d->toolOptionsDocker->setOptionWidgets(optionWidgetList);
3064 }
3065 else {
3066 d->viewManager->paintOpBox()->newOptionWidgets(optionWidgetList);
3067 }
3068}
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97

References d, KisUiFont::dockFont(), KoToolManager::instance(), KisPart::instance(), and KIS_ASSERT_RECOVER_NOOP.

◆ newView

KisView * KisMainWindow::newView ( QObject * document,
QMdiSubWindow * subWindow = 0 )
slot

Definition at line 2968 of file KisMainWindow.cpp.

2969{
2970 KisDocument *doc = qobject_cast<KisDocument*>(document);
2971 KisView *view = addViewAndNotifyLoadingCompleted(doc, subWindow);
2972 d->actionManager()->updateGUI();
2973
2974 return view;
2975}
KisView * addViewAndNotifyLoadingCompleted(KisDocument *document, QMdiSubWindow *subWindow=0)

References addViewAndNotifyLoadingCompleted(), and d.

◆ newWindow

void KisMainWindow::newWindow ( )
privateslot

◆ notifyChildViewDestroyed

void KisMainWindow::notifyChildViewDestroyed ( KisView * view)
slot

If we are the last view of the window, Qt will not activate another tab before destroying tab/window. In this case we should clear all the dangling pointers manually by setting the current view to null

Definition at line 759 of file KisMainWindow.cpp.

760{
767 if (view->canvasBase() == viewManager()->canvasBase()) {
769 }
770}
void removeTrackedCanvas(KisCanvas2 *canvas)
void setCurrentView(KisView *view)

References KisView::canvasBase(), KisViewManager::inputManager(), KisInputManager::removeTrackedCanvas(), KisViewManager::setCurrentView(), and viewManager.

◆ openCommandBar

void KisMainWindow::openCommandBar ( )
privateslot

Definition at line 2058 of file KisMainWindow.cpp.

2059{
2060 QList<KisKActionCollection *> actionCollections;
2061
2062 auto clients = guiFactory()->clients();
2063 int actionsCount = 0;
2064 for (const KisKXMLGUIClient *c : clients) {
2065 if (!c) {
2066 continue;
2067 }
2068 if (auto collection = c->actionCollection()) {
2069 actionCollections.append(collection);
2070 actionsCount += collection->count();
2071 }
2072 }
2073
2074 if (activeKisView()) {
2075 KisKActionCollection *layerActionCollection = new KisKActionCollection(0, "layeractions (disposable)");
2076 layerActionCollection->setComponentDisplayName(i18n("Layers/Masks"));
2077 KisNodeActivationActionCreatorVisitor v(layerActionCollection, viewManager()->nodeManager());
2078 activeKisView()->image()->rootLayer()->accept(v);
2079 actionCollections.append(layerActionCollection);
2080 actionsCount += layerActionCollection->count();
2081 }
2082
2083 d->commandBar->updateBar(actionCollections, actionsCount);
2084
2085 // The following line is needed to work around input method not working
2086 // on Windows.
2087 // See https://bugs.kde.org/show_bug.cgi?id=395598
2088 // and https://bugs.kde.org/show_bug.cgi?id=438122
2089 d->commandBar->activateWindow();
2090
2091 // The following line is present in Kate's version and was ported over
2092 // but I am sceptical of its use. I worry that it may subtly cause other
2093 // issues, and since the command bar appears to work fine without it, I
2094 // believe it may be better to leave it out. -- Alvin
2095 // centralWidget()->setFocusProxy(d->commandBar);
2096}
qreal v
void setComponentDisplayName(const QString &displayName)
QList< KisKXMLGUIClient * > clients() const
QPointer< KisView > activeKisView()

References activeKisView(), KisKXMLGUIFactory::clients(), KisKActionCollection::count(), d, KXmlGuiWindow::guiFactory(), KisKActionCollection::setComponentDisplayName(), v, and viewManager.

◆ openDocument()

bool KisMainWindow::openDocument ( const QString & path,
OpenFlags flags )

Load the desired document and show it.

Parameters
urlthe URL to open
Returns
TRUE on success.

Definition at line 1112 of file KisMainWindow.cpp.

1113{
1114 ScopedWidgetDisabler disabler(d->welcomePage->dropFrameBorder);
1115 QApplication::processEvents(); // make UI more responsive
1116
1117 if (!QFile(path).exists()) {
1118 if (!(flags & BatchMode)) {
1119 QMessageBox::critical(qApp->activeWindow(), i18nc("@title:window", "Krita"), i18n("The file %1 does not exist.", path));
1120 }
1121 KisRecentFilesManager::instance()->remove(QUrl::fromLocalFile(path)); //remove the file from the recent-opened-file-list
1122 return false;
1123 }
1124 return openDocumentInternal(path, flags);
1125}
bool openDocumentInternal(const QString &path, KisMainWindow::OpenFlags f=KisMainWindow::OpenFlags())
void remove(const QUrl &url)

References BatchMode, d, KisRecentFilesManager::instance(), openDocumentInternal(), and KisRecentFilesManager::remove().

◆ openDocumentInternal()

bool KisMainWindow::openDocumentInternal ( const QString & path,
KisMainWindow::OpenFlags f = KisMainWindow::OpenFlags() )
private

Definition at line 1127 of file KisMainWindow.cpp.

1128{
1129 if (!QFile(path).exists()) {
1130 qWarning() << "KisMainWindow::openDocumentInternal. Could not open:" << path;
1131 return false;
1132 }
1133
1135
1136 if (flags & BatchMode) {
1137 newdoc->setFileBatchMode(true);
1138 }
1139
1140 d->firstTime = true;
1141 connect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
1142 connect(newdoc, SIGNAL(canceled(QString)), this, SLOT(slotLoadCanceled(QString)));
1143
1144 KisDocument::OpenFlags openFlags = KisDocument::None;
1145 // XXX: Why this duplication of OpenFlags...
1146 if (flags & RecoveryFile) {
1147 openFlags |= KisDocument::RecoveryFile;
1148 }
1149
1150 bool openRet = !(flags & Import) ? newdoc->openPath(path, openFlags) : newdoc->importDocument(path);
1151
1152 if (!openRet) {
1153 delete newdoc;
1154 return false;
1155 }
1156
1157 KisPart::instance()->addDocument(newdoc);
1158
1159 // Try to determine whether this was an unnamed autosave
1160 if (flags & RecoveryFile &&
1161 ( path.startsWith(QDir::tempPath())
1162 || path.startsWith(QDir::homePath())
1163 ) &&
1164 ( QFileInfo(path).fileName().startsWith(".krita")
1165 || QFileInfo(path).fileName().startsWith("krita")
1166 )
1167 )
1168 {
1169 QString path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
1170 if (!QFileInfo(path).exists()) {
1171 path = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
1172 }
1173 newdoc->setPath(path + "/" + newdoc->objectName() + ".kra");
1174 }
1175
1176 return true;
1177}
void setFileBatchMode(const bool batchMode)
void setPath(const QString &path)
bool importDocument(const QString &path)
bool openPath(const QString &path, OpenFlags flags=None)
openPath Open a Path
void slotLoadCanceled(const QString &)
void addDocument(KisDocument *document, bool notify=true)
Definition KisPart.cpp:209
KisDocument * createDocument() const
Definition KisPart.cpp:228

References KisPart::addDocument(), BatchMode, KisPart::createDocument(), d, Import, KisDocument::importDocument(), KisPart::instance(), KisDocument::None, KisDocument::openPath(), KisDocument::RecoveryFile, RecoveryFile, KisDocument::setFileBatchMode(), KisDocument::setPath(), slotLoadCanceled(), and slotLoadCompleted().

◆ orientationChanged

void KisMainWindow::orientationChanged ( )
privateslot

Definition at line 3317 of file KisMainWindow.cpp.

3318{
3319 QScreen *screen = QGuiApplication::primaryScreen();
3320
3321 for (QWindow* window: QGuiApplication::topLevelWindows()) {
3322 // Android: we shouldn't transform Window managers independent of its child
3323 if ((window->type() == Qt::Popup)
3324 && (window->flags() & Qt::FramelessWindowHint) == 0
3325 && (window->geometry().topLeft() != QPoint(0, 0))) {
3326 // We are using reversed values. Because geometry returned is not the updated
3327 // one, but the previous one.
3328 int screenHeight = screen->geometry().width();
3329 int screenWidth = screen->geometry().height();
3330
3331 // scaling
3332 int new_x = (window->position().x() * screenWidth) / screenHeight;
3333 int new_y = (window->position().y() * screenHeight) / screenWidth;
3334
3335 // window width or height shouldn't change
3336 int winWidth = window->geometry().width();
3337 int winHeight = window->geometry().height();
3338
3339 // Try best to not let the window go beyond screen.
3340 if (new_x > screenWidth - winWidth) {
3341 new_x = screenWidth - winWidth;
3342 if (new_x < 0)
3343 new_x = 0;
3344 }
3345 if (new_y > screenHeight - winHeight) {
3346 new_y = screenHeight - winHeight;
3347 if (new_y < 0)
3348 new_y = 0;
3349 }
3350
3351 window->setPosition(QPoint(new_x, new_y));
3352 }
3353 }
3354}

◆ Private()

KisMainWindow::Private ( KisMainWindow * parent,
QUuid id )
inline

Definition at line 193 of file KisMainWindow.cpp.

194 : q(parent)
195 , id(id)
196 , styleMenu(new KActionMenu(i18nc("@action:inmenu", "Styles"), parent))
197 , dockWidgetMenu(new KActionMenu(i18nc("@action:inmenu", "&Dockers"), parent))
198 , windowMenu(new KActionMenu(i18nc("@action:inmenu", "&Window"), parent))
199 , documentMenu(new KActionMenu(i18nc("@action:inmenu", "New &View"), parent))
200 , workspaceMenu(new KActionMenu(i18nc("@action:inmenu", "Wor&kspace"), parent))
201 , welcomePage(new KisWelcomePageWidget(parent))
202 , widgetStack(new QStackedWidget(parent))
203 , mdiArea(new QMdiArea(parent))
204 , windowMapper(new KisSignalMapper(parent))
205 , documentMapper(new KisSignalMapper(parent))
206 {
207 if (id.isNull()) this->id = QUuid::createUuid();
208
209 welcomeScroller = new QScrollArea();
210 welcomeScroller->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
211 welcomeScroller->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
212 welcomeScroller->setWidget(welcomePage);
213 welcomeScroller->setWidgetResizable(true);
214
215 widgetStack->addWidget(welcomeScroller);
216 widgetStack->addWidget(mdiArea);
217 mdiArea->setTabsMovable(true);
218 mdiArea->setActivationOrder(QMdiArea::ActivationHistoryOrder);
219 mdiArea->setDocumentMode(true);
220 mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation);
221#ifdef HAVE_QMDIAREA_ALWAYS_SHOW_SUBWINDOW_TITLE
222 mdiArea->setOption(QMdiArea::AlwaysShowSubwindowNameInTitleBar);
223#endif /* HAVE_QMDIAREA_ALWAYS_SHOW_SUBWINDOW_TITLE */
224
225 commandBar = new KateCommandBar(parent);
226 }
friend class KisWelcomePageWidget
KisSignalMapper * windowMapper
QStackedWidget * widgetStack
KisWelcomePageWidget * welcomePage
KActionMenu * documentMenu
KActionMenu * dockWidgetMenu
KateCommandBar * commandBar
KActionMenu * windowMenu
KisMainWindow * q
KActionMenu * styleMenu
QScrollArea * welcomeScroller
KisSignalMapper * documentMapper
KActionMenu * workspaceMenu
The KisSignalMapper class bundles signals from identifiable senders.

◆ redo

void KisMainWindow::redo ( )
privateslot

◆ removeRecentFile

void KisMainWindow::removeRecentFile ( QString url)
slot

remove one file from the list of the recent files

Definition at line 1081 of file KisMainWindow.cpp.

1082{
1083 KisRecentFilesManager::instance()->remove(QUrl::fromLocalFile(url));
1084}

References KisRecentFilesManager::instance(), and KisRecentFilesManager::remove().

◆ renderAnimation

void KisMainWindow::renderAnimation ( )
privateslot

◆ renderAnimationAgain

void KisMainWindow::renderAnimationAgain ( )
privateslot

◆ resizeEvent()

void KisMainWindow::resizeEvent ( QResizeEvent * e)
overrideprotected

Definition at line 1653 of file KisMainWindow.cpp.

1654{
1655 d->windowSizeDirty = true;
1656 KXmlGuiWindow::resizeEvent(e);
1657}

References d.

◆ resourceManager()

KoCanvasResourceProvider * KisMainWindow::resourceManager ( ) const

Definition at line 1965 of file KisMainWindow.cpp.

1966{
1967 return d->viewManager->canvasResourceProvider()->resourceManager();
1968}

References d.

◆ restoreWorkspace [1/2]

void KisMainWindow::restoreWorkspace ( )
privateslot

Definition at line 2045 of file KisMainWindow.cpp.

2046{
2047 QString md5 = sender()->property("md5").toString();
2049 KoResourceSP resource = rserver->resource(md5, "", "");
2050 if (resource) {
2051 restoreWorkspace(resource);
2052 }
2053 else {
2054 qWarning() << "Could not retrieve resource for" << md5;
2055 }
2056}
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...

References KisResourceServerProvider::instance(), KoResourceServer< T >::resource(), restoreWorkspace(), and KisResourceServerProvider::workspaceServer().

◆ restoreWorkspace() [2/2]

bool KisMainWindow::restoreWorkspace ( KoResourceSP res)

A wrapper around restoreState

Parameters
statethe saved state
Returns
TRUE on success

Definition at line 2121 of file KisMainWindow.cpp.

2122{
2123 KisWorkspaceResourceSP workspace = res.dynamicCast<KisWorkspaceResource>();
2124
2125 bool success = restoreWorkspaceState(workspace->dockerState());
2126
2127 const bool showTitlebars = KisConfig(false).showDockerTitleBars();
2128 Q_FOREACH (QDockWidget *dock, dockWidgets()) {
2129 if (dock->titleBarWidget() && !dock->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2130 dock->titleBarWidget()->setVisible(showTitlebars || dock->isFloating());
2131 }
2132 }
2133
2134 if (activeKisView()) {
2135 activeKisView()->resourceProvider()->notifyLoadingWorkspace(workspace);
2136 }
2137
2138 d->viewManager->notifyWorkspaceLoaded();
2139
2140 return success;
2141}
Resource for storing of workspaces.

References activeKisView(), d, dockWidgets(), restoreWorkspaceState(), and KisConfig::showDockerTitleBars().

◆ restoreWorkspaceState()

bool KisMainWindow::restoreWorkspaceState ( const QByteArray & state)

Definition at line 2014 of file KisMainWindow.cpp.

2015{
2016 QByteArray oldState = saveState();
2017 const bool showTitlebars = KisConfig(false).showDockerTitleBars();
2018
2019 // needed because otherwise the layout isn't correctly restored in some situations
2020 Q_FOREACH (QDockWidget *dock, dockWidgets()) {
2021 if (dock) {
2022 dock->setProperty("Locked", false); // Unlock invisible dockers
2023 dock->toggleViewAction()->setEnabled(true);
2024 dock->hide();
2025 if (dock->titleBarWidget() && !dock->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2026 dock->titleBarWidget()->setVisible(showTitlebars);
2027 }
2028 }
2029 }
2030
2031 bool success = KXmlGuiWindow::restoreState(state);
2032
2033 if (!success) {
2034 KXmlGuiWindow::restoreState(oldState);
2035 Q_FOREACH (QDockWidget *dock, dockWidgets()) {
2036 if (dock->titleBarWidget() && !dock->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2037 dock->titleBarWidget()->setVisible(showTitlebars || dock->isFloating());
2038 }
2039 }
2040 return false;
2041 }
2042 return success;
2043}

References dockWidgets(), and KisConfig::showDockerTitleBars().

◆ restoringDone

void KisMainWindow::restoringDone ( )
signal

This signal is emitted right after the docker states have been successfully restored from config.

◆ saveDocument()

bool KisMainWindow::saveDocument ( KisDocument * document,
bool saveas,
bool isExporting,
bool isAdvancedExporting = false )

Saves the document, asking for a filename if necessary.

Parameters
saveasif set to TRUE the user is always prompted for a filename
silentif set to TRUE rootDocument()->setTitleModified will not be called.
Returns
TRUE on success, false on error or cancel (don't display anything in this case, the error dialog box is also implemented here but restore the original URL in slotFileSaveAs)

Make sure that we cannot enter this method twice!

The lower level functions may call processEvents() so double-entry is quite possible to achieve. Here we try to lock the mutex, and if it is failed, just cancel saving.

Definition at line 1335 of file KisMainWindow.cpp.

1336{
1337 if (!document) {
1338 return true;
1339 }
1340
1348 std::unique_lock<QMutex> l(d->savingEntryMutex, std::try_to_lock);
1349 if (!l.owns_lock()) return false;
1350
1351 // no busy wait for saving because it is dangerous!
1352 KisDelayedSaveDialog dlg(document->image(), KisDelayedSaveDialog::SaveDialog, 0, this);
1353 dlg.blockIfImageIsBusy();
1354
1355 if (dlg.result() == KisDelayedSaveDialog::Rejected) {
1356 return false;
1357 }
1358 else if (dlg.result() == KisDelayedSaveDialog::Ignored) {
1359 QMessageBox::critical(qApp->activeWindow(),
1360 i18nc("@title:window", "Krita"),
1361 i18n("You are saving a file while the image is "
1362 "still rendering. The saved file may be "
1363 "incomplete or corrupted.\n\n"
1364 "Please select a location where the original "
1365 "file will not be overridden!"));
1366
1367
1368 saveas = true;
1369 }
1370
1371 if (document->isRecovered()) {
1372 saveas = true;
1373 }
1374
1375 if (document->path().isEmpty()) {
1376 saveas = true;
1377 }
1378
1379 QFile target(document->path());
1380 if (!target.exists()) { // Possible when file is moved/unmounted during Krita session.
1381 saveas = true;
1382 }
1383
1384 connect(document, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
1385 connect(document, SIGNAL(canceled(QString)), this, SLOT(slotSaveCanceled(QString)));
1386
1387 QByteArray nativeFormat = document->nativeFormatMimeType();
1388 QByteArray oldMimeFormat = document->mimeType();
1389
1390 QUrl suggestedURL = QUrl::fromLocalFile(document->path());
1391
1393
1395 if (!mimeFilter.contains(oldMimeFormat)) {
1396 dbgUI << "KisMainWindow::saveDocument no export filter for" << oldMimeFormat;
1397
1398 // --- don't setOutputMimeType in case the user cancels the Save As
1399 // dialog and then tries to just plain Save ---
1400
1401 // suggest a different filename extension (yes, we fortunately don't all live in a world of magic :))
1402 QString suggestedFilename = QFileInfo(suggestedURL.toLocalFile()).completeBaseName();
1403
1404 if (!suggestedFilename.isEmpty()) { // ".kra" looks strange for a name
1405 suggestedFilename = suggestedFilename + "." + KisMimeDatabase::suffixesForMimeType(KIS_MIME_TYPE).first();
1406 suggestedURL = suggestedURL.adjusted(QUrl::RemoveFilename);
1407 suggestedURL.setPath(suggestedURL.path() + suggestedFilename);
1408 }
1409
1410 // force the user to choose outputMimeType
1411 saveas = true;
1412 }
1413
1414 bool ret = false;
1415
1416 if (document->path().isEmpty() || isExporting || saveas) {
1417 // if you're just File/Save As'ing to change filter options you
1418 // don't want to be reminded about overwriting files etc.
1419 bool justChangingFilterOptions = false;
1420
1422 dialog.setCaption(isExporting ? i18n("Exporting") : i18n("Saving As"));
1423
1424 //qDebug() << ">>>>>" << isExporting << d->lastExportLocation << d->lastExportedFormat << QString::fromLatin1(document->mimeType());
1425
1426 if (isExporting && !d->lastExportLocation.isEmpty() && !d->lastExportLocation.contains(QDir::tempPath())) {
1427
1428 // Use the location where we last exported to, if it's set, as the opening location for the file dialog
1429 QString proposedPath = QFileInfo(d->lastExportLocation).absolutePath();
1430 // If the document doesn't have a filename yet, use the title
1431 QString proposedFileName = suggestedURL.isEmpty() ? document->documentInfo()->aboutInfo("title") : QFileInfo(suggestedURL.toLocalFile()).completeBaseName();
1432 // Use the last mimetype we exported to by default
1433 QString proposedMimeType = d->lastExportedFormat.isEmpty() ? "" : d->lastExportedFormat;
1434 QString proposedExtension = KisMimeDatabase::suffixesForMimeType(proposedMimeType).first().remove("*,");
1435
1436 // Set the default dir: this overrides the one loaded from the config file, since we're exporting and the lastExportLocation is not empty
1437 dialog.setDefaultDir(proposedPath + "/" + proposedFileName + "." + proposedExtension, true);
1438 dialog.setMimeTypeFilters(mimeFilter, proposedMimeType);
1439 }
1440 else {
1441 //This section only runs when the user haven't exported yet during the session, behavior set in the File Handling, Default MimeType setting.
1442 KisConfig cfg(true);
1443 QByteArray default_mime_type = cfg.exportMimeType(false).toUtf8();
1444 QString proposedMimeType = QString::fromLatin1(default_mime_type);
1445
1446 // Get the last used location for saving
1447 KConfigGroup group = KSharedConfig::openConfig()->group("File Dialogs");
1448 QString proposedPath = group.readEntry("SaveAs", "");
1449 // if that is empty, get the last used location for loading
1450 if (proposedPath.isEmpty()) {
1451 proposedPath = group.readEntry("OpenDocument", "");
1452 }
1453 // If that is empty, too, use the Pictures location.
1454 if (proposedPath.isEmpty()) {
1455 proposedPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
1456 }
1457 // But only use that if the suggestedUrl, that is, the document's own url is empty, otherwise
1458 // open the location where the document currently is.
1459
1460 //For if the user picked All Files Supported as the default, where there would not be an extension
1461 if(default_mime_type == "all/mime"){
1462 dialog.setDefaultDir(suggestedURL.isEmpty() ? proposedPath : proposedPath + "/" + QFileInfo(suggestedURL.toLocalFile()).completeBaseName(), true);
1463 }
1464
1465 if (default_mime_type != "all/mime" && !default_mime_type.isEmpty()) {
1466 QString proposedExtension = KisMimeDatabase::suffixesForMimeType(proposedMimeType).first().remove("*,");
1467 //This line is responsible for setting filename, which also manipulates filters.
1468 dialog.setDefaultDir(suggestedURL.isEmpty() ? proposedPath : proposedPath + "/" + QFileInfo(suggestedURL.toLocalFile()).completeBaseName() + "." + proposedExtension, true);
1469 }
1470
1471 if (!isExporting) {
1472 // If Saving, use the document's mimetype, or if that is empty, kra, which is the safest.
1473 dialog.setDefaultDir(suggestedURL.isEmpty() ? proposedPath : suggestedURL.toLocalFile(), true);
1474 default_mime_type = document->mimeType().isEmpty() ? nativeFormat : document->mimeType();
1475 }
1476 dialog.setMimeTypeFilters(mimeFilter, QString::fromLatin1(default_mime_type));
1477 }
1478
1479 QString newFilePath = dialog.filename();
1480
1481 bool bOk = true;
1482 if (newFilePath.isEmpty()) {
1483 bOk = false;
1484 }
1485
1486 if (bOk) {
1487 if (document->documentInfo()->aboutInfo("title") == i18n("Unnamed")) {
1488 QString fn = newFilePath;
1489 QFileInfo info(fn);
1490 document->documentInfo()->setAboutInfo("title", info.completeBaseName());
1491 }
1492
1493 QByteArray outputFormat = nativeFormat;
1494
1495 QString outputFormatString = KisMimeDatabase::mimeTypeForFile(newFilePath, false);
1496 outputFormat = outputFormatString.toLatin1();
1497
1498
1499 if (!isExporting) {
1500 justChangingFilterOptions = (newFilePath == document->path()) && (outputFormat == document->mimeType());
1501 }
1502 else {
1503 QString path = QFileInfo(d->lastExportLocation).absolutePath();
1504 QString filename = QFileInfo(document->path()).completeBaseName();
1505 justChangingFilterOptions = (QFileInfo(newFilePath).absolutePath() == path)
1506 && (QFileInfo(newFilePath).completeBaseName() == filename)
1507 && (outputFormat == d->lastExportedFormat);
1508 }
1509
1510 bool wantToSave = true;
1511
1512 // don't change this line unless you know what you're doing :)
1513 if (!justChangingFilterOptions) {
1514 if (!document->isNativeFormat(outputFormat))
1515 wantToSave = true;
1516 }
1517
1518 if (wantToSave) {
1519 if (!isExporting) { // Save As
1520 ret = document->saveAs(newFilePath, outputFormat, true);
1521 if (ret) {
1522 dbgUI << "Successful Save As!";
1523 KisPart::instance()->queueAddRecentURLToAllMainWindowsOnFileSaved(QUrl::fromLocalFile(newFilePath));
1524 } else {
1525 dbgUI << "Failed Save As!";
1526
1527 }
1528 }
1529 else { // Export
1530 ret = document->exportDocument(newFilePath, outputFormat, isAdvancedExporting, false);
1531 if (ret) {
1532 d->lastExportLocation = newFilePath;
1533 d->lastExportedFormat = outputFormat;
1534 }
1535 }
1536
1537 } // if (wantToSave) {
1538 else
1539 ret = false;
1540 } // if (bOk) {
1541 else
1542 ret = false;
1543 } else { // saving
1544 // We cannot "export" into the currently
1545 // opened document. We are not Gimp.
1546 KIS_ASSERT_RECOVER_NOOP(!isExporting);
1547
1548 // be sure document has the correct outputMimeType!
1549 if (document->isModified()) {
1550 ret = document->save(true, 0);
1551 }
1552
1553 if (!ret) {
1554 dbgUI << "Failed Save!";
1555 }
1556 }
1557
1558 return ret;
1559}
#define KIS_MIME_TYPE
Definition KisDocument.h:57
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
static QStringList supportedMimeTypes(Direction direction)
void slotSaveCanceled(const QString &)
static QStringList suffixesForMimeType(const QString &mimeType)
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
void queueAddRecentURLToAllMainWindowsOnFileSaved(QUrl url, QUrl oldUrl=QUrl())
Definition KisPart.cpp:604
#define dbgUI
Definition kis_debug.h:56

References KisDelayedSaveDialog::blockIfImageIsBusy(), d, dbgUI, KisImportExportManager::Export, KisConfig::exportMimeType(), KisDelayedSaveDialog::Ignored, KisPart::instance(), KIS_ASSERT_RECOVER_NOOP, KIS_MIME_TYPE, KisMimeDatabase::mimeTypeForFile(), KisPart::queueAddRecentURLToAllMainWindowsOnFileSaved(), KisDelayedSaveDialog::Rejected, KisDelayedSaveDialog::SaveDialog, KoFileDialog::SaveFile, slotSaveCanceled(), slotSaveCompleted(), KisMimeDatabase::suffixesForMimeType(), KisImportExportManager::supportedMimeTypes(), and target().

◆ saveWindowSettings()

void KisMainWindow::saveWindowSettings ( )
private

Definition at line 1613 of file KisMainWindow.cpp.

1614{
1615 KSharedConfigPtr config = KSharedConfig::openConfig();
1616
1617 if (d->windowSizeDirty ) {
1618 dbgUI << "KisMainWindow::saveWindowSettings";
1619 KConfigGroup group = d->windowStateConfig;
1620 KWindowConfig::saveWindowSize(windowHandle(), group);
1621 config->sync();
1622 d->windowSizeDirty = false;
1623 }
1624
1625 if (!d->activeView || d->activeView->document()) {
1626
1627 // Save toolbar position into the config file of the app, under the doc's component name
1628 KConfigGroup group = d->windowStateConfig;
1630
1631 // Save state of dock widgets
1632 for (QMap<QString, QDockWidget*>::const_iterator i = d->dockWidgetsMap.constBegin();
1633 i != d->dockWidgetsMap.constEnd(); ++i) {
1634 if (i.value()->widget()) {
1635 KConfigGroup dockGroup = group.group(QString("DockWidget ") + i.key());
1636 dockGroup.writeEntry("Locked", i.value()->property("Locked").toBool());
1637 dockGroup.writeEntry("DockArea", (int) dockWidgetArea(i.value()));
1638 dockGroup.writeEntry("xPosition", (int) i.value()->widget()->x());
1639 dockGroup.writeEntry("yPosition", (int) i.value()->widget()->y());
1640
1641 dockGroup.writeEntry("width", (int) i.value()->widget()->width());
1642 dockGroup.writeEntry("height", (int) i.value()->widget()->height());
1643 }
1644 }
1645
1646 }
1647
1648 KSharedConfig::openConfig()->sync();
1649 resetAutoSaveSettings(); // Don't let KisKMainWindow override the good stuff we wrote down
1650
1651}
void saveMainWindowSettings(KConfigGroup &config)

References d, dbgUI, KisKMainWindow::resetAutoSaveSettings(), and KisKMainWindow::saveMainWindowSettings().

◆ saveWindowState()

void KisMainWindow::saveWindowState ( bool restoreNormalState = false)

Definition at line 1980 of file KisMainWindow.cpp.

1981{
1982 // We don't need to save welcome page's layout
1983 if (d->widgetStack->currentIndex() == 0) {
1984 // TODO(sh_zam): We should still save position/geometry, right?
1985 return;
1986 }
1987
1988 if (restoreNormalState) {
1989 QAction *showCanvasOnly = d->viewManager->actionCollection()->action("view_show_canvas_only");
1990
1991 if (showCanvasOnly && showCanvasOnly->isChecked()) {
1992 showCanvasOnly->setChecked(false);
1993 }
1994
1995 d->windowStateConfig.writeEntry("ko_geometry", saveGeometry().toBase64());
1996 d->windowStateConfig.writeEntry("State", saveState().toBase64());
1997
1998 // if the dockers are hidden at this time, save their state.
1999 if (!d->toggleDockers->isChecked()) {
2000 restoreState(d->dockerStateBeforeHiding);
2001 }
2002
2003 statusBar()->setVisible(true);
2004 menuBar()->setVisible(true);
2005
2007
2008 } else {
2009 saveMainWindowSettings(d->windowStateConfig);
2010 }
2011
2012}
KRITAWIDGETUTILS_EXPORT void restoreState(QWidget *parent, const QString &dialogName, const QMap< QString, QVariant > &defaults=QMap< QString, QVariant >())
restoreState restores the state of the dialog

References d, KisKMainWindow::saveMainWindowSettings(), and saveWindowSettings().

◆ setActiveSubWindow

void KisMainWindow::setActiveSubWindow ( QWidget * window)
privateslot

Definition at line 2878 of file KisMainWindow.cpp.

2879{
2880 if (!window) {
2882 return;
2883 }
2884 QMdiSubWindow *subwin = qobject_cast<QMdiSubWindow *>(window);
2885 //dbgKrita << "setActiveSubWindow();" << subwin << d->activeSubWindow;
2886
2887 if (subwin && subwin != d->activeSubWindow) {
2888 KisView *view = qobject_cast<KisView *>(subwin->widget());
2889 //dbgKrita << "\t" << view << activeView();
2890 if (view && view != activeView()) {
2891 setActiveView(view);
2892 }
2893 d->activeSubWindow = subwin;
2894 }
2896 d->actionManager()->updateGUI();
2897}
QPointer< KisView > activeView
void setActiveView(KisView *view)
Set the active view, this will update the undo/redo actions.

References activeView, d, setActiveView(), unsetActiveView(), and updateWindowMenu().

◆ setActiveView

void KisMainWindow::setActiveView ( KisView * view)
slot

Set the active view, this will update the undo/redo actions.

Definition at line 1751 of file KisMainWindow.cpp.

1752{
1753 d->activeView = view;
1754
1755 if (d->undoActionsUpdateManager) {
1756 d->undoActionsUpdateManager->setCurrentDocument(view ? view->document() : 0);
1757 }
1758
1759 d->viewManager->setCurrentView(view);
1760
1761 d->activeViewConnections.clear();
1762 d->activeViewConnections.addConnection(view->document(),
1763 SIGNAL(sigPathChanged(QString)),
1764 this, SLOT(slotUpdateSaveActionTitle(QString)));
1765 slotUpdateSaveActionTitle(view->document()->path());
1766 d->activeViewConnections.addConnection(view->document(),
1767 SIGNAL(sigReadWriteChanged(bool)),
1768 this, SLOT(slotUpdateReadWriteMode(bool)));
1769 slotUpdateReadWriteMode(view->document()->isReadWrite());
1770
1772
1773 Q_EMIT activeViewChanged();
1774}
void slotUpdateReadWriteMode(bool readWrite)
void slotUpdateSaveActionTitle(const QString &documentPath)
void activeViewChanged()
emitted when the current view has changed
QPointer< KisDocument > document
Definition KisView.cpp:121
static KisWindowLayoutManager * instance()
void activeDocumentChanged(KisDocument *document)

References KisWindowLayoutManager::activeDocumentChanged(), activeViewChanged(), d, KisView::document, KisWindowLayoutManager::instance(), slotUpdateReadWriteMode(), and slotUpdateSaveActionTitle().

◆ setCanvasDetached

void KisMainWindow::setCanvasDetached ( bool detached)
slot

Detach canvas onto a separate window, or restore it back to to main window.

Definition at line 1045 of file KisMainWindow.cpp.

1046{
1047#ifdef Q_OS_ANDROID
1048 if (detach) {
1049 QMessageBox::warning(this, i18nc("@title:window", "Krita"),
1050 "Detach Canvas is unsupported on Android");
1051 }
1052#else
1053 if (detach == canvasDetached()) return;
1054
1055 QWidget *outgoingWidget = centralWidget() ? takeCentralWidget() : nullptr;
1056 QWidget *incomingWidget = d->canvasWindow->swapMainWidget(outgoingWidget);
1057
1058 if (incomingWidget) {
1059 setCentralWidget(incomingWidget);
1060 }
1061
1062 if (detach) {
1063 d->canvasWindow->show();
1064 } else {
1065 d->canvasWindow->hide();
1066 }
1067 d->toggleDetachCanvas->setChecked(detach);
1068#endif
1069}
bool canvasDetached() const

References canvasDetached(), and d.

◆ setMainWindowLayoutForCurrentMainWidget()

void KisMainWindow::setMainWindowLayoutForCurrentMainWidget ( int widgetIndex,
bool widgetIndexChanged )
private

save the state of the window which existed up-to now (this is before we stop auto-saving).

saving should happen if the call s has come from a real state change, but not from on-startup initialization

When closing the latest subwindow we should restore the canvas-only mode to save stuff properly

Definition at line 1697 of file KisMainWindow.cpp.

1698{
1699
1700 if (widgetIndex == 0) {
1701 if (widgetIndexChanged) {
1706
1707 if (d->mdiArea->subWindowList().isEmpty()) {
1712 saveWindowState(true);
1713 } else {
1714 saveMainWindowSettings(d->windowStateConfig);
1715 }
1716 }
1718 }
1719 else {
1720 setAutoSaveSettings(d->windowStateConfig, false);
1721 statusBar()->setVisible(KisConfig(true).showStatusBar());
1722 }
1723
1724 QList<QAction *> actions = d->dockWidgetMenu->menu()->actions();
1725 actions.append(toolBarMenuAction()->menu()->actions());
1726 for (QAction *action : actions) {
1727 if (action) {
1728 action->setEnabled(widgetIndex);
1729 }
1730 }
1731}
QAction * toolBarMenuAction()
void setAutoSaveSettings(const QString &groupName=QLatin1String("MainWindow"), bool saveWindowSize=true)
void saveWindowState(bool restoreNormalState=false)
void adjustLayoutForWelcomePage()

References KisKXMLGUIClient::action(), adjustLayoutForWelcomePage(), d, KisKMainWindow::saveMainWindowSettings(), saveWindowState(), KisKMainWindow::setAutoSaveSettings(), and KXmlGuiWindow::toolBarMenuAction().

◆ showAboutApplication

void KisMainWindow::showAboutApplication ( )
privatevirtualslot

showAboutApplication show the about box

Definition at line 3027 of file KisMainWindow.cpp.

3028{
3029 KisAboutApplication dlg(this);
3030 dlg.exec();
3031}

◆ showDockerTitleBars

void KisMainWindow::showDockerTitleBars ( bool show)
privateslot

Toggle docker titlebars on/off.

Definition at line 3298 of file KisMainWindow.cpp.

3299{
3300 Q_FOREACH (QDockWidget *dock, dockWidgets()) {
3301 if (dock->titleBarWidget() && !dock->titleBarWidget()->inherits("KisUtilityTitleBar")) {
3302 dock->titleBarWidget()->setVisible(show || dock->isFloating());
3303 }
3304 }
3305
3306 KisConfig cfg(true);
3307 cfg.setShowDockerTitleBars(show);
3308}

References dockWidgets(), and KisConfig::setShowDockerTitleBars().

◆ showDocument()

void KisMainWindow::showDocument ( KisDocument * document)

Activate a view containing the document in this window, creating one if needed.

Definition at line 1179 of file KisMainWindow.cpp.

1179 {
1180 Q_FOREACH(QMdiSubWindow *subwindow, d->mdiArea->subWindowList()) {
1181 KisView *view = qobject_cast<KisView*>(subwindow->widget());
1183
1184 if (view) {
1185 if (view->document() == document) {
1186 setActiveSubWindow(subwindow);
1187 return;
1188 }
1189 }
1190 }
1191
1193}
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130

References addViewAndNotifyLoadingCompleted(), d, KisView::document, KIS_SAFE_ASSERT_RECOVER_NOOP, and setActiveSubWindow().

◆ showErrorAndDie

void KisMainWindow::showErrorAndDie ( )
privateslot

Quits Krita with error message from m_errorMessage.

Definition at line 3019 of file KisMainWindow.cpp.

3020{
3021 QMessageBox::critical(qApp->activeWindow(), i18nc("@title:window", "Installation error"), m_errorMessage);
3022 if (m_dieOnError) {
3023 exit(10);
3024 }
3025}

References m_dieOnError, and m_errorMessage.

◆ showEvent()

void KisMainWindow::showEvent ( QShowEvent * event)
overrideprotected

Definition at line 1678 of file KisMainWindow.cpp.

1679{
1680 // we're here because, we need to make sure everything (dockers, toolbars etc) is loaded and ready before
1681 // we can hide it.
1682 if (!event->spontaneous()) {
1683 setMainWindowLayoutForCurrentMainWidget(d->widgetStack->currentIndex(), false);
1684 }
1685#ifdef Q_OS_ANDROID
1686 // The user can conceivably purchase a product from the splash screen while
1687 // Krita is still loading. In that case, the "pending" flag will be set. The
1688 // dialog in question will clear the flag.
1690 if (androidDonations && androidDonations->isShowDonationManagementDialogPending()) {
1691 QTimer::singleShot(0, this, &KisMainWindow::slotShowDonationManagementDialog);
1692 }
1693#endif
1694 return KXmlGuiWindow::showEvent(event);
1695}
bool isShowDonationManagementDialogPending() const
void setMainWindowLayoutForCurrentMainWidget(int widgetIndex, bool widgetIndexChanged)

References d, KXmlGuiWindow::event(), KisAndroidDonations::instance(), KisAndroidDonations::isShowDonationManagementDialogPending(), and setMainWindowLayoutForCurrentMainWidget().

◆ showManual

void KisMainWindow::showManual ( )
privateslot

Definition at line 3293 of file KisMainWindow.cpp.

3294{
3295 QDesktopServices::openUrl(QUrl("https://docs.krita.org"));
3296}

◆ showOpenFileDialog()

QStringList KisMainWindow::showOpenFileDialog ( bool isImporting)

Definition at line 1223 of file KisMainWindow.cpp.

1224{
1225 KoFileDialog dialog(this, KoFileDialog::ImportFiles, "OpenDocument");
1226 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1228 dialog.setCaption(isImporting ? i18n("Import Images") : i18n("Open Images"));
1229
1230 QStringList filenames = dialog.filenames();
1231 filenames.sort();
1232
1233 return filenames;
1234}

References KisImportExportManager::Import, KoFileDialog::ImportFiles, and KisImportExportManager::supportedMimeTypes().

◆ showView()

void KisMainWindow::showView ( KisView * view,
QMdiSubWindow * subWindow = 0 )
virtual

showView shows the given view, in subWindow if not null, in a new tab otherwise.

We set Qt::WA_DontCreateNativeAncestors in KisOpenGLCanvas2, so the parents will not receive native surfaces automatically. That is a problem for MDI-subwindows, since they may overlap. This overlapping cannot be resolved when the MDI-subwindow is an alien widget, but the wrapped widget is a native widget. The docorations of any subwindow will always be lower than the content of any of the subwindows.

Therefore we explicitly create a native surface for every MDI-subwindow.

Hack alert!

Here we explicitly request KoToolManager to Q_EMIT all the tool activation signals, to reinitialize the tool options docker.

That is needed due to a design flaw we have in the initialization procedure. The tool in the KoToolManager is initialized in KisView::setViewManager() calls, which happens early enough. During this call the tool manager requests KoCanvasControllerWidget to Q_EMIT the signal to update the widgets in the tool docker. But at that moment of time the view is not yet connected to the main window, because it happens in KisViewManager::setCurrentView a bit later. This fact makes the widgets updating signals be lost and never reach the tool docker.

So here we just explicitly call the tool activation stub.

Definition at line 773 of file KisMainWindow.cpp.

774{
775 if (imageView && activeView() != imageView) {
776 // XXX: find a better way to initialize this!
777 imageView->setViewManager(d->viewManager);
778
779 imageView->canvasBase()->setFavoriteResourceManager(d->viewManager->paintOpBox()->favoriteResourcesManager());
780 imageView->slotLoadingFinished();
781
782 if (!subwin) {
783 QMdiSubWindow *currentSubWin = d->mdiArea->currentSubWindow();
784 bool shouldMaximize = currentSubWin ? currentSubWin->isMaximized() : true;
785 subwin = d->mdiArea->addSubWindow(imageView);
786
799 const bool osManagedSurfacePresent = KisPlatformPluginInterfaceFactory::instance()->surfaceColorManagedByOS();
800 const bool useNativeSurfaceForCanvas = KisConfig(true).effectiveShouldUseNativeSurfaceForCanvas(osManagedSurfacePresent);
801 if (useNativeSurfaceForCanvas) {
802 subwin->setAttribute(Qt::WA_DontCreateNativeAncestors);
803 subwin->setAttribute(Qt::WA_NativeWindow);
804 }
805
806 if (shouldMaximize) {
807 subwin->setWindowState(Qt::WindowMaximized);
808 }
809 } else {
810 subwin->setWidget(imageView);
811 }
812 imageView->setSubWindow(subwin);
813 subwin->setAttribute(Qt::WA_DeleteOnClose, true);
814 connect(subwin, SIGNAL(destroyed()), SLOT(updateWindowMenu()));
815
816 KisConfig cfg(true);
817 subwin->setOption(QMdiSubWindow::RubberBandMove, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
818 subwin->setOption(QMdiSubWindow::RubberBandResize, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
819 subwin->setWindowIcon(qApp->windowIcon());
820
821#ifdef Q_OS_MACOS
822 connect(subwin, SIGNAL(destroyed()), SLOT(updateSubwindowFlags()));
824#endif
825
826 if (d->mdiArea->subWindowList().size() == 1) {
827 imageView->showMaximized();
828 }
829 else {
830 imageView->show();
831 }
832
854
855 // No, no, no: do not try to call this _before_ the show() has
856 // been called on the view; only when that has happened is the
857 // opengl context active, and very bad things happen if we tell
858 // the dockers to update themselves with a view if the opengl
859 // context is not active.
860 setActiveView(imageView);
861
863 } else {
865 }
866}
bool effectiveShouldUseNativeSurfaceForCanvas(bool osManagedSurfacePresent) const
static KisPlatformPluginInterfaceFactory * instance()
void initializeCurrentToolForCanvas()

References activeView, KisView::canvasBase(), d, KisConfig::effectiveShouldUseNativeSurfaceForCanvas(), KoToolManager::initializeCurrentToolForCanvas(), KoToolManager::instance(), KisPlatformPluginInterfaceFactory::instance(), KisConfig::readEntry(), setActiveView(), KisCanvas2::setFavoriteResourceManager(), KisView::setSubWindow(), KisView::setViewManager(), KisView::slotLoadingFinished(), KisPlatformPluginInterfaceFactory::surfaceColorManagedByOS(), unsetActiveView(), updateSubwindowFlags(), updateWindowMenu(), and KisConfig::useOpenGL().

◆ showWelcomeScreen()

void KisMainWindow::showWelcomeScreen ( bool show)

Toggles between showing the welcome screen and the MDI area

hack: There seems to be a bug that prevents events happening to the MDI area if it isn't actively displayed (set in the widgetStack). This can cause things like the title bar not to update correctly Before doing any actions related to opening or creating documents, make sure to switch this first to make sure everything can communicate to the MDI area correctly

Definition at line 1821 of file KisMainWindow.cpp.

1822{
1823 const int currentIndex = show ? 0 : 1;
1824 if (d->widgetStack->currentIndex() != currentIndex) {
1825 setUpdatesEnabled(false);
1826 // These have to be done in different sequence to avoid graphical
1827 // layout glitch during the switch.
1828 if (show) {
1829 setMainWindowLayoutForCurrentMainWidget(currentIndex, true);
1830 d->widgetStack->setCurrentIndex(currentIndex);
1831 } else {
1832 d->widgetStack->setCurrentIndex(currentIndex);
1833 setMainWindowLayoutForCurrentMainWidget(currentIndex, true);
1834 }
1835 setUpdatesEnabled(true);
1836 }
1837}
KRITAUI_EXPORT void show()

References d, and setMainWindowLayoutForCurrentMainWidget().

◆ slotChangeInterfaceScale

void KisMainWindow::slotChangeInterfaceScale ( )
slot

Definition at line 1884 of file KisMainWindow.cpp.

1885{
1886#if defined(Q_OS_ANDROID) && KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
1888 if (androidScaling) {
1889 androidScaling->showDialog();
1890 }
1891#endif
1892}

References KisAndroidScaling::instance(), and KisAndroidScaling::showDialog().

◆ slotConfigureToolbars

void KisMainWindow::slotConfigureToolbars ( )
privateslot

Configure toolbars.

Definition at line 2386 of file KisMainWindow.cpp.

2387{
2389 KisKEditToolBar edit(factory(), this);
2390 connect(&edit, SIGNAL(newToolBarConfig()), this, SLOT(slotNewToolbarConfig()));
2391 (void) edit.exec();
2393}
A dialog used to customize or configure toolbars.
void slotNewToolbarConfig()

References applyToolBarLayout(), KisKXMLGUIClient::factory(), saveWindowState(), slotNewToolbarConfig(), and void().

◆ slotDocumentInfo

void KisMainWindow::slotDocumentInfo ( )
privateslot

Show a dialog with author and document information.

Definition at line 2183 of file KisMainWindow.cpp.

2184{
2185 if (!d->activeView->document())
2186 return;
2187
2188 KoDocumentInfo *docInfo = d->activeView->document()->documentInfo();
2189
2190 if (!docInfo)
2191 return;
2192
2193 KoDocumentInfoDlg *dlg = d->activeView->document()->createDocumentInfoDialog(this, docInfo);
2194
2195 if (dlg->exec()) {
2196 if (dlg->isDocumentSaved()) {
2197 d->activeView->document()->setModified(false);
2198 } else {
2199 d->activeView->document()->setModified(true);
2200 }
2201 }
2202
2203 delete dlg;
2204}
The dialog that shows information about the document.
The class containing all meta information about a document.

References d, and KoDocumentInfoDlg::isDocumentSaved().

◆ slotExportAdvance

void KisMainWindow::slotExportAdvance ( )
privateslot

Definition at line 1907 of file KisMainWindow.cpp.

1908{
1909 if (saveDocument(d->activeView->document(), true, true,true)) {
1910 Q_EMIT documentSaved();
1911 }
1912}
bool saveDocument(KisDocument *document, bool saveas, bool isExporting, bool isAdvancedExporting=false)
void documentSaved()

References d, documentSaved(), and saveDocument().

◆ slotExportFile

void KisMainWindow::slotExportFile ( )
privateslot

File --> Export

This will call slotFileSaveAs().

Definition at line 1901 of file KisMainWindow.cpp.

1902{
1903 if (saveDocument(d->activeView->document(), true, true,false)) {
1904 Q_EMIT documentSaved();
1905 }
1906}

References d, documentSaved(), and saveDocument().

◆ slotFileCloseAll

bool KisMainWindow::slotFileCloseAll ( )
privateslot

Closes all open documents.

Definition at line 2206 of file KisMainWindow.cpp.

2207{
2208 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
2209 if (subwin) {
2210 if(!subwin->close())
2211 return false;
2212 }
2213 }
2214
2215 return true;
2216}

References d.

◆ slotFileNew

void KisMainWindow::slotFileNew ( )
slot

Slot for opening a new document.

If the current document is empty, the new document replaces it. If not, a new mainwindow will be opened for showing the document.

Definition at line 1839 of file KisMainWindow.cpp.

1840{
1842 dlg->exec();
1843 dlg->deleteLater();
1844}

◆ slotFileOpen

void KisMainWindow::slotFileOpen ( bool isImporting = false)
slot

Slot for opening a saved file.

If the current document is empty, the opened document replaces it. If not a new mainwindow will be opened for showing the opened file.

Definition at line 1853 of file KisMainWindow.cpp.

1854{
1855 QStringList urls = showOpenFileDialog(isImporting);
1856
1857 if (urls.isEmpty())
1858 return;
1859
1860 Q_FOREACH (const QString& url, urls) {
1861
1862 if (!url.isEmpty()) {
1863 OpenFlags flags = isImporting ? Import : None;
1864 bool res = openDocument(url, flags);
1865 if (!res) {
1866 warnKrita << "Loading" << url << "failed";
1867 }
1868 }
1869 }
1870}
QStringList showOpenFileDialog(bool isImporting)
bool openDocument(const QString &path, OpenFlags flags)

References Import, None, openDocument(), showOpenFileDialog(), and warnKrita.

◆ slotFileOpenRecent

void KisMainWindow::slotFileOpenRecent ( const QUrl & url)
slot

Slot for opening a file among the recently opened files.

If the current document is empty, the opened document replaces it. If not a new mainwindow will be opened for showing the opened file.

Definition at line 1872 of file KisMainWindow.cpp.

1873{
1874 (void) openDocument(url.toLocalFile(), None);
1875}

References None, openDocument(), and void().

◆ slotFileQuit

void KisMainWindow::slotFileQuit ( )
privateslot

Closes the mainwindow.

Definition at line 2218 of file KisMainWindow.cpp.

2219{
2220 // Do not close while KisMainWindow has the savingEntryMutex locked, bug409395.
2221 // After the background saving job is initiated, KisDocument blocks closing
2222 // while it saves itself.
2223 if (hackIsSaving()) {
2224 return;
2225 }
2227}

References KisPart::closeSession(), hackIsSaving(), and KisPart::instance().

◆ slotFileSave

void KisMainWindow::slotFileSave ( )
slot

Saves the current document with the current name.

Definition at line 1877 of file KisMainWindow.cpp.

1878{
1879 if (saveDocument(d->activeView->document(), false, false,false)) {
1880 Q_EMIT documentSaved();
1881 }
1882}

References d, documentSaved(), and saveDocument().

◆ slotFileSaveAs

void KisMainWindow::slotFileSaveAs ( )
privateslot

Saves the current document with a new name.

Definition at line 1894 of file KisMainWindow.cpp.

1895{
1896 if (saveDocument(d->activeView->document(), true, false,false)) {
1897 Q_EMIT documentSaved();
1898 }
1899}

References d, documentSaved(), and saveDocument().

◆ slotImportFile

void KisMainWindow::slotImportFile ( )
privateslot

File --> Import

This will call slotFileOpen().

Definition at line 1846 of file KisMainWindow.cpp.

1847{
1848 dbgUI << "slotImportFile()";
1849 slotFileOpen(true);
1850}

References dbgUI, and slotFileOpen().

◆ slotLoadCanceled

void KisMainWindow::slotLoadCanceled ( const QString & errMsg)
privateslot

Definition at line 1250 of file KisMainWindow.cpp.

1251{
1252 KisUsageLogger::log(QString("Loading canceled: %1.").arg(errMsg));
1253 KisDocument* doc = qobject_cast<KisDocument*>(sender());
1254 Q_ASSERT(doc);
1255 disconnect(doc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
1256 disconnect(doc, SIGNAL(canceled(QString)), this, SLOT(slotLoadCanceled(QString)));
1257}
static void log(const QString &message)
Logs with date/time.

References KisUsageLogger::log(), slotLoadCanceled(), and slotLoadCompleted().

◆ slotLoadCompleted

void KisMainWindow::slotLoadCompleted ( )
privateslot

Definition at line 1237 of file KisMainWindow.cpp.

1238{
1239 KisDocument *newdoc = qobject_cast<KisDocument*>(sender());
1240 if (newdoc && newdoc->image()) {
1242
1243 disconnect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
1244 disconnect(newdoc, SIGNAL(canceled(QString)), this, SLOT(slotLoadCanceled(QString)));
1245
1246 Q_EMIT loadCompleted();
1247 }
1248}
KisImageSP image
void loadCompleted()

References addViewAndNotifyLoadingCompleted(), KisDocument::image, loadCompleted(), slotLoadCanceled(), and slotLoadCompleted().

◆ slotNewToolbarConfig

void KisMainWindow::slotNewToolbarConfig ( )
privateslot

Post toolbar config. (Plug action lists back in, etc.)

First we should apply icon overrides, and only after that we should update the layout, since the function checks for the presence of the icons in the action.

Definition at line 2401 of file KisMainWindow.cpp.

2402{
2403 applyMainWindowSettings(d->windowStateConfig);
2404
2406 Q_UNUSED(factory);
2407
2408 // Check if there's an active view
2409 if (!d->activeView)
2410 return;
2411
2412 plugActionList("toolbarlist", d->toolbarList);
2413
2421}

References applyActionIconOverridesFromLocalXML(), KXmlGuiWindow::applyMainWindowSettings(), applyToolBarLayout(), d, KisKXMLGUIClient::factory(), KXmlGuiWindow::guiFactory(), and KisKXMLGUIClient::plugActionList().

◆ slotPreferences

void KisMainWindow::slotPreferences ( )
slot

slotPreferences open the preferences dialog

Definition at line 868 of file KisMainWindow.cpp.

869{
870 std::optional<KisDlgPreferences::PageDesc>page = std::nullopt;
871
872 KisAction* action = d->actionManager()->actionByName("options_configure");
873 QVariant data = action->data();
874 if (data.userType() == QMetaType::QVariantList) {
875 // Reset the data first
876 action->setData(QVariant());
877 QList<QVariant> list = data.toList();
878
879 Q_ASSERT(list.length() == 2);
880 Q_ASSERT(list[0].userType() == QMetaType::Int);
881 Q_ASSERT(list[1].userType() == QMetaType::Int);
882
884 int t = list[1].toInt();
886 }
887
888 QScopedPointer<KisDlgPreferences> dlgPreferences(new KisDlgPreferences(this));
889
890 if (dlgPreferences->editPreferences(page)) {
894
895 // XXX: should this be changed for the views in other windows as well?
896 Q_FOREACH (QPointer<KisView> koview, KisPart::instance()->views()) {
897 KisViewManager *view = qobject_cast<KisViewManager*>(koview);
898 if (view) {
899 // Update the settings for all nodes -- they don't query
900 // KisConfig directly because they need the settings during
901 // compositing, and they don't connect to the config notifier
902 // because nodes are not QObjects (because only one base class
903 // can be a QObject).
904 KisNode* node = dynamic_cast<KisNode*>(view->image()->rootLayer().data());
905 if (node) {
906 node->updateSettings();
907 }
908 }
909
910 }
912
913 d->viewManager->showHideScrollbars();
914 }
915}
const Params2D p
static KisImageConfigNotifier * instance()
KisGroupLayerSP rootLayer() const
KisImageWSP image() const
Return the image this view is displaying.
int toInt(const QString &str, bool *ok=nullptr)
virtual void updateSettings()

References KisKXMLGUIClient::action(), d, KisSharedPtr< T >::data(), KisViewManager::image(), KisConfigNotifier::instance(), KisImageConfigNotifier::instance(), KisPart::instance(), KisConfigNotifier::notifyConfigChanged(), KisImageConfigNotifier::notifyConfigChanged(), KisConfigNotifier::notifyPixelGridModeChanged(), p, KisImage::rootLayer(), KisBaseNode::updateSettings(), and updateWindowMenu().

◆ slotResetConfigurations

void KisMainWindow::slotResetConfigurations ( )
privateslot

Reset User Configurations.

Definition at line 2395 of file KisMainWindow.cpp.

2396{
2397 KisApplication *kisApp = static_cast<KisApplication*>(qApp);
2398 kisApp->askResetConfig();
2399}
Base class for the Krita app.

References KisApplication::askResetConfig().

◆ slotSaveCanceled

void KisMainWindow::slotSaveCanceled ( const QString & errMsg)
privateslot

Definition at line 1259 of file KisMainWindow.cpp.

1260{
1261 if (!errMsg.isEmpty()) { // empty when cancelled by user
1262 KisUsageLogger::log(QString("Saving cancelled. Error:").arg(errMsg));
1263 QMessageBox::critical(this, i18nc("@title:window", "Krita"), errMsg);
1264 }
1265 else {
1266 KisUsageLogger::log(QString("Saving cancelled by the user."));
1267 }
1269}

References KisUsageLogger::log(), and slotSaveCompleted().

◆ slotSaveCompleted

void KisMainWindow::slotSaveCompleted ( )
privateslot

Definition at line 1271 of file KisMainWindow.cpp.

1272{
1273 KisUsageLogger::log(QString("Saving Completed"));
1274 KisDocument* doc = qobject_cast<KisDocument*>(sender());
1275 if (doc) {
1276 disconnect(doc, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
1277 disconnect(doc, SIGNAL(canceled(QString)), this, SLOT(slotSaveCanceled(QString)));
1278 }
1279
1280 if (d->deferredClosingEvent) {
1281 KXmlGuiWindow::closeEvent(d->deferredClosingEvent);
1282 }
1283}
void closeEvent(QCloseEvent *) override

References KisKMainWindow::closeEvent(), d, KisUsageLogger::log(), slotSaveCanceled(), and slotSaveCompleted().

◆ slotShowSessionManager

void KisMainWindow::slotShowSessionManager ( )
slot

Definition at line 1914 of file KisMainWindow.cpp.

1914 {
1916}
void showSessionManager()
Definition KisPart.cpp:624

References KisPart::instance(), and KisPart::showSessionManager().

◆ slotStoragesWarning

void KisMainWindow::slotStoragesWarning ( const QString & location = QString())
privateslot

Definition at line 2098 of file KisMainWindow.cpp.

2099{
2100 QString warning;
2102 warning = i18n("You don't have any resource bundles enabled.");
2103 }
2104
2105 if (!checkPaintOpAvailable()) {
2106 warning += i18n("\nThere are no brush presets available. Please enable a bundle that has presets before continuing.\n");
2107 QMessageBox::critical(this, i18nc("@title:window", "Krita"), warning);
2108
2109 QAction *action = actionCollection()->action("manage_bundles");
2110 if (action) {
2111 action->trigger();
2112 }
2113 }
2114
2116 QMessageBox::warning(this, i18nc("@title:window", "Krita"), warning + i18n("\nOnly your local resources are available."));
2117 }
2118
2119}
bool checkPaintOpAvailable()
bool checkActiveBundlesAvailable()
checkActiveStorages checks whether there is at least one bundle available and at least one paintop pr...

References KisKXMLGUIClient::action(), KisKActionCollection::action(), KisKXMLGUIClient::actionCollection(), checkActiveBundlesAvailable(), and checkPaintOpAvailable().

◆ slotThemeChanged

void KisMainWindow::slotThemeChanged ( )
privateslot

Definition at line 955 of file KisMainWindow.cpp.

956{
957 KConfigGroup group(KSharedConfig::openConfig(), "theme");
958#ifndef Q_OS_HAIKU
959 if (group.readEntry("Theme", "") == d->themeManager->currentThemeName()) return;
960
961 // save theme changes instantly
962 group.writeEntry("Theme", d->themeManager->currentThemeName());
963#endif
964 updateTheme();
965
966 // Make the other top level windows update as well
967 Q_FOREACH (QWidget* topLevelWidget, qApp->topLevelWidgets()) {
968 if (topLevelWidget == this) {
969 // Skip if the current top level widget is this window
970 continue;
971 }
972 if (topLevelWidget->isHidden()) {
973 // Skip unwanted top level widgets like menus, dropdowns, tooltips, etc.
974 continue;
975 }
976 KisMainWindow *topLevelMainWindow = qobject_cast<KisMainWindow*>(topLevelWidget);
977 if (topLevelMainWindow) {
978 topLevelMainWindow->updateTheme();
979 Q_EMIT topLevelMainWindow->themeChanged();
980 } else {
981 QObjectList objects;
982 objects.append(topLevelWidget);
983 while (!objects.isEmpty()) {
984 QWidget* widget = qobject_cast<QWidget*>(objects.takeFirst());
985 if (widget) {
986 objects.append(widget->children());
988 }
989 }
990 }
991 }
992
994
995 Q_EMIT themeChanged();
996}
void updateIconCommon(QObject *object)

References applyActionIconOverridesFromLocalXML(), d, themeChanged(), KisIconUtils::updateIconCommon(), updateTheme(), and KisKXMLGUIBuilder::widget().

◆ slotToolbarToggled

void KisMainWindow::slotToolbarToggled ( bool toggle)
privateslot

Shows or hides a toolbar

Definition at line 2423 of file KisMainWindow.cpp.

2424{
2425 //dbgUI <<"KisMainWindow::slotToolbarToggled" << sender()->name() <<" toggle=" << true;
2426 // The action (sender) and the toolbar have the same name
2427 KisToolBar * bar = toolBar(sender()->objectName());
2428 if (bar) {
2429 if (toggle) {
2430 bar->show();
2431 }
2432 else {
2433 bar->hide();
2434 }
2435
2436 if (d->activeView && d->activeView->document()) {
2438 }
2439 } else
2440 warnUI << "slotToolbarToggled : Toolbar " << sender()->objectName() << " not found!";
2441}

References d, saveWindowState(), KisKMainWindow::toolBar(), and warnUI.

◆ slotUpdateReadWriteMode

void KisMainWindow::slotUpdateReadWriteMode ( bool readWrite)
privateslot

Definition at line 1098 of file KisMainWindow.cpp.

1099{
1100 Q_UNUSED(readWrite);
1101 d->actionManager()->updateGUI();
1102}

References d.

◆ slotUpdateSaveActionTitle

void KisMainWindow::slotUpdateSaveActionTitle ( const QString & documentPath)
privateslot

Definition at line 1086 of file KisMainWindow.cpp.

1087{
1088 const QString fileName = QFileInfo(documentPath).fileName();
1089
1090 if (!fileName.isEmpty()) {
1091 d->saveAction->setToolTip(i18n("Save as %1", fileName));
1092 }
1093 else {
1094 d->saveAction->setToolTip(i18n("Save"));
1095 }
1096}

References d.

◆ slotUpdateWidgetStyle

void KisMainWindow::slotUpdateWidgetStyle ( )
privateslot

Definition at line 2572 of file KisMainWindow.cpp.

2573{
2574 KisConfig cfg(true);
2575 QString themeFromConfig = cfg.widgetStyle();
2576
2577 Q_FOREACH (auto key, d->actionMap.keys()) { // find checked style to save to config
2578 if(d->actionMap.value(key)->isChecked()) {
2579 cfg.setWidgetStyle(key);
2580 qApp->setProperty(currentUnderlyingStyleNameProperty, key);
2581 qApp->setStyle(key);
2582
2583 // When switching to a style that uses system colors, reset the theme
2584#ifndef Q_OS_HAIKU
2585 QString currentStyle = qApp->style()->objectName();
2586#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
2587 if (currentStyle == "macintosh" || currentStyle == "windowsvista") {
2588 d->themeManager->setCurrentTheme("System");
2589 }
2590#else
2591 if (currentStyle == "macos" || currentStyle == "windowsvista" || currentStyle == "windows11") {
2592 d->themeManager->setCurrentTheme("System");
2593 }
2594#endif
2595#endif
2596 }
2597 }
2598}
constexpr const char * currentUnderlyingStyleNameProperty
Definition kis_global.h:116

References currentUnderlyingStyleNameProperty, d, KisConfig::setWidgetStyle(), and KisConfig::widgetStyle().

◆ slotXmlGuiMakingChanges

void KisMainWindow::slotXmlGuiMakingChanges ( bool finished)
privateslot

Definition at line 3310 of file KisMainWindow.cpp.

3311{
3312 if (finished) {
3314 }
3315}

References subWindowActivated().

◆ subWindowActivated

void KisMainWindow::subWindowActivated ( )
slot

Qt has a weirdness, it has hardcoded shortcuts added to an action in the window menu. We need to reset the shortcuts for that menu to nothing, otherwise the shortcuts cannot be made configurable.

See: https://bugs.kde.org/show_bug.cgi?id=352205 https://bugs.kde.org/show_bug.cgi?id=375524 https://bugs.kde.org/show_bug.cgi?id=398729

Definition at line 2650 of file KisMainWindow.cpp.

2651{
2652 bool enabled = (activeKisView() != 0);
2653
2654 d->mdiCascade->setEnabled(enabled);
2655 d->mdiNextWindow->setEnabled(enabled);
2656 d->mdiPreviousWindow->setEnabled(enabled);
2657 d->mdiTile->setEnabled(enabled);
2658 d->close->setEnabled(enabled);
2659 d->closeAll->setEnabled(enabled);
2660
2661 setActiveSubWindow(d->mdiArea->activeSubWindow());
2662
2672 QMdiSubWindow *subWindow = d->mdiArea->currentSubWindow();
2673 if (subWindow) {
2674 QMenu *menu = subWindow->systemMenu();
2675 if (menu && menu->actions().size() == 8) {
2676 Q_FOREACH (QAction *action, menu->actions()) {
2677 action->setShortcut(QKeySequence());
2678
2679 }
2680 menu->actions().last()->deleteLater();
2681 }
2682 }
2683
2684 d->actionManager()->updateGUI();
2685}

References KisKXMLGUIClient::action(), activeKisView(), d, and setActiveSubWindow().

◆ swapWorkspaces()

void KisMainWindow::swapWorkspaces ( KisMainWindow * a,
KisMainWindow * b )
static

Definition at line 2169 of file KisMainWindow.cpp.

2170{
2171 QByteArray workspaceA = a->borrowWorkspace(b);
2172 QByteArray workspaceB = b->borrowWorkspace(a);
2173
2174 a->restoreWorkspaceState(workspaceB);
2175 b->restoreWorkspaceState(workspaceA);
2176}

References borrowWorkspace(), and restoreWorkspaceState().

◆ switchTab

void KisMainWindow::switchTab ( int index)
privateslot

Definition at line 1813 of file KisMainWindow.cpp.

1814{
1815 QTabBar *tabBar = d->findTabBarHACK();
1816 if (!tabBar) return;
1817
1818 tabBar->setCurrentIndex(index);
1819}

References d.

◆ synchronizeDynamicActions

void KisMainWindow::synchronizeDynamicActions ( )
slot

Definition at line 3410 of file KisMainWindow.cpp.

3411{
3412 // Add all actions with a menu property to the main window
3413 KisActionManager::synchronizeDynamicActions(this->actionCollection()->actions(), this->menuBar()->actions());
3414}
static void synchronizeDynamicActions(QList< QAction * > newActions, const QList< QAction * > &menuBarActions)

References KisKXMLGUIClient::actionCollection(), and KisActionManager::synchronizeDynamicActions().

◆ themeChanged

void KisMainWindow::themeChanged ( )
signal

This signal is emitted when the color theme changes.

◆ toggleDockersVisibility

void KisMainWindow::toggleDockersVisibility ( bool visible,
bool onWelcomePage = false )
privateslot

Hide the dockers

Definition at line 2631 of file KisMainWindow.cpp.

2632{
2633 if (!visible) {
2634 d->dockerStateBeforeHiding = saveState();
2635
2636 Q_FOREACH (QObject* widget, children()) {
2637 if (widget->inherits("QDockWidget")) {
2638 QDockWidget* dw = static_cast<QDockWidget*>(widget);
2639 if (dw->isVisible() && !(onWelcomePage && dw->property("ShowOnWelcomePage").toBool())) {
2640 dw->hide();
2641 }
2642 }
2643 }
2644 }
2645 else {
2646 restoreState(d->dockerStateBeforeHiding);
2647 }
2648}

References d, and KisKXMLGUIBuilder::widget().

◆ undo

void KisMainWindow::undo ( )
privateslot

◆ unsetActiveView

void KisMainWindow::unsetActiveView ( )
slot

Definition at line 1776 of file KisMainWindow.cpp.

1777{
1778 d->activeViewConnections.clear();
1779 slotUpdateSaveActionTitle(QString());
1781}

References d, slotUpdateReadWriteMode(), and slotUpdateSaveActionTitle().

◆ updateSubwindowFlags

void KisMainWindow::updateSubwindowFlags ( )
privateslot

Definition at line 2862 of file KisMainWindow.cpp.

2863{
2864 bool onlyOne = false;
2865 if (d->mdiArea->subWindowList().size() == 1 && d->mdiArea->viewMode() == QMdiArea::SubWindowView) {
2866 onlyOne = true;
2867 }
2868 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
2869 if (onlyOne) {
2870 subwin->setWindowFlags(subwin->windowFlags() | Qt::FramelessWindowHint);
2871 subwin->showMaximized();
2872 } else {
2873 subwin->setWindowFlags((subwin->windowFlags() | Qt::FramelessWindowHint) ^ Qt::FramelessWindowHint);
2874 }
2875 }
2876}

References d.

◆ updateTheme

void KisMainWindow::updateTheme ( )
privateslot

Handle theme changes from theme manager

Definition at line 917 of file KisMainWindow.cpp.

918{
919 // reload action icons!
920 Q_FOREACH (QAction *action, actionCollection()->actions()) {
922 }
923 if (d->mdiArea) {
924 d->mdiArea->setPalette(qApp->palette());
925 for (int i=0; i<d->mdiArea->subWindowList().size(); i++) {
926 QMdiSubWindow *window = d->mdiArea->subWindowList().at(i);
927 if (window) {
928 window->setPalette(qApp->palette());
929 KisView *view = qobject_cast<KisView*>(window->widget());
930 if (view) {
931 view->slotThemeChanged(qApp->palette());
932 }
933 }
934 }
935 }
936
938
939 // Update toolbars
940 {
941 Q_FOREACH (KisToolBar* aToolBar, toolBars()) {
942 QObjectList objects;
943 objects.append(aToolBar);
944 while (!objects.isEmpty()) {
945 QWidget* widget = qobject_cast<QWidget*>(objects.takeFirst());
946 if (widget) {
947 objects.append(widget->children());
948 widget->setPalette(qApp->palette());
949 }
950 }
951 }
952 }
953}
void slotThemeChanged(QPalette pal)
Definition KisView.cpp:1223
void updateIcon(QAbstractButton *button)

References KisKXMLGUIClient::action(), KisKXMLGUIClient::actionCollection(), customizeTabBar(), d, KisView::slotThemeChanged(), KisKMainWindow::toolBars(), KisIconUtils::updateIcon(), and KisKXMLGUIBuilder::widget().

◆ updateWindowMenu

void KisMainWindow::updateWindowMenu ( )
privateslot

Definition at line 2719 of file KisMainWindow.cpp.

2720{
2721 QMenu *menu = d->windowMenu->menu();
2722 menu->clear();
2723
2724#ifndef Q_OS_ANDROID
2725 menu->addAction(d->newWindow);
2726#endif
2727 menu->addAction(d->documentMenu);
2728
2729 QMenu *docMenu = d->documentMenu->menu();
2730 docMenu->clear();
2731
2732 QFontMetrics fontMetrics = docMenu->fontMetrics();
2733 QRect geom = this->geometry();
2734 QPoint p(geom.width() / 2 + geom.left(), geom.height() / 2 + geom.top());
2735 QScreen *screen = qApp->screenAt(p);
2736 int fileStringWidth = 300;
2737 if (screen) {
2738 fileStringWidth = int(screen->availableGeometry().width() * .40f);
2739 }
2740 Q_FOREACH (QPointer<KisDocument> doc, KisPart::instance()->documents()) {
2741 if (doc) {
2742 QString title = fontMetrics.elidedText(doc->path(), Qt::ElideMiddle, fileStringWidth);
2743 if (title.isEmpty() && doc->image()) {
2744 title = doc->image()->objectName();
2745 }
2746 QAction *action = docMenu->addAction(title);
2747 action->setIcon(qApp->windowIcon());
2748 connect(action, SIGNAL(triggered()), d->documentMapper, SLOT(map()));
2749 d->documentMapper->setMapping(action, doc);
2750 }
2751 }
2752
2753 menu->addAction(d->workspaceMenu);
2754 QMenu *workspaceMenu = d->workspaceMenu->menu();
2755 workspaceMenu->clear();
2757 KisResourceIterator resourceIterator(&resourceModel);
2758 KisMainWindow *m_this = this;
2759
2760 while (resourceIterator.hasNext()) {
2761 KisResourceItemSP resource = resourceIterator.next();
2762 QAction *action = workspaceMenu->addAction(resource->name());
2763 action->setProperty("md5", QVariant::fromValue<QString>(resource->md5sum()));
2764 connect(action, SIGNAL(triggered()), this, SLOT(restoreWorkspace()));
2765 }
2766 workspaceMenu->addSeparator();
2767 connect(workspaceMenu->addAction(i18nc("@action:inmenu", "&Import Workspace...")),
2768 &QAction::triggered,
2769 this,
2770 [&]()
2771 {
2773
2774 KoFileDialog dialog(0, KoFileDialog::OpenFile, "OpenDocument");
2775 dialog.setMimeTypeFilters(mimeTypes);
2776 dialog.setCaption(i18nc("@title:window", "Choose File to Add"));
2777 QString filename = dialog.filename();
2778
2780 });
2781
2782 connect(workspaceMenu->addAction(i18nc("@action:inmenu", "&New Workspace...")),
2783 &QAction::triggered,
2784 [=]() {
2785 QString name;
2786 name = QInputDialog::getText(this, i18nc("@title:window", "New Workspace..."),
2787 i18nc("@label:textbox", "Name:"));
2788 if (name.isEmpty()) {
2789 return;
2790 }
2791
2793 workspace->setDockerState(m_this->saveState());
2794 workspace->setImage(layoutThumbnail());
2795 workspace->setValid(true);
2796
2797 // this line must happen before we save the workspace to resource folder or other places
2798 // because it mostly just triggers palettes to be saved into the workspace
2799 d->viewManager->canvasResourceProvider()->notifySavingWorkspace(workspace);
2800 workspace->setValid(true);
2801
2802 workspace->setFilename(name.replace(" ", "_") + workspace->defaultFileExtension());
2803 workspace->setName(name);
2804
2806 });
2807
2808 // TODO: What to do about delete?
2809 // workspaceMenu->addAction(i18nc("@action:inmenu", "&Delete Workspace..."));
2810
2811 menu->addSeparator();
2812 menu->addAction(d->close);
2813 menu->addAction(d->closeAll);
2814 if (d->mdiArea->viewMode() == QMdiArea::SubWindowView) {
2815 menu->addSeparator();
2816 menu->addAction(d->mdiTile);
2817 menu->addAction(d->mdiCascade);
2818 }
2819 menu->addSeparator();
2820 menu->addAction(d->mdiNextWindow);
2821 menu->addAction(d->mdiPreviousWindow);
2822 menu->addSeparator();
2823
2824 QList<QMdiSubWindow *> windows = d->mdiArea->subWindowList();
2825 for (int i = 0; i < windows.size(); ++i) {
2826 QPointer<KisView>child = qobject_cast<KisView*>(windows.at(i)->widget());
2827 if (child && child->document()) {
2828 QString text;
2829 if (i < 9) {
2830 text = i18n("&%1 %2", i + 1, fontMetrics.elidedText(child->document()->path(), Qt::ElideMiddle, fileStringWidth));
2831 }
2832 else {
2833 text = i18n("%1 %2", i + 1, fontMetrics.elidedText(child->document()->path(), Qt::ElideMiddle, fileStringWidth));
2834 }
2835
2836 QAction *action = menu->addAction(text);
2837 action->setIcon(qApp->windowIcon());
2838 action->setCheckable(true);
2839 action->setChecked(child == activeKisView());
2840 connect(action, SIGNAL(triggered()), d->windowMapper, SLOT(map()));
2841 d->windowMapper->setMapping(action, windows.at(i));
2842 }
2843 }
2844
2845 bool showMdiArea = windows.count( ) > 0;
2846 if (!showMdiArea) {
2847 showWelcomeScreen(true); // see workaround in function in header
2848 }
2849
2850 // enable/disable the toolbox docker if there are no documents open
2851 Q_FOREACH (QObject* widget, children()) {
2852 if (widget->inherits("QDockWidget")) {
2853 QDockWidget* dw = static_cast<QDockWidget*>(widget);
2854
2855 if ( dw->objectName() == "ToolBox") {
2856 dw->setEnabled(showMdiArea);
2857 }
2858 }
2859 }
2860}
The KisResourceIterator class provides an iterator for a KisResourceModel.
static KisResourceLoaderRegistry * instance()
QStringList mimeTypes(const QString &resourceType) const
static KoResourceSP importResourceFileWithUserInput(QWidget *widgetParent, QString storageLocation, QString resourceType, QString resourceFilepath)
static bool addResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString storageLocation="")

References KisKXMLGUIClient::action(), activeKisView(), KisResourceUserOperations::addResourceWithUserInput(), d, KisResourceIterator::hasNext(), KisResourceUserOperations::importResourceFileWithUserInput(), KisResourceLoaderRegistry::instance(), KisPart::instance(), layoutThumbnail(), KisResourceLoaderRegistry::mimeTypes(), KisResourceIterator::next(), KoFileDialog::OpenFile, p, restoreWorkspace(), showWelcomeScreen(), KisKXMLGUIBuilder::widget(), workspaceMenu, and ResourceType::Workspaces.

◆ viewCount()

int KisMainWindow::viewCount ( ) const

Definition at line 1970 of file KisMainWindow.cpp.

1971{
1972 return d->mdiArea->subWindowList().size();
1973}

References d.

◆ viewFullscreen

void KisMainWindow::viewFullscreen ( bool fullScreen)
slot

Toggle full screen on/off.

Definition at line 2443 of file KisMainWindow.cpp.

2444{
2445#ifdef Q_OS_ANDROID
2446 // Full-screening on Android applies to the entire application, not this
2447 // window in particular. Qt tries to paper over that matter, but it causes
2448 // some pretty horrid flickering when the main window gets hidden. We just
2449 // talk to the Android interface directly to get around that.
2451 d->fullScreenMode->setChecked(fullScreen);
2452#else
2453 KisConfig cfg(false);
2454 cfg.setFullscreenMode(fullScreen);
2455
2456 if (fullScreen) {
2457 setWindowState(windowState() | Qt::WindowFullScreen); // set
2458 } else {
2459 setWindowState(windowState() & ~Qt::WindowFullScreen); // reset
2460 }
2461 d->fullScreenMode->setChecked(isFullScreen());
2462#endif
2463}
void setFullScreen(bool fullScreen)

References d, KisAndroidUtils::setFullScreen(), and KisConfig::setFullscreenMode().

◆ viewManager()

KisViewManager * KisMainWindow::viewManager ( ) const

◆ windowFocused

void KisMainWindow::windowFocused ( )
slot

Notify selection manager so that it could update selection mask overlay

Definition at line 2687 of file KisMainWindow.cpp.

2688{
2692 if (viewManager() && viewManager()->selectionManager()) {
2694 }
2695
2696 KisPart *kisPart = KisPart::instance();
2698 if (!layoutManager->primaryWorkspaceFollowsFocus()) return;
2699
2700 QUuid primary = layoutManager->primaryWindowId();
2701 if (primary.isNull()) return;
2702
2703 if (d->id == primary) {
2704 if (!d->workspaceBorrowedBy.isNull()) {
2705 KisMainWindow *borrower = kisPart->windowById(d->workspaceBorrowedBy);
2706 if (!borrower) return;
2707 swapWorkspaces(this, borrower);
2708 }
2709 } else {
2710 if (d->workspaceBorrowedBy == primary) return;
2711
2712 KisMainWindow *primaryWindow = kisPart->windowById(primary);
2713 if (!primaryWindow) return;
2714 swapWorkspaces(this, primaryWindow);
2715 }
2716}
static void swapWorkspaces(KisMainWindow *a, KisMainWindow *b)
KisSelectionManager * selectionManager()

References d, KisPart::instance(), KisWindowLayoutManager::instance(), KisWindowLayoutManager::primaryWindowId(), KisWindowLayoutManager::primaryWorkspaceFollowsFocus(), KisSelectionManager::selectionChanged(), KisViewManager::selectionManager(), swapWorkspaces(), viewManager, and KisPart::windowById().

◆ windowsLayoutSavingAllowed()

bool KisMainWindow::windowsLayoutSavingAllowed ( ) const
overrideprotectedvirtual

Reimplemented from KisKMainWindow.

Definition at line 1672 of file KisMainWindow.cpp.

1673{
1674 QAction *action= d->viewManager->actionCollection()->action("view_show_canvas_only");
1675 return !action || !action->isChecked();
1676}

References KisKXMLGUIClient::action(), and d.

◆ windowStateConfig()

const KConfigGroup & KisMainWindow::windowStateConfig ( ) const

Friends And Related Symbol Documentation

◆ KisPart

friend class KisPart
friend

Definition at line 455 of file KisMainWindow.h.

◆ KisWelcomePageWidget

friend class KisWelcomePageWidget
friend

Definition at line 442 of file KisMainWindow.h.

Member Data Documentation

◆ actionMap

QMap<QString, QAction*> KisMainWindow::actionMap

Definition at line 286 of file KisMainWindow.cpp.

◆ activeSubWindow

QMdiSubWindow* KisMainWindow::activeSubWindow {nullptr}

Definition at line 317 of file KisMainWindow.cpp.

317{nullptr};

◆ activeView

KisView * KisMainWindow::activeView

Definition at line 237 of file KisMainWindow.cpp.

◆ activeViewConnections

KisSignalAutoConnectionsStore KisMainWindow::activeViewConnections

Definition at line 238 of file KisMainWindow.cpp.

◆ canvasWindow

QWidget * KisMainWindow::canvasWindow {nullptr}

Definition at line 320 of file KisMainWindow.cpp.

320{nullptr};

◆ close

KisAction* KisMainWindow::close {nullptr}

Definition at line 261 of file KisMainWindow.cpp.

261{nullptr};

◆ closeAll

KisAction* KisMainWindow::closeAll {nullptr}

Definition at line 255 of file KisMainWindow.cpp.

255{nullptr};

◆ commandBar

KateCommandBar* KisMainWindow::commandBar {nullptr}

Definition at line 330 of file KisMainWindow.cpp.

330{nullptr};

◆ commandBarAction

KisAction* KisMainWindow::commandBarAction {nullptr}

Definition at line 281 of file KisMainWindow.cpp.

281{nullptr};

◆ d

Private* const KisMainWindow::d
private

Definition at line 486 of file KisMainWindow.h.

◆ deferredClosingEvent

QCloseEvent* KisMainWindow::deferredClosingEvent {nullptr}

Definition at line 306 of file KisMainWindow.cpp.

306{nullptr};

◆ dockerStateBeforeHiding

QByteArray KisMainWindow::dockerStateBeforeHiding

Definition at line 303 of file KisMainWindow.cpp.

◆ dockWidgetMenu

KActionMenu* KisMainWindow::dockWidgetMenu {nullptr}

Definition at line 288 of file KisMainWindow.cpp.

288{nullptr};

◆ dockWidgetsMap

QMap<QString, QDockWidget *> KisMainWindow::dockWidgetsMap

Definition at line 302 of file KisMainWindow.cpp.

◆ documentMapper

KisSignalMapper* KisMainWindow::documentMapper {nullptr}

Definition at line 319 of file KisMainWindow.cpp.

319{nullptr};

◆ documentMenu

KActionMenu* KisMainWindow::documentMenu {nullptr}

Definition at line 290 of file KisMainWindow.cpp.

290{nullptr};

◆ expandingSpacers

KisAction* KisMainWindow::expandingSpacers[2]

Definition at line 282 of file KisMainWindow.cpp.

◆ exportFile

KisAction* KisMainWindow::exportFile {nullptr}

Definition at line 257 of file KisMainWindow.cpp.

257{nullptr};

◆ exportFileAdvance

KisAction* KisMainWindow::exportFileAdvance {nullptr}

Definition at line 258 of file KisMainWindow.cpp.

258{nullptr};

◆ firstTime

bool KisMainWindow::firstTime {true}

Definition at line 242 of file KisMainWindow.cpp.

242{true};

◆ fullScreenMode

KisAction* KisMainWindow::fullScreenMode {nullptr}

Definition at line 279 of file KisMainWindow.cpp.

279{nullptr};

◆ helpMenu

KisKHelpMenu* KisMainWindow::helpMenu {nullptr}

Definition at line 293 of file KisMainWindow.cpp.

293{nullptr};

◆ id

QUuid KisMainWindow::id

Definition at line 233 of file KisMainWindow.cpp.

◆ importAnimation

void KisMainWindow::importAnimation {nullptr}

Definition at line 251 of file KisMainWindow.cpp.

251{nullptr};

◆ importFile

KisAction* KisMainWindow::importFile {nullptr}

Definition at line 256 of file KisMainWindow.cpp.

256{nullptr};

◆ importVideoAnimation

void KisMainWindow::importVideoAnimation {nullptr}

Definition at line 252 of file KisMainWindow.cpp.

252{nullptr};

◆ lastExportedFormat

QByteArray KisMainWindow::lastExportedFormat

Definition at line 322 of file KisMainWindow.cpp.

◆ lastExportLocation

QString KisMainWindow::lastExportLocation

Definition at line 300 of file KisMainWindow.cpp.

◆ m_dieOnError

bool KisMainWindow::m_dieOnError
private

Definition at line 489 of file KisMainWindow.h.

◆ m_errorMessage

QString KisMainWindow::m_errorMessage
private

Definition at line 488 of file KisMainWindow.h.

◆ mdiArea

QMdiArea* KisMainWindow::mdiArea {nullptr}

Definition at line 316 of file KisMainWindow.cpp.

316{nullptr};

◆ mdiCascade

KisAction* KisMainWindow::mdiCascade {nullptr}

Definition at line 262 of file KisMainWindow.cpp.

262{nullptr};

◆ mdiNextWindow

KisAction* KisMainWindow::mdiNextWindow {nullptr}

Definition at line 264 of file KisMainWindow.cpp.

264{nullptr};

◆ mdiPreviousWindow

KisAction* KisMainWindow::mdiPreviousWindow {nullptr}

Definition at line 265 of file KisMainWindow.cpp.

265{nullptr};

◆ mdiTile

KisAction* KisMainWindow::mdiTile {nullptr}

Definition at line 263 of file KisMainWindow.cpp.

263{nullptr};

◆ newWindow

void KisMainWindow::newWindow {nullptr}

Definition at line 277 of file KisMainWindow.cpp.

277{nullptr};

◆ q

KisMainWindow* KisMainWindow::q {nullptr}

Definition at line 232 of file KisMainWindow.cpp.

232{nullptr};

◆ recentFiles

KRecentFilesAction* KisMainWindow::recentFiles {nullptr}

Definition at line 295 of file KisMainWindow.cpp.

295{nullptr};

◆ redo

void KisMainWindow::redo {nullptr}

Definition at line 260 of file KisMainWindow.cpp.

260{nullptr};

◆ renderAnimation

void KisMainWindow::renderAnimation {nullptr}

Definition at line 253 of file KisMainWindow.cpp.

253{nullptr};

◆ renderAnimationAgain

void KisMainWindow::renderAnimationAgain {nullptr}

Definition at line 254 of file KisMainWindow.cpp.

254{nullptr};

◆ resetConfigurations

KisAction* KisMainWindow::resetConfigurations {nullptr}

Definition at line 267 of file KisMainWindow.cpp.

267{nullptr};

◆ saveAction

KisAction* KisMainWindow::saveAction {nullptr}

Definition at line 249 of file KisMainWindow.cpp.

249{nullptr};

◆ saveActionAs

KisAction* KisMainWindow::saveActionAs {nullptr}

Definition at line 250 of file KisMainWindow.cpp.

250{nullptr};

◆ savingEntryMutex

QMutex KisMainWindow::savingEntryMutex

Definition at line 324 of file KisMainWindow.cpp.

◆ showDocumentInfo

KisAction* KisMainWindow::showDocumentInfo {nullptr}

Definition at line 248 of file KisMainWindow.cpp.

248{nullptr};

◆ showSessionManager

KisAction* KisMainWindow::showSessionManager {nullptr}

Definition at line 280 of file KisMainWindow.cpp.

280{nullptr};

◆ styleActions

QActionGroup* KisMainWindow::styleActions {nullptr}

Definition at line 285 of file KisMainWindow.cpp.

285{nullptr};

◆ styleMenu

KActionMenu* KisMainWindow::styleMenu {nullptr}

Definition at line 284 of file KisMainWindow.cpp.

284{nullptr};

◆ tabSwitchCompressor

QScopedPointer<KisSignalCompressorWithParam<int> > KisMainWindow::tabSwitchCompressor

Definition at line 323 of file KisMainWindow.cpp.

◆ themeManager

Digikam::ThemeManager* KisMainWindow::themeManager {nullptr}

Definition at line 308 of file KisMainWindow.cpp.

308{nullptr};

◆ toggleDetachCanvas

KisAction* KisMainWindow::toggleDetachCanvas {nullptr}

Definition at line 276 of file KisMainWindow.cpp.

276{nullptr};

◆ toggleDockers

KisAction* KisMainWindow::toggleDockers {nullptr}

Definition at line 266 of file KisMainWindow.cpp.

266{nullptr};

◆ toggleDockerTitleBars

KisAction* KisMainWindow::toggleDockerTitleBars {nullptr}

Definition at line 268 of file KisMainWindow.cpp.

268{nullptr};

◆ toolbarList

QList<QAction *> KisMainWindow::toolbarList

Definition at line 240 of file KisMainWindow.cpp.

◆ toolOptionsDocker

KoToolDocker* KisMainWindow::toolOptionsDocker {nullptr}

Definition at line 304 of file KisMainWindow.cpp.

304{nullptr};

◆ undo

void KisMainWindow::undo {nullptr}

Definition at line 259 of file KisMainWindow.cpp.

259{nullptr};

◆ undoActionsUpdateManager

QScopedPointer<KisUndoActionsUpdateManager> KisMainWindow::undoActionsUpdateManager

Definition at line 298 of file KisMainWindow.cpp.

◆ viewManager

KisViewManager * KisMainWindow::viewManager {nullptr}

Definition at line 235 of file KisMainWindow.cpp.

235{nullptr};

◆ welcomePage

KisWelcomePageWidget* KisMainWindow::welcomePage {nullptr}

Definition at line 311 of file KisMainWindow.cpp.

311{nullptr};

◆ welcomeScroller

QScrollArea* KisMainWindow::welcomeScroller {nullptr}

Definition at line 310 of file KisMainWindow.cpp.

310{nullptr};

◆ widgetStack

QStackedWidget* KisMainWindow::widgetStack {nullptr}

Definition at line 314 of file KisMainWindow.cpp.

314{nullptr};

◆ windowMapper

KisSignalMapper* KisMainWindow::windowMapper {nullptr}

Definition at line 318 of file KisMainWindow.cpp.

318{nullptr};

◆ windowMenu

KActionMenu* KisMainWindow::windowMenu {nullptr}

Definition at line 289 of file KisMainWindow.cpp.

289{nullptr};

◆ windowSizeDirty

bool KisMainWindow::windowSizeDirty {false}

Definition at line 243 of file KisMainWindow.cpp.

243{false};

◆ windowStateConfig

const KConfigGroup & KisMainWindow::windowStateConfig

Definition at line 326 of file KisMainWindow.cpp.

◆ workspaceBorrowedBy

QUuid KisMainWindow::workspaceBorrowedBy

Definition at line 328 of file KisMainWindow.cpp.

◆ workspaceMenu

KActionMenu* KisMainWindow::workspaceMenu {nullptr}

Definition at line 291 of file KisMainWindow.cpp.

291{nullptr};

◆ workspacemodel

KisResourceModel* KisMainWindow::workspacemodel {nullptr}

Definition at line 296 of file KisMainWindow.cpp.

296{nullptr};

The documentation for this class was generated from the following files: