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

A widget for displaying if no documents are open. This will display in the MDI area. More...

#include <KisWelcomePageWidget.h>

+ Inheritance diagram for KisWelcomePageWidget:

Public Slots

void showDropAreaIndicator (bool show)
 
void slotUpdateThemeColors ()
 

Public Member Functions

 KisWelcomePageWidget (QWidget *parent)
 
void setMainWindow (KisMainWindow *m_mainWindow)
 
 ~KisWelcomePageWidget () override
 

Protected Member Functions

void changeEvent (QEvent *event) override
 
void dragEnterEvent (QDragEnterEvent *event) override
 
void dragLeaveEvent (QDragLeaveEvent *event) override
 
void dragMoveEvent (QDragMoveEvent *event) override
 
void dropEvent (QDropEvent *event) override
 
bool eventFilter (QObject *watched, QEvent *event) override
 

Private Slots

bool isDevelopmentBuild ()
 
QFont largerFont ()
 
void recentDocumentClicked (QModelIndex index)
 
void slotNewFileClicked ()
 
void slotOpenFileClicked ()
 
void slotPaste ()
 
void slotRecentDocContextMenuRequest (const QPoint &pos)
 
void slotRecentFilesModelIsUpToDate ()
 
void slotScrollerStateChanged (QScroller::State state)
 

Private Member Functions

void setupNewsLangSelection (QMenu *newsOptionMenu)
 
void showDevVersionHighlight ()
 

Private Attributes

const QString analyticsString = "pk_campaign=startup-sceen&pk_kwd="
 
QColor backgroundColor
 
QColor blendedColor
 
QString blendedStyle
 
KisMainWindowm_mainWindow {nullptr}
 
bool m_networkIsAllowed {false}
 
QScopedPointer< RecentItemDelegaterecentItemDelegate
 
QColor textColor
 

Detailed Description

A widget for displaying if no documents are open. This will display in the MDI area.

Definition at line 37 of file KisWelcomePageWidget.h.

Constructor & Destructor Documentation

◆ KisWelcomePageWidget()

KisWelcomePageWidget::KisWelcomePageWidget ( QWidget * parent)
explicit

Definition at line 118 of file KisWelcomePageWidget.cpp.

119 : QWidget(parent)
120{
121 setupUi(this);
122
123 // URLs that go to web browser...
124 devBuildIcon->setIcon(KisIconUtils::loadIcon("warning"));
125 devBuildLabel->setVisible(false);
126 updaterFrame->setVisible(false);
127 versionNotificationLabel->setVisible(false);
128 bnVersionUpdate->setVisible(false);
129 bnErrorDetails->setVisible(false);
130
131 // Recent docs...
132 recentDocumentsListView->setDragEnabled(false);
133 recentDocumentsListView->viewport()->setAutoFillBackground(false);
134 recentDocumentsListView->setSpacing(2);
135 recentDocumentsListView->installEventFilter(this);
136 recentDocumentsListView->setViewMode(QListView::IconMode);
137 recentDocumentsListView->setSelectionMode(QAbstractItemView::NoSelection);
138
139// m_recentItemDelegate.reset(new RecentItemDelegate(this));
140// m_recentItemDelegate->setItemHeight(KisRecentDocumentsModelWrapper::ICON_SIZE_LENGTH);
141// recentDocumentsListView->setItemDelegate(m_recentItemDelegate.data());
143 recentDocumentsListView->setVerticalScrollMode(QListView::ScrollPerPixel);
144 recentDocumentsListView->verticalScrollBar()->setSingleStep(50);
145 {
146 QScroller* scroller = KisKineticScroller::createPreconfiguredScroller(recentDocumentsListView);
147 if (scroller) {
148 connect(scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChanged(QScroller::State)));
149 }
150 }
151 recentDocumentsListView->setContextMenuPolicy(Qt::CustomContextMenu);
152 connect(recentDocumentsListView, SIGNAL(customContextMenuRequested(QPoint)), SLOT(slotRecentDocContextMenuRequest(QPoint)));
153
154 // News widget...
155 QMenu *newsOptionsMenu = new QMenu(this);
156 newsOptionsMenu->setToolTipsVisible(true);
157 ShowNewsAction *showNewsAction = new ShowNewsAction(i18n("Enable news and check for new releases"), newsOptionsMenu);
158 newsOptionsMenu->addAction(showNewsAction);
159 showNewsAction->setToolTip(i18n("Show news about Krita: this needs internet to retrieve information from the krita.org website"));
160 showNewsAction->setCheckable(true);
161
162 newsOptionsMenu->addSection(i18n("Language"));
163 QAction *newsInfoAction = newsOptionsMenu->addAction(i18n("English news is always up to date."));
164 newsInfoAction->setEnabled(false);
165
166 setupNewsLangSelection(newsOptionsMenu);
167 btnNewsOptions->setMenu(newsOptionsMenu);
168
169 labelSupportText->setFont(largerFont());
170 donationLink->setFont(largerFont());
171
172 connect(showNewsAction, SIGNAL(toggled(bool)), newsWidget, SLOT(setVisible(bool)));
173 connect(showNewsAction, SIGNAL(toggled(bool)), labelNoFeed, SLOT(setHidden(bool)));
174 connect(showNewsAction, SIGNAL(toggled(bool)), newsWidget, SLOT(toggleNews(bool)));
175 connect(labelNoFeed, SIGNAL(linkActivated(QString)), showNewsAction, SLOT(enableFromLink(QString)));
176
177 labelNoFeed->setDismissable(false);
178
179#ifdef ENABLE_UPDATERS
180 connect(showNewsAction, SIGNAL(toggled(bool)), this, SLOT(slotToggleUpdateChecks(bool)));
181#endif
182
183 donationLink->hide();
184 supporterBadge->hide();
185#ifdef Q_OS_ANDROID
186 initDonations();
187#endif
188
189 // configure the News area
190 KisConfig cfg(true);
191 m_networkIsAllowed = cfg.readEntry<bool>("FetchNews", false);
192
193
194#ifdef ENABLE_UPDATERS
195#ifndef Q_OS_ANDROID
196 // Setup version updater, but do not check for them, unless the user explicitly
197 // wants to check for updates.
198 // * No updater is created for Linux/Steam, Windows/Steam and Windows/Store distributions,
199 // as those stores have their own updating mechanism.
200 // * STEAMAPPID(Windows)/SteamAppId(Linux) environment variable is set when Krita is run from Steam.
201 // The environment variables are not public API.
202 // * MS Store version runs as a package (though we cannot know if it was
203 // installed from the Store or manually with the .msix package)
204#if defined Q_OS_LINUX
205 if (!qEnvironmentVariableIsSet("SteamAppId")) { // do not create updater for linux/steam
206 if (qEnvironmentVariableIsSet("APPIMAGE")) {
207 m_versionUpdater.reset(new KisAppimageUpdater());
208 } else {
209 m_versionUpdater.reset(new KisManualUpdater());
210 }
211 }
212#elif defined Q_OS_WIN
213 if (!KisWindowsPackageUtils::isRunningInPackage() && !qEnvironmentVariableIsSet("STEAMAPPID")) {
214 m_versionUpdater.reset(new KisManualUpdater());
215 KisUsageLogger::log("Non-store package - creating updater");
216 } else {
217 KisUsageLogger::log("detected appx or steam package - not creating the updater");
218 }
219#else
220 // always create updater for MacOS
221 m_versionUpdater.reset(new KisManualUpdater());
222#endif // Q_OS_*
223 if (!m_versionUpdater.isNull()) {
224 connect(bnVersionUpdate, SIGNAL(clicked()), this, SLOT(slotRunVersionUpdate()));
225 connect(bnErrorDetails, SIGNAL(clicked()), this, SLOT(slotShowUpdaterErrorDetails()));
226 connect(m_versionUpdater.data(), SIGNAL(sigUpdateCheckStateChange(KisUpdaterStatus)),
227 this, SLOT(slotSetUpdateStatus(const KisUpdaterStatus&)));
228
229 if (m_networkIsAllowed) { // only if the user wants them
230 m_versionUpdater->checkForUpdate();
231 }
232 }
233#endif // ifndef Q_OS_ANDROID
234#endif // ENABLE_UPDATERS
235
236
237 showNewsAction->setChecked(m_networkIsAllowed);
238 newsWidget->setVisible(m_networkIsAllowed);
239 versionNotificationLabel->setEnabled(m_networkIsAllowed);
240
241 // Drop area..
242 setAcceptDrops(true);
243}
static void log(const QString &message)
Logs with date/time.
void setupNewsLangSelection(QMenu *newsOptionMenu)
void slotScrollerStateChanged(QScroller::State state)
void slotRecentDocContextMenuRequest(const QPoint &pos)
QIcon loadIcon(const QString &name)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)

References KisKineticScroller::createPreconfiguredScroller(), KisRecentDocumentsModelWrapper::ICON_SIZE_LENGTH, KisWindowsPackageUtils::isRunningInPackage(), largerFont(), KisIconUtils::loadIcon(), KisUsageLogger::log(), m_networkIsAllowed, KisConfig::readEntry(), setupNewsLangSelection(), slotRecentDocContextMenuRequest(), and slotScrollerStateChanged().

◆ ~KisWelcomePageWidget()

KisWelcomePageWidget::~KisWelcomePageWidget ( )
override

Definition at line 245 of file KisWelcomePageWidget.cpp.

246{
247}

Member Function Documentation

◆ changeEvent()

void KisWelcomePageWidget::changeEvent ( QEvent * event)
overrideprotected

Definition at line 480 of file KisWelcomePageWidget.cpp.

481{
482 if (event->type() == QEvent::FontChange) {
483 labelSupportText->setFont(largerFont());
484 donationLink->setFont(largerFont());
485 }
486}

References largerFont().

◆ dragEnterEvent()

void KisWelcomePageWidget::dragEnterEvent ( QDragEnterEvent * event)
overrideprotected

Definition at line 418 of file KisWelcomePageWidget.cpp.

419{
421 if (event->mimeData()->hasUrls() ||
422 event->mimeData()->hasFormat("application/x-krita-node-internal-pointer") ||
423 event->mimeData()->hasFormat("application/x-qt-image")) {
424 return event->accept();
425 }
426
427 return event->ignore();
428}
void showDropAreaIndicator(bool show)

References showDropAreaIndicator().

◆ dragLeaveEvent()

void KisWelcomePageWidget::dragLeaveEvent ( QDragLeaveEvent * event)
overrideprotected

◆ dragMoveEvent()

void KisWelcomePageWidget::dragMoveEvent ( QDragMoveEvent * event)
overrideprotected

Definition at line 461 of file KisWelcomePageWidget.cpp.

462{
464
465 if (event->mimeData()->hasUrls() ||
466 event->mimeData()->hasFormat("application/x-krita-node-internal-pointer") ||
467 event->mimeData()->hasFormat("application/x-qt-image")) {
468 return event->accept();
469 }
470
471 return event->ignore();
472}
void dragMoveEvent(QDragMoveEvent *event) override

References KisMainWindow::dragMoveEvent(), and m_mainWindow.

◆ dropEvent()

void KisWelcomePageWidget::dropEvent ( QDropEvent * event)
overrideprotected

Definition at line 430 of file KisWelcomePageWidget.cpp.

431{
433
434 if (event->mimeData()->hasUrls() && !event->mimeData()->urls().empty()) {
435 Q_FOREACH (const QUrl &url, event->mimeData()->urls()) {
436 if (url.toLocalFile().endsWith(".bundle", Qt::CaseInsensitive)) {
437 bool r = m_mainWindow->installBundle(url.toLocalFile());
438 if (!r) {
439 qWarning() << "Could not install bundle" << url.toLocalFile();
440 }
441 } else if (!url.isLocalFile()) {
442 QScopedPointer<QTemporaryFile> tmp(new QTemporaryFile());
443 tmp->setFileName(url.fileName());
444
445 KisRemoteFileFetcher fetcher;
446
447 if (!fetcher.fetchFile(url, tmp.data())) {
448 qWarning() << "Fetching" << url << "failed";
449 continue;
450 }
451 const auto localUrl = QUrl::fromLocalFile(tmp->fileName());
452
453 m_mainWindow->openDocument(localUrl.toLocalFile(), KisMainWindow::None);
454 } else {
456 }
457 }
458 }
459}
bool installBundle(const QString &fileName) const
Copy the given file into the bundle directory.
bool openDocument(const QString &path, OpenFlags flags)
The KisRemoteFileFetcher class can fetch a remote file and blocks until the file is downloaded.
bool fetchFile(const QUrl &remote, QIODevice *io)
fetch the image. Shows a progress dialog

References KisRemoteFileFetcher::fetchFile(), KisMainWindow::installBundle(), m_mainWindow, KisMainWindow::None, KisMainWindow::openDocument(), and showDropAreaIndicator().

◆ eventFilter()

bool KisWelcomePageWidget::eventFilter ( QObject * watched,
QEvent * event )
overrideprotected

Definition at line 488 of file KisWelcomePageWidget.cpp.

489{
490 if (watched == recentDocumentsListView && event->type() == QEvent::Leave) {
491 recentDocumentsListView->clearSelection();
492 }
493 return QWidget::eventFilter(watched, event);
494}

◆ isDevelopmentBuild

bool KisWelcomePageWidget::isDevelopmentBuild ( )
privateslot

Definition at line 647 of file KisWelcomePageWidget.cpp.

648{
650}
KRITAVERSION_EXPORT bool isDevelopersBuild()

References KritaVersionWrapper::isDevelopersBuild().

◆ largerFont

QFont KisWelcomePageWidget::largerFont ( )
privateslot

Definition at line 832 of file KisWelcomePageWidget.cpp.

833{
834 QFont larger = font();
835 // Font size may be in pixels (on Android) or points (everywhere else.)
836 qreal ratio = 1.1;
837 if (larger.pixelSize() == -1) {
838 larger.setPointSizeF(larger.pointSizeF() * ratio);
839 } else {
840 larger.setPixelSize(qRound(larger.pixelSize() * ratio));
841 }
842 return larger;
843}

◆ recentDocumentClicked

void KisWelcomePageWidget::recentDocumentClicked ( QModelIndex index)
privateslot

Definition at line 625 of file KisWelcomePageWidget.cpp.

626{
627 QString fileUrl = index.data(Qt::ToolTipRole).toString();
629}

References m_mainWindow, KisMainWindow::None, and KisMainWindow::openDocument().

◆ setMainWindow()

void KisWelcomePageWidget::setMainWindow ( KisMainWindow * m_mainWindow)

Definition at line 249 of file KisWelcomePageWidget.cpp.

250{
251 if (mainWin) {
252 m_mainWindow = mainWin;
253
254 // set the shortcut links from actions (only if a shortcut exists)
255 if ( mainWin->viewManager()->actionManager()->actionByName("file_new")->shortcut().toString() != "") {
256 newFileLinkShortcut->setText(
257 QString("(") + mainWin->viewManager()->actionManager()->actionByName("file_new")->shortcut().toString(QKeySequence::NativeText) + QString(")"));
258 }
259 if (mainWin->viewManager()->actionManager()->actionByName("file_open")->shortcut().toString() != "") {
260 openFileShortcut->setText(
261 QString("(") + mainWin->viewManager()->actionManager()->actionByName("file_open")->shortcut().toString(QKeySequence::NativeText) + QString(")"));
262 }
263 connect(recentDocumentsListView, SIGNAL(clicked(QModelIndex)), this, SLOT(recentDocumentClicked(QModelIndex)));
264 // we need the view manager to actually call actions, so don't create the connections
265 // until after the view manager is set
266 connect(newFileLink, SIGNAL(clicked(bool)), this, SLOT(slotNewFileClicked()));
267 connect(openFileLink, SIGNAL(clicked(bool)), this, SLOT(slotOpenFileClicked()));
268 connect(clearRecentFilesLink, SIGNAL(clicked(bool)), mainWin, SLOT(clearRecentFiles()));
269
270 KisAction *pasteAction = mainWin->viewManager()->actionManager()->actionByName("edit_paste");
271 connect(pasteAction, SIGNAL(triggered()), this, SLOT(slotPaste()));
272
274
275 // allows RSS news items to apply analytics tracking.
276 newsWidget->setAnalyticsTracking("?" + analyticsString);
277
279 connect(recentFilesModel, SIGNAL(sigModelIsUpToDate()), this, SLOT(slotRecentFilesModelIsUpToDate()));
280 recentDocumentsListView->setModel(&recentFilesModel->model());
282 }
283}
KisAction * actionByName(const QString &name) const
KisActionManager * actionManager
static KisRecentDocumentsModelWrapper * instance()
void recentDocumentClicked(QModelIndex index)

References KisActionManager::actionByName(), KisViewManager::actionManager(), analyticsString, KisRecentDocumentsModelWrapper::instance(), m_mainWindow, KisRecentDocumentsModelWrapper::model(), recentDocumentClicked(), slotNewFileClicked(), slotOpenFileClicked(), slotPaste(), slotRecentFilesModelIsUpToDate(), slotUpdateThemeColors(), and KisMainWindow::viewManager.

◆ setupNewsLangSelection()

void KisWelcomePageWidget::setupNewsLangSelection ( QMenu * newsOptionMenu)
private

Definition at line 523 of file KisWelcomePageWidget.cpp.

524{
525 // Hard-coded news language data:
526 // These are languages in which the news items should be regularly
527 // translated into as of 04-09-2024.
528 // The language display names should not be translated. This reflects
529 // the language selection box on the Krita website.
530 struct Lang {
531 const QString siteCode;
532 const QString name;
533 };
534 static const std::array<Lang, 22> newsLangs = {{
535 {QString("en"), QStringLiteral("English")},
536 {QString("jp"), QStringLiteral("日本語")},
537 {QString("zh"), QStringLiteral("中文 (简体)")},
538 {QString("zh-tw"), QStringLiteral("中文 (台灣正體)")},
539 {QString("zh-hk"), QStringLiteral("廣東話 (香港)")},
540 {QString("ca"), QStringLiteral("Català")},
541 {QString("ca@valencia"), QStringLiteral("Català de Valencia")},
542 {QString("cs"), QStringLiteral("Čeština")},
543 {QString("de"), QStringLiteral("Deutsch")},
544 {QString("eo"), QStringLiteral("Esperanto")},
545 {QString("es"), QStringLiteral("Español")},
546 {QString("eu"), QStringLiteral("Euskara")},
547 {QString("fr"), QStringLiteral("Français")},
548 {QString("it"), QStringLiteral("Italiano")},
549 {QString("lt"), QStringLiteral("lietuvių")},
550 {QString("nl"), QStringLiteral("Nederlands")},
551 {QString("pt"), QStringLiteral("Português")},
552 {QString("sk"), QStringLiteral("Slovenský")},
553 {QString("sl"), QStringLiteral("Slovenski")},
554 {QString("sv"), QStringLiteral("Svenska")},
555 {QString("tr"), QStringLiteral("Türkçe")},
556 {QString("uk"), QStringLiteral("Українська")}
557 }};
558
559 static const QString newsLangConfigName = QStringLiteral("FetchNewsLanguages");
560
561 QSharedPointer<QSet<QString>> enabledNewsLangs = QSharedPointer<QSet<QString>>::create();
562 {
563 // Initialize with the config.
564 KisConfig cfg(true);
565 auto languagesList = cfg.readList<QString>(newsLangConfigName);
566 *enabledNewsLangs = QSet(languagesList.begin(), languagesList.end());
567 }
568
569 // If no languages are selected in the config, use the automatic selection.
570 if (enabledNewsLangs->isEmpty()) {
571 enabledNewsLangs->insert(QString(getAutoNewsLang()));
572 }
573
574 for (const auto &lang : newsLangs) {
575 QAction *langItem = newsOptionsMenu->addAction(lang.name);
576 langItem->setCheckable(true);
577 // We can copy `code` into the lambda because its backing string is a
578 // static string literal.
579 const QString code = lang.siteCode;
580 connect(langItem, &QAction::toggled, newsWidget, [=](bool checked) {
581 newsWidget->toggleNewsLanguage(code, checked);
582 });
583
584 // Set the initial checked state.
585 if (enabledNewsLangs->contains(code)) {
586 langItem->setChecked(true);
587 }
588
589 // Connect this lambda after setting the initial checked state because
590 // we don't want to overwrite the config when doing the initial setup.
591 connect(langItem, &QAction::toggled, [=](bool checked) {
592 KisConfig cfg(false);
593 // It is safe to modify `enabledNewsLangs` here, because the slots
594 // are called synchronously on the UI thread so there is no need
595 // for explicit synchronization.
596 if (checked) {
597 enabledNewsLangs->insert(QString(code));
598 } else {
599 enabledNewsLangs->remove(QString(code));
600 }
601 cfg.writeList(newsLangConfigName, enabledNewsLangs->values());
602 });
603 }
604}
const char * name(StandardAction id)

References KisConfig::readList(), and KisConfig::writeList().

◆ showDevVersionHighlight()

void KisWelcomePageWidget::showDevVersionHighlight ( )
private

Definition at line 606 of file KisWelcomePageWidget.cpp.

607{
608 // always flag development version
609 if (isDevelopmentBuild()) {
610 QString devBuildLabelText = QString("<a style=\"color: " +
611 blendedColor.name() +
612 " \" href=\"https://docs.krita.org/en/untranslatable_pages/triaging_bugs.html?"
613 + analyticsString + "dev-build" + "\">")
614 .append(i18n("DEV BUILD")).append("</a>");
615
616 devBuildLabel->setText(devBuildLabelText);
617 devBuildIcon->setVisible(true);
618 devBuildLabel->setVisible(true);
619 } else {
620 devBuildIcon->setVisible(false);
621 devBuildLabel->setVisible(false);
622 }
623}

References analyticsString, blendedColor, and isDevelopmentBuild().

◆ showDropAreaIndicator

void KisWelcomePageWidget::showDropAreaIndicator ( bool show)
slot

if a document is placed over this area, a dotted line will appear as an indicator that it is a droppable area. KisMainwindow is what triggers this

Definition at line 286 of file KisWelcomePageWidget.cpp.

287{
288 if (!show) {
289 QString dropFrameStyle = QStringLiteral("QFrame#dropAreaIndicator { border: 2px solid transparent }");
290 dropFrameBorder->setStyleSheet(dropFrameStyle);
291 } else {
292 QColor textColor = qApp->palette().color(QPalette::Text);
293 QColor backgroundColor = qApp->palette().color(QPalette::Window);
295
296 // QColor.name() turns it into a hex/web format
297 QString dropFrameStyle = QString("QFrame#dropAreaIndicator { border: 2px dotted ").append(blendedColor.name()).append(" }") ;
298 dropFrameBorder->setStyleSheet(dropFrameStyle);
299 }
300}
QColor blendColors(const QColor &c1, const QColor &c2, qreal r1)

References backgroundColor, KisPaintingTweaks::blendColors(), blendedColor, and textColor.

◆ slotNewFileClicked

void KisWelcomePageWidget::slotNewFileClicked ( )
privateslot

Definition at line 652 of file KisWelcomePageWidget.cpp.

653{
655}

References m_mainWindow, and KisMainWindow::slotFileNew().

◆ slotOpenFileClicked

void KisWelcomePageWidget::slotOpenFileClicked ( )
privateslot

Definition at line 657 of file KisWelcomePageWidget.cpp.

658{
660}
void slotFileOpen(bool isImporting=false)

References m_mainWindow, and KisMainWindow::slotFileOpen().

◆ slotPaste

void KisWelcomePageWidget::slotPaste ( )
privateslot

Definition at line 662 of file KisWelcomePageWidget.cpp.

663{
664 if (!this->isVisible())
665 return;
666
667 // Don't do anything if there's no image in the clipboard
668 if (!KisClipboard::instance()->hasImage())
669 return;
670
672
674 dlg->exec();
675 dlg->deleteLater();
676}
static KisClipboard * instance()

References KisDlgCreateNewDocument::CreateFromClipboard, KisClipboard::instance(), and KisDlgCreateNewDocument::SelectPage().

◆ slotRecentDocContextMenuRequest

void KisWelcomePageWidget::slotRecentDocContextMenuRequest ( const QPoint & pos)
privateslot

Definition at line 631 of file KisWelcomePageWidget.cpp.

632{
633 QMenu contextMenu;
634 QModelIndex index = recentDocumentsListView->indexAt(pos);
635 QAction *actionForget = 0;
636 if (index.isValid()) {
637 actionForget = new QAction(i18n("Forget \"%1\"", index.data(Qt::DisplayRole).toString()), &contextMenu);
638 contextMenu.addAction(actionForget);
639 }
640 QAction *triggered = contextMenu.exec(recentDocumentsListView->mapToGlobal(pos));
641
642 if (index.isValid() && triggered == actionForget) {
643 m_mainWindow->removeRecentFile(index.data(Qt::ToolTipRole).toString());
644 }
645}
void removeRecentFile(QString url)

References m_mainWindow, and KisMainWindow::removeRecentFile().

◆ slotRecentFilesModelIsUpToDate

void KisWelcomePageWidget::slotRecentFilesModelIsUpToDate ( )
privateslot

Once all files in the recent documents model are checked, cleanup the UI if the model is empty

Definition at line 678 of file KisWelcomePageWidget.cpp.

679{
681 const bool modelIsEmpty = recentFilesModel->model().rowCount() == 0;
682
683 if (modelIsEmpty) {
684 recentDocsStackedWidget->setCurrentWidget(labelNoRecentDocs);
685 } else {
686 recentDocsStackedWidget->setCurrentWidget(recentDocumentsListView);
687 }
688 clearRecentFilesLink->setVisible(!modelIsEmpty);
689}

References KisRecentDocumentsModelWrapper::instance(), and KisRecentDocumentsModelWrapper::model().

◆ slotScrollerStateChanged

void KisWelcomePageWidget::slotScrollerStateChanged ( QScroller::State state)
inlineprivateslot

Definition at line 72 of file KisWelcomePageWidget.h.

KRITAWIDGETUTILS_EXPORT void updateCursor(QWidget *source, QScroller::State state)

References KisKineticScroller::updateCursor().

◆ slotUpdateThemeColors

void KisWelcomePageWidget::slotUpdateThemeColors ( )
slot

Definition at line 302 of file KisWelcomePageWidget.cpp.

303{
304 textColor = qApp->palette().color(QPalette::Text);
305 backgroundColor = qApp->palette().color(QPalette::Window);
306
307 // make the welcome screen labels a subtle color so it doesn't clash with the main UI elements
309 // only apply color to the widget itself, not to the tooltip or something
310 blendedStyle = "QWidget{color: " + blendedColor.name() + "}";
311
312 // what labels to change the color...
313 startTitleLabel->setStyleSheet(blendedStyle);
314 recentDocumentsLabel->setStyleSheet(blendedStyle);
315 helpTitleLabel->setStyleSheet(blendedStyle);
316 newsTitleLabel->setStyleSheet(blendedStyle);
317 newFileLinkShortcut->setStyleSheet(blendedStyle);
318 openFileShortcut->setStyleSheet(blendedStyle);
319 clearRecentFilesLink->setStyleSheet(blendedStyle);
320 recentDocumentsListView->setStyleSheet(blendedStyle);
321 newsWidget->setStyleSheet(blendedStyle);
322
323#ifdef Q_OS_ANDROID
324 blendedStyle = blendedStyle + "\nQPushButton { padding: 10px }";
325#endif
326
327 newFileLink->setStyleSheet(blendedStyle);
328 openFileLink->setStyleSheet(blendedStyle);
329
330 // make drop area QFrame have a dotted line
331 dropFrameBorder->setObjectName("dropAreaIndicator");
332 QString dropFrameStyle = QString("QFrame#dropAreaIndicator { border: 4px dotted ").append(blendedColor.name()).append("}");
333 dropFrameBorder->setStyleSheet(dropFrameStyle);
334
335 // only show drop area when we have a document over the empty area
337
338 // add icons for new and open settings to make them stand out a bit more
339 openFileLink->setIconSize(QSize(48, 48));
340 newFileLink->setIconSize(QSize(48, 48));
341
342 openFileLink->setIcon(KisIconUtils::loadIcon("document-open"));
343 newFileLink->setIcon(KisIconUtils::loadIcon("document-new"));
344
345 btnNewsOptions->setIcon(KisIconUtils::loadIcon("view-choose"));
346 btnNewsOptions->setFlat(true);
347
348 supportKritaIcon->setIcon(KisIconUtils::loadIcon(QStringLiteral("support-krita")));
349 const QIcon &linkIcon = KisIconUtils::loadIcon(QStringLiteral("bookmarks"));
350 userManualIcon->setIcon(linkIcon);
351 gettingStartedIcon->setIcon(linkIcon);
352 userCommunityIcon->setIcon(linkIcon);
353 kritaWebsiteIcon->setIcon(linkIcon);
354 sourceCodeIcon->setIcon(linkIcon);
355
356 kdeIcon->setIcon(KisIconUtils::loadIcon(QStringLiteral("kde")));
357
358 // HTML links seem to be a bit more stubborn with theme changes... setting inline styles to help with color change
359 userCommunityLink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://krita-artists.org\">")
360 .append(i18n("User Community")).append("</a>"));
361
362 gettingStartedLink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://docs.krita.org/user_manual/getting_started.html\">")
363 .append(i18n("Getting Started")).append("</a>"));
364
365 manualLink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://docs.krita.org\">")
366 .append(i18n("User Manual")).append("</a>"));
367
368 supportKritaLink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://krita.org/support-us/donations?" + analyticsString + "donations" + "\">")
369 .append(i18n("Support Krita")).append("</a>"));
370
371 kritaWebsiteLink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://www.krita.org?" + analyticsString + "marketing-site" + "\">")
372 .append(i18n("Krita Website")).append("</a>"));
373
374 sourceCodeLink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://invent.kde.org/graphics/krita\">")
375 .append(i18n("Source Code")).append("</a>"));
376
377 poweredByKDELink->setText(QString("<a style=\"color: " + blendedColor.name() + " \" href=\"https://userbase.kde.org/What_is_KDE\">")
378 .append(i18n("Powered by KDE")).append("</a>"));
379
380 QString translationNoFeed = i18n("You can <a href=\"ignored\" style=\"color: COLOR_PLACEHOLDER; text-decoration: underline;\">enable news</a> from krita.org in various languages with the menu above");
381 labelNoFeed->setText(translationNoFeed.replace("COLOR_PLACEHOLDER", blendedColor.name()));
382
383 const QColor faintTextColor = KisPaintingTweaks::blendColors(textColor, backgroundColor, 0.4);
384 const QString &faintTextStyle = "QWidget{color: " + faintTextColor.name() + "}";
385 labelNoRecentDocs->setStyleSheet(faintTextStyle);
386 labelNoFeed->setStyleSheet(faintTextStyle);
387
388 const QColor frameColor = KisPaintingTweaks::blendColors(textColor, backgroundColor, 0.1);
389 const QString &frameQss = "{border: 1px solid " + frameColor.name() + "}";
390 recentDocsStackedWidget->setStyleSheet("QStackedWidget#recentDocsStackedWidget" + frameQss);
391 newsFrame->setStyleSheet("QFrame#newsFrame" + frameQss);
392
393 // show the dev version labels, if dev version is detected
395
396#ifdef ENABLE_UPDATERS
397 updateVersionUpdaterFrame(); // updater frame
398#endif
399
400#ifdef Q_OS_ANDROID
401 donationLink->setText(
402 QStringLiteral("<a href=\"#\">%1</a>").arg(QString(i18n("Get your Krita Supporter Badge here!"))));
403#endif
404
405#ifdef Q_OS_MACOS
406 // macOS store version should not contain external links containing donation buttons or forms
407 if (KisMacosEntitlements().sandbox()) {
408 supportKritaLink->hide();
409 supportKritaIcon->hide();
410 labelSupportText->hide();
411 kritaWebsiteLink->hide();
412 kritaWebsiteIcon->hide();
413 donationLink->hide();
414 }
415#endif
416}

References analyticsString, backgroundColor, KisPaintingTweaks::blendColors(), blendedColor, blendedStyle, KisIconUtils::loadIcon(), showDevVersionHighlight(), showDropAreaIndicator(), and textColor.

Member Data Documentation

◆ analyticsString

const QString KisWelcomePageWidget::analyticsString = "pk_campaign=startup-sceen&pk_kwd="
private

help us see how many people are clicking startup screen links you can see the results in Matomo (stats.kde.org) this will be listed in the "Acquisition" section of Matomo just append some text to this to associate it with an event/page

Definition at line 117 of file KisWelcomePageWidget.h.

◆ backgroundColor

QColor KisWelcomePageWidget::backgroundColor
private

Definition at line 122 of file KisWelcomePageWidget.h.

◆ blendedColor

QColor KisWelcomePageWidget::blendedColor
private

Definition at line 123 of file KisWelcomePageWidget.h.

◆ blendedStyle

QString KisWelcomePageWidget::blendedStyle
private

Definition at line 124 of file KisWelcomePageWidget.h.

◆ m_mainWindow

KisMainWindow* KisWelcomePageWidget::m_mainWindow {nullptr}
private

Definition at line 111 of file KisWelcomePageWidget.h.

111{nullptr};

◆ m_networkIsAllowed

bool KisWelcomePageWidget::m_networkIsAllowed {false}
private

Definition at line 130 of file KisWelcomePageWidget.h.

130{false};

◆ recentItemDelegate

QScopedPointer<RecentItemDelegate> KisWelcomePageWidget::recentItemDelegate
private

Definition at line 132 of file KisWelcomePageWidget.h.

◆ textColor

QColor KisWelcomePageWidget::textColor
private

Definition at line 121 of file KisWelcomePageWidget.h.


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