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)
 
KisViewnewView (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

KisActionManageractionManager ()
 
KisViewactiveView () const
 
KisViewaddViewAndNotifyLoadingCompleted (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)
 
KoCanvasResourceProviderresourceManager () 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
 
KisViewManagerviewManager () 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 KisKXMLGUIFactoryguiFactory ()
 
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)
 
KisToolBartoolBar (const QString &name=QString())
 
QList< KisToolBar * > toolBars () const
 
 ~KisKMainWindow () override
 Destructor.
 
- Public Member Functions inherited from KisKXMLGUIBuilder
KisKXMLGUIClientbuilderClient () 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 KisKActionCollectionactionCollection () const
 
void addStateActionDisabled (const QString &state, const QString &action)
 
void addStateActionEnabled (const QString &state, const QString &action)
 
void beginXMLPlug (QWidget *)
 
QList< KisKXMLGUIClient * > childClients ()
 
KisKXMLGUIBuilderclientBuilder () const
 
virtual QString componentName () const
 
virtual QDomDocument domDocument () const
 
void endXMLPlug ()
 
KisKXMLGUIFactoryfactory () const
 
StateChange getActionsToChangeForState (const QString &state)
 
void insertChildClient (KisKXMLGUIClient *child)
 
 KisKXMLGUIClient ()
 
 KisKXMLGUIClient (KisKXMLGUIClient *parent)
 
virtual QString localXMLFile () const
 
KisKXMLGUIClientparentClient () 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< KisViewactiveView
 
KisSignalAutoConnectionsStore activeViewConnections
 
KisCanvasWindowcanvasWindow {nullptr}
 
KisActionclose {nullptr}
 
KisActioncloseAll {nullptr}
 
KateCommandBarcommandBar {nullptr}
 
KisActioncommandBarAction {nullptr}
 
QCloseEvent * deferredClosingEvent {nullptr}
 
QByteArray dockerStateBeforeHiding
 
KActionMenu * dockWidgetMenu {nullptr}
 
QMap< QString, QDockWidget * > dockWidgetsMap
 
KisSignalMapperdocumentMapper {nullptr}
 
KActionMenu * documentMenu {nullptr}
 
KisActionexpandingSpacers [2]
 
KisActionexportFile {nullptr}
 
KisActionexportFileAdvance {nullptr}
 
bool firstTime {true}
 
KisActionfullScreenMode {nullptr}
 
KisKHelpMenuhelpMenu {nullptr}
 
QUuid id
 
KisActionimportAnimation {nullptr}
 
KisActionimportFile {nullptr}
 
KisActionimportVideoAnimation {nullptr}
 
QByteArray lastExportedFormat
 
QString lastExportLocation
 
QMdiArea * mdiArea {nullptr}
 
KisActionmdiCascade {nullptr}
 
KisActionmdiNextWindow {nullptr}
 
KisActionmdiPreviousWindow {nullptr}
 
KisActionmdiTile {nullptr}
 
KisActionnewWindow {nullptr}
 
KisMainWindowq {nullptr}
 
KRecentFilesActionrecentFiles {nullptr}
 
KisActionredo {nullptr}
 
KisActionrenderAnimation {nullptr}
 
KisActionrenderAnimationAgain {nullptr}
 
KisActionresetConfigurations {nullptr}
 
KisActionsaveAction {nullptr}
 
KisActionsaveActionAs {nullptr}
 
QMutex savingEntryMutex
 
KisActionshowDocumentInfo {nullptr}
 
KisActionshowSessionManager {nullptr}
 
QActionGroup * styleActions {nullptr}
 
KActionMenu * styleMenu {nullptr}
 
QScopedPointer< KisSignalCompressorWithParam< int > > tabSwitchCompressor
 
Digikam::ThemeManagerthemeManager {nullptr}
 
KisActiontoggleDetachCanvas {nullptr}
 
KisActiontoggleDockers {nullptr}
 
KisActiontoggleDockerTitleBars {nullptr}
 
QList< QAction * > toolbarList
 
KoToolDockertoolOptionsDocker {nullptr}
 
KisActionundo {nullptr}
 
QScopedPointer< KisUndoActionsUpdateManagerundoActionsUpdateManager
 
KisViewManagerviewManager {nullptr}
 
KisWelcomePageWidgetwelcomePage {nullptr}
 
QScrollArea * welcomeScroller {nullptr}
 
QStackedWidget * widgetStack {nullptr}
 
KisSignalMapperwindowMapper {nullptr}
 
KActionMenu * windowMenu {nullptr}
 
bool windowSizeDirty {false}
 
KConfigGroup windowStateConfig
 
QUuid workspaceBorrowedBy
 
KActionMenu * workspaceMenu {nullptr}
 
KisResourceModelworkspacemodel {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< KisViewactiveKisView ()
 
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
KisCanvas2canvas
 
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 188 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 226 of file KisMainWindow.cpp.

226 {
227 qDeleteAll(toolbarList);
228 }
QList< QAction * > toolbarList

◆ KisMainWindow()

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

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

Definition at line 362 of file KisMainWindow.cpp.

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

694{
695 // Q_FOREACH (QAction *ac, actionCollection()->actions()) {
696 // QAction *action = qobject_cast<QAction*>(ac);
697 // if (action) {
698 // qDebug() << "<Action"
699 // << "\n\tname=" << action->objectName()
700 // << "\n\ticon=" << action->icon().name()
701 // << "\n\ttext=" << action->text().replace("&", "&amp;")
702 // << "\n\twhatsThis=" << action->whatsThis()
703 // << "\n\ttoolTip=" << action->toolTip().replace("<html>", "").replace("</html>", "")
704 // << "\n\ticonText=" << action->iconText().replace("&", "&amp;")
705 // << "\n\tshortcut=" << action->shortcut().toString()
706 // << "\n\tisCheckable=" << QString((action->isChecked() ? "true" : "false"))
707 // << "\n\tstatusTip=" << action->statusTip()
708 // << "\n/>\n" ;
709 // }
710 // else {
711 // dbgKrita << "Got a non-qaction:" << ac->objectName();
712 // }
713 // }
714
724 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
725 if (subwin) {
726 (void) subwin->close();
727 delete subwin;
728 }
729 }
730
731 // The doc and view might still exist (this is the case when closing the window)
733
734 delete d->viewManager;
735 delete d;
736
737}
void removeMainWindow(KisMainWindow *mainWindow)
Definition KisPart.cpp:440

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

Member Function Documentation

◆ actionManager()

KisActionManager * KisMainWindow::actionManager ( )
inline

Definition at line 330 of file KisMainWindow.cpp.

330 {
331 return viewManager->actionManager();
332 }
KisViewManager * viewManager
KisActionManager * actionManager() const

◆ activeKisView()

QPointer< KisView > KisMainWindow::activeKisView ( )
private

Definition at line 3018 of file KisMainWindow.cpp.

3019{
3020 if (!d->mdiArea) return 0;
3021 QMdiSubWindow *activeSubWindow = d->mdiArea->activeSubWindow();
3022 //dbgKrita << "activeKisView" << activeSubWindow;
3023 if (!activeSubWindow) return 0;
3024 return qobject_cast<KisView*>(activeSubWindow->widget());
3025}
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 748 of file KisMainWindow.cpp.

749{
750 if (d->activeView == view && !subWindow) return;
751
752 if (d->activeView) {
753 d->activeView->disconnect(this);
754 }
755
756 // register the newly created view in the input manager
758
759 showView(view, subWindow);
760 Q_EMIT restoringDone();
761
762// QTabBar *tabBar = d->findTabBarHACK();
763// Q_FOREACH(QObject *c, tabBar->children()) {
764// if (QWidget *w = qobject_cast<QWidget*>(c)) {
765// w->setAcceptDrops(true);
766// }
767// }
768}
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 1185 of file KisMainWindow.cpp.

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

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

◆ adjustLayoutForWelcomePage()

void KisMainWindow::adjustLayoutForWelcomePage ( )
private

Definition at line 1723 of file KisMainWindow.cpp.

1724{
1725 // This makes sure we don't save window state when we're in welcome page mode, because all the dockers
1726 // etc are hidden while the user is here.
1728
1729 toggleDockersVisibility(false, true);
1730 if (statusBar()) {
1731 statusBar()->hide();
1732 }
1733 QList<QToolBar *> toolbars = findChildren<QToolBar *>();
1734 for (QToolBar *toolbar : toolbars) {
1735 if (toolbar->objectName() != "mainToolBar") {
1736 toolbar->hide();
1737 }
1738 }
1739}
void resetAutoSaveSettings()
void toggleDockersVisibility(bool visible, bool onWelcomePage=false)

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

◆ applyActionIconOverridesFromLocalXML()

void KisMainWindow::applyActionIconOverridesFromLocalXML ( )
private

Definition at line 3364 of file KisMainWindow.cpp.

3365{
3366 QString xmlPath = KoResourcePaths::locateLocal("data", "krita5.xmlgui");
3367 QFile file(xmlPath);
3368 if (!file.exists()) {
3369 return;
3370 }
3371
3372 QDomDocument doc;
3373 if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) {
3374 return;
3375 }
3376
3377 QDomNodeList overridesList = doc.elementsByTagName(QStringLiteral("ActionIconOverrides"));
3378 if (!overridesList.isEmpty()) {
3379 QDomElement overridesElement = overridesList.at(0).toElement();
3380 QDomNodeList actions = overridesElement.elementsByTagName(QStringLiteral("Action"));
3381 for (int i = 0; i < actions.count(); ++i) {
3382 QDomElement actionElement = actions.at(i).toElement();
3383 QString name = actionElement.attribute(QStringLiteral("name"));
3384 QString icon = actionElement.attribute(QStringLiteral("icon"));
3385 if (!name.isEmpty() && !icon.isEmpty()) {
3386 QAction *qa = actionCollection()->action(name);
3387 if (qa) {
3388 qa->setIcon(KisIconUtils::loadIcon(icon));
3389 }
3390 }
3391 }
3392 }
3393}
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 3219 of file KisMainWindow.cpp.

3220{
3221 Q_FOREACH (KisToolBar *toolBar, toolBars()) {
3222 toolBar->layout()->setSpacing(4);
3223 toolBar->setStyleSheet("QToolBar { border: none }"); // has a border in "Fusion" style that people don't like
3224
3225 // Hide text for buttons with an icon in the toolbar
3226 Q_FOREACH (QAction *ac, toolBar->actions()){
3227 if (ac->icon().pixmap(QSize(1,1)).isNull() == false){
3228 ac->setPriority(QAction::LowPriority);
3229 } else {
3230 ac->setIcon(QIcon());
3231 }
3232 }
3233 }
3234}
QList< KisToolBar * > toolBars() const

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

◆ borrowWorkspace()

QByteArray KisMainWindow::borrowWorkspace ( KisMainWindow * borrower)
private

Definition at line 2133 of file KisMainWindow.cpp.

2134{
2135 QByteArray currentWorkspace = saveState();
2136
2137 if (!d->workspaceBorrowedBy.isNull()) {
2138 if (other->id() == d->workspaceBorrowedBy) {
2139 // We're swapping our original workspace back
2140 d->workspaceBorrowedBy = QUuid();
2141 return currentWorkspace;
2142 } else {
2143 // Get our original workspace back before swapping with a third window
2144 KisMainWindow *borrower = KisPart::instance()->windowById(d->workspaceBorrowedBy);
2145 if (borrower) {
2146 QByteArray originalLayout = borrower->borrowWorkspace(this);
2147 borrower->restoreWorkspaceState(currentWorkspace);
2148
2149 d->workspaceBorrowedBy = other->id();
2150 return originalLayout;
2151 }
2152 }
2153 }
2154
2155 d->workspaceBorrowedBy = other->id();
2156 return currentWorkspace;
2157}
Main window for Krita.
bool restoreWorkspaceState(const QByteArray &state)
QByteArray borrowWorkspace(KisMainWindow *borrower)
KisMainWindow * windowById(QUuid id) const
Definition KisPart.cpp:480
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 1030 of file KisMainWindow.cpp.

1031{
1032 return centralWidget() != d->widgetStack;
1033}

References d.

◆ canvasObservers()

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

Implements KoCanvasSupervisor.

Definition at line 2599 of file KisMainWindow.cpp.

2600{
2602
2603 observers.append(static_cast<KoCanvasObserverBase*>(KisPart::instance()->playbackEngine()));
2604
2605 Q_FOREACH (QDockWidget *docker, dockWidgets()) {
2606 KoCanvasObserverBase *observer = dynamic_cast<KoCanvasObserverBase*>(docker);
2607 if (observer) {
2608 observers << observer;
2609 }
2610 else {
2611 warnKrita << docker << "is not a canvas observer";
2612 }
2613 }
2614
2615 return observers;
2616}
#define warnKrita
Definition kis_debug.h:87

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 3341 of file KisMainWindow.cpp.

3342{
3344 proxy.setSourceModel(KisStorageModel::instance());
3346 QStringList()
3348
3349 return (proxy.rowCount() > 0);
3350}
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 2985 of file KisMainWindow.cpp.

2986{
2987 // print error if the lcms engine is not available
2988 if (!KoColorSpaceEngineRegistry::instance()->contains("icc")) {
2989 // need to wait 1 event since exiting here would not work.
2990 m_errorMessage = i18n("The Krita LittleCMS color management plugin is not installed. Krita will quit now.");
2991 m_dieOnError = true;
2992 QTimer::singleShot(0, this, SLOT(showErrorAndDie()));
2993 return;
2994 }
2995
2997
2998 // window is created signal (used in Python)
2999 // there must be some asynchronous things happening in the constructor, because the window cannot
3000 // be referenced until after this timeout is done
3002}
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 1066 of file KisMainWindow.cpp.

1067{
1069}
static KisRecentFilesManager * instance()

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

◆ closeCurrentWindow

void KisMainWindow::closeCurrentWindow ( )
privateslot

Definition at line 2977 of file KisMainWindow.cpp.

2978{
2979 if (d->mdiArea->currentSubWindow()) {
2980 d->mdiArea->currentSubWindow()->close();
2981 d->actionManager()->updateGUI();
2982 }
2983}

References d.

◆ closeEvent()

void KisMainWindow::closeEvent ( QCloseEvent * e)
overrideprotected

Definition at line 1565 of file KisMainWindow.cpp.

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

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 2887 of file KisMainWindow.cpp.

2888{
2889 KisConfig cfg(true);
2890 QMdiArea::ViewMode viewMode = (QMdiArea::ViewMode)cfg.readEntry<int>("mdi_viewmode", (int)QMdiArea::TabbedView);
2891 d->mdiArea->setViewMode(viewMode);
2892 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
2893 subwin->setOption(QMdiSubWindow::RubberBandMove, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
2894 subwin->setOption(QMdiSubWindow::RubberBandResize, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
2895 if (viewMode == QMdiArea::TabbedView) {
2896 subwin->setWindowState(Qt::WindowMaximized);
2897 }
2898
2906 if (viewMode == QMdiArea::TabbedView) {
2907 Qt::WindowFlags oldFlags = subwin->windowFlags();
2908 Qt::WindowFlags flags = oldFlags;
2909
2910 flags &= ~Qt::WindowStaysOnTopHint;
2911 flags &= ~Qt::WindowStaysOnBottomHint;
2912
2913 if (flags != oldFlags) {
2914 subwin->setWindowFlags(flags);
2915 subwin->showMaximized();
2916 }
2917 }
2918 }
2919#ifdef Q_OS_MACOS
2921#endif
2922
2923 KConfigGroup group( KSharedConfig::openConfig(), "theme");
2924#ifndef Q_OS_HAIKU
2925 d->themeManager->setCurrentTheme(group.readEntry("Theme", "Krita dark"));
2926#endif
2927 d->actionManager()->updateGUI();
2928
2929 QString s = cfg.getMDIBackgroundColor();
2931 QBrush brush(c.toQColor());
2932 d->mdiArea->setBackground(brush);
2933
2934 QString backgroundImage = cfg.getMDIBackgroundImage();
2935 if (backgroundImage != "") {
2936 QImage image(backgroundImage);
2937 QBrush brush(image);
2938 d->mdiArea->setBackground(brush);
2939 }
2940
2941 d->mdiArea->update();
2942
2943 qApp->setFont(KisUiFont::normalFont());
2944
2945 Q_FOREACH (QObject* widget, children()) {
2946 if (widget->inherits("QDockWidget")) {
2947 QDockWidget* dw = static_cast<QDockWidget*>(widget);
2948 dw->setFont(KisUiFont::dockFont());
2949 }
2950 }
2951}
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 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 3055 of file KisMainWindow.cpp.

3056{
3057 KisActionManager *actionManager = d->actionManager();
3058
3059
3060
3065 d->fullScreenMode = actionManager->createStandardAction(KStandardAction::FullScreen, this, SLOT(viewFullscreen(bool)));
3066
3067 d->recentFiles = KStandardAction::openRecent(this, SLOT(slotFileOpenRecent(QUrl)), actionCollection());
3068
3070 d->saveAction->setActivationFlags(KisAction::IMAGE_IS_WRITABLE);
3071
3073 d->saveActionAs->setActivationFlags(KisAction::ACTIVE_IMAGE);
3074
3076 d->undo->setActivationFlags(KisAction::ACTIVE_IMAGE);
3077
3079 d->redo->setActivationFlags(KisAction::ACTIVE_IMAGE);
3080
3081 d->undoActionsUpdateManager.reset(new KisUndoActionsUpdateManager(d->undo, d->redo));
3082 d->undoActionsUpdateManager->setCurrentDocument(d->activeView ? d->activeView->document() : 0);
3083
3084 d->importAnimation = actionManager->createAction("file_import_animation");
3085 connect(d->importAnimation, SIGNAL(triggered()), this, SLOT(importAnimation()));
3086
3087 // Importing video requires ffmpeg, which is not available on Android.
3088#ifndef Q_OS_ANDROID
3089 d->importVideoAnimation = actionManager->createAction("file_import_video_animation");
3090 connect(d->importVideoAnimation, SIGNAL(triggered()), this, SLOT(importVideoAnimation()));
3091#endif
3092
3093 d->renderAnimation = actionManager->createAction("render_animation");
3094 d->renderAnimation->setActivationFlags(KisAction::IMAGE_HAS_ANIMATION);
3095 connect( d->renderAnimation, SIGNAL(triggered()), this, SLOT(renderAnimation()));
3096
3097 d->renderAnimationAgain = actionManager->createAction("render_animation_again");
3098 d->renderAnimationAgain->setActivationFlags(KisAction::IMAGE_HAS_ANIMATION);
3099 connect( d->renderAnimationAgain, SIGNAL(triggered()), this, SLOT(renderAnimationAgain()));
3100
3101 d->closeAll = actionManager->createAction("file_close_all");
3102 connect(d->closeAll, SIGNAL(triggered()), this, SLOT(slotFileCloseAll()));
3103
3104 d->importFile = actionManager->createAction("file_import_file");
3105 d->importFile->setActivationFlags(KisAction::IMAGE_IS_WRITABLE);
3106 connect(d->importFile, SIGNAL(triggered(bool)), this, SLOT(slotImportFile()));
3107
3108 d->exportFile = actionManager->createAction("file_export_file");
3109 connect(d->exportFile, SIGNAL(triggered(bool)), this, SLOT(slotExportFile()));
3110
3111 d->exportFileAdvance = actionManager->createAction("file_export_advanced");
3112 connect(d->exportFileAdvance, SIGNAL(triggered(bool)), this, SLOT(slotExportAdvance()));
3113
3114 /* The following entry opens the document information dialog. Since the action is named so it
3115 intends to show data this entry should not have a trailing ellipses (...). */
3116 d->showDocumentInfo = actionManager->createAction("file_documentinfo");
3117 connect(d->showDocumentInfo, SIGNAL(triggered(bool)), this, SLOT(slotDocumentInfo()));
3118#ifndef Q_OS_HAIKU
3119 d->themeManager->setThemeMenuAction(new KActionMenu(i18nc("@action:inmenu", "&Themes"), this));
3120 d->themeManager->registerThemeActions(actionCollection());
3121 connect(d->themeManager, SIGNAL(signalThemeChanged()), this, SLOT(slotThemeChanged()), Qt::QueuedConnection);
3122 connect(this, SIGNAL(themeChanged()), d->welcomePage, SLOT(slotUpdateThemeColors()), Qt::UniqueConnection);
3123#endif
3124 d->toggleDockers = actionManager->createAction("view_toggledockers");
3125
3126
3127 KisConfig(true).showDockers(true);
3128 d->toggleDockers->setChecked(true);
3129 connect(d->toggleDockers, SIGNAL(toggled(bool)), SLOT(toggleDockersVisibility(bool)));
3130
3131 d->resetConfigurations = actionManager->createAction("reset_configurations");
3132 connect(d->resetConfigurations, SIGNAL(triggered()), this, SLOT(slotResetConfigurations()));
3133
3134#ifndef Q_OS_ANDROID
3135 d->toggleDetachCanvas = actionManager->createAction("view_detached_canvas");
3136 d->toggleDetachCanvas->setChecked(false);
3137 connect(d->toggleDetachCanvas, SIGNAL(toggled(bool)), SLOT(setCanvasDetached(bool)));
3138#endif
3139 setCanvasDetached(false);
3140
3141 d->toggleDockerTitleBars = actionManager->createAction("view_toggledockertitlebars");
3142 d->toggleDockerTitleBars->setChecked(KisConfig(false).showDockerTitleBars());
3143 connect(d->toggleDockerTitleBars, SIGNAL(toggled(bool)), SLOT(showDockerTitleBars(bool)));
3144
3145 actionCollection()->addAction("settings_dockers_menu", d->dockWidgetMenu);
3146 actionCollection()->addAction("window", d->windowMenu);
3147
3148 actionCollection()->addAction("style_menu", d->styleMenu); // for widget styles: breeze, fusion, etc
3149
3150 d->mdiCascade = actionManager->createAction("windows_cascade");
3151 connect(d->mdiCascade, SIGNAL(triggered()), d->mdiArea, SLOT(cascadeSubWindows()));
3152
3153 d->mdiTile = actionManager->createAction("windows_tile");
3154 connect(d->mdiTile, SIGNAL(triggered()), d->mdiArea, SLOT(tileSubWindows()));
3155
3156 d->mdiNextWindow = actionManager->createAction("windows_next");
3157 connect(d->mdiNextWindow, SIGNAL(triggered()), d->mdiArea, SLOT(activateNextSubWindow()));
3158
3159 d->mdiPreviousWindow = actionManager->createAction("windows_previous");
3160 connect(d->mdiPreviousWindow, SIGNAL(triggered()), d->mdiArea, SLOT(activatePreviousSubWindow()));
3161
3162#ifdef Q_OS_ANDROID
3163 d->showDonationManagementDialog = actionManager->createAction("manage_donations");
3164 connect(d->showDonationManagementDialog,
3165 &QAction::triggered,
3166 this,
3167 &KisMainWindow::slotShowDonationManagementDialog);
3168
3170 if (androidDonations) {
3171 d->manageSubscriptions = actionManager->createAction("manage_subscriptions");
3172 connect(d->manageSubscriptions,
3173 &QAction::triggered,
3174 androidDonations,
3176 connect(androidDonations,
3178 this,
3179 &KisMainWindow::slotShowDonationManagementDialog,
3180 Qt::QueuedConnection);
3181 }
3182#if KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
3184 if (androidScaling && androidScaling->isSupported()) {
3185 d->changeInterfaceScale = actionManager->createAction("change_interface_scale");
3186 connect(d->changeInterfaceScale, &QAction::triggered, this, &KisMainWindow::slotChangeInterfaceScale);
3187 }
3188#endif
3189#else
3190 d->newWindow = actionManager->createAction("view_newwindow");
3191 connect(d->newWindow, SIGNAL(triggered(bool)), this, SLOT(newWindow()));
3192#endif
3193
3195
3196 d->showSessionManager = actionManager->createAction("file_sessions");
3197 connect(d->showSessionManager, SIGNAL(triggered(bool)), this, SLOT(slotShowSessionManager()));
3198
3199 d->commandBarAction = actionManager->createAction("command_bar_open");
3200 connect(d->commandBarAction, SIGNAL(triggered(bool)), this, SLOT(openCommandBar()));
3201
3203
3204 for (int i = 0; i < 2; i++) {
3205 d->expandingSpacers[i] = new KisAction(i18n("Expanding Spacer"));
3206 d->expandingSpacers[i]->setDefaultWidget(new QWidget(this));
3207 d->expandingSpacers[i]->defaultWidget()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
3208 actionManager->addAction(QString("expanding_spacer_%1").arg(i), d->expandingSpacers[i]);
3209 }
3210
3211 {
3212 using namespace KisWidgetConnectionUtils;
3213
3214 QAction *action = actionManager->createAction("lock_toolbars");
3216 }
3217}
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 2455 of file KisMainWindow.cpp.

2456{
2457 QDockWidget* dockWidget = 0;
2458 const bool showTitlebars = KisConfig(false).showDockerTitleBars();
2459
2460 if (!d->dockWidgetsMap.contains(factory->id())) {
2461 dockWidget = factory->createDockWidget();
2462 KAcceleratorManager::setNoAccel(dockWidget);
2463
2464 // It is quite possible that a dock factory cannot create the dock; don't
2465 // do anything in that case.
2466 if (!dockWidget) {
2467 warnKrita << "Could not create docker for" << factory->id();
2468 return 0;
2469 }
2470
2471 KoDockWidgetTitleBar *titleBar = dynamic_cast<KoDockWidgetTitleBar*>(dockWidget->titleBarWidget());
2472
2473 // Check if the dock widget is supposed to be collapsible
2474 if (!dockWidget->titleBarWidget()) {
2475 titleBar = new KoDockWidgetTitleBar(dockWidget);
2476 dockWidget->setTitleBarWidget(titleBar);
2477 }
2478 if (titleBar) {
2479 titleBar->setFont(KisUiFont::dockFont());
2480 }
2481
2482 if (dockWidget->titleBarWidget() && !dockWidget->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2483 dockWidget->titleBarWidget()->setVisible(KisConfig(true).showDockerTitleBars());
2484 }
2485
2486 dockWidget->setObjectName(factory->id());
2487 dockWidget->setParent(this);
2488 if (!showTitlebars) {
2489 if (dockWidget->titleBarWidget() && !dockWidget->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2490 dockWidget->titleBarWidget()->setVisible(false);
2491 }
2492 dockWidget->setFeatures(QDockWidget::NoDockWidgetFeatures);
2493 }
2494 if (dockWidget->widget() && dockWidget->widget()->layout())
2495 dockWidget->widget()->layout()->setContentsMargins(1, 1, 1, 1);
2496
2497 Qt::DockWidgetArea side = Qt::RightDockWidgetArea;
2498 bool visible = true;
2499
2500 switch (factory->defaultDockPosition()) {
2502 dockWidget->setFloating(true); // position nicely?
2503 break;
2505 side = Qt::TopDockWidgetArea; break;
2507 side = Qt::LeftDockWidgetArea; break;
2509 side = Qt::BottomDockWidgetArea; break;
2511 side = Qt::RightDockWidgetArea; break;
2513 default:
2514 side = Qt::RightDockWidgetArea;
2515 visible = false;
2516 }
2517
2518 KConfigGroup group = d->windowStateConfig.group("DockWidget " + factory->id());
2519 side = static_cast<Qt::DockWidgetArea>(group.readEntry("DockArea", static_cast<int>(side)));
2520 if (side == Qt::NoDockWidgetArea) side = Qt::RightDockWidgetArea;
2521
2522 addDockWidget(side, dockWidget);
2523 if (!visible) {
2524 dockWidget->hide();
2525 }
2526
2527 bool locked = group.readEntry("Locked", false);
2528 if (titleBar && locked) {
2529 titleBar->setLocked(true);
2530 }
2531 else if ( dockWidget->titleBarWidget()->inherits("KisUtilityTitleBar") && locked){
2532 KisUtilityTitleBar *utilityTitleBar = dynamic_cast<KisUtilityTitleBar*>(dockWidget->titleBarWidget());
2533 utilityTitleBar->setLocked(true);
2534 }
2535
2536 d->dockWidgetsMap.insert(factory->id(), dockWidget);
2537 }
2538 else {
2539 dockWidget = d->dockWidgetsMap[factory->id()];
2540 }
2541
2542#ifdef Q_OS_MACOS
2543 dockWidget->setAttribute(Qt::WA_MacSmallSize, true);
2544#endif
2545 dockWidget->setFont(KisUiFont::dockFont());
2546
2547 connect(dockWidget, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)), this, SLOT(forceDockTabFonts()));
2548
2549 return dockWidget;
2550}
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 739 of file KisMainWindow.cpp.

740{
741 return 0;
742}

◆ customizeTabBar()

void KisMainWindow::customizeTabBar ( )
private

Definition at line 989 of file KisMainWindow.cpp.

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

References d, and KisIconUtils::useDarkIcons().

◆ dockWidget()

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

Definition at line 2593 of file KisMainWindow.cpp.

2594{
2595 if (!d->dockWidgetsMap.contains(id)) return 0;
2596 return d->dockWidgetsMap[id];
2597}

References d, and id.

◆ dockWidgets()

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

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

Definition at line 2588 of file KisMainWindow.cpp.

2589{
2590 return d->dockWidgetsMap.values();
2591}

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 1795 of file KisMainWindow.cpp.

1796{
1797 if (d->tabSwitchCompressor->isActive()) {
1798 d->tabSwitchCompressor->stop();
1799 }
1800}

References d.

◆ dragLeaveEvent()

void KisMainWindow::dragLeaveEvent ( QDragLeaveEvent * event)
overrideprotected

Definition at line 1656 of file KisMainWindow.cpp.

1657{
1658 dragLeave();
1659 event->accept();
1660}

References dragLeave().

◆ dragMove()

void KisMainWindow::dragMove ( QDragMoveEvent * event)
private

Definition at line 1773 of file KisMainWindow.cpp.

1774{
1775 QTabBar *tabBar = d->findTabBarHACK();
1776
1777 if (!tabBar && d->mdiArea->viewMode() == QMdiArea::TabbedView) {
1778 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)!";
1779 }
1780
1781 if (tabBar && tabBar->isVisible()) {
1782 QPoint pos = tabBar->mapFromGlobal(mapToGlobal(event->pos()));
1783 if (tabBar->rect().contains(pos)) {
1784 const int tabIndex = tabBar->tabAt(pos);
1785
1786 if (tabIndex >= 0 && tabBar->currentIndex() != tabIndex) {
1787 d->tabSwitchCompressor->start(tabIndex);
1788 }
1789 } else if (d->tabSwitchCompressor->isActive()) {
1790 d->tabSwitchCompressor->stop();
1791 }
1792 }
1793}
bool event(QEvent *event) override

References d, and KXmlGuiWindow::event().

◆ dragMoveEvent()

void KisMainWindow::dragMoveEvent ( QDragMoveEvent * event)
overrideprotected

Definition at line 1650 of file KisMainWindow.cpp.

1651{
1652 dragMove(event);
1653 event->accept();
1654}
void dragMove(QDragMoveEvent *event)

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

◆ findTabBarHACK()

QTabBar * KisMainWindow::findTabBarHACK ( )
inline

Definition at line 334 of file KisMainWindow.cpp.

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

◆ forceDockTabFonts

void KisMainWindow::forceDockTabFonts ( )
privateslot

Definition at line 2552 of file KisMainWindow.cpp.

2553{
2554 Q_FOREACH (QObject *child, children()) {
2555 if (child->inherits("QTabBar")) {
2556 ((QTabBar *)child)->setFont(KisUiFont::dockFont());
2557 }
2558 }
2559}

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 1275 of file KisMainWindow.cpp.

1276{
1277 std::unique_lock<QMutex> l(d->savingEntryMutex, std::try_to_lock);
1278 return !l.owns_lock();
1279}

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 3236 of file KisMainWindow.cpp.

3237{
3238 // if the user didn's specify the geometry on the command line (does anyone do that still?),
3239 // we first figure out some good default size and restore the x,y position. See bug 285804Z.
3240 KConfigGroup cfg = d->windowStateConfig;
3241 QByteArray geom = QByteArray::fromBase64(cfg.readEntry("ko_geometry", QByteArray()));
3242 if (!restoreGeometry(geom)) {
3243 QRect desk = this->screen()->availableGeometry();
3244
3245 quint32 x = desk.x();
3246 quint32 y = desk.y();
3247 quint32 w = 0;
3248 quint32 h = 0;
3249
3250 // Default size -- maximize on small screens, something useful on big screens
3251 const int deskWidth = desk.width();
3252 if (deskWidth > 1024) {
3253 // a nice width, and slightly less than total available
3254 // height to compensate for the window decs
3255 w = (deskWidth / 3) * 2;
3256 h = (desk.height() / 3) * 2;
3257 }
3258 else {
3259 w = desk.width();
3260 h = desk.height();
3261 }
3262
3263 x += (desk.width() - w) / 2;
3264 y += (desk.height() - h) / 2;
3265
3266 move(x,y);
3267 setGeometry(geometry().x(), geometry().y(), w, h);
3268 }
3269#ifdef Q_OS_ANDROID
3270 // We handle full-screening differently on Android, see viewFullScreen.
3272#else
3273 bool fullScreen = isFullScreen();
3274#endif
3275 d->fullScreenMode->setChecked(fullScreen);
3276}
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 1281 of file KisMainWindow.cpp.

1282{
1283 QFileInfo from(fileName);
1284 QFileInfo to(QStringLiteral("%1/%2").arg(KoResourcePaths::getAppDataLocation(), from.fileName()));
1285 if (to.exists()) {
1286 QFile::remove(to.canonicalFilePath());
1287 }
1288 return QFile::copy(fileName, to.absoluteFilePath());
1289}
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 1291 of file KisMainWindow.cpp.

1292{
1293 int size = 256;
1294 qreal scale = qreal(size)/qreal(qMax(geometry().width(), geometry().height()));
1295 QImage layoutThumbnail = QImage(qRound(geometry().width()*scale), qRound(geometry().height()*scale), QImage::Format_ARGB32);
1296 QPainter gc(&layoutThumbnail);
1297 gc.fillRect(0, 0, layoutThumbnail.width(), layoutThumbnail.height(), this->palette().dark());
1298
1299 Q_FOREACH(const QObject *child, children()) {
1300 if (child->isWidgetType()) {
1301 const QWidget *w = static_cast<const QWidget *>(child);
1302
1303 if (w->isVisible() && !w->property("_kis_excludeFromLayoutThumbnail").toBool()) {
1304 QRect wRect = QRectF(w->geometry().x()*scale
1305 , w->geometry().y()*scale
1306 , w->geometry().width()*scale
1307 , w->geometry().height()*scale
1308 ).toRect();
1309
1310 wRect = wRect.intersected(layoutThumbnail.rect().adjusted(-1, -1, -1, -1));
1311
1312 gc.setBrush(this->palette().window());
1313 if (w == d->widgetStack) {
1314 gc.setBrush(d->mdiArea->background());
1315 }
1316 gc.setPen(this->palette().windowText().color());
1317 gc.drawRect(wRect);
1318 }
1319 }
1320 }
1321 gc.end();
1322 return layoutThumbnail;
1323}
QImage layoutThumbnail()
layoutThumbnail
rgba palette[MAX_PALETTE]
Definition palette.c:35

References d, layoutThumbnail(), and palette.

◆ 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 3027 of file KisMainWindow.cpp.

3028{
3029 KIS_ASSERT_RECOVER_NOOP(controller == KoToolManager::instance()->activeCanvasController());
3030 bool isOurOwnView = false;
3031
3032 Q_FOREACH (QPointer<KisView> view, KisPart::instance()->views()) {
3033 if (view && view->canvasController() == controller) {
3034 isOurOwnView = view->mainWindow() == this;
3035 }
3036 }
3037
3038 if (!isOurOwnView) return;
3039
3040 Q_FOREACH (QWidget *w, optionWidgetList) {
3041#ifdef Q_OS_MACOS
3042 w->setAttribute(Qt::WA_MacSmallSize, true);
3043#endif
3044 w->setFont(KisUiFont::dockFont());
3045 }
3046
3047 if (d->toolOptionsDocker) {
3048 d->toolOptionsDocker->setOptionWidgets(optionWidgetList);
3049 }
3050 else {
3051 d->viewManager->paintOpBox()->newOptionWidgets(optionWidgetList);
3052 }
3053}
#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 2953 of file KisMainWindow.cpp.

2954{
2955 KisDocument *doc = qobject_cast<KisDocument*>(document);
2956 KisView *view = addViewAndNotifyLoadingCompleted(doc, subWindow);
2957 d->actionManager()->updateGUI();
2958
2959 return view;
2960}
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 770 of file KisMainWindow.cpp.

771{
778 if (view->canvasBase() == viewManager()->canvasBase()) {
780 }
781}
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 2048 of file KisMainWindow.cpp.

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

1103{
1104 ScopedWidgetDisabler disabler(d->welcomePage->dropFrameBorder);
1105 QApplication::processEvents(); // make UI more responsive
1106
1107 if (!QFile(path).exists()) {
1108 if (!(flags & BatchMode)) {
1109 QMessageBox::critical(qApp->activeWindow(), i18nc("@title:window", "Krita"), i18n("The file %1 does not exist.", path));
1110 }
1111 KisRecentFilesManager::instance()->remove(QUrl::fromLocalFile(path)); //remove the file from the recent-opened-file-list
1112 return false;
1113 }
1114 return openDocumentInternal(path, flags);
1115}
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 1117 of file KisMainWindow.cpp.

1118{
1119 if (!QFile(path).exists()) {
1120 qWarning() << "KisMainWindow::openDocumentInternal. Could not open:" << path;
1121 return false;
1122 }
1123
1125
1126 if (flags & BatchMode) {
1127 newdoc->setFileBatchMode(true);
1128 }
1129
1130 d->firstTime = true;
1131 connect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
1132 connect(newdoc, SIGNAL(canceled(QString)), this, SLOT(slotLoadCanceled(QString)));
1133
1134 KisDocument::OpenFlags openFlags = KisDocument::None;
1135 // XXX: Why this duplication of OpenFlags...
1136 if (flags & RecoveryFile) {
1137 openFlags |= KisDocument::RecoveryFile;
1138 }
1139
1140 bool openRet = !(flags & Import) ? newdoc->openPath(path, openFlags) : newdoc->importDocument(path);
1141
1142 if (!openRet) {
1143 delete newdoc;
1144 return false;
1145 }
1146
1147 KisPart::instance()->addDocument(newdoc);
1148
1149 // Try to determine whether this was an unnamed autosave
1150 if (flags & RecoveryFile &&
1151 ( path.startsWith(QDir::tempPath())
1152 || path.startsWith(QDir::homePath())
1153 ) &&
1154 ( QFileInfo(path).fileName().startsWith(".krita")
1155 || QFileInfo(path).fileName().startsWith("krita")
1156 )
1157 )
1158 {
1159 QString path = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
1160 if (!QFileInfo(path).exists()) {
1161 path = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
1162 }
1163 newdoc->setPath(path + "/" + newdoc->objectName() + ".kra");
1164 }
1165
1166 return true;
1167}
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:211
KisDocument * createDocument() const
Definition KisPart.cpp:230

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 3302 of file KisMainWindow.cpp.

3303{
3304 QScreen *screen = QGuiApplication::primaryScreen();
3305
3306 for (QWindow* window: QGuiApplication::topLevelWindows()) {
3307 // Android: we shouldn't transform Window managers independent of its child
3308 if ((window->type() == Qt::Popup)
3309 && (window->flags() & Qt::FramelessWindowHint) == 0
3310 && (window->geometry().topLeft() != QPoint(0, 0))) {
3311 // We are using reversed values. Because geometry returned is not the updated
3312 // one, but the previous one.
3313 int screenHeight = screen->geometry().width();
3314 int screenWidth = screen->geometry().height();
3315
3316 // scaling
3317 int new_x = (window->position().x() * screenWidth) / screenHeight;
3318 int new_y = (window->position().y() * screenHeight) / screenWidth;
3319
3320 // window width or height shouldn't change
3321 int winWidth = window->geometry().width();
3322 int winHeight = window->geometry().height();
3323
3324 // Try best to not let the window go beyond screen.
3325 if (new_x > screenWidth - winWidth) {
3326 new_x = screenWidth - winWidth;
3327 if (new_x < 0)
3328 new_x = 0;
3329 }
3330 if (new_y > screenHeight - winHeight) {
3331 new_y = screenHeight - winHeight;
3332 if (new_y < 0)
3333 new_y = 0;
3334 }
3335
3336 window->setPosition(QPoint(new_x, new_y));
3337 }
3338 }
3339}

◆ Private()

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

Definition at line 191 of file KisMainWindow.cpp.

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

1072{
1073 KisRecentFilesManager::instance()->remove(QUrl::fromLocalFile(url));
1074}

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 1643 of file KisMainWindow.cpp.

1644{
1645 d->windowSizeDirty = true;
1646 KXmlGuiWindow::resizeEvent(e);
1647}

References d.

◆ resourceManager()

KoCanvasResourceProvider * KisMainWindow::resourceManager ( ) const

Definition at line 1955 of file KisMainWindow.cpp.

1956{
1957 return d->viewManager->canvasResourceProvider()->resourceManager();
1958}

References d.

◆ restoreWorkspace [1/2]

void KisMainWindow::restoreWorkspace ( )
privateslot

Definition at line 2035 of file KisMainWindow.cpp.

2036{
2037 QString md5 = sender()->property("md5").toString();
2039 KoResourceSP resource = rserver->resource(md5, "", "");
2040 if (resource) {
2041 restoreWorkspace(resource);
2042 }
2043 else {
2044 qWarning() << "Could not retrieve resource for" << md5;
2045 }
2046}
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 2111 of file KisMainWindow.cpp.

2112{
2113 KisWorkspaceResourceSP workspace = res.dynamicCast<KisWorkspaceResource>();
2114
2115 bool success = restoreWorkspaceState(workspace->dockerState());
2116
2117 const bool showTitlebars = KisConfig(false).showDockerTitleBars();
2118 Q_FOREACH (QDockWidget *dock, dockWidgets()) {
2119 if (dock->titleBarWidget() && !dock->titleBarWidget()->inherits("KisUtilityTitleBar")) {
2120 dock->titleBarWidget()->setVisible(showTitlebars || dock->isFloating());
2121 }
2122 }
2123
2124 if (activeKisView()) {
2125 activeKisView()->resourceProvider()->notifyLoadingWorkspace(workspace);
2126 }
2127
2128 d->viewManager->notifyWorkspaceLoaded();
2129
2130 return success;
2131}
Resource for storing of workspaces.

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

◆ restoreWorkspaceState()

bool KisMainWindow::restoreWorkspaceState ( const QByteArray & state)

Definition at line 2004 of file KisMainWindow.cpp.

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

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 1325 of file KisMainWindow.cpp.

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

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 1603 of file KisMainWindow.cpp.

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

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

◆ saveWindowState()

void KisMainWindow::saveWindowState ( bool restoreNormalState = false)

Definition at line 1970 of file KisMainWindow.cpp.

1971{
1972 // We don't need to save welcome page's layout
1973 if (d->widgetStack->currentIndex() == 0) {
1974 // TODO(sh_zam): We should still save position/geometry, right?
1975 return;
1976 }
1977
1978 if (restoreNormalState) {
1979 QAction *showCanvasOnly = d->viewManager->actionCollection()->action("view_show_canvas_only");
1980
1981 if (showCanvasOnly && showCanvasOnly->isChecked()) {
1982 showCanvasOnly->setChecked(false);
1983 }
1984
1985 d->windowStateConfig.writeEntry("ko_geometry", saveGeometry().toBase64());
1986 d->windowStateConfig.writeEntry("State", saveState().toBase64());
1987
1988 // if the dockers are hidden at this time, save their state.
1989 if (!d->toggleDockers->isChecked()) {
1990 restoreState(d->dockerStateBeforeHiding);
1991 }
1992
1993 statusBar()->setVisible(true);
1994 menuBar()->setVisible(true);
1995
1997
1998 } else {
1999 saveMainWindowSettings(d->windowStateConfig);
2000 }
2001
2002}
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 2866 of file KisMainWindow.cpp.

2867{
2868 if (!window) {
2870 return;
2871 }
2872 QMdiSubWindow *subwin = qobject_cast<QMdiSubWindow *>(window);
2873 //dbgKrita << "setActiveSubWindow();" << subwin << d->activeSubWindow;
2874
2875 if (subwin && subwin != d->activeSubWindow) {
2876 KisView *view = qobject_cast<KisView *>(subwin->widget());
2877 //dbgKrita << "\t" << view << activeView();
2878 if (view && view != activeView()) {
2879 setActiveView(view);
2880 }
2881 d->activeSubWindow = subwin;
2882 }
2884 d->actionManager()->updateGUI();
2885}
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 1741 of file KisMainWindow.cpp.

1742{
1743 d->activeView = view;
1744
1745 if (d->undoActionsUpdateManager) {
1746 d->undoActionsUpdateManager->setCurrentDocument(view ? view->document() : 0);
1747 }
1748
1749 d->viewManager->setCurrentView(view);
1750
1751 d->activeViewConnections.clear();
1752 d->activeViewConnections.addConnection(view->document(),
1753 SIGNAL(sigPathChanged(QString)),
1754 this, SLOT(slotUpdateSaveActionTitle(QString)));
1755 slotUpdateSaveActionTitle(view->document()->path());
1756 d->activeViewConnections.addConnection(view->document(),
1757 SIGNAL(sigReadWriteChanged(bool)),
1758 this, SLOT(slotUpdateReadWriteMode(bool)));
1759 slotUpdateReadWriteMode(view->document()->isReadWrite());
1760
1762
1763 Q_EMIT activeViewChanged();
1764}
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 1035 of file KisMainWindow.cpp.

1036{
1037#ifdef Q_OS_ANDROID
1038 if (detach) {
1039 QMessageBox::warning(this, i18nc("@title:window", "Krita"),
1040 "Detach Canvas is unsupported on Android");
1041 }
1042#else
1043 if (detach == canvasDetached()) return;
1044
1045 QWidget *outgoingWidget = centralWidget() ? takeCentralWidget() : nullptr;
1046 QWidget *incomingWidget = d->canvasWindow->swapMainWidget(outgoingWidget);
1047
1048 if (incomingWidget) {
1049 setCentralWidget(incomingWidget);
1050 }
1051
1052 if (detach) {
1053 d->canvasWindow->show();
1054 } else {
1055 d->canvasWindow->hide();
1056 }
1057 d->toggleDetachCanvas->setChecked(detach);
1058#endif
1059}
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 1687 of file KisMainWindow.cpp.

1688{
1689
1690 if (widgetIndex == 0) {
1691 if (widgetIndexChanged) {
1696
1697 if (d->mdiArea->subWindowList().isEmpty()) {
1702 saveWindowState(true);
1703 } else {
1704 saveMainWindowSettings(d->windowStateConfig);
1705 }
1706 }
1708 }
1709 else {
1710 setAutoSaveSettings(d->windowStateConfig, false);
1711 statusBar()->setVisible(KisConfig(true).showStatusBar());
1712 }
1713
1714 QList<QAction *> actions = d->dockWidgetMenu->menu()->actions();
1715 actions.append(toolBarMenuAction()->menu()->actions());
1716 for (QAction *action : actions) {
1717 if (action) {
1718 action->setEnabled(widgetIndex);
1719 }
1720 }
1721}
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 3012 of file KisMainWindow.cpp.

3013{
3014 KisAboutApplication dlg(this);
3015 dlg.exec();
3016}

◆ showDockerTitleBars

void KisMainWindow::showDockerTitleBars ( bool show)
privateslot

Toggle docker titlebars on/off.

Definition at line 3283 of file KisMainWindow.cpp.

3284{
3285 Q_FOREACH (QDockWidget *dock, dockWidgets()) {
3286 if (dock->titleBarWidget() && !dock->titleBarWidget()->inherits("KisUtilityTitleBar")) {
3287 dock->titleBarWidget()->setVisible(show || dock->isFloating());
3288 }
3289 }
3290
3291 KisConfig cfg(true);
3292 cfg.setShowDockerTitleBars(show);
3293}

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 1169 of file KisMainWindow.cpp.

1169 {
1170 Q_FOREACH(QMdiSubWindow *subwindow, d->mdiArea->subWindowList()) {
1171 KisView *view = qobject_cast<KisView*>(subwindow->widget());
1173
1174 if (view) {
1175 if (view->document() == document) {
1176 setActiveSubWindow(subwindow);
1177 return;
1178 }
1179 }
1180 }
1181
1183}
#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 3004 of file KisMainWindow.cpp.

3005{
3006 QMessageBox::critical(qApp->activeWindow(), i18nc("@title:window", "Installation error"), m_errorMessage);
3007 if (m_dieOnError) {
3008 exit(10);
3009 }
3010}

References m_dieOnError, and m_errorMessage.

◆ showEvent()

void KisMainWindow::showEvent ( QShowEvent * event)
overrideprotected

Definition at line 1668 of file KisMainWindow.cpp.

1669{
1670 // we're here because, we need to make sure everything (dockers, toolbars etc) is loaded and ready before
1671 // we can hide it.
1672 if (!event->spontaneous()) {
1673 setMainWindowLayoutForCurrentMainWidget(d->widgetStack->currentIndex(), false);
1674 }
1675#ifdef Q_OS_ANDROID
1676 // The user can conceivably purchase a product from the splash screen while
1677 // Krita is still loading. In that case, the "pending" flag will be set. The
1678 // dialog in question will clear the flag.
1680 if (androidDonations && androidDonations->isShowDonationManagementDialogPending()) {
1681 QTimer::singleShot(0, this, &KisMainWindow::slotShowDonationManagementDialog);
1682 }
1683#endif
1684 return KXmlGuiWindow::showEvent(event);
1685}
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 3278 of file KisMainWindow.cpp.

3279{
3280 QDesktopServices::openUrl(QUrl("https://docs.krita.org"));
3281}

◆ showOpenFileDialog()

QStringList KisMainWindow::showOpenFileDialog ( bool isImporting)

Definition at line 1213 of file KisMainWindow.cpp.

1214{
1215 KoFileDialog dialog(this, KoFileDialog::ImportFiles, "OpenDocument");
1216 dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation));
1218 dialog.setCaption(isImporting ? i18n("Import Images") : i18n("Open Images"));
1219
1220 QStringList filenames = dialog.filenames();
1221 filenames.sort();
1222
1223 return filenames;
1224}

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.

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 784 of file KisMainWindow.cpp.

785{
786 if (imageView && activeView() != imageView) {
787 // XXX: find a better way to initialize this!
788 imageView->setViewManager(d->viewManager);
789
790 imageView->canvasBase()->setFavoriteResourceManager(d->viewManager->paintOpBox()->favoriteResourcesManager());
791 imageView->slotLoadingFinished();
792
793 if (!subwin) {
794 QMdiSubWindow *currentSubWin = d->mdiArea->currentSubWindow();
795 bool shouldMaximize = currentSubWin ? currentSubWin->isMaximized() : true;
796 subwin = d->mdiArea->addSubWindow(imageView);
797 if (shouldMaximize) {
798 subwin->setWindowState(Qt::WindowMaximized);
799 }
800 } else {
801 subwin->setWidget(imageView);
802 }
803 imageView->setSubWindow(subwin);
804 subwin->setAttribute(Qt::WA_DeleteOnClose, true);
805 connect(subwin, SIGNAL(destroyed()), SLOT(updateWindowMenu()));
806
807 KisConfig cfg(true);
808 subwin->setOption(QMdiSubWindow::RubberBandMove, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
809 subwin->setOption(QMdiSubWindow::RubberBandResize, cfg.readEntry<int>("mdi_rubberband", cfg.useOpenGL()));
810 subwin->setWindowIcon(qApp->windowIcon());
811
812#ifdef Q_OS_MACOS
813 connect(subwin, SIGNAL(destroyed()), SLOT(updateSubwindowFlags()));
815#endif
816
817 if (d->mdiArea->subWindowList().size() == 1) {
818 imageView->showMaximized();
819 }
820 else {
821 imageView->show();
822 }
823
845
846 // No, no, no: do not try to call this _before_ the show() has
847 // been called on the view; only when that has happened is the
848 // opengl context active, and very bad things happen if we tell
849 // the dockers to update themselves with a view if the opengl
850 // context is not active.
851 setActiveView(imageView);
852
854 } else {
856 }
857}
void initializeCurrentToolForCanvas()

References activeView, KisView::canvasBase(), d, KoToolManager::initializeCurrentToolForCanvas(), KoToolManager::instance(), KisConfig::readEntry(), setActiveView(), KisCanvas2::setFavoriteResourceManager(), KisView::setSubWindow(), KisView::setViewManager(), KisView::slotLoadingFinished(), 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 1811 of file KisMainWindow.cpp.

1812{
1813 const int currentIndex = show ? 0 : 1;
1814 if (d->widgetStack->currentIndex() != currentIndex) {
1815 setUpdatesEnabled(false);
1816 // These have to be done in different sequence to avoid graphical
1817 // layout glitch during the switch.
1818 if (show) {
1819 setMainWindowLayoutForCurrentMainWidget(currentIndex, true);
1820 d->widgetStack->setCurrentIndex(currentIndex);
1821 } else {
1822 d->widgetStack->setCurrentIndex(currentIndex);
1823 setMainWindowLayoutForCurrentMainWidget(currentIndex, true);
1824 }
1825 setUpdatesEnabled(true);
1826 }
1827}
KRITAUI_EXPORT void show()

References d, and setMainWindowLayoutForCurrentMainWidget().

◆ slotChangeInterfaceScale

void KisMainWindow::slotChangeInterfaceScale ( )
slot

Definition at line 1874 of file KisMainWindow.cpp.

1875{
1876#if defined(Q_OS_ANDROID) && KRITA_QT_HAS_ANDROID_QPLATFORMSCREEN_DENSITY_ADJUSTMENT
1878 if (androidScaling) {
1879 androidScaling->showDialog();
1880 }
1881#endif
1882}

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

◆ slotConfigureToolbars

void KisMainWindow::slotConfigureToolbars ( )
privateslot

Configure toolbars.

Definition at line 2376 of file KisMainWindow.cpp.

2377{
2379 KisKEditToolBar edit(factory(), this);
2380 connect(&edit, SIGNAL(newToolBarConfig()), this, SLOT(slotNewToolbarConfig()));
2381 (void) edit.exec();
2383}
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 2173 of file KisMainWindow.cpp.

2174{
2175 if (!d->activeView->document())
2176 return;
2177
2178 KoDocumentInfo *docInfo = d->activeView->document()->documentInfo();
2179
2180 if (!docInfo)
2181 return;
2182
2183 KoDocumentInfoDlg *dlg = d->activeView->document()->createDocumentInfoDialog(this, docInfo);
2184
2185 if (dlg->exec()) {
2186 if (dlg->isDocumentSaved()) {
2187 d->activeView->document()->setModified(false);
2188 } else {
2189 d->activeView->document()->setModified(true);
2190 }
2191 }
2192
2193 delete dlg;
2194}
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 1897 of file KisMainWindow.cpp.

1898{
1899 if (saveDocument(d->activeView->document(), true, true,true)) {
1900 Q_EMIT documentSaved();
1901 }
1902}
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 1891 of file KisMainWindow.cpp.

1892{
1893 if (saveDocument(d->activeView->document(), true, true,false)) {
1894 Q_EMIT documentSaved();
1895 }
1896}

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

◆ slotFileCloseAll

bool KisMainWindow::slotFileCloseAll ( )
privateslot

Closes all open documents.

Definition at line 2196 of file KisMainWindow.cpp.

2197{
2198 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
2199 if (subwin) {
2200 if(!subwin->close())
2201 return false;
2202 }
2203 }
2204
2205 return true;
2206}

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 1829 of file KisMainWindow.cpp.

1830{
1832 dlg->exec();
1833 dlg->deleteLater();
1834}

◆ 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 1843 of file KisMainWindow.cpp.

1844{
1845 QStringList urls = showOpenFileDialog(isImporting);
1846
1847 if (urls.isEmpty())
1848 return;
1849
1850 Q_FOREACH (const QString& url, urls) {
1851
1852 if (!url.isEmpty()) {
1853 OpenFlags flags = isImporting ? Import : None;
1854 bool res = openDocument(url, flags);
1855 if (!res) {
1856 warnKrita << "Loading" << url << "failed";
1857 }
1858 }
1859 }
1860}
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 1862 of file KisMainWindow.cpp.

1863{
1864 (void) openDocument(url.toLocalFile(), None);
1865}

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

◆ slotFileQuit

void KisMainWindow::slotFileQuit ( )
privateslot

Closes the mainwindow.

Definition at line 2208 of file KisMainWindow.cpp.

2209{
2210 // Do not close while KisMainWindow has the savingEntryMutex locked, bug409395.
2211 // After the background saving job is initiated, KisDocument blocks closing
2212 // while it saves itself.
2213 if (hackIsSaving()) {
2214 return;
2215 }
2217}

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

◆ slotFileSave

void KisMainWindow::slotFileSave ( )
slot

Saves the current document with the current name.

Definition at line 1867 of file KisMainWindow.cpp.

1868{
1869 if (saveDocument(d->activeView->document(), false, false,false)) {
1870 Q_EMIT documentSaved();
1871 }
1872}

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

◆ slotFileSaveAs

void KisMainWindow::slotFileSaveAs ( )
privateslot

Saves the current document with a new name.

Definition at line 1884 of file KisMainWindow.cpp.

1885{
1886 if (saveDocument(d->activeView->document(), true, false,false)) {
1887 Q_EMIT documentSaved();
1888 }
1889}

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

◆ slotImportFile

void KisMainWindow::slotImportFile ( )
privateslot

File --> Import

This will call slotFileOpen().

Definition at line 1836 of file KisMainWindow.cpp.

1837{
1838 dbgUI << "slotImportFile()";
1839 slotFileOpen(true);
1840}

References dbgUI, and slotFileOpen().

◆ slotLoadCanceled

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

Definition at line 1240 of file KisMainWindow.cpp.

1241{
1242 KisUsageLogger::log(QString("Loading canceled: %1.").arg(errMsg));
1243 KisDocument* doc = qobject_cast<KisDocument*>(sender());
1244 Q_ASSERT(doc);
1245 disconnect(doc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
1246 disconnect(doc, SIGNAL(canceled(QString)), this, SLOT(slotLoadCanceled(QString)));
1247}
static void log(const QString &message)
Logs with date/time.

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

◆ slotLoadCompleted

void KisMainWindow::slotLoadCompleted ( )
privateslot

Definition at line 1227 of file KisMainWindow.cpp.

1228{
1229 KisDocument *newdoc = qobject_cast<KisDocument*>(sender());
1230 if (newdoc && newdoc->image()) {
1232
1233 disconnect(newdoc, SIGNAL(completed()), this, SLOT(slotLoadCompleted()));
1234 disconnect(newdoc, SIGNAL(canceled(QString)), this, SLOT(slotLoadCanceled(QString)));
1235
1236 Q_EMIT loadCompleted();
1237 }
1238}
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 2391 of file KisMainWindow.cpp.

2392{
2393 applyMainWindowSettings(d->windowStateConfig);
2394
2396 Q_UNUSED(factory);
2397
2398 // Check if there's an active view
2399 if (!d->activeView)
2400 return;
2401
2402 plugActionList("toolbarlist", d->toolbarList);
2403
2411}

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 859 of file KisMainWindow.cpp.

860{
861 std::optional<KisDlgPreferences::PageDesc>page = std::nullopt;
862
863 KisAction* action = d->actionManager()->actionByName("options_configure");
864 QVariant data = action->data();
865 if (data.userType() == QMetaType::QVariantList) {
866 // Reset the data first
867 action->setData(QVariant());
868 QList<QVariant> list = data.toList();
869
870 Q_ASSERT(list.length() == 2);
871 Q_ASSERT(list[0].userType() == QMetaType::Int);
872 Q_ASSERT(list[1].userType() == QMetaType::Int);
873
875 int t = list[1].toInt();
877 }
878
879 QScopedPointer<KisDlgPreferences> dlgPreferences(new KisDlgPreferences(this));
880
881 if (dlgPreferences->editPreferences(page)) {
885
886 // XXX: should this be changed for the views in other windows as well?
887 Q_FOREACH (QPointer<KisView> koview, KisPart::instance()->views()) {
888 KisViewManager *view = qobject_cast<KisViewManager*>(koview);
889 if (view) {
890 // Update the settings for all nodes -- they don't query
891 // KisConfig directly because they need the settings during
892 // compositing, and they don't connect to the config notifier
893 // because nodes are not QObjects (because only one base class
894 // can be a QObject).
895 KisNode* node = dynamic_cast<KisNode*>(view->image()->rootLayer().data());
896 if (node) {
897 node->updateSettings();
898 }
899 }
900
901 }
903
904 d->viewManager->showHideScrollbars();
905 }
906}
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 2385 of file KisMainWindow.cpp.

2386{
2387 KisApplication *kisApp = static_cast<KisApplication*>(qApp);
2388 kisApp->askResetConfig();
2389}
Base class for the Krita app.

References KisApplication::askResetConfig().

◆ slotSaveCanceled

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

Definition at line 1249 of file KisMainWindow.cpp.

1250{
1251 if (!errMsg.isEmpty()) { // empty when cancelled by user
1252 KisUsageLogger::log(QString("Saving cancelled. Error:").arg(errMsg));
1253 QMessageBox::critical(this, i18nc("@title:window", "Krita"), errMsg);
1254 }
1255 else {
1256 KisUsageLogger::log(QString("Saving cancelled by the user."));
1257 }
1259}

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

◆ slotSaveCompleted

void KisMainWindow::slotSaveCompleted ( )
privateslot

Definition at line 1261 of file KisMainWindow.cpp.

1262{
1263 KisUsageLogger::log(QString("Saving Completed"));
1264 KisDocument* doc = qobject_cast<KisDocument*>(sender());
1265 if (doc) {
1266 disconnect(doc, SIGNAL(completed()), this, SLOT(slotSaveCompleted()));
1267 disconnect(doc, SIGNAL(canceled(QString)), this, SLOT(slotSaveCanceled(QString)));
1268 }
1269
1270 if (d->deferredClosingEvent) {
1271 KXmlGuiWindow::closeEvent(d->deferredClosingEvent);
1272 }
1273}
void closeEvent(QCloseEvent *) override

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

◆ slotShowSessionManager

void KisMainWindow::slotShowSessionManager ( )
slot

Definition at line 1904 of file KisMainWindow.cpp.

1904 {
1906}
void showSessionManager()
Definition KisPart.cpp:626

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

◆ slotStoragesWarning

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

Definition at line 2088 of file KisMainWindow.cpp.

2089{
2090 QString warning;
2092 warning = i18n("You don't have any resource bundles enabled.");
2093 }
2094
2095 if (!checkPaintOpAvailable()) {
2096 warning += i18n("\nThere are no brush presets available. Please enable a bundle that has presets before continuing.\n");
2097 QMessageBox::critical(this, i18nc("@title:window", "Krita"), warning);
2098
2099 QAction *action = actionCollection()->action("manage_bundles");
2100 if (action) {
2101 action->trigger();
2102 }
2103 }
2104
2106 QMessageBox::warning(this, i18nc("@title:window", "Krita"), warning + i18n("\nOnly your local resources are available."));
2107 }
2108
2109}
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 946 of file KisMainWindow.cpp.

947{
948 KConfigGroup group(KSharedConfig::openConfig(), "theme");
949#ifndef Q_OS_HAIKU
950 if (group.readEntry("Theme", "") == d->themeManager->currentThemeName()) return;
951
952 // save theme changes instantly
953 group.writeEntry("Theme", d->themeManager->currentThemeName());
954#endif
955 updateTheme();
956
957 // Make the other top level windows update as well
958 Q_FOREACH (QWidget* topLevelWidget, qApp->topLevelWidgets()) {
959 if (topLevelWidget == this) {
960 // Skip if the current top level widget is this window
961 continue;
962 }
963 if (topLevelWidget->isHidden()) {
964 // Skip unwanted top level widgets like menus, dropdowns, tooltips, etc.
965 continue;
966 }
967 KisMainWindow *topLevelMainWindow = qobject_cast<KisMainWindow*>(topLevelWidget);
968 if (topLevelMainWindow) {
969 topLevelMainWindow->updateTheme();
970 Q_EMIT topLevelMainWindow->themeChanged();
971 } else {
972 QObjectList objects;
973 objects.append(topLevelWidget);
974 while (!objects.isEmpty()) {
975 QWidget* widget = qobject_cast<QWidget*>(objects.takeFirst());
976 if (widget) {
977 objects.append(widget->children());
979 }
980 }
981 }
982 }
983
985
986 Q_EMIT themeChanged();
987}
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 2413 of file KisMainWindow.cpp.

2414{
2415 //dbgUI <<"KisMainWindow::slotToolbarToggled" << sender()->name() <<" toggle=" << true;
2416 // The action (sender) and the toolbar have the same name
2417 KisToolBar * bar = toolBar(sender()->objectName());
2418 if (bar) {
2419 if (toggle) {
2420 bar->show();
2421 }
2422 else {
2423 bar->hide();
2424 }
2425
2426 if (d->activeView && d->activeView->document()) {
2428 }
2429 } else
2430 warnUI << "slotToolbarToggled : Toolbar " << sender()->objectName() << " not found!";
2431}

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

◆ slotUpdateReadWriteMode

void KisMainWindow::slotUpdateReadWriteMode ( bool readWrite)
privateslot

Definition at line 1088 of file KisMainWindow.cpp.

1089{
1090 Q_UNUSED(readWrite);
1091 d->actionManager()->updateGUI();
1092}

References d.

◆ slotUpdateSaveActionTitle

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

Definition at line 1076 of file KisMainWindow.cpp.

1077{
1078 const QString fileName = QFileInfo(documentPath).fileName();
1079
1080 if (!fileName.isEmpty()) {
1081 d->saveAction->setToolTip(i18n("Save as %1", fileName));
1082 }
1083 else {
1084 d->saveAction->setToolTip(i18n("Save"));
1085 }
1086}

References d.

◆ slotUpdateWidgetStyle

void KisMainWindow::slotUpdateWidgetStyle ( )
privateslot

Definition at line 2561 of file KisMainWindow.cpp.

2562{
2563 KisConfig cfg(true);
2564 QString themeFromConfig = cfg.widgetStyle();
2565
2566 Q_FOREACH (auto key, d->actionMap.keys()) { // find checked style to save to config
2567 if(d->actionMap.value(key)->isChecked()) {
2568 cfg.setWidgetStyle(key);
2569 qApp->setProperty(currentUnderlyingStyleNameProperty, key);
2570 qApp->setStyle(key);
2571
2572 // When switching to a style that uses system colors, reset the theme
2573#ifndef Q_OS_HAIKU
2574#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
2575 if (qApp->style()->objectName() == "macintosh") {
2576 d->themeManager->setCurrentTheme("System");
2577 }
2578#else
2579 if (qApp->style()->name() == "macos") {
2580 d->themeManager->setCurrentTheme("System");
2581 }
2582#endif
2583#endif
2584 }
2585 }
2586}
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 3295 of file KisMainWindow.cpp.

3296{
3297 if (finished) {
3299 }
3300}

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 2638 of file KisMainWindow.cpp.

2639{
2640 bool enabled = (activeKisView() != 0);
2641
2642 d->mdiCascade->setEnabled(enabled);
2643 d->mdiNextWindow->setEnabled(enabled);
2644 d->mdiPreviousWindow->setEnabled(enabled);
2645 d->mdiTile->setEnabled(enabled);
2646 d->close->setEnabled(enabled);
2647 d->closeAll->setEnabled(enabled);
2648
2649 setActiveSubWindow(d->mdiArea->activeSubWindow());
2650
2660 QMdiSubWindow *subWindow = d->mdiArea->currentSubWindow();
2661 if (subWindow) {
2662 QMenu *menu = subWindow->systemMenu();
2663 if (menu && menu->actions().size() == 8) {
2664 Q_FOREACH (QAction *action, menu->actions()) {
2665 action->setShortcut(QKeySequence());
2666
2667 }
2668 menu->actions().last()->deleteLater();
2669 }
2670 }
2671
2672 d->actionManager()->updateGUI();
2673}

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

◆ swapWorkspaces()

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

Definition at line 2159 of file KisMainWindow.cpp.

2160{
2161 QByteArray workspaceA = a->borrowWorkspace(b);
2162 QByteArray workspaceB = b->borrowWorkspace(a);
2163
2164 a->restoreWorkspaceState(workspaceB);
2165 b->restoreWorkspaceState(workspaceA);
2166}

References borrowWorkspace(), and restoreWorkspaceState().

◆ switchTab

void KisMainWindow::switchTab ( int index)
privateslot

Definition at line 1803 of file KisMainWindow.cpp.

1804{
1805 QTabBar *tabBar = d->findTabBarHACK();
1806 if (!tabBar) return;
1807
1808 tabBar->setCurrentIndex(index);
1809}

References d.

◆ synchronizeDynamicActions

void KisMainWindow::synchronizeDynamicActions ( )
slot

Definition at line 3395 of file KisMainWindow.cpp.

3396{
3397 // Add all actions with a menu property to the main window
3398 Q_FOREACH(QAction *action, this->actionCollection()->actions()) {
3399 QString menuLocation = action->property("menulocation").toString();
3400 if (!menuLocation.isEmpty()) {
3401 QAction *found = 0;
3402 QList<QAction *> candidates = this->menuBar()->actions();
3403 Q_FOREACH(const QString &name, menuLocation.split("/")) {
3404 Q_FOREACH(QAction *candidate, candidates) {
3405 if (candidate->objectName().toLower() == name.toLower()) {
3406 found = candidate;
3407 candidates = candidate->menu()->actions();
3408 break;
3409 }
3410 }
3411 if (candidates.isEmpty()) {
3412 break;
3413 }
3414 }
3415
3416 if (found && found->menu()) {
3417 QList<QAction *> existingActions = found->menu()->actions();
3418
3419 if (std::find_if(existingActions.begin(),
3420 existingActions.end(),
3421 kismpl::mem_equal_to(&QAction::objectName, action->objectName()))
3422 == existingActions.end()) {
3423
3424 if (std::is_sorted(existingActions.begin(),
3425 existingActions.end(),
3426 kismpl::mem_less(&QAction::objectName))) {
3427
3428 auto it = std::upper_bound(existingActions.begin(),
3429 existingActions.end(),
3430 action->objectName(),
3431 kismpl::mem_less(&QAction::objectName));
3432 found->menu()->insertAction(it != existingActions.end() ? *it : nullptr, action);
3433
3434 } else {
3435 found->menu()->addAction(action);
3436 }
3437 }
3438 }
3439 }
3440 }
3441}
auto mem_equal_to(MemTypeNoRef Class::*ptr, MemType &&value)
mem_equal_to is an unary functor that compares a member of the object to a given value
Definition KisMpl.h:233
auto mem_less(MemTypeNoRef Class::*ptr, MemType &&value)
mem_less is an unary functor that compares a member of the object to a given value
Definition KisMpl.h:269

References KisKXMLGUIClient::action(), KisKXMLGUIClient::actionCollection(), kismpl::mem_equal_to(), and kismpl::mem_less().

◆ 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 2619 of file KisMainWindow.cpp.

2620{
2621 if (!visible) {
2622 d->dockerStateBeforeHiding = saveState();
2623
2624 Q_FOREACH (QObject* widget, children()) {
2625 if (widget->inherits("QDockWidget")) {
2626 QDockWidget* dw = static_cast<QDockWidget*>(widget);
2627 if (dw->isVisible() && !(onWelcomePage && dw->property("ShowOnWelcomePage").toBool())) {
2628 dw->hide();
2629 }
2630 }
2631 }
2632 }
2633 else {
2634 restoreState(d->dockerStateBeforeHiding);
2635 }
2636}

References d, and KisKXMLGUIBuilder::widget().

◆ undo

void KisMainWindow::undo ( )
privateslot

◆ unsetActiveView

void KisMainWindow::unsetActiveView ( )
slot

Definition at line 1766 of file KisMainWindow.cpp.

1767{
1768 d->activeViewConnections.clear();
1769 slotUpdateSaveActionTitle(QString());
1771}

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

◆ updateSubwindowFlags

void KisMainWindow::updateSubwindowFlags ( )
privateslot

Definition at line 2850 of file KisMainWindow.cpp.

2851{
2852 bool onlyOne = false;
2853 if (d->mdiArea->subWindowList().size() == 1 && d->mdiArea->viewMode() == QMdiArea::SubWindowView) {
2854 onlyOne = true;
2855 }
2856 Q_FOREACH (QMdiSubWindow *subwin, d->mdiArea->subWindowList()) {
2857 if (onlyOne) {
2858 subwin->setWindowFlags(subwin->windowFlags() | Qt::FramelessWindowHint);
2859 subwin->showMaximized();
2860 } else {
2861 subwin->setWindowFlags((subwin->windowFlags() | Qt::FramelessWindowHint) ^ Qt::FramelessWindowHint);
2862 }
2863 }
2864}

References d.

◆ updateTheme

void KisMainWindow::updateTheme ( )
privateslot

Handle theme changes from theme manager

Definition at line 908 of file KisMainWindow.cpp.

909{
910 // reload action icons!
911 Q_FOREACH (QAction *action, actionCollection()->actions()) {
913 }
914 if (d->mdiArea) {
915 d->mdiArea->setPalette(qApp->palette());
916 for (int i=0; i<d->mdiArea->subWindowList().size(); i++) {
917 QMdiSubWindow *window = d->mdiArea->subWindowList().at(i);
918 if (window) {
919 window->setPalette(qApp->palette());
920 KisView *view = qobject_cast<KisView*>(window->widget());
921 if (view) {
922 view->slotThemeChanged(qApp->palette());
923 }
924 }
925 }
926 }
927
929
930 // Update toolbars
931 {
932 Q_FOREACH (KisToolBar* aToolBar, toolBars()) {
933 QObjectList objects;
934 objects.append(aToolBar);
935 while (!objects.isEmpty()) {
936 QWidget* widget = qobject_cast<QWidget*>(objects.takeFirst());
937 if (widget) {
938 objects.append(widget->children());
939 widget->setPalette(qApp->palette());
940 }
941 }
942 }
943 }
944}
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 2707 of file KisMainWindow.cpp.

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

1961{
1962 return d->mdiArea->subWindowList().size();
1963}

References d.

◆ viewFullscreen

void KisMainWindow::viewFullscreen ( bool fullScreen)
slot

Toggle full screen on/off.

Definition at line 2433 of file KisMainWindow.cpp.

2434{
2435#ifdef Q_OS_ANDROID
2436 // Full-screening on Android applies to the entire application, not this
2437 // window in particular. Qt tries to paper over that matter, but it causes
2438 // some pretty horrid flickering when the main window gets hidden. We just
2439 // talk to the Android interface directly to get around that.
2441 d->fullScreenMode->setChecked(fullScreen);
2442#else
2443 KisConfig cfg(false);
2444 cfg.setFullscreenMode(fullScreen);
2445
2446 if (fullScreen) {
2447 setWindowState(windowState() | Qt::WindowFullScreen); // set
2448 } else {
2449 setWindowState(windowState() & ~Qt::WindowFullScreen); // reset
2450 }
2451 d->fullScreenMode->setChecked(isFullScreen());
2452#endif
2453}
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 2675 of file KisMainWindow.cpp.

2676{
2680 if (viewManager() && viewManager()->selectionManager()) {
2682 }
2683
2684 KisPart *kisPart = KisPart::instance();
2686 if (!layoutManager->primaryWorkspaceFollowsFocus()) return;
2687
2688 QUuid primary = layoutManager->primaryWindowId();
2689 if (primary.isNull()) return;
2690
2691 if (d->id == primary) {
2692 if (!d->workspaceBorrowedBy.isNull()) {
2693 KisMainWindow *borrower = kisPart->windowById(d->workspaceBorrowedBy);
2694 if (!borrower) return;
2695 swapWorkspaces(this, borrower);
2696 }
2697 } else {
2698 if (d->workspaceBorrowedBy == primary) return;
2699
2700 KisMainWindow *primaryWindow = kisPart->windowById(primary);
2701 if (!primaryWindow) return;
2702 swapWorkspaces(this, primaryWindow);
2703 }
2704}
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 1662 of file KisMainWindow.cpp.

1663{
1664 QAction *action= d->viewManager->actionCollection()->action("view_show_canvas_only");
1665 return !action || !action->isChecked();
1666}

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 284 of file KisMainWindow.cpp.

◆ activeSubWindow

QMdiSubWindow* KisMainWindow::activeSubWindow {nullptr}

Definition at line 315 of file KisMainWindow.cpp.

315{nullptr};

◆ activeView

KisView * KisMainWindow::activeView

Definition at line 235 of file KisMainWindow.cpp.

◆ activeViewConnections

KisSignalAutoConnectionsStore KisMainWindow::activeViewConnections

Definition at line 236 of file KisMainWindow.cpp.

◆ canvasWindow

QWidget * KisMainWindow::canvasWindow {nullptr}

Definition at line 318 of file KisMainWindow.cpp.

318{nullptr};

◆ close

KisAction* KisMainWindow::close {nullptr}

Definition at line 259 of file KisMainWindow.cpp.

259{nullptr};

◆ closeAll

KisAction* KisMainWindow::closeAll {nullptr}

Definition at line 253 of file KisMainWindow.cpp.

253{nullptr};

◆ commandBar

KateCommandBar* KisMainWindow::commandBar {nullptr}

Definition at line 328 of file KisMainWindow.cpp.

328{nullptr};

◆ commandBarAction

KisAction* KisMainWindow::commandBarAction {nullptr}

Definition at line 279 of file KisMainWindow.cpp.

279{nullptr};

◆ d

Private* const KisMainWindow::d
private

Definition at line 486 of file KisMainWindow.h.

◆ deferredClosingEvent

QCloseEvent* KisMainWindow::deferredClosingEvent {nullptr}

Definition at line 304 of file KisMainWindow.cpp.

304{nullptr};

◆ dockerStateBeforeHiding

QByteArray KisMainWindow::dockerStateBeforeHiding

Definition at line 301 of file KisMainWindow.cpp.

◆ dockWidgetMenu

KActionMenu* KisMainWindow::dockWidgetMenu {nullptr}

Definition at line 286 of file KisMainWindow.cpp.

286{nullptr};

◆ dockWidgetsMap

QMap<QString, QDockWidget *> KisMainWindow::dockWidgetsMap

Definition at line 300 of file KisMainWindow.cpp.

◆ documentMapper

KisSignalMapper* KisMainWindow::documentMapper {nullptr}

Definition at line 317 of file KisMainWindow.cpp.

317{nullptr};

◆ documentMenu

KActionMenu* KisMainWindow::documentMenu {nullptr}

Definition at line 288 of file KisMainWindow.cpp.

288{nullptr};

◆ expandingSpacers

KisAction* KisMainWindow::expandingSpacers[2]

Definition at line 280 of file KisMainWindow.cpp.

◆ exportFile

KisAction* KisMainWindow::exportFile {nullptr}

Definition at line 255 of file KisMainWindow.cpp.

255{nullptr};

◆ exportFileAdvance

KisAction* KisMainWindow::exportFileAdvance {nullptr}

Definition at line 256 of file KisMainWindow.cpp.

256{nullptr};

◆ firstTime

bool KisMainWindow::firstTime {true}

Definition at line 240 of file KisMainWindow.cpp.

240{true};

◆ fullScreenMode

KisAction* KisMainWindow::fullScreenMode {nullptr}

Definition at line 277 of file KisMainWindow.cpp.

277{nullptr};

◆ helpMenu

KisKHelpMenu* KisMainWindow::helpMenu {nullptr}

Definition at line 291 of file KisMainWindow.cpp.

291{nullptr};

◆ id

QUuid KisMainWindow::id

Definition at line 231 of file KisMainWindow.cpp.

◆ importAnimation

void KisMainWindow::importAnimation {nullptr}

Definition at line 249 of file KisMainWindow.cpp.

249{nullptr};

◆ importFile

KisAction* KisMainWindow::importFile {nullptr}

Definition at line 254 of file KisMainWindow.cpp.

254{nullptr};

◆ importVideoAnimation

void KisMainWindow::importVideoAnimation {nullptr}

Definition at line 250 of file KisMainWindow.cpp.

250{nullptr};

◆ lastExportedFormat

QByteArray KisMainWindow::lastExportedFormat

Definition at line 320 of file KisMainWindow.cpp.

◆ lastExportLocation

QString KisMainWindow::lastExportLocation

Definition at line 298 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 314 of file KisMainWindow.cpp.

314{nullptr};

◆ mdiCascade

KisAction* KisMainWindow::mdiCascade {nullptr}

Definition at line 260 of file KisMainWindow.cpp.

260{nullptr};

◆ mdiNextWindow

KisAction* KisMainWindow::mdiNextWindow {nullptr}

Definition at line 262 of file KisMainWindow.cpp.

262{nullptr};

◆ mdiPreviousWindow

KisAction* KisMainWindow::mdiPreviousWindow {nullptr}

Definition at line 263 of file KisMainWindow.cpp.

263{nullptr};

◆ mdiTile

KisAction* KisMainWindow::mdiTile {nullptr}

Definition at line 261 of file KisMainWindow.cpp.

261{nullptr};

◆ newWindow

void KisMainWindow::newWindow {nullptr}

Definition at line 275 of file KisMainWindow.cpp.

275{nullptr};

◆ q

KisMainWindow* KisMainWindow::q {nullptr}

Definition at line 230 of file KisMainWindow.cpp.

230{nullptr};

◆ recentFiles

KRecentFilesAction* KisMainWindow::recentFiles {nullptr}

Definition at line 293 of file KisMainWindow.cpp.

293{nullptr};

◆ redo

void KisMainWindow::redo {nullptr}

Definition at line 258 of file KisMainWindow.cpp.

258{nullptr};

◆ renderAnimation

void KisMainWindow::renderAnimation {nullptr}

Definition at line 251 of file KisMainWindow.cpp.

251{nullptr};

◆ renderAnimationAgain

void KisMainWindow::renderAnimationAgain {nullptr}

Definition at line 252 of file KisMainWindow.cpp.

252{nullptr};

◆ resetConfigurations

KisAction* KisMainWindow::resetConfigurations {nullptr}

Definition at line 265 of file KisMainWindow.cpp.

265{nullptr};

◆ saveAction

KisAction* KisMainWindow::saveAction {nullptr}

Definition at line 247 of file KisMainWindow.cpp.

247{nullptr};

◆ saveActionAs

KisAction* KisMainWindow::saveActionAs {nullptr}

Definition at line 248 of file KisMainWindow.cpp.

248{nullptr};

◆ savingEntryMutex

QMutex KisMainWindow::savingEntryMutex

Definition at line 322 of file KisMainWindow.cpp.

◆ showDocumentInfo

KisAction* KisMainWindow::showDocumentInfo {nullptr}

Definition at line 246 of file KisMainWindow.cpp.

246{nullptr};

◆ showSessionManager

KisAction* KisMainWindow::showSessionManager {nullptr}

Definition at line 278 of file KisMainWindow.cpp.

278{nullptr};

◆ styleActions

QActionGroup* KisMainWindow::styleActions {nullptr}

Definition at line 283 of file KisMainWindow.cpp.

283{nullptr};

◆ styleMenu

KActionMenu* KisMainWindow::styleMenu {nullptr}

Definition at line 282 of file KisMainWindow.cpp.

282{nullptr};

◆ tabSwitchCompressor

QScopedPointer<KisSignalCompressorWithParam<int> > KisMainWindow::tabSwitchCompressor

Definition at line 321 of file KisMainWindow.cpp.

◆ themeManager

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

Definition at line 306 of file KisMainWindow.cpp.

306{nullptr};

◆ toggleDetachCanvas

KisAction* KisMainWindow::toggleDetachCanvas {nullptr}

Definition at line 274 of file KisMainWindow.cpp.

274{nullptr};

◆ toggleDockers

KisAction* KisMainWindow::toggleDockers {nullptr}

Definition at line 264 of file KisMainWindow.cpp.

264{nullptr};

◆ toggleDockerTitleBars

KisAction* KisMainWindow::toggleDockerTitleBars {nullptr}

Definition at line 266 of file KisMainWindow.cpp.

266{nullptr};

◆ toolbarList

QList<QAction *> KisMainWindow::toolbarList

Definition at line 238 of file KisMainWindow.cpp.

◆ toolOptionsDocker

KoToolDocker* KisMainWindow::toolOptionsDocker {nullptr}

Definition at line 302 of file KisMainWindow.cpp.

302{nullptr};

◆ undo

void KisMainWindow::undo {nullptr}

Definition at line 257 of file KisMainWindow.cpp.

257{nullptr};

◆ undoActionsUpdateManager

QScopedPointer<KisUndoActionsUpdateManager> KisMainWindow::undoActionsUpdateManager

Definition at line 296 of file KisMainWindow.cpp.

◆ viewManager

KisViewManager * KisMainWindow::viewManager {nullptr}

Definition at line 233 of file KisMainWindow.cpp.

233{nullptr};

◆ welcomePage

KisWelcomePageWidget* KisMainWindow::welcomePage {nullptr}

Definition at line 309 of file KisMainWindow.cpp.

309{nullptr};

◆ welcomeScroller

QScrollArea* KisMainWindow::welcomeScroller {nullptr}

Definition at line 308 of file KisMainWindow.cpp.

308{nullptr};

◆ widgetStack

QStackedWidget* KisMainWindow::widgetStack {nullptr}

Definition at line 312 of file KisMainWindow.cpp.

312{nullptr};

◆ windowMapper

KisSignalMapper* KisMainWindow::windowMapper {nullptr}

Definition at line 316 of file KisMainWindow.cpp.

316{nullptr};

◆ windowMenu

KActionMenu* KisMainWindow::windowMenu {nullptr}

Definition at line 287 of file KisMainWindow.cpp.

287{nullptr};

◆ windowSizeDirty

bool KisMainWindow::windowSizeDirty {false}

Definition at line 241 of file KisMainWindow.cpp.

241{false};

◆ windowStateConfig

const KConfigGroup & KisMainWindow::windowStateConfig

Definition at line 324 of file KisMainWindow.cpp.

◆ workspaceBorrowedBy

QUuid KisMainWindow::workspaceBorrowedBy

Definition at line 326 of file KisMainWindow.cpp.

◆ workspaceMenu

KActionMenu* KisMainWindow::workspaceMenu {nullptr}

Definition at line 289 of file KisMainWindow.cpp.

289{nullptr};

◆ workspacemodel

KisResourceModel* KisMainWindow::workspacemodel {nullptr}

Definition at line 294 of file KisMainWindow.cpp.

294{nullptr};

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