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

#include <KisViewManager.h>

+ Inheritance diagram for KisViewManager:

Classes

class  KisViewManagerPrivate
 

Public Slots

void changeAuthorProfile (const QString &profileName)
 
void setShowFloatingMessage (bool show)
 
void showHideScrollbars ()
 
void slotActivateTransformTool ()
 
void slotResetFgBg ()
 
void slotToggleBrushOutline ()
 
void slotToggleFgBg ()
 
void slotUpdateAuthorProfileActions ()
 
void slotViewAdded (KisView *view)
 
void slotViewRemoved (KisView *view)
 
void switchCanvasOnly (bool toggled)
 
void updateGUI ()
 
void updateIcons ()
 Update the style of all the icons.
 

Signals

void brushOutlineToggled ()
 
void floatingMessageRequested (const QString &message, const QString &iconName)
 
void viewChanged ()
 viewChanged sent out when the view has changed.
 

Public Member Functions

virtual KisKActionCollectionactionCollection () const
 
KisActionManageractionManager () const
 
KisPaintDeviceSP activeDevice ()
 Convenience method to get at the active paint device.
 
KisLayerSP activeLayer ()
 Convenience method to get at the active layer.
 
KisNodeSP activeNode ()
 
bool blockUntilOperationsFinished (KisImageSP image)
 blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is finished
 
void blockUntilOperationsFinishedForced (KisImageSP image)
 blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is finished. Does not provide a "Cancel" button. So the user is forced to wait.
 
QWidget * canvas () const
 Return the actual widget that is displaying the current image.
 
KisCanvas2canvasBase () const
 Return the canvas base class.
 
KisCanvasResourceProvidercanvasResourceProvider ()
 
QPointer< KoUpdatercreateThreadedUpdater (const QString &name)
 
QPointer< KoUpdatercreateUnthreadedUpdater (const QString &name)
 create a new progress updater
 
void disableControls ()
 
KisDocumentdocument () const
 
void enableControls ()
 disable and enable toolbar controls. used for disabling them during painting.
 
KisFilterManagerfilterManager ()
 The filtermanager handles everything action-related to filters.
 
KisGridManagergridManager () const
 
KisGuidesManagerguidesManager () const
 
KisIdleTasksManageridleTasksManager ()
 
KisImageWSP image () const
 Return the image this view is displaying.
 
KisImageManagerimageManager ()
 
KisInputManagerinputManager () const
 Filters events and sends them to canvas actions.
 
 KisViewManager (QWidget *parent, KisKActionCollection *actionCollection)
 
KisMainWindowmainWindow () const
 
QWidget * mainWindowAsQWidget () const
 
KisNodeManagernodeManager () const
 The node manager handles everything about nodes.
 
void notifyWorkspaceLoaded ()
 
KisPaintopBoxpaintOpBox () const
 
QMainWindow * qtMainWindow () const
 
KisSelectionSP selection ()
 
bool selectionEditable ()
 Checks if the current global or local selection is editable.
 
KisSelectionManagerselectionManager ()
 
void setCurrentView (KisView *view)
 
void setQtMainWindow (QMainWindow *newMainWindow)
 
void showFloatingMessage (const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
 shows a floating message in the top right corner of the canvas
 
void showFloatingRotationMessage (const QString &message)
 
void showFloatingZoomMessage (const QString &message)
 
KisStatusBarstatusBar () const
 Return the wrapper class around the statusbar.
 
KisTextPropertiesManagertextPropertyManager () const
 
KisUndoAdapterundoAdapter ()
 The undo adapter is used to add commands to the undo stack.
 
int viewCount () const
 
 ~KisViewManager () override
 

Static Public Member Functions

static void initializeResourceManager (KoCanvasResourceProvider *resourceManager)
 
static void testingInitializeOpacityToPresetResourceConverter (KoCanvasResourceProvider *resourceManager)
 

Private Slots

void guiUpdateTimeout ()
 
void openResourcesDirectory ()
 
void showStatusBar (bool toggled)
 
void slotCreateCopy ()
 
void slotCreateOpacityResource (bool isOpacityPresetMode, KoToolBase *tool)
 
void slotCreateTemplate ()
 
void slotDocumentSaved ()
 
void slotResetDisplay ()
 
void slotResetRotation ()
 
void slotSaveIncremental ()
 
void slotSaveIncrementalBackup ()
 
void slotSaveRulersTrackMouseState (bool value)
 
void slotSaveShowRulersState (bool value)
 
void slotUpdatePixelGridAction ()
 
void toggleTabletLogger ()
 

Private Member Functions

QString canonicalPath ()
 
void createActions ()
 
void handleFloatingZoomRotationMessage (QString &messageToClear)
 
void setupManagers ()
 
void updateCanvasOnlyActionState ()
 
KisZoomManagerzoomManager ()
 The zoommanager handles everything action-related to zooming.
 

Private Attributes

KisViewManagerPrivate *const d
 

Detailed Description

KisViewManager manages the collection of views shown in a single mainwindow.

Definition at line 51 of file KisViewManager.h.

Constructor & Destructor Documentation

◆ KisViewManager()

KisViewManager::KisViewManager ( QWidget * parent,
KisKActionCollection * actionCollection )

Construct a new view on the krita document.

Parameters
parenta parent widget we show ourselves in.
actionCollectionan action collection.

Definition at line 281 of file KisViewManager.cpp.

282 : d(new KisViewManagerPrivate(this, _actionCollection, parent))
283{
284 d->actionCollection = _actionCollection;
285 d->mainWindow = dynamic_cast<QMainWindow*>(parent);
287 connect(&d->guiUpdateCompressor, SIGNAL(timeout()), this, SLOT(guiUpdateTimeout()));
288
291
292 // These initialization functions must wait until KisViewManager ctor is complete.
293 d->statusBar.setup();
295 d->statusBar.progressUpdater()->startSubtask(1, "", true);
296 // reset state to "completed"
297 d->persistentImageProgressUpdater->setRange(0,100);
298 d->persistentImageProgressUpdater->setValue(100);
299
301 d->statusBar.progressUpdater()->startSubtask(1, "", true);
302 // reset state to "completed"
303 d->persistentUnthreadedProgressUpdater->setRange(0,100);
305
309 d->persistentUnthreadedProgressUpdaterRouter->setAutoNestNames(true);
311
312 // just a clumsy way to mark the updater as completed, the subtask will
313 // be automatically deleted on completion...
314 d->persistentUnthreadedProgressUpdaterRouter->startSubtask()->setProgress(100);
315
316 d->controlFrame.setup(parent);
317
318
319 //Check to draw scrollbars after "Canvas only mode" toggle is created.
320 this->showHideScrollbars();
321
323
324 connect(KoToolManager::instance(), SIGNAL(inputDeviceChanged(KoInputDevice)),
325 d->controlFrame.paintopBox(), SLOT(slotInputDeviceChanged(KoInputDevice)));
326
327 connect(KoToolManager::instance(), SIGNAL(changedTool(KoCanvasController*)),
328 d->controlFrame.paintopBox(), SLOT(slotToolChanged(KoCanvasController*)));
329
330 connect(&d->nodeManager, SIGNAL(sigNodeActivated(KisNodeSP)),
331 canvasResourceProvider(), SLOT(slotNodeActivated(KisNodeSP)));
332
333 connect(KisPart::instance(), SIGNAL(sigViewAdded(KisView*)), SLOT(slotViewAdded(KisView*)));
334 connect(KisPart::instance(), SIGNAL(sigViewRemoved(KisView*)), SLOT(slotViewRemoved(KisView*)));
335 connect(KisPart::instance(), SIGNAL(sigViewRemoved(KisView*)),
336 d->controlFrame.paintopBox(), SLOT(updatePresetConfig()));
337
338 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotUpdateAuthorProfileActions()));
339 connect(KisConfigNotifier::instance(), SIGNAL(pixelGridModeChanged()), SLOT(slotUpdatePixelGridAction()));
340
341 connect(KoToolManager::instance(), SIGNAL(createOpacityResource(bool, KoToolBase*)), SLOT(slotCreateOpacityResource(bool, KoToolBase*)));
342
344
345 KisConfig cfg(true);
346 d->showFloatingMessage = cfg.showCanvasMessages();
348 KoColor foreground(Qt::black, cs);
349 d->canvasResourceProvider.setFGColor(cfg.readKoColor("LastForeGroundColor",foreground));
350 KoColor background(Qt::white, cs);
351 d->canvasResourceProvider.setBGColor(cfg.readKoColor("LastBackGroundColor",background));
352 d->canvasResourceProvider.setColorHistory(cfg.readKoColors("LastColorHistory"));
354
355 // Initialize the old imagesize plugin
356 new ImageSize(this);
357}
void setColorHistory(const QList< KoColor > &colors)
void setResourceManager(KoCanvasResourceProvider *resourceManager)
static KisConfigNotifier * instance()
KisPaintopBox * paintopBox()
void setup(QWidget *parent)
static KisInputProfileManager * instance()
static KisPart * instance()
Definition KisPart.cpp:131
KoProgressUpdater * progressUpdater()
void setCanvasResourceProvider(KisCanvasResourceProvider *provider)
setCanvasResourceProvider set the canvas resource provider.
QScopedPointer< KoProgressUpdater > persistentUnthreadedProgressUpdaterRouter
QPointer< KoUpdater > persistentUnthreadedProgressUpdater
QPointer< KoUpdater > persistentImageProgressUpdater
KisCanvasResourceProvider canvasResourceProvider
KoCanvasResourceProvider canvasResourceManager
KisTextPropertiesManager textPropertyManager
void slotUpdatePixelGridAction()
void slotUpdateAuthorProfileActions()
void slotViewAdded(KisView *view)
KisViewManagerPrivate *const d
void slotViewRemoved(KisView *view)
void slotCreateOpacityResource(bool isOpacityPresetMode, KoToolBase *tool)
KisCanvasResourceProvider * canvasResourceProvider()
QPointer< KoUpdater > startSubtask(int weight=1, const QString &name=QString(), bool isPersistent=false)
static KoToolManager * instance()
Return the toolmanager singleton.
void initializeToolActions()
ChildIterator< value_type, is_const > parent(const ChildIterator< value_type, is_const > &it)
Definition KisForest.h:327
static KoColorSpaceRegistry * instance()
const KoColorSpace * rgb8(const QString &profileName=QString())

References KisViewManager::KisViewManagerPrivate::actionCollection, KisViewManager::KisViewManagerPrivate::canvasResourceManager, KisViewManager::KisViewManagerPrivate::canvasResourceProvider, canvasResourceProvider(), KisViewManager::KisViewManagerPrivate::controlFrame, createActions(), d, KisViewManager::KisViewManagerPrivate::guiUpdateCompressor, guiUpdateTimeout(), KoToolManager::initializeToolActions(), KoToolManager::instance(), KisConfigNotifier::instance(), KoColorSpaceRegistry::instance(), KisInputProfileManager::instance(), KisPart::instance(), KisInputProfileManager::loadProfiles(), KisViewManager::KisViewManagerPrivate::mainWindow, KisViewManager::KisViewManagerPrivate::nodeManager, KisControlFrame::paintopBox(), KisViewManager::KisViewManagerPrivate::persistentImageProgressUpdater, KisViewManager::KisViewManagerPrivate::persistentUnthreadedProgressUpdater, KisViewManager::KisViewManagerPrivate::persistentUnthreadedProgressUpdaterRouter, KisStatusBar::progressUpdater(), KisConfig::readKoColor(), KisConfig::readKoColors(), KoColorSpaceRegistry::rgb8(), KisCanvasResourceProvider::setBGColor(), KisTextPropertiesManager::setCanvasResourceProvider(), KisCanvasResourceProvider::setColorHistory(), KisCanvasResourceProvider::setFGColor(), KisCanvasResourceProvider::setResourceManager(), KisStatusBar::setup(), KisControlFrame::setup(), setupManagers(), KisConfig::showCanvasMessages(), KisViewManager::KisViewManagerPrivate::showFloatingMessage, showHideScrollbars(), slotCreateOpacityResource(), slotUpdateAuthorProfileActions(), slotUpdatePixelGridAction(), slotViewAdded(), slotViewRemoved(), KoProgressUpdater::startSubtask(), KisViewManager::KisViewManagerPrivate::statusBar, KisViewManager::KisViewManagerPrivate::textPropertyManager, and KoProgressUpdater::Unthreaded.

◆ ~KisViewManager()

KisViewManager::~KisViewManager ( )
override

Definition at line 360 of file KisViewManager.cpp.

361{
362 KisConfig cfg(false);
363 if (canvasResourceProvider() && canvasResourceProvider()->currentPreset()) {
364 cfg.writeKoColor("LastForeGroundColor",canvasResourceProvider()->fgColor());
365 cfg.writeKoColor("LastBackGroundColor",canvasResourceProvider()->bgColor());
366 }
367
369 cfg.writeKoColors("LastColorHistory", canvasResourceProvider()->colorHistory());
370 }
371
372 cfg.writeEntry("baseLength", KisResourceItemChooserSync::instance()->baseLength());
373 cfg.writeEntry("CanvasOnlyActive", false); // We never restart in CanvasOnlyMode
374 delete d;
375}
const ColorPatches colorHistory
Definition WGConfig.cpp:213
static KisResourceItemChooserSync * instance()

References canvasResourceProvider(), d, KisResourceItemChooserSync::instance(), KisConfig::writeEntry(), KisConfig::writeKoColor(), and KisConfig::writeKoColors().

Member Function Documentation

◆ actionCollection()

KisKActionCollection * KisViewManager::actionCollection ( ) const
virtual

Retrieves the entire action collection.

Definition at line 422 of file KisViewManager.cpp.

423{
424 return d->actionCollection;
425}

References KisViewManager::KisViewManagerPrivate::actionCollection, and d.

◆ actionManager()

KisActionManager * KisViewManager::actionManager ( ) const

Definition at line 864 of file KisViewManager.cpp.

865{
866 return &d->actionManager;
867}

References KisViewManager::KisViewManagerPrivate::actionManager, and d.

◆ activeDevice()

KisPaintDeviceSP KisViewManager::activeDevice ( )

Convenience method to get at the active paint device.

Definition at line 661 of file KisViewManager.cpp.

662{
664}
KisPaintDeviceSP activePaintDevice()
Get the paint device the user wants to paint on now.

References KisNodeManager::activePaintDevice(), d, and KisViewManager::KisViewManagerPrivate::nodeManager.

◆ activeLayer()

KisLayerSP KisViewManager::activeLayer ( )

Convenience method to get at the active layer.

Definition at line 656 of file KisViewManager.cpp.

657{
658 return d->nodeManager.activeLayer();
659}
KisLayerSP activeLayer()

References KisNodeManager::activeLayer(), d, and KisViewManager::KisViewManagerPrivate::nodeManager.

◆ activeNode()

KisNodeSP KisViewManager::activeNode ( )

Convenience method to get at the active node, which may be a layer or a mask or a selection

Definition at line 651 of file KisViewManager.cpp.

652{
653 return d->nodeManager.activeNode();
654}
KisNodeSP activeNode()
Convenience function to get the active layer or mask.

References KisNodeManager::activeNode(), d, and KisViewManager::KisViewManagerPrivate::nodeManager.

◆ blockUntilOperationsFinished()

bool KisViewManager::blockUntilOperationsFinished ( KisImageSP image)

blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is finished

Parameters
imagethe image which we should wait for
Returns
true if the image has finished execution of the actions, false if the user cancelled operation

Definition at line 906 of file KisViewManager.cpp.

907{
909}
bool blockUntilOperationsFinishedImpl(KisImageSP image, bool force)
KisImageWSP image() const
Return the image this view is displaying.

References KisViewManager::KisViewManagerPrivate::blockUntilOperationsFinishedImpl(), d, and image().

◆ blockUntilOperationsFinishedForced()

void KisViewManager::blockUntilOperationsFinishedForced ( KisImageSP image)

blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is finished. Does not provide a "Cancel" button. So the user is forced to wait.

Parameters
imagethe image which we should wait for

Definition at line 911 of file KisViewManager.cpp.

912{
914}

References KisViewManager::KisViewManagerPrivate::blockUntilOperationsFinishedImpl(), d, and image().

◆ brushOutlineToggled

void KisViewManager::brushOutlineToggled ( )
signal

◆ canonicalPath()

QString KisViewManager::canonicalPath ( )
private

Definition at line 974 of file KisViewManager.cpp.

975{
976#ifdef Q_OS_ANDROID
977 QString path = QFileInfo(document()->localFilePath()).canonicalPath();
978 // if the path is based on a document tree then a directory would be returned. So check if it exists and more
979 // importantly check if we have permissions
980 if (QDir(path).exists()) {
981 return path;
982 } else {
983 KoFileDialog dialog(nullptr, KoFileDialog::ImportDirectory, "OpenDirectory");
984 dialog.setDirectoryUrl(QUrl(document()->localFilePath()));
985 return dialog.filename();
986 }
987#else
988 return QFileInfo(document()->localFilePath()).canonicalPath();
989#endif
990}
KisDocument * document() const

References document(), and KoFileDialog::ImportDirectory.

◆ canvas()

QWidget * KisViewManager::canvas ( ) const

Return the actual widget that is displaying the current image.

Definition at line 618 of file KisViewManager.cpp.

619{
620 if (d && d->currentImageView && d->currentImageView->canvasBase()->canvasWidget()) {
621 return d->currentImageView->canvasBase()->canvasWidget();
622 }
623 return 0;
624}

References KisViewManager::KisViewManagerPrivate::currentImageView, and d.

◆ canvasBase()

KisCanvas2 * KisViewManager::canvasBase ( ) const

Return the canvas base class.

Definition at line 610 of file KisViewManager.cpp.

611{
612 if (d && d->currentImageView) {
613 return d->currentImageView->canvasBase();
614 }
615 return 0;
616}

References KisViewManager::KisViewManagerPrivate::currentImageView, and d.

◆ canvasResourceProvider()

KisCanvasResourceProvider * KisViewManager::canvasResourceProvider ( )

The resource provider contains all per-view settings, such as current color, current paint op etc.

Definition at line 605 of file KisViewManager.cpp.

606{
607 return &d->canvasResourceProvider;
608}

References KisViewManager::KisViewManagerPrivate::canvasResourceProvider, and d.

◆ changeAuthorProfile

void KisViewManager::changeAuthorProfile ( const QString & profileName)
slot

Definition at line 1653 of file KisViewManager.cpp.

1654{
1655 KConfigGroup appAuthorGroup(KSharedConfig::openConfig(), "Author");
1656 if (profileName.isEmpty() || profileName == i18nc("choice for author profile", "Anonymous")) {
1657 appAuthorGroup.writeEntry("active-profile", "");
1658 } else {
1659 appAuthorGroup.writeEntry("active-profile", profileName);
1660 }
1661 appAuthorGroup.sync();
1662 Q_FOREACH (KisDocument *doc, KisPart::instance()->documents()) {
1664 }
1665}
KoDocumentInfo * documentInfo() const

References KisDocument::documentInfo(), KisPart::instance(), and KoDocumentInfo::updateParameters().

◆ createActions()

void KisViewManager::createActions ( )
private

Definition at line 731 of file KisViewManager.cpp.

732{
733 KisConfig cfg(true);
734
735 d->saveIncremental = actionManager()->createAction("save_incremental_version");
736 connect(d->saveIncremental, SIGNAL(triggered()), this, SLOT(slotSaveIncremental()));
737
738 d->saveIncrementalBackup = actionManager()->createAction("save_incremental_backup");
739 connect(d->saveIncrementalBackup, SIGNAL(triggered()), this, SLOT(slotSaveIncrementalBackup()));
740
741 connect(mainWindow(), SIGNAL(documentSaved()), this, SLOT(slotDocumentSaved()));
742
743 d->saveIncremental->setEnabled(false);
744 d->saveIncrementalBackup->setEnabled(false);
745
746 KisAction *tabletDebugger = actionManager()->createAction("tablet_debugger");
747 connect(tabletDebugger, SIGNAL(triggered()), this, SLOT(toggleTabletLogger()));
748
749 d->createTemplate = actionManager()->createAction("create_template");
750 connect(d->createTemplate, SIGNAL(triggered()), this, SLOT(slotCreateTemplate()));
751
752 d->createCopy = actionManager()->createAction("create_copy");
753 connect(d->createCopy, SIGNAL(triggered()), this, SLOT(slotCreateCopy()));
754
755 d->openResourcesDirectory = actionManager()->createAction("open_resources_directory");
756 connect(d->openResourcesDirectory, SIGNAL(triggered()), SLOT(openResourcesDirectory()));
757
758 d->rotateCanvasRight = actionManager()->createAction("rotate_canvas_right");
759 d->rotateCanvasLeft = actionManager()->createAction("rotate_canvas_left");
760 d->resetCanvasRotation = actionManager()->createAction("reset_canvas_rotation");
761 d->wrapAroundAction = actionManager()->createAction("wrap_around_mode");
762 d->wrapAroundHVAxisAction = actionManager()->createAction("wrap_around_hv_axis");
763 d->wrapAroundHAxisAction = actionManager()->createAction("wrap_around_h_axis");
764 d->wrapAroundVAxisAction = actionManager()->createAction("wrap_around_v_axis");
765 d->wrapAroundAxisActions = new QActionGroup(this);
769 d->levelOfDetailAction = actionManager()->createAction("level_of_detail_mode");
770 d->softProof = actionManager()->createAction("softProof");
771 d->gamutCheck = actionManager()->createAction("gamutCheck");
772
773 KisAction *tAction = actionManager()->createAction("showStatusBar");
774 tAction->setChecked(cfg.showStatusBar());
775 connect(tAction, SIGNAL(toggled(bool)), this, SLOT(showStatusBar(bool)));
776
777 tAction = actionManager()->createAction("view_show_canvas_only");
778 tAction->setChecked(false);
779 connect(tAction, SIGNAL(toggled(bool)), this, SLOT(switchCanvasOnly(bool)));
780
781 //Workaround, by default has the same shortcut as mirrorCanvas
782 KisAction *a = dynamic_cast<KisAction*>(actionCollection()->action("format_italic"));
783 if (a) {
784 a->setDefaultShortcut(QKeySequence());
785 }
786
787 actionManager()->createAction("ruler_pixel_multiple2");
788 d->showRulersAction = actionManager()->createAction("view_ruler");
789 d->showRulersAction->setChecked(cfg.showRulers());
790 connect(d->showRulersAction, SIGNAL(toggled(bool)), SLOT(slotSaveShowRulersState(bool)));
791
792 d->rulersTrackMouseAction = actionManager()->createAction("rulers_track_mouse");
793 d->rulersTrackMouseAction->setChecked(cfg.rulersTrackMouse());
794 connect(d->rulersTrackMouseAction, SIGNAL(toggled(bool)), SLOT(slotSaveRulersTrackMouseState(bool)));
795
796 d->zoomTo100pct = actionManager()->createAction("zoom_to_100pct");
797
800
801 d->zoomToFit = actionManager()->createAction("zoom_to_fit");
802 d->zoomToFitWidth = actionManager()->createAction("zoom_to_fit_width");
803 d->zoomToFitHeight = actionManager()->createAction("zoom_to_fit_height");
804 d->toggleZoomToFit = actionManager()->createAction("toggle_zoom_to_fit");
805
806 d->resetDisplay = actionManager()->createAction("reset_display");
807
808 d->viewPrintSize = actionManager()->createAction("view_print_size");
809
810 d->actionAuthor = new KSelectAction(KisIconUtils::loadIcon("im-user"), i18n("Active Author Profile"), this);
811 connect(d->actionAuthor, SIGNAL(textTriggered(QString)), this, SLOT(changeAuthorProfile(QString)));
812 actionCollection()->addAction("settings_active_author", d->actionAuthor);
814
815 d->showPixelGrid = actionManager()->createAction("view_pixel_grid");
817
818 d->toggleFgBg = actionManager()->createAction("toggle_fg_bg");
819 connect(d->toggleFgBg, SIGNAL(triggered(bool)), this, SLOT(slotToggleFgBg()));
820
821 d->resetFgBg = actionManager()->createAction("reset_fg_bg");
822 connect(d->resetFgBg, SIGNAL(triggered(bool)), this, SLOT(slotResetFgBg()));
823
824 d->toggleBrushOutline = actionManager()->createAction("toggle_brush_outline");
825 connect(d->toggleBrushOutline, SIGNAL(triggered(bool)), this, SLOT(slotToggleBrushOutline()));
826
827}
KisAction * createAction(const QString &name)
KisAction * createStandardAction(KStandardAction::StandardAction, const QObject *receiver, const char *member)
void setDefaultShortcut(const QKeySequence &shortcut)
Q_INVOKABLE QAction * addAction(const QString &name, QAction *action)
QAction * action(int index) const
KisMainWindow * mainWindow() const
void slotSaveRulersTrackMouseState(bool value)
KisActionManager * actionManager() const
void switchCanvasOnly(bool toggled)
virtual KisKActionCollection * actionCollection() const
void slotSaveIncrementalBackup()
void showStatusBar(bool toggled)
void slotSaveShowRulersState(bool value)
void changeAuthorProfile(const QString &profileName)
QIcon loadIcon(const QString &name)

References KisKActionCollection::action(), KisViewManager::KisViewManagerPrivate::actionAuthor, actionCollection(), actionManager(), KisKActionCollection::addAction(), changeAuthorProfile(), KisActionManager::createAction(), KisViewManager::KisViewManagerPrivate::createCopy, KisActionManager::createStandardAction(), KisViewManager::KisViewManagerPrivate::createTemplate, d, KisViewManager::KisViewManagerPrivate::gamutCheck, KisViewManager::KisViewManagerPrivate::levelOfDetailAction, KisIconUtils::loadIcon(), mainWindow(), KisViewManager::KisViewManagerPrivate::openResourcesDirectory, openResourcesDirectory(), KisViewManager::KisViewManagerPrivate::resetCanvasRotation, KisViewManager::KisViewManagerPrivate::resetDisplay, KisViewManager::KisViewManagerPrivate::resetFgBg, KisViewManager::KisViewManagerPrivate::rotateCanvasLeft, KisViewManager::KisViewManagerPrivate::rotateCanvasRight, KisConfig::rulersTrackMouse(), KisViewManager::KisViewManagerPrivate::rulersTrackMouseAction, KisViewManager::KisViewManagerPrivate::saveIncremental, KisViewManager::KisViewManagerPrivate::saveIncrementalBackup, KisAction::setDefaultShortcut(), KisViewManager::KisViewManagerPrivate::showPixelGrid, KisConfig::showRulers(), KisViewManager::KisViewManagerPrivate::showRulersAction, KisConfig::showStatusBar(), showStatusBar(), slotCreateCopy(), slotCreateTemplate(), slotDocumentSaved(), slotResetFgBg(), slotSaveIncremental(), slotSaveIncrementalBackup(), slotSaveRulersTrackMouseState(), slotSaveShowRulersState(), slotToggleBrushOutline(), slotToggleFgBg(), slotUpdateAuthorProfileActions(), slotUpdatePixelGridAction(), KisViewManager::KisViewManagerPrivate::softProof, switchCanvasOnly(), KisViewManager::KisViewManagerPrivate::toggleBrushOutline, KisViewManager::KisViewManagerPrivate::toggleFgBg, toggleTabletLogger(), KisViewManager::KisViewManagerPrivate::toggleZoomToFit, KisViewManager::KisViewManagerPrivate::viewPrintSize, KisViewManager::KisViewManagerPrivate::wrapAroundAction, KisViewManager::KisViewManagerPrivate::wrapAroundAxisActions, KisViewManager::KisViewManagerPrivate::wrapAroundHAxisAction, KisViewManager::KisViewManagerPrivate::wrapAroundHVAxisAction, KisViewManager::KisViewManagerPrivate::wrapAroundVAxisAction, KisViewManager::KisViewManagerPrivate::zoomIn, KStandardAction::ZoomIn, KisViewManager::KisViewManagerPrivate::zoomOut, KStandardAction::ZoomOut, KisViewManager::KisViewManagerPrivate::zoomTo100pct, KisViewManager::KisViewManagerPrivate::zoomToFit, KisViewManager::KisViewManagerPrivate::zoomToFitHeight, and KisViewManager::KisViewManagerPrivate::zoomToFitWidth.

◆ createThreadedUpdater()

QPointer< KoUpdater > KisViewManager::createThreadedUpdater ( const QString & name)

◆ createUnthreadedUpdater()

QPointer< KoUpdater > KisViewManager::createUnthreadedUpdater ( const QString & name)

create a new progress updater

Definition at line 636 of file KisViewManager.cpp.

637{
638 return d->persistentUnthreadedProgressUpdaterRouter->startSubtask(1, name, false);
639}

References d, and KisViewManager::KisViewManagerPrivate::persistentUnthreadedProgressUpdaterRouter.

◆ disableControls()

void KisViewManager::disableControls ( )

Definition at line 1178 of file KisViewManager.cpp.

1179{
1180 // prevents possible crashes, if somebody changes the paintop during dragging by using the mousewheel
1181 // this is for Bug 250944
1182 // the solution blocks all wheel, mouse and key event, while dragging with the freehand tool
1183 // see KisToolFreehand::initPaint() and endPaint()
1184 d->controlFrame.paintopBox()->installEventFilter(&d->blockingEventFilter);
1185 Q_FOREACH (QObject* child, d->controlFrame.paintopBox()->children()) {
1186 child->installEventFilter(&d->blockingEventFilter);
1187 }
1188}
BlockingUserInputEventFilter blockingEventFilter

References KisViewManager::KisViewManagerPrivate::blockingEventFilter, KisViewManager::KisViewManagerPrivate::controlFrame, d, and KisControlFrame::paintopBox().

◆ document()

KisDocument * KisViewManager::document ( ) const

Definition at line 879 of file KisViewManager.cpp.

880{
881 if (d->currentImageView && d->currentImageView->document()) {
882 return d->currentImageView->document();
883 }
884 return 0;
885}

References KisViewManager::KisViewManagerPrivate::currentImageView, and d.

◆ enableControls()

void KisViewManager::enableControls ( )

disable and enable toolbar controls. used for disabling them during painting.

Definition at line 1190 of file KisViewManager.cpp.

1191{
1192 d->controlFrame.paintopBox()->removeEventFilter(&d->blockingEventFilter);
1193 Q_FOREACH (QObject* child, d->controlFrame.paintopBox()->children()) {
1194 child->removeEventFilter(&d->blockingEventFilter);
1195 }
1196}

References KisViewManager::KisViewManagerPrivate::blockingEventFilter, KisViewManager::KisViewManagerPrivate::controlFrame, d, and KisControlFrame::paintopBox().

◆ filterManager()

KisFilterManager * KisViewManager::filterManager ( )

The filtermanager handles everything action-related to filters.

Definition at line 674 of file KisViewManager.cpp.

675{
676 return &d->filterManager;
677}

References d, and KisViewManager::KisViewManagerPrivate::filterManager.

◆ floatingMessageRequested

void KisViewManager::floatingMessageRequested ( const QString & message,
const QString & iconName )
signal

◆ gridManager()

KisGridManager * KisViewManager::gridManager ( ) const

Definition at line 869 of file KisViewManager.cpp.

870{
871 return &d->gridManager;
872}

References d, and KisViewManager::KisViewManagerPrivate::gridManager.

◆ guidesManager()

KisGuidesManager * KisViewManager::guidesManager ( ) const

Definition at line 874 of file KisViewManager.cpp.

875{
876 return &d->guidesManager;
877}

References d, and KisViewManager::KisViewManagerPrivate::guidesManager.

◆ guiUpdateTimeout

◆ handleFloatingZoomRotationMessage()

void KisViewManager::handleFloatingZoomRotationMessage ( QString & messageToClear)
private

Definition at line 1581 of file KisViewManager.cpp.

1582{
1583 int timeoutMsec = 500;
1584
1585 if (d->zoomRotationMessageTimer.hasExpired()) {
1586 messageToClear.clear();
1587 }
1588 d->zoomRotationMessageTimer.setRemainingTime(timeoutMsec);
1589
1590 QString message;
1591 bool haveZoomMessage = !d->zoomMessage.isEmpty();
1592 bool haveRotationMessage = !d->rotationMessage.isEmpty();
1593 if (haveZoomMessage) {
1594 if (haveRotationMessage) {
1595 message = QStringLiteral("%1\n%2").arg(d->zoomMessage, d->rotationMessage);
1596 } else {
1597 message = d->zoomMessage;
1598 }
1599 } else if (haveRotationMessage) {
1600 message = d->rotationMessage;
1601 } else {
1602 return;
1603 }
1604
1605 showFloatingMessage(message, QIcon(), timeoutMsec, KisFloatingMessage::Low, Qt::AlignCenter);
1606}
void showFloatingMessage(const QString &message, const QIcon &icon, int timeout=4500, KisFloatingMessage::Priority priority=KisFloatingMessage::Medium, int alignment=Qt::AlignCenter|Qt::TextWordWrap)
shows a floating message in the top right corner of the canvas

References d, KisFloatingMessage::Low, KisViewManager::KisViewManagerPrivate::rotationMessage, showFloatingMessage(), KisViewManager::KisViewManagerPrivate::zoomMessage, and KisViewManager::KisViewManagerPrivate::zoomRotationMessageTimer.

◆ idleTasksManager()

KisIdleTasksManager * KisViewManager::idleTasksManager ( )

Definition at line 689 of file KisViewManager.cpp.

690{
691 return &d->idleTasksManager;
692}

References d, and KisViewManager::KisViewManagerPrivate::idleTasksManager.

◆ image()

KisImageWSP KisViewManager::image ( ) const

Return the image this view is displaying.

Definition at line 597 of file KisViewManager.cpp.

598{
599 if (document()) {
600 return document()->image();
601 }
602 return 0;
603}
KisImageSP image

References document(), and KisDocument::image.

◆ imageManager()

KisImageManager * KisViewManager::imageManager ( )

The image manager handles everything action-related to the current image

Definition at line 679 of file KisViewManager.cpp.

680{
681 return &d->imageManager;
682}

References d, and KisViewManager::KisViewManagerPrivate::imageManager.

◆ initializeResourceManager()

void KisViewManager::initializeResourceManager ( KoCanvasResourceProvider * resourceManager)
static

Definition at line 379 of file KisViewManager.cpp.

380{
395
396 resourceManager->addActiveCanvasResourceDependency(
400
401 resourceManager->addActiveCanvasResourceDependency(
405
406 resourceManager->addActiveCanvasResourceDependency(
410
411 KSharedConfigPtr config = KSharedConfig::openConfig();
412 KConfigGroup miscGroup = config->group("Misc");
413 const uint handleRadius = miscGroup.readEntry("HandleRadius", 5);
414 resourceManager->setHandleRadius(handleRadius);
415}
unsigned int uint
void addActiveCanvasResourceDependency(KoActiveCanvasResourceDependencySP dep)
void addResourceUpdateMediator(KoResourceUpdateMediatorSP mediator)
void addDerivedResourceConverter(KoDerivedResourceConverterSP converter)
QSharedPointer< T > toQShared(T *ptr)
@ BackgroundColor
The active background color selected for this canvas.
@ ForegroundColor
The active foreground color selected for this canvas.

References KoCanvasResourceProvider::addActiveCanvasResourceDependency(), KoCanvasResourceProvider::addDerivedResourceConverter(), KoCanvasResourceProvider::addResourceUpdateMediator(), KoCanvasResource::BackgroundColor, KoCanvasResource::CurrentGradient, KoCanvasResource::CurrentPaintOpPreset, KoCanvasResource::ForegroundColor, KoCanvasResourceProvider::setHandleRadius(), and toQShared().

◆ inputManager()

KisInputManager * KisViewManager::inputManager ( ) const

Filters events and sends them to canvas actions.

Definition at line 684 of file KisViewManager.cpp.

685{
686 return &d->inputManager;
687}

References d, and KisViewManager::KisViewManagerPrivate::inputManager.

◆ mainWindow()

KisMainWindow * KisViewManager::mainWindow ( ) const
Returns
the KisMainWindow this view is in, or 0

Definition at line 1608 of file KisViewManager.cpp.

1609{
1610 return qobject_cast<KisMainWindow*>(d->mainWindow);
1611}

References d, and KisViewManager::KisViewManagerPrivate::mainWindow.

◆ mainWindowAsQWidget()

QWidget * KisViewManager::mainWindowAsQWidget ( ) const

Gets the KisMainWindow as a QWidget, useful when you just need it to be used as a parent to a dialog or window without needing to include KisMainWindow.h.

Definition at line 1613 of file KisViewManager.cpp.

1614{
1615 return mainWindow();
1616}

References mainWindow().

◆ nodeManager()

KisNodeManager * KisViewManager::nodeManager ( ) const

The node manager handles everything about nodes.

Definition at line 859 of file KisViewManager.cpp.

860{
861 return &d->nodeManager;
862}

References d, and KisViewManager::KisViewManagerPrivate::nodeManager.

◆ notifyWorkspaceLoaded()

◆ openResourcesDirectory

void KisViewManager::openResourcesDirectory ( )
privateslot

Definition at line 1464 of file KisViewManager.cpp.

1465{
1466 QString resourcePath = KisResourceLocator::instance()->resourceLocationBase();
1467#ifdef Q_OS_WIN
1468
1469 QString folderInStandardAppData;
1470 QString folderInPrivateAppData;
1471 KoResourcePaths::getAllUserResourceFoldersLocationsForWindowsStore(folderInStandardAppData, folderInPrivateAppData);
1472
1473 if (!folderInPrivateAppData.isEmpty()) {
1474
1475 const auto pathToDisplay = [](const QString &path) {
1476 // Due to how Unicode word wrapping works, the string does not
1477 // wrap after backslashes in Qt 5.12. We don't want the path to
1478 // become too long, so we add a U+200B ZERO WIDTH SPACE to allow
1479 // wrapping. The downside is that we cannot let the user select
1480 // and copy the path because it now contains invisible unicode
1481 // code points.
1482 // See: https://bugreports.qt.io/browse/QTBUG-80892
1483 return QDir::toNativeSeparators(path).replace(QChar('\\'), QStringLiteral(u"\\\u200B"));
1484 };
1485
1486 QMessageBox mbox(qApp->activeWindow());
1487 mbox.setIcon(QMessageBox::Information);
1488 mbox.setWindowTitle(i18nc("@title:window resource folder", "Open Resource Folder"));
1489 // Similar text is also used in kis_dlg_preferences.cc
1490
1491 mbox.setText(i18nc("@info resource folder",
1492 "<p>You are using the Microsoft Store package version of Krita. "
1493 "Even though Krita can be configured to place resources under the "
1494 "user AppData location, Windows may actually store the files "
1495 "inside a private app location.</p>\n"
1496 "<p>You should check both locations to determine where "
1497 "the files are located.</p>\n"
1498 "<p><b>User AppData</b>:<br/>\n"
1499 "%1</p>\n"
1500 "<p><b>Private app location</b>:<br/>\n"
1501 "%2</p>",
1502 pathToDisplay(folderInStandardAppData),
1503 pathToDisplay(folderInPrivateAppData)
1504 ));
1505 mbox.setTextInteractionFlags(Qt::NoTextInteraction);
1506
1507 const auto *btnOpenUserAppData = mbox.addButton(i18nc("@action:button resource folder", "Open in &user AppData"), QMessageBox::AcceptRole);
1508 const auto *btnOpenPrivateAppData = mbox.addButton(i18nc("@action:button resource folder", "Open in &private app location"), QMessageBox::AcceptRole);
1509
1510 mbox.addButton(QMessageBox::Close);
1511 mbox.setDefaultButton(QMessageBox::Close);
1512 mbox.exec();
1513
1514 if (mbox.clickedButton() == btnOpenPrivateAppData) {
1515 resourcePath = folderInPrivateAppData;
1516 } else if (mbox.clickedButton() == btnOpenUserAppData) {
1517 // no-op: resourcePath = resourceDir.absolutePath();
1518 } else {
1519 return;
1520 }
1521
1522
1523 }
1524#endif
1525 QDesktopServices::openUrl(QUrl::fromLocalFile(resourcePath));
1526}
qreal u
QString resourceLocationBase() const
resourceLocationBase is the place where all resource storages (folder, bundles etc....
static KisResourceLocator * instance()
static void getAllUserResourceFoldersLocationsForWindowsStore(QString &standardLocation, QString &privateLocation)
getAllAppDataLocationsForWindowsStore Use this to get both private and general appdata folders which ...

References KoResourcePaths::getAllUserResourceFoldersLocationsForWindowsStore(), KisResourceLocator::instance(), KisResourceLocator::resourceLocationBase(), and u.

◆ paintOpBox()

KisPaintopBox * KisViewManager::paintOpBox ( ) const

◆ qtMainWindow()

QMainWindow * KisViewManager::qtMainWindow ( ) const

The QMainWindow associated with this view. This is most likely going to be shell(), but when running as Gemini or Sketch, this will be set to the applications' own QMainWindow. This can be checked by qobject_casting to KisMainWindow to check the difference.

Definition at line 950 of file KisViewManager.cpp.

951{
952 if (d->mainWindow)
953 return d->mainWindow;
954
955 //Fallback for when we have not yet set the main window.
956 QMainWindow* w = qobject_cast<QMainWindow*>(qApp->activeWindow());
957 if(w)
958 return w;
959
960 return mainWindow();
961}

References d, KisViewManager::KisViewManagerPrivate::mainWindow, and mainWindow().

◆ selection()

KisSelectionSP KisViewManager::selection ( )

Convenience method to get at the active selection (the selection of the current layer, or, if that does not exist, the global selection.

Definition at line 699 of file KisViewManager.cpp.

700{
701 if (d->currentImageView) {
702 return d->currentImageView->selection();
703 }
704 return 0;
705
706}

References KisViewManager::KisViewManagerPrivate::currentImageView, and d.

◆ selectionEditable()

bool KisViewManager::selectionEditable ( )

Checks if the current global or local selection is editable.

Definition at line 708 of file KisViewManager.cpp.

709{
710 KisLayerSP layer = activeLayer();
711 if (layer) {
712 KisSelectionMaskSP mask = layer->selectionMask();
713 if (mask) {
714 return mask->isEditable();
715 }
716 }
717 // global selection is always editable
718 return true;
719}
KisLayerSP activeLayer()
Convenience method to get at the active layer.
bool isEditable(bool checkVisibility=true) const
virtual KisSelectionMaskSP selectionMask() const
Definition kis_layer.cc:504

References activeLayer(), KisBaseNode::isEditable(), and KisLayer::selectionMask().

◆ selectionManager()

KisSelectionManager * KisViewManager::selectionManager ( )

The selection manager handles everything action related to selections.

Definition at line 646 of file KisViewManager.cpp.

647{
648 return &d->selectionManager;
649}

References d, and KisViewManager::KisViewManagerPrivate::selectionManager.

◆ setCurrentView()

void KisViewManager::setCurrentView ( KisView * view)

idle tasks managed should be reconnected to the new image the first, because other dockers may request it to recalculate stuff

Definition at line 447 of file KisViewManager.cpp.

448{
449 if (d->currentImageView) {
450 d->currentImageView->notifyCurrentStateChanged(false);
451
452 d->currentImageView->canvasBase()->setCursor(QCursor(Qt::ArrowCursor));
453 KisDocument* doc = d->currentImageView->document();
454 if (doc) {
456 doc->disconnect(this);
457 }
458 d->currentImageView->canvasController()->proxyObject->disconnect(&d->statusBar);
461 }
462
463 QPointer<KisView> imageView = qobject_cast<KisView*>(view);
464 d->currentImageView = imageView;
465
466 if (imageView) {
470
471 d->softProof->setChecked(imageView->softProofing());
472 d->gamutCheck->setChecked(imageView->gamutCheck());
473
474 // Wait for the async image to have loaded
475 KisDocument* doc = imageView->document();
476
477 if (KisConfig(true).readEntry<bool>("EnablePositionLabel", false)) {
478 connect(d->currentImageView->canvasController()->proxyObject,
479 SIGNAL(documentMousePositionChanged(QPointF)),
480 &d->statusBar,
481 SLOT(documentMousePositionChanged(QPointF)));
482 }
483
484 KisCanvasController *canvasController = dynamic_cast<KisCanvasController*>(d->currentImageView->canvasController());
485 KIS_ASSERT(canvasController);
486
487 d->viewConnections.addUniqueConnection(&d->nodeManager, SIGNAL(sigNodeActivated(KisNodeSP)), doc->image(), SLOT(requestStrokeEndActiveNode()));
488 d->viewConnections.addUniqueConnection(d->rotateCanvasRight, SIGNAL(triggered()), canvasController, SLOT(rotateCanvasRight15()));
489 d->viewConnections.addUniqueConnection(d->rotateCanvasLeft, SIGNAL(triggered()),canvasController, SLOT(rotateCanvasLeft15()));
490 d->viewConnections.addUniqueConnection(d->resetCanvasRotation, SIGNAL(triggered()),canvasController, SLOT(resetCanvasRotation()));
491
492 d->viewConnections.addUniqueConnection(d->wrapAroundAction, SIGNAL(toggled(bool)), canvasController, SLOT(slotToggleWrapAroundMode(bool)));
493 d->wrapAroundAction->setChecked(canvasController->wrapAroundMode());
494 d->viewConnections.addUniqueConnection(d->wrapAroundHVAxisAction, SIGNAL(triggered()), canvasController, SLOT(slotSetWrapAroundModeAxisHV()));
495 d->wrapAroundHVAxisAction->setChecked(canvasController->wrapAroundModeAxis() == WRAPAROUND_BOTH);
496 d->viewConnections.addUniqueConnection(d->wrapAroundHAxisAction, SIGNAL(triggered()), canvasController, SLOT(slotSetWrapAroundModeAxisH()));
497 d->wrapAroundHAxisAction->setChecked(canvasController->wrapAroundModeAxis() == WRAPAROUND_HORIZONTAL);
498 d->viewConnections.addUniqueConnection(d->wrapAroundVAxisAction, SIGNAL(triggered()), canvasController, SLOT(slotSetWrapAroundModeAxisV()));
499 d->wrapAroundVAxisAction->setChecked(canvasController->wrapAroundModeAxis() == WRAPAROUND_VERTICAL);
500
501 d->viewConnections.addUniqueConnection(d->levelOfDetailAction, SIGNAL(toggled(bool)), canvasController, SLOT(slotToggleLevelOfDetailMode(bool)));
502 d->levelOfDetailAction->setChecked(canvasController->levelOfDetailMode());
503
504 d->viewConnections.addUniqueConnection(d->currentImageView->image(), SIGNAL(sigColorSpaceChanged(const KoColorSpace*)), d->controlFrame.paintopBox(), SLOT(slotColorSpaceChanged(const KoColorSpace*)));
505 d->viewConnections.addUniqueConnection(d->showRulersAction, SIGNAL(toggled(bool)), imageView->zoomManager(), SLOT(setShowRulers(bool)));
506 d->viewConnections.addUniqueConnection(d->rulersTrackMouseAction, SIGNAL(toggled(bool)), imageView->zoomManager(), SLOT(setRulersTrackMouse(bool)));
507 d->viewConnections.addUniqueConnection(d->zoomTo100pct, SIGNAL(triggered()), imageView->zoomManager(), SLOT(zoomTo100()));
508 d->viewConnections.addUniqueConnection(d->zoomIn, SIGNAL(triggered()), imageView->zoomManager(), SLOT(slotZoomIn()));
509 d->viewConnections.addUniqueConnection(d->zoomOut, SIGNAL(triggered()), imageView->zoomManager(), SLOT(slotZoomOut()));
510 d->viewConnections.addUniqueConnection(d->zoomToFit, SIGNAL(triggered()), imageView->zoomManager(), SLOT(slotZoomToFit()));
511 d->viewConnections.addUniqueConnection(d->zoomToFitWidth, SIGNAL(triggered()), imageView->zoomManager(), SLOT(slotZoomToFitWidth()));
512 d->viewConnections.addUniqueConnection(d->zoomToFitHeight, SIGNAL(triggered()), imageView->zoomManager(), SLOT(slotZoomToFitHeight()));
513 d->viewConnections.addUniqueConnection(d->toggleZoomToFit, SIGNAL(triggered()), imageView->zoomManager(), SLOT(slotToggleZoomToFit()));
514
515 d->viewConnections.addUniqueConnection(d->resetDisplay, SIGNAL(triggered()), imageView->viewManager(), SLOT(slotResetDisplay()));
516
517 d->viewConnections.addConnection(imageView->canvasController(),
519 this,
520 [this](bool value) {
521 QSignalBlocker b(d->viewPrintSize);
522 d->viewPrintSize->setChecked(value);
523 });
524 d->viewPrintSize->setChecked(imageView->canvasController()->usePrintResolutionMode());
525 d->viewConnections.addUniqueConnection(d->viewPrintSize, &KisAction::toggled,
526 imageView->canvasController(), &KisCanvasController::setUsePrintResolutionMode);
527
528 d->viewConnections.addUniqueConnection(imageView->canvasController(),
530 imageView->zoomManager()->zoomAction(),
532 imageView->zoomManager()->zoomAction()->setUsePrintResolutionMode(imageView->canvasController()->usePrintResolutionMode());
533 d->viewConnections.addUniqueConnection(imageView->zoomManager()->zoomAction(),
535 imageView->canvasController(),
537
538 d->viewConnections.addUniqueConnection(d->softProof, SIGNAL(toggled(bool)), view, SLOT(slotSoftProofing(bool)) );
539 d->viewConnections.addUniqueConnection(d->gamutCheck, SIGNAL(toggled(bool)), view, SLOT(slotGamutCheck(bool)) );
540
541 // set up progress reporting
543 d->viewConnections.addUniqueConnection(&d->statusBar, SIGNAL(sigCancellationRequested()), doc->image(), SLOT(requestStrokeCancellation()));
544
545 d->viewConnections.addUniqueConnection(d->showPixelGrid, SIGNAL(toggled(bool)), canvasController, SLOT(slotTogglePixelGrid(bool)));
546
547 imageView->zoomManager()->setShowRulers(d->showRulersAction->isChecked());
548 imageView->zoomManager()->setRulersTrackMouse(d->rulersTrackMouseAction->isChecked());
549
551 }
552
553 d->filterManager.setView(imageView);
554 d->selectionManager.setView(imageView);
555 d->guidesManager.setView(imageView);
556 d->nodeManager.setView(imageView);
557 d->imageManager.setView(imageView);
558 d->canvasControlsManager.setView(imageView);
559 d->actionManager.setView(imageView);
560 d->gridManager.setView(imageView);
561 d->statusBar.setView(imageView);
563 d->mirrorManager.setView(imageView);
564
565 if (d->currentImageView) {
566 d->currentImageView->notifyCurrentStateChanged(true);
567 d->currentImageView->canvasController()->activate();
568 d->currentImageView->canvasController()->setFocus();
569
571 image(), SIGNAL(sigSizeChanged(QPointF,QPointF)),
572 canvasResourceProvider(), SLOT(slotImageSizeChanged()));
573
575 image(), SIGNAL(sigResolutionChanged(double,double)),
576 canvasResourceProvider(), SLOT(slotOnScreenResolutionChanged()));
577
579 image(), SIGNAL(sigNodeChanged(KisNodeSP)),
580 this, SLOT(updateGUI()));
581
583 d->currentImageView->canvasController()->proxyObject,
587 }
588
590
593
594 Q_EMIT viewChanged();
595}
float value(const T *src, size_t ch)
@ WRAPAROUND_HORIZONTAL
@ WRAPAROUND_BOTH
@ WRAPAROUND_VERTICAL
void setView(QPointer< KisView > imageView)
WrapAroundAxis wrapAroundModeAxis() const
void setUsePrintResolutionMode(bool value)
void sigUsePrintResolutionModeChanged(bool value)
void setView(QPointer< KisView >imageView)
void addProxy(KoProgressProxy *proxy)
void removeProxy(KoProgressProxy *proxy)
void setView(QPointer< KisView > imageView)
void setView(QPointer< KisView >imageView)
void setView(QPointer< KisView >imageView)
void setView(QPointer< KisView > view)
void setImage(KisImageSP image)
void setView(QPointer< KisView >imageView)
KisCompositeProgressProxy * compositeProgressProxy()
Definition kis_image.cc:746
void setView(QPointer< KisView > imageView)
void setView(QPointer< KisView >imageView)
void setView(QPointer< KisView >imageView)
void addUniqueConnection(Sender sender, Signal signal, Receiver receiver, Method method)
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void setView(QPointer< KisView > imageView)
KisSignalAutoConnectionsStore viewConnections
KisCanvasControlsManager canvasControlsManager
KisDecorationsManager paintingAssistantsManager
void viewChanged()
viewChanged sent out when the view has changed.
void effectiveZoomChanged(qreal zoom)
void sigUsePrintResolutionModeChanged(bool value)
void setUsePrintResolutionMode(bool value)
#define KIS_ASSERT(cond)
Definition kis_assert.h:33

References KisViewManager::KisViewManagerPrivate::actionManager, KisSignalAutoConnectionsStore::addConnection(), KisCompositeProgressProxy::addProxy(), KisSignalAutoConnectionsStore::addUniqueConnection(), KisViewManager::KisViewManagerPrivate::canvasControlsManager, canvasResourceProvider(), KisSignalAutoConnectionsStore::clear(), KisImage::compositeProgressProxy(), KisViewManager::KisViewManagerPrivate::controlFrame, KisViewManager::KisViewManagerPrivate::currentImageView, d, KoCanvasControllerProxyObject::effectiveZoomChanged(), KisViewManager::KisViewManagerPrivate::filterManager, KisViewManager::KisViewManagerPrivate::gamutCheck, KisViewManager::KisViewManagerPrivate::gridManager, KisViewManager::KisViewManagerPrivate::guidesManager, KisViewManager::KisViewManagerPrivate::idleTasksManager, KisDocument::image, image(), KisViewManager::KisViewManagerPrivate::imageManager, KIS_ASSERT, KisViewManager::KisViewManagerPrivate::levelOfDetailAction, KisCanvasController::levelOfDetailMode(), KisViewManager::KisViewManagerPrivate::mirrorManager, KisViewManager::KisViewManagerPrivate::nodeManager, KisViewManager::KisViewManagerPrivate::paintingAssistantsManager, KisControlFrame::paintopBox(), KisViewManager::KisViewManagerPrivate::persistentImageProgressUpdater, KisCompositeProgressProxy::removeProxy(), KisViewManager::KisViewManagerPrivate::resetCanvasRotation, KisViewManager::KisViewManagerPrivate::resetDisplay, KisViewManager::KisViewManagerPrivate::rotateCanvasLeft, KisViewManager::KisViewManagerPrivate::rotateCanvasRight, KisViewManager::KisViewManagerPrivate::rulersTrackMouseAction, KisViewManager::KisViewManagerPrivate::selectionManager, KisIdleTasksManager::setImage(), KisCanvasController::setUsePrintResolutionMode(), KoZoomAction::setUsePrintResolutionMode(), KisActionManager::setView(), KisMirrorManager::setView(), KisStatusBar::setView(), KisDecorationsManager::setView(), KisGuidesManager::setView(), KisGridManager::setView(), KisCanvasControlsManager::setView(), KisFilterManager::setView(), KisImageManager::setView(), KisNodeManager::setView(), KisSelectionManager::setView(), showHideScrollbars(), KisViewManager::KisViewManagerPrivate::showPixelGrid, KisViewManager::KisViewManagerPrivate::showRulersAction, KisCanvasController::sigUsePrintResolutionModeChanged(), KoZoomAction::sigUsePrintResolutionModeChanged(), KisCanvasResourceProvider::slotImageSizeChanged(), KisCanvasResourceProvider::slotOnScreenResolutionChanged(), slotResetDisplay(), KisViewManager::KisViewManagerPrivate::softProof, KisViewManager::KisViewManagerPrivate::statusBar, KisViewManager::KisViewManagerPrivate::toggleZoomToFit, KisActionManager::updateGUI(), updateGUI(), value(), viewChanged(), KisViewManager::KisViewManagerPrivate::viewConnections, KisViewManager::KisViewManagerPrivate::viewPrintSize, WRAPAROUND_BOTH, WRAPAROUND_HORIZONTAL, WRAPAROUND_VERTICAL, KisViewManager::KisViewManagerPrivate::wrapAroundAction, KisViewManager::KisViewManagerPrivate::wrapAroundHAxisAction, KisViewManager::KisViewManagerPrivate::wrapAroundHVAxisAction, KisCanvasController::wrapAroundMode(), KisCanvasController::wrapAroundModeAxis(), KisViewManager::KisViewManagerPrivate::wrapAroundVAxisAction, KisViewManager::KisViewManagerPrivate::zoomIn, KisViewManager::KisViewManagerPrivate::zoomOut, KisViewManager::KisViewManagerPrivate::zoomTo100pct, KisViewManager::KisViewManagerPrivate::zoomToFit, KisViewManager::KisViewManagerPrivate::zoomToFitHeight, and KisViewManager::KisViewManagerPrivate::zoomToFitWidth.

◆ setQtMainWindow()

void KisViewManager::setQtMainWindow ( QMainWindow * newMainWindow)

The mainWindow function will return the shell() value, unless this function is called with a non-null value. To make it return shell() again, simply pass null to this function.

Definition at line 963 of file KisViewManager.cpp.

964{
965 d->mainWindow = newMainWindow;
966}

References d, and KisViewManager::KisViewManagerPrivate::mainWindow.

◆ setShowFloatingMessage

void KisViewManager::setShowFloatingMessage ( bool show)
slot

Definition at line 1648 of file KisViewManager.cpp.

1649{
1650 d->showFloatingMessage = show;
1651}

References d, and KisViewManager::KisViewManagerPrivate::showFloatingMessage.

◆ setupManagers()

void KisViewManager::setupManagers ( )
private

Definition at line 829 of file KisViewManager.cpp.

830{
831 // Create the managers for filters, selections, layers etc.
832 // XXX: When the current layer changes, call updateGUI on all
833 // managers
834
836
838
840
842
844
846
848
850
852}
void setup(KisActionManager *actionManager)
void setup(KisActionManager *actionManager)
void setup(KisKActionCollection *ac, KisActionManager *actionManager)
void setup(KisActionManager *actionManager)
void setup(KisActionManager *actionManager)
void setup(KisActionManager *actionManager)
void setup(KisKActionCollection *collection)
void setup(KisKActionCollection *collection, KisActionManager *actionManager)
void setup(KisActionManager *actionManager)

References actionCollection(), actionManager(), KisViewManager::KisViewManagerPrivate::canvasControlsManager, d, KisViewManager::KisViewManagerPrivate::filterManager, KisViewManager::KisViewManagerPrivate::gridManager, KisViewManager::KisViewManagerPrivate::guidesManager, KisViewManager::KisViewManagerPrivate::imageManager, KisViewManager::KisViewManagerPrivate::mirrorManager, KisViewManager::KisViewManagerPrivate::nodeManager, KisViewManager::KisViewManagerPrivate::paintingAssistantsManager, KisViewManager::KisViewManagerPrivate::selectionManager, KisGridManager::setup(), KisGuidesManager::setup(), KisCanvasControlsManager::setup(), KisImageManager::setup(), KisSelectionManager::setup(), KisDecorationsManager::setup(), KisFilterManager::setup(), KisMirrorManager::setup(), and KisNodeManager::setup().

◆ showFloatingMessage()

void KisViewManager::showFloatingMessage ( const QString & message,
const QIcon & icon,
int timeout = 4500,
KisFloatingMessage::Priority priority = KisFloatingMessage::Medium,
int alignment = Qt::AlignCenter | Qt::TextWordWrap )

shows a floating message in the top right corner of the canvas

Definition at line 1561 of file KisViewManager.cpp.

1562{
1563 if (!d->currentImageView) return;
1564 d->currentImageView->showFloatingMessage(message, icon, timeout, priority, alignment);
1565
1566 Q_EMIT floatingMessageRequested(message, icon.name());
1567}
void floatingMessageRequested(const QString &message, const QString &iconName)

References KisViewManager::KisViewManagerPrivate::currentImageView, d, and floatingMessageRequested().

◆ showFloatingRotationMessage()

void KisViewManager::showFloatingRotationMessage ( const QString & message)

◆ showFloatingZoomMessage()

void KisViewManager::showFloatingZoomMessage ( const QString & message)

◆ showHideScrollbars

void KisViewManager::showHideScrollbars ( )
slot

Definition at line 1619 of file KisViewManager.cpp.

1620{
1621 if (!d->currentImageView) return;
1622 if (!d->currentImageView->canvasController()) return;
1623
1624 KisConfig cfg(true);
1625 bool toggled = actionCollection()->action("view_show_canvas_only")->isChecked();
1626
1627 if ( (toggled && cfg.hideScrollbarsFullscreen()) || (!toggled && cfg.hideScrollbars()) ) {
1628 d->currentImageView->canvasController()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1629 d->currentImageView->canvasController()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1630 } else {
1631 d->currentImageView->canvasController()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
1632 d->currentImageView->canvasController()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
1633 }
1634}

References KisKActionCollection::action(), actionCollection(), KisViewManager::KisViewManagerPrivate::currentImageView, d, KisConfig::hideScrollbars(), and KisConfig::hideScrollbarsFullscreen().

◆ showStatusBar

void KisViewManager::showStatusBar ( bool toggled)
privateslot

Definition at line 1198 of file KisViewManager.cpp.

1199{
1200 KisMainWindow *mw = mainWindow();
1201 if(mw && mw->statusBar()) {
1202 mw->statusBar()->setVisible(toggled);
1203 KisConfig cfg(false);
1204 cfg.setShowStatusBar(toggled);
1205 }
1206}
Main window for Krita.

References mainWindow(), and KisConfig::setShowStatusBar().

◆ slotActivateTransformTool

void KisViewManager::slotActivateTransformTool ( )
slot

Definition at line 1712 of file KisViewManager.cpp.

1713{
1714 if(KoToolManager::instance()->activeToolId() == "KisToolTransform") {
1715 KoToolBase* tool = KoToolManager::instance()->toolById(canvasBase(), "KisToolTransform");
1716
1717 QSet<KoShape*> dummy;
1718 // Start a new stroke
1719 tool->deactivate();
1720 tool->activate(dummy);
1721 }
1722
1723 KoToolManager::instance()->switchToolRequested("KisToolTransform");
1724}
KisCanvas2 * canvasBase() const
Return the canvas base class.
virtual void activate(const QSet< KoShape * > &shapes)
virtual void deactivate()
KoToolBase * toolById(KoCanvasBase *canvas, const QString &id) const
void switchToolRequested(const QString &id)

References KoToolBase::activate(), canvasBase(), KoToolBase::deactivate(), KoToolManager::instance(), KoToolManager::switchToolRequested(), and KoToolManager::toolById().

◆ slotCreateCopy

void KisViewManager::slotCreateCopy ( )
privateslot

Definition at line 922 of file KisViewManager.cpp.

923{
924 KisDocument *srcDoc = document();
925 if (!srcDoc) return;
926
927 if (!this->blockUntilOperationsFinished(srcDoc->image())) return;
928
929 KisDocument *doc = 0;
930 {
931 KisImageReadOnlyBarrierLock l(srcDoc->image());
932 doc = srcDoc->clone(true);
933 }
935
936 QString name = srcDoc->documentInfo()->aboutInfo("name");
937 if (name.isEmpty()) {
938 name = document()->path();
939 }
940 name = i18n("%1 (Copy)", name);
941 doc->documentInfo()->setAboutInfo("title", name);
942 doc->resetPath();
943
945 KisMainWindow *mw = qobject_cast<KisMainWindow*>(d->mainWindow);
947}
QString path() const
KisDocument * clone(bool addStorage=false)
creates a clone of the document and returns it. Please make sure that you hold all the necessary lock...
KisView * addViewAndNotifyLoadingCompleted(KisDocument *document, QMdiSubWindow *subWindow=0)
void addDocument(KisDocument *document, bool notify=true)
Definition KisPart.cpp:211
bool blockUntilOperationsFinished(KisImageSP image)
blockUntilOperationsFinished blocks the GUI of the application until execution of actions on image is...
void setAboutInfo(const QString &info, const QString &data)
QString aboutInfo(const QString &info) const
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
const char * name(StandardAction id)

References KoDocumentInfo::aboutInfo(), KisPart::addDocument(), KisMainWindow::addViewAndNotifyLoadingCompleted(), blockUntilOperationsFinished(), KisDocument::clone(), d, document(), KisDocument::documentInfo(), KisDocument::image, KisPart::instance(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisViewManager::KisViewManagerPrivate::mainWindow, KisDocument::path(), KisDocument::resetPath(), and KoDocumentInfo::setAboutInfo().

◆ slotCreateOpacityResource

void KisViewManager::slotCreateOpacityResource ( bool isOpacityPresetMode,
KoToolBase * tool )
privateslot

Definition at line 1782 of file KisViewManager.cpp.

1783{
1784 if (isOpacityPresetMode) {
1786 }
1787 else {
1789 }
1790}
void setConverter(KoDerivedResourceConverterSP converter, KoToolBase *tool)
void setAbstractResource(KoAbstractCanvasResourceInterfaceSP abstractResource, KoToolBase *tool)

References KoToolManager::instance(), KoCanvasResource::Opacity, KoToolManager::setAbstractResource(), KoToolManager::setConverter(), and toQShared().

◆ slotCreateTemplate

void KisViewManager::slotCreateTemplate ( )
privateslot

Definition at line 916 of file KisViewManager.cpp.

917{
918 if (!document()) return;
919 KisTemplateCreateDia::createTemplate( QStringLiteral("templates/"), ".kra", document(), mainWindow());
920}
static void createTemplate(const QString &templatesResourcePath, const char *suffix, KisDocument *document, QWidget *parent=0)

References KisTemplateCreateDia::createTemplate(), document(), and mainWindow().

◆ slotDocumentSaved

void KisViewManager::slotDocumentSaved ( )
privateslot

◆ slotResetDisplay

void KisViewManager::slotResetDisplay ( )
privateslot

Definition at line 1774 of file KisViewManager.cpp.

1775{
1776 KisCanvasController *canvasController = d->currentImageView->canvasController();
1777 canvasController->resetCanvasRotation();
1778 canvasController->mirrorCanvas(false);
1780}
KisZoomManager * zoomManager()
The zoommanager handles everything action-related to zooming.

References KisViewManager::KisViewManagerPrivate::currentImageView, d, KisCanvasController::mirrorCanvas(), KisCanvasController::resetCanvasRotation(), KisZoomManager::slotZoomToFit(), and zoomManager().

◆ slotResetFgBg

◆ slotResetRotation

void KisViewManager::slotResetRotation ( )
privateslot

Definition at line 1768 of file KisViewManager.cpp.

1769{
1770 KisCanvasController *canvasController = d->currentImageView->canvasController();
1771 canvasController->resetCanvasRotation();
1772}

References KisViewManager::KisViewManagerPrivate::currentImageView, d, and KisCanvasController::resetCanvasRotation().

◆ slotSaveIncremental

void KisViewManager::slotSaveIncremental ( )
privateslot

Definition at line 992 of file KisViewManager.cpp.

993{
994 if (!document()) return;
995
996 if (document()->path().isEmpty()) {
997 KisMainWindow *mw = qobject_cast<KisMainWindow*>(d->mainWindow);
998 mw->saveDocument(document(), true, false);
999 return;
1000 }
1001
1002 bool foundVersion;
1003 bool fileAlreadyExists;
1004 bool isBackup;
1005 QString version = "000";
1006 QString newVersion;
1007 QString letter;
1008 QString path = canonicalPath();
1009
1010 QString fileName = QFileInfo(document()->localFilePath()).fileName();
1011
1012 // Find current version filenames
1013 // v v Regexp to find incremental versions in the filename, taking our backup scheme into account as well
1014 // Considering our incremental version and backup scheme, format is filename_001~001.ext
1015 QRegularExpression regex("_(\\d{1,4})([a-z])?([\\.|~])");
1016 QRegularExpressionMatch match;
1017 foundVersion = fileName.contains(regex, &match);
1018 isBackup = foundVersion ? match.captured(3) == "~" : false;
1019
1020 // If the filename has a version, prepare it for incrementation
1021 if (foundVersion) {
1022 version = match.captured(1);
1023 letter = match.captured(2);
1024 } else {
1025 // ...else, simply add a version to it so the next loop works
1026 QRegularExpression regex2("\\.\\w{2,4}$"); // Heuristic to find file extension
1027 QRegularExpressionMatch match = regex2.match(fileName);
1028 QString extensionPlusVersion = match.captured(0);
1029 extensionPlusVersion.prepend(version);
1030 extensionPlusVersion.prepend("_");
1031 fileName.replace(regex2, extensionPlusVersion);
1032 }
1033
1034 // Prepare the base for new version filename
1035 int intVersion = version.toInt(0);
1036 ++intVersion;
1037 QString baseNewVersion = QString::number(intVersion);
1038 while (baseNewVersion.length() < version.length()) {
1039 baseNewVersion.prepend("0");
1040 }
1041
1042 // Check if the file exists under the new name and search until options are exhausted (test appending a to z)
1043 do {
1044 newVersion = baseNewVersion;
1045 newVersion.prepend("_");
1046 if (!letter.isNull()) newVersion.append(letter);
1047 if (isBackup) {
1048 newVersion.append("~");
1049 } else {
1050 newVersion.append(".");
1051 }
1052 fileName.replace(regex, newVersion);
1053 fileAlreadyExists = QFileInfo(path + '/' + fileName).exists();
1054 if (fileAlreadyExists) {
1055 if (!letter.isNull()) {
1056 char letterCh = letter.at(0).toLatin1();
1057 ++letterCh;
1058 letter = QString(QChar(letterCh));
1059 } else {
1060 letter = 'a';
1061 }
1062 }
1063 } while (fileAlreadyExists && letter != "{"); // x, y, z, {...
1064
1065 if (letter == "{") {
1066 QMessageBox::critical(mainWindow(), i18nc("@title:window", "Couldn't save incremental version"), i18n("Alternative names exhausted, try manually saving with a higher number"));
1067 return;
1068 }
1069 QString newFilePath = path + '/' + fileName;
1070 document()->setFileBatchMode(true);
1071 document()->saveAs(newFilePath, document()->mimeType(), true);
1072 document()->setFileBatchMode(false);
1073 KisPart::instance()->queueAddRecentURLToAllMainWindowsOnFileSaved(QUrl::fromLocalFile(newFilePath),
1074 QUrl::fromLocalFile(document()->path()));
1075}
void setFileBatchMode(const bool batchMode)
bool saveAs(const QString &path, const QByteArray &mimeType, bool showWarnings, KisPropertiesConfigurationSP exportConfiguration=0)
bool saveDocument(KisDocument *document, bool saveas, bool isExporting, bool isAdvancedExporting=false)
void queueAddRecentURLToAllMainWindowsOnFileSaved(QUrl url, QUrl oldUrl=QUrl())
Definition KisPart.cpp:606
QString canonicalPath()

References canonicalPath(), d, document(), KisPart::instance(), KisViewManager::KisViewManagerPrivate::mainWindow, mainWindow(), KisPart::queueAddRecentURLToAllMainWindowsOnFileSaved(), KisDocument::saveAs(), KisMainWindow::saveDocument(), and KisDocument::setFileBatchMode().

◆ slotSaveIncrementalBackup

void KisViewManager::slotSaveIncrementalBackup ( )
privateslot

Definition at line 1077 of file KisViewManager.cpp.

1078{
1079 if (!document()) return;
1080
1081 if (document()->path().isEmpty()) {
1082 KisMainWindow *mw = qobject_cast<KisMainWindow*>(d->mainWindow);
1083 mw->saveDocument(document(), true, false);
1084 return;
1085 }
1086
1087 bool workingOnBackup;
1088 bool fileAlreadyExists;
1089 QString version = "000";
1090 QString newVersion;
1091 QString letter;
1092 QString path = canonicalPath();
1093 QString fileName = QFileInfo(document()->localFilePath()).fileName();
1094
1095 // First, discover if working on a backup file, or a normal file
1096 QRegularExpression regex("~(\\d{1,4})([a-z])?\\.");
1097 QRegularExpressionMatch match;
1098 workingOnBackup = fileName.contains(regex, &match);
1099
1100 if (workingOnBackup) {
1101 // Try to save incremental version (of backup), use letter for alt versions
1102 version = match.captured(1);
1103 letter = match.captured(2);
1104
1105 // Prepare the base for new version filename
1106 int intVersion = version.toInt(0);
1107 ++intVersion;
1108 QString baseNewVersion = QString::number(intVersion);
1109 QString backupFileName = document()->localFilePath();
1110 while (baseNewVersion.length() < version.length()) {
1111 baseNewVersion.prepend("0");
1112 }
1113
1114 // Check if the file exists under the new name and search until options are exhausted (test appending a to z)
1115 do {
1116 newVersion = baseNewVersion;
1117 newVersion.prepend("~");
1118 if (!letter.isNull()) newVersion.append(letter);
1119 newVersion.append(".");
1120 backupFileName.replace(regex, newVersion);
1121 fileAlreadyExists = QFile(path + '/' + backupFileName).exists();
1122 if (fileAlreadyExists) {
1123 if (!letter.isNull()) {
1124 char letterCh = letter.at(0).toLatin1();
1125 ++letterCh;
1126 letter = QString(QChar(letterCh));
1127 } else {
1128 letter = 'a';
1129 }
1130 }
1131 } while (fileAlreadyExists && letter != "{"); // x, y, z, {...
1132
1133 if (letter == "{") {
1134 QMessageBox::critical(mainWindow(), i18nc("@title:window", "Couldn't save incremental backup"), i18n("Alternative names exhausted, try manually saving with a higher number"));
1135 return;
1136 }
1137 QFile::copy(path + '/' + fileName, path + '/' + backupFileName);
1138 document()->saveAs(path + '/' + fileName, document()->mimeType(), true);
1139 }
1140 else { // if NOT working on a backup...
1141 // Navigate directory searching for latest backup version, ignore letters
1142 const quint8 HARDCODED_DIGIT_COUNT = 3;
1143 QString baseNewVersion = "000";
1144 QString backupFileName = QFileInfo(document()->localFilePath()).fileName();
1145 QRegularExpression regex2("\\.\\w{2,4}$"); // Heuristic to find file extension
1146 QRegularExpressionMatch match = regex2.match(fileName);
1147 QString extensionPlusVersion = match.captured(0);
1148 extensionPlusVersion.prepend(baseNewVersion);
1149 extensionPlusVersion.prepend("~");
1150 backupFileName.replace(regex2, extensionPlusVersion);
1151
1152 // Save version with 1 number higher than the highest version found ignoring letters
1153 do {
1154 newVersion = baseNewVersion;
1155 newVersion.prepend("~");
1156 newVersion.append(".");
1157 backupFileName.replace(regex, newVersion);
1158 fileAlreadyExists = QFile(path + '/' + backupFileName).exists();
1159 if (fileAlreadyExists) {
1160 // Prepare the base for new version filename, increment by 1
1161 int intVersion = baseNewVersion.toInt(0);
1162 ++intVersion;
1163 baseNewVersion = QString::number(intVersion);
1164 while (baseNewVersion.length() < HARDCODED_DIGIT_COUNT) {
1165 baseNewVersion.prepend("0");
1166 }
1167 }
1168 } while (fileAlreadyExists);
1169
1170 // Save both as backup and on current file for interapplication workflow
1171 document()->setFileBatchMode(true);
1172 QFile::copy(path + '/' + fileName, path + '/' + backupFileName);
1173 document()->saveAs(path + '/' + fileName, document()->mimeType(), true);
1174 document()->setFileBatchMode(false);
1175 }
1176}
QString localFilePath() const

References canonicalPath(), d, document(), KisDocument::localFilePath(), KisViewManager::KisViewManagerPrivate::mainWindow, mainWindow(), KisDocument::saveAs(), KisMainWindow::saveDocument(), and KisDocument::setFileBatchMode().

◆ slotSaveRulersTrackMouseState

void KisViewManager::slotSaveRulersTrackMouseState ( bool value)
privateslot

Definition at line 1642 of file KisViewManager.cpp.

1643{
1644 KisConfig cfg(false);
1645 cfg.setRulersTrackMouse(value);
1646}

References KisConfig::setRulersTrackMouse(), and value().

◆ slotSaveShowRulersState

void KisViewManager::slotSaveShowRulersState ( bool value)
privateslot

Definition at line 1636 of file KisViewManager.cpp.

1637{
1638 KisConfig cfg(false);
1639 cfg.setShowRulers(value);
1640}

References KisConfig::setShowRulers(), and value().

◆ slotToggleBrushOutline

void KisViewManager::slotToggleBrushOutline ( )
slot

Definition at line 1749 of file KisViewManager.cpp.

1750{
1751 KisConfig cfg(true);
1752
1753 OutlineStyle style;
1754
1755 if (cfg.newOutlineStyle() != OUTLINE_NONE) {
1756 style = OUTLINE_NONE;
1757 cfg.setLastUsedOutlineStyle(cfg.newOutlineStyle());
1758 } else {
1759 style = cfg.lastUsedOutlineStyle();
1760 cfg.setLastUsedOutlineStyle(OUTLINE_NONE);
1761 }
1762
1763 cfg.setNewOutlineStyle(style);
1764
1765 Q_EMIT brushOutlineToggled();
1766}
void brushOutlineToggled()
OutlineStyle
Definition kis_global.h:53
@ OUTLINE_NONE
Definition kis_global.h:54

References brushOutlineToggled(), KisConfig::lastUsedOutlineStyle(), KisConfig::newOutlineStyle(), OUTLINE_NONE, KisConfig::setLastUsedOutlineStyle(), and KisConfig::setNewOutlineStyle().

◆ slotToggleFgBg

void KisViewManager::slotToggleFgBg ( )
slot

NOTE: Some of color selectors do not differentiate foreground and background colors, so if one wants them to end up being set up to foreground color, it should be set the last.

Definition at line 1726 of file KisViewManager.cpp.

References KoCanvasResourceProvider::backgroundColor(), KisViewManager::KisViewManagerPrivate::canvasResourceManager, d, KoCanvasResourceProvider::foregroundColor(), KoCanvasResourceProvider::setBackgroundColor(), and KoCanvasResourceProvider::setForegroundColor().

◆ slotUpdateAuthorProfileActions

void KisViewManager::slotUpdateAuthorProfileActions ( )
slot

Definition at line 1667 of file KisViewManager.cpp.

1668{
1669 Q_ASSERT(d->actionAuthor);
1670 if (!d->actionAuthor) {
1671 return;
1672 }
1673 d->actionAuthor->clear();
1674 d->actionAuthor->addAction(i18nc("choice for author profile", "Anonymous"));
1675
1676 KConfigGroup authorGroup(KSharedConfig::openConfig(), "Author");
1677 QStringList profiles = authorGroup.readEntry("profile-names", QStringList());
1678 QString authorInfo = KoResourcePaths::getAppDataLocation() + "/authorinfo/";
1679 QStringList filters = QStringList() << "*.authorinfo";
1680 QDir dir(authorInfo);
1681 Q_FOREACH(QString entry, dir.entryList(filters)) {
1682 int ln = QString(".authorinfo").size();
1683 entry.chop(ln);
1684 if (!profiles.contains(entry)) {
1685 profiles.append(entry);
1686 }
1687 }
1688 Q_FOREACH (const QString &profile , profiles) {
1689 d->actionAuthor->addAction(profile);
1690 }
1691
1692 KConfigGroup appAuthorGroup(KSharedConfig::openConfig(), "Author");
1693 QString profileName = appAuthorGroup.readEntry("active-profile", "");
1694
1695 if (profileName == "anonymous" || profileName.isEmpty()) {
1696 d->actionAuthor->setCurrentItem(0);
1697 } else if (profiles.contains(profileName)) {
1698 d->actionAuthor->setCurrentAction(profileName);
1699 }
1700}
QList< QString > QStringList
static QString getAppDataLocation()

References KisViewManager::KisViewManagerPrivate::actionAuthor, d, and KoResourcePaths::getAppDataLocation().

◆ slotUpdatePixelGridAction

void KisViewManager::slotUpdatePixelGridAction ( )
privateslot

◆ slotViewAdded

void KisViewManager::slotViewAdded ( KisView * view)
slot

Definition at line 427 of file KisViewManager.cpp.

428{
429 // WARNING: this slot is called even when a view from another main windows is added!
430 // Don't expect \p view be a child of this view manager!
431
432 if (view->viewManager() == this && viewCount() == 0) {
434 }
435}
void showAllStatusBarItems()
int viewCount() const
KisViewManager * viewManager
Definition KisView.cpp:129

References d, KisStatusBar::showAllStatusBarItems(), KisViewManager::KisViewManagerPrivate::statusBar, viewCount(), and KisView::viewManager.

◆ slotViewRemoved

void KisViewManager::slotViewRemoved ( KisView * view)
slot

Definition at line 437 of file KisViewManager.cpp.

438{
439 // WARNING: this slot is called even when a view from another main windows is removed!
440 // Don't expect \p view be a child of this view manager!
441
442 if (view->viewManager() == this && viewCount() == 0) {
444 }
445}
void hideAllStatusBarItems()

References d, KisStatusBar::hideAllStatusBarItems(), KisViewManager::KisViewManagerPrivate::statusBar, viewCount(), and KisView::viewManager.

◆ statusBar()

KisStatusBar * KisViewManager::statusBar ( ) const

Return the wrapper class around the statusbar.

Definition at line 626 of file KisViewManager.cpp.

627{
628 return &d->statusBar;
629}

References d, and KisViewManager::KisViewManagerPrivate::statusBar.

◆ switchCanvasOnly

void KisViewManager::switchCanvasOnly ( bool toggled)
slot

Capture the initial canvas position.

Going into a fullscreen mode is a multistage process that includes making the window fullscreen. It means that it is not easy to catch a moment, when the new state is "fully established". First, it hides the dockers, then it hides the menu, then it makes the window fullscreen (hiding titlebar and "start" menu). And these actions happen in the course of dozens of milliseconds.

And since we cannot catch the moment when the new state is "fully established" we use a heuristic (read "a hack") that just pre-scrolls the canves into an expected offset. The prescroll offset is saved globally, so that when exiting the fullscreen mode we would know how big the new offset should (since we cannot get the real value of it).

Here are the list of cases when this approach fails:

1) When the fullscreen window migrates to a different screen, potentially with a different resolution (while being fullscreen)

2) When dockers or toolbars are visible, and the user resizes them while the window is fullscreen.

In both the cases the saved offset in d->canvasOnlyOffsetCompensation becomes invalid and the window jumps in an offset direction on exiting the fullscreen mode.

Restore state uses the current layout state of the window, but removal of the menu will be backed into this state after receiving of some events in the event queue. Hence we cannot apply the application of the saved state directly. We need to postpone that via the events queue.

See https://bugs.kde.org/show_bug.cgi?id=475973

Definition at line 1215 of file KisViewManager.cpp.

1216{
1217 if (toggled == d->inCanvasOnlyMode) {
1219 return;
1220 }
1221
1222 KisConfig cfg(false);
1224
1225 if(!main) {
1226 dbgUI << "Unable to switch to canvas-only mode, main window not found";
1228 return;
1229 }
1230
1231#ifdef Q_OS_ANDROID
1232 // On Android, expanded tool bars will crash when canvas-only mode is
1233 // toggled. To avoid this, we go looking for expanded toolbars and close
1234 // them instead of switching the mode and hitting a crash. Note that this
1235 // only works properly because we turn off main window animations on
1236 // Android, since that means clicking the extension button will instantly
1237 // hide the menu. With animations, the user could still trigger a crash if
1238 // they tried switching the mode while the extension animation is running.
1239 QList<QToolBar *> toolBars = main->findChildren<QToolBar *>();
1240 bool wasToolBarPopupOpen = false;
1241 for (QToolBar *toolBar : toolBars) {
1242 for (QToolButton *button : toolBar->findChildren<QToolButton *>(QStringLiteral("qt_toolbar_ext_button"))) {
1243 if (button->isChecked()) {
1244 wasToolBarPopupOpen = true;
1245 button->click();
1246 }
1247 }
1248 }
1249
1250 if(wasToolBarPopupOpen) {
1252 return;
1253 }
1254#endif
1255
1256 cfg.writeEntry("CanvasOnlyActive", toggled);
1257 d->inCanvasOnlyMode = toggled;
1259
1260 KisViewManagerPrivate::CanvasOnlyOptions options(cfg);
1261
1262 if (toggled) {
1263 d->canvasStateInNormalMode = qtMainWindow()->saveState();
1264 } else {
1265 d->canvasStateInCanvasOnlyMode = qtMainWindow()->saveState();
1266 d->canvasOnlyOptions = options;
1267 }
1268
1269 const bool toggleFullscreen = (options.hideTitlebarFullscreen && !cfg.fullscreenMode());
1270 const bool useCanvasOffsetCompensation = d->currentImageView &&
1271 d->currentImageView->canvasController() &&
1272 d->currentImageView->isMaximized() &&
1273 !main->canvasDetached();
1274
1275 if (useCanvasOffsetCompensation) {
1276 // The offset is calculated in two steps; this is the first step.
1277 if (toggled) {
1307 QPoint origin;
1308 if (toggleFullscreen) {
1309 // We're windowed, so also capture the position of the window in the screen.
1310 origin = main->geometry().topLeft() - main->screen()->geometry().topLeft();
1311 }
1313 } else {
1314 // Restore the original canvas position. The result is more stable if we pan before showing the UI elements.
1315 d->currentImageView->canvasController()->pan(- d->canvasOnlyOffsetCompensation);
1316 }
1317 }
1318
1319 if (options.hideStatusbarFullscreen) {
1320 if (main->statusBar()) {
1321 if (!toggled) {
1322 if (main->statusBar()->dynamicPropertyNames().contains("wasvisible")) {
1323 if (main->statusBar()->property("wasvisible").toBool()) {
1324 main->statusBar()->setVisible(true);
1325 }
1326 }
1327 }
1328 else {
1329 main->statusBar()->setProperty("wasvisible", main->statusBar()->isVisible());
1330 main->statusBar()->setVisible(false);
1331 }
1332 }
1333 }
1334
1335 if (options.hideDockersFullscreen) {
1336 KisAction* action = qobject_cast<KisAction*>(main->actionCollection()->action("view_toggledockers"));
1337 if (action) {
1338 action->setCheckable(true);
1339 if (toggled) {
1340 if (action->isChecked()) {
1341 cfg.setShowDockers(action->isChecked());
1342 action->setChecked(false);
1343 } else {
1344 cfg.setShowDockers(false);
1345 }
1346 } else {
1347 action->setChecked(cfg.showDockers());
1348 }
1349 }
1350 }
1351
1352 // QT in windows does not return to maximized upon 4th tab in a row
1353 // https://bugreports.qt.io/browse/QTBUG-57882, https://bugreports.qt.io/browse/QTBUG-52555, https://codereview.qt-project.org/#/c/185016/
1354 if (toggleFullscreen) {
1355 if(toggled) {
1356 main->setWindowState( main->windowState() | Qt::WindowFullScreen);
1357 } else {
1358 main->setWindowState( main->windowState() & ~Qt::WindowFullScreen);
1359 }
1360 }
1361
1362 if (options.hideMenuFullscreen) {
1363 if (!toggled) {
1364 if (main->menuBar()->dynamicPropertyNames().contains("wasvisible")) {
1365 if (main->menuBar()->property("wasvisible").toBool()) {
1366 main->menuBar()->setVisible(true);
1367 }
1368 }
1369 }
1370 else {
1371 main->menuBar()->setProperty("wasvisible", main->menuBar()->isVisible());
1372 main->menuBar()->setVisible(false);
1373 }
1374 }
1375
1376 if (options.hideToolbarFullscreen) {
1377 // We already went searching for these on Android above.
1378#ifndef Q_OS_ANDROID
1379 QList<QToolBar*> toolBars = main->findChildren<QToolBar*>();
1380#endif
1381 Q_FOREACH (QToolBar* toolbar, toolBars) {
1382 if (!toggled) {
1383 if (toolbar->dynamicPropertyNames().contains("wasvisible")) {
1384 if (toolbar->property("wasvisible").toBool()) {
1385 toolbar->setVisible(true);
1386 }
1387 }
1388 }
1389 else {
1390 toolbar->setProperty("wasvisible", toolbar->isVisible());
1391 toolbar->setVisible(false);
1392 }
1393 }
1394 }
1395
1397
1398 if (toggled) {
1399 if (!d->canvasStateInCanvasOnlyMode.isEmpty() &&
1401 *d->canvasOnlyOptions == options) {
1402
1412 QTimer::singleShot(0, this, [this] () {
1413 this->mainWindow()->restoreState(d->canvasStateInCanvasOnlyMode);
1414 });
1415 }
1416
1417 // show a fading heads-up display about the shortcut to go back
1418 showFloatingMessage(i18n("Going into Canvas-Only mode.\nPress %1 to go back.",
1419 actionCollection()->action("view_show_canvas_only")->shortcut().toString(QKeySequence::NativeText)), QIcon(),
1420 2000,
1422 }
1423 else {
1424 if (!d->canvasStateInNormalMode.isEmpty()) {
1425 main->restoreState(d->canvasStateInNormalMode);
1426 }
1427 }
1428
1429 if (useCanvasOffsetCompensation && toggled) {
1430 const KoZoomMode::Mode mode = d->currentImageView->canvasController()->zoomState().mode;
1431
1432 const bool allowedZoomMode =
1433 (mode == KoZoomMode::ZOOM_CONSTANT) ||
1434 (mode == KoZoomMode::ZOOM_HEIGHT);
1435
1436 if (allowedZoomMode) {
1437 // Defer the pan action until the layout is fully settled in (including the menu bars, etc.).
1438 QTimer::singleShot(0, this, [this] () {
1439 // Compensate by the difference of (after - before) layout.
1441 d->currentImageView->canvasController()->pan(d->canvasOnlyOffsetCompensation);
1442 });
1443 } else {
1444 // Nothing to restore.
1445 d->canvasOnlyOffsetCompensation = QPoint();
1446 }
1447 }
1448}
void updateCanvasOnlyActionState()
QMainWindow * qtMainWindow() const
@ ZOOM_CONSTANT
zoom x %
Definition KoZoomMode.h:24
@ ZOOM_HEIGHT
zoom pageheight
Definition KoZoomMode.h:27
#define dbgUI
Definition kis_debug.h:52
QString button(const QWheelEvent &ev)
int main(int argc, char **argv)
Definition main.cpp:26
QString toString(const QString &value)

References actionCollection(), button(), KisViewManager::KisViewManagerPrivate::canvasOnlyOffsetCompensation, KisViewManager::KisViewManagerPrivate::canvasOnlyOptions, KisViewManager::KisViewManagerPrivate::canvasStateInCanvasOnlyMode, KisViewManager::KisViewManagerPrivate::canvasStateInNormalMode, KisViewManager::KisViewManagerPrivate::currentImageView, d, dbgUI, KisConfig::fullscreenMode(), KisViewManager::KisViewManagerPrivate::CanvasOnlyOptions::hideDockersFullscreen, KisViewManager::KisViewManagerPrivate::CanvasOnlyOptions::hideMenuFullscreen, KisViewManager::KisViewManagerPrivate::CanvasOnlyOptions::hideStatusbarFullscreen, KisViewManager::KisViewManagerPrivate::CanvasOnlyOptions::hideTitlebarFullscreen, KisViewManager::KisViewManagerPrivate::CanvasOnlyOptions::hideToolbarFullscreen, KisViewManager::KisViewManagerPrivate::inCanvasOnlyMode, KisFloatingMessage::Low, main(), mainWindow(), qtMainWindow(), KisConfig::setShowDockers(), KisConfig::showDockers(), showFloatingMessage(), showHideScrollbars(), updateCanvasOnlyActionState(), KisConfig::writeEntry(), KoZoomMode::ZOOM_CONSTANT, and KoZoomMode::ZOOM_HEIGHT.

◆ testingInitializeOpacityToPresetResourceConverter()

void KisViewManager::testingInitializeOpacityToPresetResourceConverter ( KoCanvasResourceProvider * resourceManager)
static

◆ textPropertyManager()

KisTextPropertiesManager * KisViewManager::textPropertyManager ( ) const

Definition at line 694 of file KisViewManager.cpp.

695{
696 return &d->textPropertyManager;
697}

References d, and KisViewManager::KisViewManagerPrivate::textPropertyManager.

◆ toggleTabletLogger

void KisViewManager::toggleTabletLogger ( )
privateslot

◆ undoAdapter()

KisUndoAdapter * KisViewManager::undoAdapter ( )

The undo adapter is used to add commands to the undo stack.

Definition at line 721 of file KisViewManager.cpp.

722{
723 if (!document()) return 0;
724
726 Q_ASSERT(image);
727
728 return image->undoAdapter();
729}
KisUndoAdapter * undoAdapter() const

References document(), KisDocument::image, image(), and KisImage::undoAdapter().

◆ updateCanvasOnlyActionState()

void KisViewManager::updateCanvasOnlyActionState ( )
private

Definition at line 1450 of file KisViewManager.cpp.

1451{
1452 QAction *action = actionManager()->actionByName(QStringLiteral("view_show_canvas_only"));
1453 if (action && action->isChecked() != d->inCanvasOnlyMode) {
1454 QSignalBlocker blocker(action);
1455 action->setChecked(d->inCanvasOnlyMode);
1456 }
1457}
KisAction * actionByName(const QString &name) const

References KisActionManager::actionByName(), actionManager(), d, and KisViewManager::KisViewManagerPrivate::inCanvasOnlyMode.

◆ updateGUI

void KisViewManager::updateGUI ( )
slot

Visit all managers to update gui elements, e.g. enable / disable actions. This is heavy-duty call, so it uses a compressor.

Definition at line 854 of file KisViewManager.cpp.

References d, KisViewManager::KisViewManagerPrivate::guiUpdateCompressor, and KisSignalCompressor::start().

◆ updateIcons

void KisViewManager::updateIcons ( )
slot

Update the style of all the icons.

Definition at line 1528 of file KisViewManager.cpp.

1529{
1530 if (mainWindow()) {
1532 Q_FOREACH (QDockWidget* dock, dockers) {
1533 KoDockWidgetTitleBar* titlebar = dynamic_cast<KoDockWidgetTitleBar*>(dock->titleBarWidget());
1534 if (titlebar) {
1535 titlebar->updateIcons();
1536 }
1537 if (qobject_cast<KoToolDocker*>(dock)) {
1538 // Tool options widgets icons are updated by KoToolManager
1539 continue;
1540 }
1541 QObjectList objects;
1542 objects.append(dock);
1543 while (!objects.isEmpty()) {
1544 QObject* object = objects.takeFirst();
1545 objects.append(object->children());
1547 }
1548 }
1549 }
1550}
QList< QDockWidget * > dockWidgets() const
Return the list of dock widgets belonging to this main window.
A custom title bar for dock widgets.
void updateIconCommon(QObject *object)

References KisMainWindow::dockWidgets(), mainWindow(), KisIconUtils::updateIconCommon(), and KoDockWidgetTitleBar::updateIcons().

◆ viewChanged

void KisViewManager::viewChanged ( )
signal

viewChanged sent out when the view has changed.

◆ viewCount()

int KisViewManager::viewCount ( ) const

Definition at line 887 of file KisViewManager.cpp.

888{
889 KisMainWindow *mw = qobject_cast<KisMainWindow*>(d->mainWindow);
890 if (mw) {
891 return mw->viewCount();
892 }
893 return 0;
894}
int viewCount() const

References d, KisViewManager::KisViewManagerPrivate::mainWindow, and KisMainWindow::viewCount().

◆ zoomManager()

KisZoomManager * KisViewManager::zoomManager ( )
private

The zoommanager handles everything action-related to zooming.

Definition at line 666 of file KisViewManager.cpp.

667{
668 if (d->currentImageView) {
669 return d->currentImageView->zoomManager();
670 }
671 return 0;
672}

References KisViewManager::KisViewManagerPrivate::currentImageView, and d.

Member Data Documentation

◆ d

KisViewManagerPrivate* const KisViewManager::d
private

Definition at line 277 of file KisViewManager.h.


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