13#include <kconfiggroup.h>
14#include <ksharedconfig.h>
26 bool showImageInAllWindows{
false};
27 bool primaryWorkspaceFollowsFocus{
false};
33 KConfigGroup layoutsCfg(KSharedConfig::openConfig(),
"DisplayLayouts");
36 Q_FOREACH(QString name, groups) {
37 loadDisplayLayout(name, layoutsCfg.group(name));
45 int displayNumber = 1;
48 const QString displayDefinition = layoutCfg.readEntry(QString(
"Display%1").arg(displayNumber++), QString());
49 if (displayDefinition.isEmpty())
break;
52 const QString &resolutionStr = displayDefinition;
55 if (dimensions.size() != 2) {
56 qWarning() <<
"Invalid display definition: " << displayDefinition;
60 QSize resolution = QSize(
65 layout->displays.append(
Display{resolution});
68 layout->preferredWindowLayout = layoutCfg.readEntry(
"PreferredLayout",
"");
70 displayLayouts.append(layout);
74 KConfigGroup layoutsCfg(KSharedConfig::openConfig(),
"DisplayLayouts");
75 KConfigGroup layoutCfg = layoutsCfg.group(layout.name);
76 layoutCfg.writeEntry(
"PreferredLayout", layout.preferredWindowLayout);
82 return resolution == screen->geometry().size();
87 if (screens.size() != displays.size())
return false;
90 Q_FOREACH(
auto &expectedDisplay, displays) {
92 for (i = 0; i < screens.size(); i++) {
93 if (matchedScreens[i])
continue;
95 if (expectedDisplay.matches(screens[i])) {
96 matchedScreens[i] =
true;
101 if (i == screens.size()) {
117 d->loadDisplayLayouts();
119 connect(qobject_cast<KisApplication*>(KisApplication::instance()),
120 SIGNAL(focusChanged(QWidget*,QWidget*)),
135 bool wasEnabled =
d->showImageInAllWindows;
137 d->showImageInAllWindows = showInAll;
139 if (!wasEnabled && showInAll) {
141 if (currentMainWindow) {
155 return d->showImageInAllWindows;
160 return d->primaryWorkspaceFollowsFocus;
165 d->primaryWorkspaceFollowsFocus = enabled;
166 d->primaryWindow = primaryWindow;
171 return d->primaryWindow;
176 if (
d->showImageInAllWindows) {
178 if (window->isHidden())
continue;
180 const auto view = window->activeView();
181 if (!view || view->document() != document) {
182 window->showDocument(document);
193 KisMainWindow *newMainWindow = qobject_cast<KisMainWindow*>(now->window());
194 if (!newMainWindow)
return;
207 if (displayLayout->
matches(screens)) {
209 d->saveDisplayLayout(*displayLayout);
219 Q_FOREACH(
const DisplayLayout *displayLayout,
d->displayLayouts) {
220 if (displayLayout->
matches(screens)) {
226 layout->applyLayout();
232 Q_FOREACH(QScreen *screen, screens) {
Q_GLOBAL_STATIC(KisStoragePluginRegistry, s_instance)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QPointer< KisView > activeView
static KisPart * instance()
KisMainWindow * currentMainwindow() const
static KisResourceServerProvider * instance()
KoResourceServer< KisWindowLayoutResource > * windowLayoutServer()
QPointer< KisDocument > document
QUuid primaryWindowId() const
void setShowImageInAllWindowsEnabled(bool showInAll)
void setPrimaryWorkspaceFollowsFocus(bool enabled, QUuid primaryWindow)
~KisWindowLayoutManager()
void setLastUsedLayout(KisWindowLayoutResource *layout)
bool primaryWorkspaceFollowsFocus() const
void slotScreensChanged()
bool isShowImageInAllWindowsEnabled() const
static KisWindowLayoutManager * instance()
void slotFocusChanged(QWidget *, QWidget *)
void activeDocumentChanged(KisDocument *document)
QScopedPointer< Private > d
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...
int toInt(const QString &str, bool *ok=nullptr)
QString preferredWindowLayout
bool matches(QList< QScreen * > screens) const
bool matches(QScreen *screen) const
void saveDisplayLayout(const DisplayLayout &layout)
QVector< DisplayLayout * > displayLayouts
void loadDisplayLayouts()
void loadDisplayLayout(const QString &name, KConfigGroup layoutCfg)