From 196aee97b15234e45e4b4c64d61b479dc013f1c7 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 29 Nov 2021 20:48:43 +0100 Subject: [PATCH] Welcome: Unify design with Qt Design Studio This applies the design of the new Welcome Screen for the Qt Design Studio to the Welcome Screen of Qt Creator. Change-Id: Id63283da1db43ac1036d371694cc2ea4a6de8d8c Reviewed-by: Eike Ziller --- share/qtcreator/themes/dark.creatortheme | 12 +- share/qtcreator/themes/default.creatortheme | 14 +- .../themes/design-light.creatortheme | 14 +- share/qtcreator/themes/design.creatortheme | 12 +- share/qtcreator/themes/flat-dark.creatortheme | 10 +- .../qtcreator/themes/flat-light.creatortheme | 14 +- share/qtcreator/themes/flat.creatortheme | 12 +- src/libs/utils/theme/theme.h | 8 +- src/plugins/coreplugin/CMakeLists.txt | 14 + src/plugins/coreplugin/coreplugin.qbs | 6 + src/plugins/coreplugin/iwelcomepage.cpp | 59 +-- src/plugins/coreplugin/iwelcomepage.h | 8 +- src/plugins/coreplugin/welcomepagehelper.cpp | 253 +++++++----- src/plugins/coreplugin/welcomepagehelper.h | 30 +- src/plugins/marketplace/productlistmodel.cpp | 6 +- .../marketplace/qtmarketplacewelcomepage.cpp | 18 +- .../projectexplorer/projectwelcomepage.cpp | 172 ++++---- .../qtsupport/gettingstartedwelcomepage.cpp | 39 +- .../qtsupport/images/icons/qteventicon.png | Bin 3210 -> 3403 bytes .../qtsupport/images/icons/qteventicon@2x.png | Bin 6527 -> 7047 bytes .../qtsupport/images/icons/tutorialicon.png | Bin 5498 -> 5476 bytes .../images/icons/tutorialicon@2x.png | Bin 11861 -> 11766 bytes .../images/icons/videotutorialicon.png | Bin 4062 -> 4131 bytes .../images/icons/videotutorialicon@2x.png | Bin 8552 -> 8810 bytes src/plugins/welcome/images/blogs.png | Bin 252 -> 0 bytes src/plugins/welcome/images/blogs@2x.png | Bin 458 -> 0 bytes src/plugins/welcome/images/community.png | Bin 116 -> 0 bytes src/plugins/welcome/images/community@2x.png | Bin 167 -> 0 bytes src/plugins/welcome/images/download.png | Bin 197 -> 0 bytes src/plugins/welcome/images/download@2x.png | Bin 264 -> 0 bytes src/plugins/welcome/images/new.png | Bin 92 -> 0 bytes src/plugins/welcome/images/new@2x.png | Bin 95 -> 0 bytes src/plugins/welcome/images/open.png | Bin 127 -> 0 bytes src/plugins/welcome/images/open@2x.png | Bin 182 -> 0 bytes src/plugins/welcome/images/qtaccount.png | Bin 177 -> 0 bytes src/plugins/welcome/images/qtaccount@2x.png | Bin 300 -> 0 bytes src/plugins/welcome/images/settings.png | Bin 216 -> 0 bytes src/plugins/welcome/images/settings@2x.png | Bin 418 -> 0 bytes src/plugins/welcome/images/userguide.png | Bin 235 -> 0 bytes src/plugins/welcome/images/userguide@2x.png | Bin 457 -> 0 bytes src/plugins/welcome/welcome.qrc | 16 - src/plugins/welcome/welcomeplugin.cpp | 368 ++++++++++-------- src/tools/icons/qtcreatoricons.svg | 205 +--------- 43 files changed, 626 insertions(+), 664 deletions(-) delete mode 100644 src/plugins/welcome/images/blogs.png delete mode 100644 src/plugins/welcome/images/blogs@2x.png delete mode 100644 src/plugins/welcome/images/community.png delete mode 100644 src/plugins/welcome/images/community@2x.png delete mode 100644 src/plugins/welcome/images/download.png delete mode 100644 src/plugins/welcome/images/download@2x.png delete mode 100644 src/plugins/welcome/images/new.png delete mode 100644 src/plugins/welcome/images/new@2x.png delete mode 100644 src/plugins/welcome/images/open.png delete mode 100644 src/plugins/welcome/images/open@2x.png delete mode 100644 src/plugins/welcome/images/qtaccount.png delete mode 100644 src/plugins/welcome/images/qtaccount@2x.png delete mode 100644 src/plugins/welcome/images/settings.png delete mode 100644 src/plugins/welcome/images/settings@2x.png delete mode 100644 src/plugins/welcome/images/userguide.png delete mode 100644 src/plugins/welcome/images/userguide@2x.png diff --git a/share/qtcreator/themes/dark.creatortheme b/share/qtcreator/themes/dark.creatortheme index 24148a425a6..ea9b911b267 100644 --- a/share/qtcreator/themes/dark.creatortheme +++ b/share/qtcreator/themes/dark.creatortheme @@ -303,13 +303,13 @@ Debugger_WatchItem_ValueChanged=ffff6666 Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=text -Welcome_ForegroundPrimaryColor=ff999999 +Welcome_ForegroundPrimaryColor=ffa3a3a3 Welcome_ForegroundSecondaryColor=ff808080 -Welcome_BackgroundColor=normalBackground -Welcome_ButtonBackgroundColor=normalBackground -Welcome_DividerColor=ff555555 -Welcome_HoverColor=ff444444 -Welcome_LinkColor=ff78bb39 +Welcome_BackgroundPrimaryColor=normalBackground +Welcome_BackgroundSecondaryColor=shadowBackground +Welcome_HoverColor=ff404040 +Welcome_AccentColor=ff57d658 +Welcome_LinkColor=ff67e668 Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=text diff --git a/share/qtcreator/themes/default.creatortheme b/share/qtcreator/themes/default.creatortheme index 1fe39754d33..5a225fd7f68 100644 --- a/share/qtcreator/themes/default.creatortheme +++ b/share/qtcreator/themes/default.creatortheme @@ -293,13 +293,13 @@ Debugger_WatchItem_ValueChanged=ffc80000 Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=ff000000 -Welcome_ForegroundPrimaryColor=ff555759 -Welcome_ForegroundSecondaryColor=ff727476 -Welcome_BackgroundColor=fff8f8f8 -Welcome_ButtonBackgroundColor=ffdfdfdf -Welcome_DividerColor=ffd6d6d6 -Welcome_HoverColor=ffe8e8e8 -Welcome_LinkColor=ff5caa15 +Welcome_ForegroundPrimaryColor=shadowBackground +Welcome_ForegroundSecondaryColor=ff939393 +Welcome_BackgroundPrimaryColor=fffafafa +Welcome_BackgroundSecondaryColor=ffffffff +Welcome_HoverColor=ffefefef +Welcome_AccentColor=ff45ce55 +Welcome_LinkColor=ff20a020 Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=darkText diff --git a/share/qtcreator/themes/design-light.creatortheme b/share/qtcreator/themes/design-light.creatortheme index 828034cf46c..4ce143baa31 100644 --- a/share/qtcreator/themes/design-light.creatortheme +++ b/share/qtcreator/themes/design-light.creatortheme @@ -308,13 +308,13 @@ Debugger_WatchItem_ValueChanged=ffbf0303 Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=ff000000 -Welcome_ForegroundPrimaryColor=ff404244 -Welcome_ForegroundSecondaryColor=ff727476 -Welcome_BackgroundColor=normalBackground -Welcome_ButtonBackgroundColor=normalBackground -Welcome_DividerColor=ffd6d6d6 -Welcome_HoverColor=fff6f6f6 -Welcome_LinkColor=ff5caa15 +Welcome_ForegroundPrimaryColor=ff404040 +Welcome_ForegroundSecondaryColor=ff727272 +Welcome_BackgroundPrimaryColor=ffeaeaea +Welcome_BackgroundSecondaryColor=ffefefef +Welcome_HoverColor=ffe1e1e1 +Welcome_AccentColor=ff25709a +Welcome_LinkColor=ff104090 Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=text diff --git a/share/qtcreator/themes/design.creatortheme b/share/qtcreator/themes/design.creatortheme index eeed389e365..e61f1ad3f66 100644 --- a/share/qtcreator/themes/design.creatortheme +++ b/share/qtcreator/themes/design.creatortheme @@ -305,13 +305,13 @@ Debugger_WatchItem_ValueChanged=ffff6666 Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=text -Welcome_ForegroundPrimaryColor=ff999999 +Welcome_ForegroundPrimaryColor=ffa3a3a3 Welcome_ForegroundSecondaryColor=ff808080 -Welcome_BackgroundColor=normalBackground -Welcome_ButtonBackgroundColor=normalBackground -Welcome_DividerColor=ff555555 -Welcome_HoverColor=ff444444 -Welcome_LinkColor=ff7fc63c +Welcome_BackgroundPrimaryColor=ff242424 +Welcome_BackgroundSecondaryColor=ff1c1c1c +Welcome_HoverColor=ff2b2a2a +Welcome_AccentColor=ff3f8ccc +Welcome_LinkColor=ff5fafef Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=text diff --git a/share/qtcreator/themes/flat-dark.creatortheme b/share/qtcreator/themes/flat-dark.creatortheme index 9b4a1fedeed..b0005b478cb 100644 --- a/share/qtcreator/themes/flat-dark.creatortheme +++ b/share/qtcreator/themes/flat-dark.creatortheme @@ -309,11 +309,11 @@ Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=text Welcome_ForegroundPrimaryColor=ff999999 Welcome_ForegroundSecondaryColor=ff808080 -Welcome_BackgroundColor=normalBackground -Welcome_ButtonBackgroundColor=normalBackground -Welcome_DividerColor=ff555555 -Welcome_HoverColor=ff444444 -Welcome_LinkColor=ff7fc63c +Welcome_BackgroundPrimaryColor=normalBackground +Welcome_BackgroundSecondaryColor=ff242628 +Welcome_HoverColor=ff404243 +Welcome_AccentColor=ff36c148 +Welcome_LinkColor=ff5fcf4f Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=text diff --git a/share/qtcreator/themes/flat-light.creatortheme b/share/qtcreator/themes/flat-light.creatortheme index f5a80b2c97a..b160dbe4397 100644 --- a/share/qtcreator/themes/flat-light.creatortheme +++ b/share/qtcreator/themes/flat-light.creatortheme @@ -303,13 +303,13 @@ Debugger_WatchItem_ValueChanged=ffbf0303 Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=ff000000 -Welcome_ForegroundPrimaryColor=ff404244 -Welcome_ForegroundSecondaryColor=ff727476 -Welcome_BackgroundColor=normalBackground -Welcome_ButtonBackgroundColor=normalBackground -Welcome_DividerColor=ffd6d6d6 -Welcome_HoverColor=fff6f6f6 -Welcome_LinkColor=ff5caa15 +Welcome_ForegroundPrimaryColor=ff232323 +Welcome_ForegroundSecondaryColor=ff939393 +Welcome_BackgroundPrimaryColor=fffafafa +Welcome_BackgroundSecondaryColor=ffffffff +Welcome_HoverColor=ffefefef +Welcome_AccentColor=ff45ce55 +Welcome_LinkColor=ff20a020 Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=text diff --git a/share/qtcreator/themes/flat.creatortheme b/share/qtcreator/themes/flat.creatortheme index 59c21dd705a..277b6da113a 100644 --- a/share/qtcreator/themes/flat.creatortheme +++ b/share/qtcreator/themes/flat.creatortheme @@ -302,12 +302,12 @@ Debugger_Breakpoint_TextMarkColor=ffff4040 Welcome_TextColor=ff000000 Welcome_ForegroundPrimaryColor=shadowBackground -Welcome_ForegroundSecondaryColor=ff727476 -Welcome_BackgroundColor=normalBackground -Welcome_ButtonBackgroundColor=normalBackground -Welcome_DividerColor=ffd6d6d6 -Welcome_HoverColor=fff6f6f6 -Welcome_LinkColor=ff5caa15 +Welcome_ForegroundSecondaryColor=ff939393 +Welcome_BackgroundPrimaryColor=fffafafa +Welcome_BackgroundSecondaryColor=ffffffff +Welcome_HoverColor=ffefefef +Welcome_AccentColor=ff45ce55 +Welcome_LinkColor=ff20a020 Welcome_DisabledLinkColor=textDisabled Timeline_TextColor=text diff --git a/src/libs/utils/theme/theme.h b/src/libs/utils/theme/theme.h index 460162c2e4d..fb41d3b1964 100644 --- a/src/libs/utils/theme/theme.h +++ b/src/libs/utils/theme/theme.h @@ -249,11 +249,11 @@ public: Welcome_TextColor, Welcome_ForegroundPrimaryColor, Welcome_ForegroundSecondaryColor, - Welcome_BackgroundColor, - Welcome_ButtonBackgroundColor, - Welcome_DividerColor, - Welcome_LinkColor, + Welcome_BackgroundPrimaryColor, + Welcome_BackgroundSecondaryColor, Welcome_HoverColor, + Welcome_AccentColor, + Welcome_LinkColor, Welcome_DisabledLinkColor, /* Timeline Library */ diff --git a/src/plugins/coreplugin/CMakeLists.txt b/src/plugins/coreplugin/CMakeLists.txt index 9f88488c29d..8acbfdd8a2e 100644 --- a/src/plugins/coreplugin/CMakeLists.txt +++ b/src/plugins/coreplugin/CMakeLists.txt @@ -205,5 +205,19 @@ if ((NOT WIN32) AND (NOT APPLE)) endforeach() endif() +set(FONTS_BASE "${QtCreator_SOURCE_DIR}/src/share/3rdparty/studiofonts/") +if(${Qt5_VERSION} VERSION_LESS "6") +extend_qtc_plugin(Core + SOURCES "${FONTS_BASE}/studiofonts.qrc" +) +else() # < Qt 6 +qt_add_resources(Core + CoreWelcomeScreenFonts_rcc + BASE ${FONTS_BASE} + PREFIX "studiofonts" + FILES "${FONTS_BASE}/TitilliumWeb-Regular.ttf" +) +endif() + # transitional qmake plugin build support qtc_add_public_header(coreplugin_dependencies.pri) diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index cb8cb2977f9..51e82ee2c1e 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -178,6 +178,12 @@ Project { ] } + Group { + name: "studiofonts" + prefix: "../../share/3rdparty/studiofonts/" + files: "studiofonts.qrc" + } + Group { name: "Action Manager" prefix: "actionmanager/" diff --git a/src/plugins/coreplugin/iwelcomepage.cpp b/src/plugins/coreplugin/iwelcomepage.cpp index 735444c967e..89c13f993c7 100644 --- a/src/plugins/coreplugin/iwelcomepage.cpp +++ b/src/plugins/coreplugin/iwelcomepage.cpp @@ -26,6 +26,7 @@ #include "iwelcomepage.h" #include "icore.h" +#include "welcomepagehelper.h" #include #include @@ -33,13 +34,18 @@ #include #include #include +#include #include #include +#include + using namespace Utils; namespace Core { +const char WITHACCENTCOLOR_PROPERTY_NAME[] = "_withAccentColor"; + static QList g_welcomePages; const QList IWelcomePage::allWelcomePages() @@ -64,10 +70,10 @@ QPalette WelcomePageFrame::buttonPalette(bool isActive, bool isCursorInside, boo if (isActive) { if (forText) { pal.setColor(QPalette::Window, theme->color(Theme::Welcome_ForegroundPrimaryColor)); - pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_BackgroundColor)); + pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_BackgroundPrimaryColor)); } else { - pal.setColor(QPalette::Window, theme->color(Theme::Welcome_ForegroundPrimaryColor)); - pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_ForegroundPrimaryColor)); + pal.setColor(QPalette::Window, theme->color(Theme::Welcome_AccentColor)); + pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_AccentColor)); } } else { if (isCursorInside) { @@ -83,7 +89,7 @@ QPalette WelcomePageFrame::buttonPalette(bool isActive, bool isCursorInside, boo pal.setColor(QPalette::Window, theme->color(Theme::Welcome_ForegroundPrimaryColor)); pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_TextColor)); } else { - pal.setColor(QPalette::Window, theme->color(Theme::Welcome_BackgroundColor)); + pal.setColor(QPalette::Window, theme->color(Theme::Welcome_BackgroundPrimaryColor)); pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_ForegroundSecondaryColor)); } } @@ -100,27 +106,28 @@ WelcomePageFrame::WelcomePageFrame(QWidget *parent) void WelcomePageFrame::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); - - const QRectF adjustedRect(QRectF(rect()).adjusted(0.5, 0.5, -0.5, -0.5)); - QPen pen(palette().color(QPalette::WindowText)); - pen.setJoinStyle(Qt::MiterJoin); - QPainter p(this); - p.setPen(pen); - p.drawRect(adjustedRect); + + qDrawPlainRect(&p, rect(), palette().color(QPalette::WindowText), 1); + + if (property(WITHACCENTCOLOR_PROPERTY_NAME).toBool()) { + const int accentRectWidth = 10; + const QRect accentRect = rect().adjusted(width() - accentRectWidth, 0, 0, 0); + p.fillRect(accentRect, creatorTheme()->color(Theme::Welcome_AccentColor)); + } } class WelcomePageButtonPrivate { public: - WelcomePageButtonPrivate(WelcomePageButton *parent) : q(parent) {} + explicit WelcomePageButtonPrivate(WelcomePageButton *parent) + : q(parent) {} bool isActive() const; void doUpdate(bool cursorInside); WelcomePageButton *q; QHBoxLayout *m_layout = nullptr; QLabel *m_label = nullptr; - QLabel *m_icon = nullptr; std::function onClicked; std::function activeChecker; @@ -131,17 +138,16 @@ WelcomePageButton::WelcomePageButton(QWidget *parent) { setAutoFillBackground(true); setPalette(buttonPalette(false, false, false)); + setContentsMargins(0, 1, 0, 1); - QFont f = font(); - f.setPixelSize(15); d->m_label = new QLabel(this); - d->m_label->setFont(f); d->m_label->setPalette(buttonPalette(false, false, true)); + d->m_label->setAlignment(Qt::AlignCenter); d->m_layout = new QHBoxLayout; - d->m_layout->setContentsMargins(13, 5, 20, 5); d->m_layout->setSpacing(0); d->m_layout->addWidget(d->m_label); + setSize(SizeLarge); setLayout(d->m_layout); } @@ -177,8 +183,6 @@ void WelcomePageButtonPrivate::doUpdate(bool cursorInside) q->setPalette(WelcomePageFrame::buttonPalette(active, cursorInside, false)); const QPalette lpal = WelcomePageFrame::buttonPalette(active, cursorInside, true); m_label->setPalette(lpal); - if (m_icon) - m_icon->setPalette(lpal); q->update(); } @@ -187,14 +191,17 @@ void WelcomePageButton::setText(const QString &text) d->m_label->setText(text); } -void WelcomePageButton::setIcon(const QPixmap &pixmap) +void WelcomePageButton::setSize(Size size) { - if (!d->m_icon) { - d->m_icon = new QLabel(this); - d->m_layout->insertWidget(0, d->m_icon); - d->m_layout->insertSpacing(1, 10); - } - d->m_icon->setPixmap(pixmap); + const int hMargin = size == SizeSmall ? 12 : 26; + const int vMargin = size == SizeSmall ? 2 : 4; + d->m_layout->setContentsMargins(hMargin, vMargin, hMargin, vMargin); + d->m_label->setFont(size == SizeSmall ? font() : WelcomePageHelpers::brandFont()); +} + +void WelcomePageButton::setWithAccentColor(bool withAccent) +{ + setProperty(WITHACCENTCOLOR_PROPERTY_NAME, withAccent); } void WelcomePageButton::setActiveChecker(const std::function &value) diff --git a/src/plugins/coreplugin/iwelcomepage.h b/src/plugins/coreplugin/iwelcomepage.h index 1a89b5df8c4..b95947ecb4b 100644 --- a/src/plugins/coreplugin/iwelcomepage.h +++ b/src/plugins/coreplugin/iwelcomepage.h @@ -75,6 +75,11 @@ public: class CORE_EXPORT WelcomePageButton : public WelcomePageFrame { public: + enum Size { + SizeSmall, + SizeLarge, + }; + WelcomePageButton(QWidget *parent); ~WelcomePageButton() override; @@ -83,7 +88,8 @@ public: void leaveEvent(QEvent *) override; void setText(const QString &text); - void setIcon(const QPixmap &pixmap); + void setSize(enum Size); + void setWithAccentColor(bool withAccent); void setOnClicked(const std::function &value); void setActiveChecker(const std::function &value); void recheckActive(); diff --git a/src/plugins/coreplugin/welcomepagehelper.cpp b/src/plugins/coreplugin/welcomepagehelper.cpp index e3360b35f08..b78886c04a6 100644 --- a/src/plugins/coreplugin/welcomepagehelper.cpp +++ b/src/plugins/coreplugin/welcomepagehelper.cpp @@ -28,9 +28,11 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -57,23 +59,58 @@ static QFont sizedFont(int size, const QWidget *widget) return f; } +namespace WelcomePageHelpers { + +QFont brandFont() +{ + const static QFont f = []{ + const int id = QFontDatabase::addApplicationFont(":/studiofonts/TitilliumWeb-Regular.ttf"); + QFont result; + result.setPixelSize(16); + if (id >= 0) { + const QStringList fontFamilies = QFontDatabase::applicationFontFamilies(id); + result.setFamilies(fontFamilies); + } + return result; + }(); + return f; +} + +QWidget *panelBar(QWidget *parent) +{ + auto frame = new QWidget(parent); + frame->setAutoFillBackground(true); + frame->setMinimumWidth(WelcomePageHelpers::HSpacing); + QPalette pal = frame->palette(); + pal.setColor(QPalette::Window, themeColor(Theme::Welcome_BackgroundPrimaryColor)); + frame->setPalette(pal); + return frame; +} + +} // namespace WelcomePageHelpers + SearchBox::SearchBox(QWidget *parent) : WelcomePageFrame(parent) { - QPalette pal = buttonPalette(false, false, true); - pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundColor)); - // for macOS dark mode - pal.setColor(QPalette::Text, themeColor(Theme::Welcome_TextColor)); - setPalette(pal); + setAutoFillBackground(true); m_lineEdit = new FancyLineEdit; m_lineEdit->setFiltering(true); m_lineEdit->setFrame(false); - m_lineEdit->setFont(sizedFont(14, this)); + m_lineEdit->setFont(WelcomePageHelpers::brandFont()); + m_lineEdit->setMinimumHeight(33); m_lineEdit->setAttribute(Qt::WA_MacShowFocusRect, false); + QPalette pal = buttonPalette(false, false, true); + // for the margins + pal.setColor(QPalette::Window, m_lineEdit->palette().color(QPalette::Base)); + // for macOS dark mode + pal.setColor(QPalette::WindowText, themeColor(Theme::Welcome_ForegroundPrimaryColor)); + pal.setColor(QPalette::Text, themeColor(Theme::Welcome_TextColor)); + setPalette(pal); + auto box = new QHBoxLayout(this); - box->setContentsMargins(10, 3, 3, 3); + box->setContentsMargins(10, 0, 1, 0); box->addWidget(m_lineEdit); } @@ -89,7 +126,7 @@ GridView::GridView(QWidget *parent) setUniformItemSizes(true); QPalette pal; - pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundColor)); + pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundSecondaryColor)); setPalette(pal); // Makes a difference on Mac. } @@ -99,7 +136,7 @@ void GridView::leaveEvent(QEvent *) viewportEvent(&hev); // Seemingly needed to kill the hover paint. } -const QSize ListModel::defaultImageSize(188, 145); +const QSize ListModel::defaultImageSize(214, 160); ListModel::ListModel(QObject *parent) : QAbstractListModel(parent) @@ -223,7 +260,7 @@ struct SearchStringLexer inline void yyinp() { yychar = *codePtr++; } - SearchStringLexer(const QString &code) + explicit SearchStringLexer(const QString &code) : code(code) , codePtr(code.unicode()) , yychar(QLatin1Char(' ')) { } @@ -327,11 +364,12 @@ bool ListModelFilter::leaveFilterAcceptsRowBeforeFiltering(const ListItem *, boo } ListItemDelegate::ListItemDelegate() + : backgroundPrimaryColor(themeColor(Theme::Welcome_BackgroundPrimaryColor)) + , backgroundSecondaryColor(themeColor(Theme::Welcome_BackgroundSecondaryColor)) + , foregroundPrimaryColor(themeColor(Theme::Welcome_ForegroundPrimaryColor)) + , hoverColor(themeColor(Theme::Welcome_HoverColor)) + , textColor(themeColor(Theme::Welcome_TextColor)) { - lightColor = QColor(221, 220, 220); // color: "#dddcdc" - backgroundColor = themeColor(Theme::Welcome_BackgroundColor); - foregroundColor1 = themeColor(Theme::Welcome_ForegroundPrimaryColor); // light-ish. - foregroundColor2 = themeColor(Theme::Welcome_ForegroundSecondaryColor); // blacker. } void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, @@ -339,24 +377,25 @@ void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti { const ListItem *item = index.data(ListModel::ItemRole).value(); - // Quick hack for empty items in the last row. - if (!item) - return; - const QRect rc = option.rect; + const QRect tileRect(0, 0, rc.width() - GridItemGap, rc.height() - GridItemGap); + const QSize thumbnailBgSize = ListModel::defaultImageSize.grownBy(QMargins(1, 1, 1, 1)); + const QRect thumbnailBgRect((tileRect.width() - thumbnailBgSize.width()) / 2, GridItemGap, + thumbnailBgSize.width(), thumbnailBgSize.height()); + const QRect textArea = tileRect.adjusted(GridItemGap, GridItemGap, -GridItemGap, -GridItemGap); - const int d = 10; - const int x = rc.x() + d; - const int y = rc.y() + d; - const int w = rc.width() - 2 * d; - const int h = rc.height() - 2 * d; const bool hovered = option.state & QStyle::State_MouseOver; - const int tagsBase = TagsSeparatorY + 10; - const int shiftY = TagsSeparatorY - 20; - const int nameY = TagsSeparatorY - 20; + constexpr int tagsBase = TagsSeparatorY + 17; + constexpr int shiftY = TagsSeparatorY - 16; + constexpr int nameY = TagsSeparatorY - 20; - const QRect textRect = QRect(x, y + nameY, w, h); + const QRect textRect = textArea.translated(0, nameY); + + painter->save(); + painter->translate(rc.topLeft()); + + painter->fillRect(tileRect, hovered ? hoverColor : backgroundPrimaryColor); QTextOption wrapped; wrapped.setWrapMode(QTextOption::WordWrap); @@ -365,121 +404,135 @@ void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti if (hovered) { if (index != m_previousIndex) { m_previousIndex = index; + m_blurredThumbnail = QPixmap(); m_startTime.start(); m_currentArea = rc; m_currentWidget = qobject_cast( const_cast(option.widget)); } - animationProgress = m_startTime.elapsed() / 200.0; // Duration 200 ms. - static const QEasingCurve animationCurve(QEasingCurve::OutQuad); + constexpr float hoverAnimationDuration = 260; + animationProgress = m_startTime.elapsed() / hoverAnimationDuration; + static const QEasingCurve animationCurve(QEasingCurve::OutCubic); offset = animationCurve.valueForProgress(animationProgress) * shiftY; if (offset < shiftY) QTimer::singleShot(10, this, &ListItemDelegate::goon); - else if (offset > shiftY) - offset = shiftY; } else { m_previousIndex = QModelIndex(); } - const QFontMetrics fm(option.widget->font()); const QRect shiftedTextRect = textRect.adjusted(0, -offset, 0, -offset); // The pixmap. - if (offset < shiftY) { - QPixmap pm = index.data(ListModel::ItemImageRole).value(); - QRect inner(x + 11, y, ListModel::defaultImageSize.width(), - ListModel::defaultImageSize.height()); - QRect pixmapRect = inner; - if (!pm.isNull()) { - painter->setPen(foregroundColor2); + const QPixmap pm = index.data(ListModel::ItemImageRole).value(); + QPoint thumbnailPos = thumbnailBgRect.center(); + if (!pm.isNull()) { + painter->fillRect(thumbnailBgRect, backgroundSecondaryColor); - adjustPixmapRect(&pixmapRect); + thumbnailPos.rx() -= pm.width() / pm.devicePixelRatio() / 2 - 1; + thumbnailPos.ry() -= pm.height() / pm.devicePixelRatio() / 2 - 1; + painter->drawPixmap(thumbnailPos, pm); - QPoint pixmapPos = pixmapRect.center(); - pixmapPos.rx() -= pm.width() / pm.devicePixelRatio() / 2; - pixmapPos.ry() -= pm.height() / pm.devicePixelRatio() / 2; - painter->drawPixmap(pixmapPos, pm); - - drawPixmapOverlay(item, painter, option, pixmapRect); - - } else { - // The description text as fallback. - painter->setPen(foregroundColor2); - painter->setFont(sizedFont(11, option.widget)); - painter->drawText(pixmapRect.adjusted(6, 10, -6, -10), item->description, wrapped); - } - qDrawPlainRect(painter, pixmapRect.translated(-1, -1), foregroundColor1); - } - - // The description background rect - if (offset) { - QRect backgroundRect = shiftedTextRect.adjusted(0, -16, 0, 0); - painter->fillRect(backgroundRect, backgroundColor); - } - - // The title of the example. - painter->setPen(foregroundColor1); - painter->setFont(sizedFont(13, option.widget)); - QRectF nameRect; - if (offset) { - nameRect = painter->boundingRect(shiftedTextRect, item->name, wrapped); - painter->drawText(nameRect, item->name, wrapped); + painter->setPen(foregroundPrimaryColor); + drawPixmapOverlay(item, painter, option, thumbnailBgRect); } else { - nameRect = QRect(x, y + nameY, x + w, y + nameY + 20); - QString elidedName = fm.elidedText(item->name, Qt::ElideRight, w - 20); - painter->drawText(nameRect, elidedName); + // The description text as fallback. + painter->setPen(textColor); + painter->setFont(sizedFont(11, option.widget)); + painter->drawText(thumbnailBgRect.adjusted(6, 10, -6, -10), item->description, wrapped); } - // The separator line below the example title. + // The description background + if (offset && !pm.isNull()) { + if (m_blurredThumbnail.isNull()) { + constexpr int blurRadius = 50; + QImage thumbnail(tileRect.size() + QSize(blurRadius, blurRadius) * 2, + QImage::Format_ARGB32_Premultiplied); + thumbnail.fill(hoverColor); + QPainter thumbnailPainter(&thumbnail); + thumbnailPainter.translate(blurRadius, blurRadius); + thumbnailPainter.fillRect(thumbnailBgRect, backgroundSecondaryColor); + thumbnailPainter.drawPixmap(thumbnailPos, pm); + thumbnailPainter.setPen(foregroundPrimaryColor); + drawPixmapOverlay(item, &thumbnailPainter, option, thumbnailBgRect); + thumbnailPainter.end(); + + m_blurredThumbnail = QPixmap(tileRect.size()); + QPainter blurredThumbnailPainter(&m_blurredThumbnail); + blurredThumbnailPainter.translate(-blurRadius, -blurRadius); + qt_blurImage(&blurredThumbnailPainter, thumbnail, blurRadius, false, false); + blurredThumbnailPainter.setOpacity(0.825); + blurredThumbnailPainter.fillRect(tileRect, hoverColor); + } + QRect thumbnailPortionRect = tileRect; + thumbnailPortionRect.setTop(shiftY - offset); + const QPixmap thumbnailPortionPM = m_blurredThumbnail.copy(thumbnailPortionRect); + painter->drawPixmap(thumbnailPortionRect.topLeft(), thumbnailPortionPM); + } + + // The description Text (unhovered or hovered) + painter->setPen(textColor); + painter->setFont(sizedFont(13, option.widget)); // Title font if (offset) { - int ll = nameRect.bottom() + 5; - painter->setPen(lightColor); + // The title of the example + const QRectF nameRect = painter->boundingRect(shiftedTextRect, item->name, wrapped); + painter->drawText(nameRect, item->name, wrapped); + + // The separator line below the example title. + const int ll = nameRect.height() + 3; + const QLine line = QLine(0, ll, textArea.width(), ll).translated(shiftedTextRect.topLeft()); + painter->setPen(foregroundPrimaryColor); painter->setOpacity(animationProgress); // "fade in" separator line and description - painter->drawLine(x, ll, x + w, ll); - } + painter->drawLine(line); - // The description text. - if (offset) { - int dd = nameRect.height() + 10; - QRect descRect = shiftedTextRect.adjusted(0, dd, 0, dd); - painter->setPen(foregroundColor2); + // The description text. + const int dd = ll + 5; + const QRect descRect = shiftedTextRect.adjusted(0, dd, 0, dd); + painter->setPen(textColor); painter->setFont(sizedFont(11, option.widget)); painter->drawText(descRect, item->description, wrapped); painter->setOpacity(1); + } else { + // The title of the example + const QString elidedName = painter->fontMetrics() + .elidedText(item->name, Qt::ElideRight, textRect.width()); + painter->drawText(textRect, elidedName); } // Separator line between text and 'Tags:' section - painter->setPen(lightColor); - painter->drawLine(x, y + TagsSeparatorY, x + w, y + TagsSeparatorY); + painter->setPen(foregroundPrimaryColor); + painter->drawLine(QLineF(textArea.topLeft(), textArea.topRight()) + .translated(0, TagsSeparatorY)); // The 'Tags:' section - const int tagsHeight = h - tagsBase; + painter->setPen(foregroundPrimaryColor); const QFont tagsFont = sizedFont(10, option.widget); - const QFontMetrics tagsFontMetrics(tagsFont); - QRect tagsLabelRect = QRect(x, y + tagsBase, 30, tagsHeight - 2); - painter->setPen(foregroundColor2); painter->setFont(tagsFont); - painter->drawText(tagsLabelRect, tr("Tags:")); + const QFontMetrics fm = painter->fontMetrics(); + const QString tagsLabelText = tr("Tags:"); + constexpr int tagsHorSpacing = 5; + const QRect tagsLabelRect = + QRect(0, 0, fm.horizontalAdvance(tagsLabelText) + tagsHorSpacing, fm.height()) + .translated(textArea.x(), tagsBase); + painter->drawText(tagsLabelRect, tagsLabelText); painter->setPen(themeColor(Theme::Welcome_LinkColor)); m_currentTagRects.clear(); int xx = 0; - int yy = y + tagsBase; + int yy = 0; for (const QString &tag : item->tags) { - const int ww = tagsFontMetrics.horizontalAdvance(tag) + 5; - if (xx + ww > w - 30) { - yy += 15; + const int ww = fm.horizontalAdvance(tag) + tagsHorSpacing; + if (xx + ww > textArea.width() - tagsLabelRect.width()) { + yy += fm.lineSpacing(); xx = 0; } - const QRect tagRect(xx + x + 30, yy, ww, 15); + const QRect tagRect = QRect(xx, yy, ww, tagsLabelRect.height()) + .translated(tagsLabelRect.topRight()); painter->drawText(tagRect, tag); - m_currentTagRects.append({ tag, tagRect }); + m_currentTagRects.append({ tag, tagRect.translated(rc.topLeft()) }); xx += ww; } - // Box it when hovered. - if (hovered) - qDrawPlainRect(painter, rc, lightColor); + painter->restore(); } bool ListItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, @@ -524,10 +577,6 @@ void ListItemDelegate::clickAction(const ListItem *) const { } -void ListItemDelegate::adjustPixmapRect(QRect *) const -{ -} - void ListItemDelegate::goon() { if (m_currentWidget) diff --git a/src/plugins/coreplugin/welcomepagehelper.h b/src/plugins/coreplugin/welcomepagehelper.h index 90645f4dee5..dc3a15a6102 100644 --- a/src/plugins/coreplugin/welcomepagehelper.h +++ b/src/plugins/coreplugin/welcomepagehelper.h @@ -40,10 +40,19 @@ namespace Utils { class FancyLineEdit; } namespace Core { +namespace WelcomePageHelpers { + +constexpr int HSpacing = 20; +constexpr int ItemGap = 4; +CORE_EXPORT QFont brandFont(); +CORE_EXPORT QWidget *panelBar(QWidget *parent = nullptr); + +} // namespace WelcomePageHelpers + class CORE_EXPORT SearchBox : public WelcomePageFrame { public: - SearchBox(QWidget *parent); + explicit SearchBox(QWidget *parent); Utils::FancyLineEdit *m_lineEdit = nullptr; }; @@ -121,10 +130,10 @@ public: void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - static constexpr int GridItemWidth = 230; - static constexpr int GridItemHeight = 230; - static constexpr int GridItemGap = 10; - static constexpr int TagsSeparatorY = GridItemHeight - 60; + static constexpr int GridItemGap = 3 * WelcomePageHelpers::ItemGap; + static constexpr int GridItemWidth = 240 + GridItemGap; + static constexpr int GridItemHeight = GridItemWidth; + static constexpr int TagsSeparatorY = GridItemHeight - GridItemGap - 52; signals: void tagClicked(const QString &tag); @@ -138,14 +147,14 @@ protected: const QStyleOptionViewItem &option, const QRect ¤tPixmapRect) const; virtual void clickAction(const ListItem *item) const; - virtual void adjustPixmapRect(QRect *pixmapRect) const; void goon(); - QColor lightColor; - QColor backgroundColor; - QColor foregroundColor1; - QColor foregroundColor2; + const QColor backgroundPrimaryColor; + const QColor backgroundSecondaryColor; + const QColor foregroundPrimaryColor; + const QColor hoverColor; + const QColor textColor; private: mutable QPersistentModelIndex m_previousIndex; @@ -153,6 +162,7 @@ private: mutable QRect m_currentArea; mutable QPointer m_currentWidget; mutable QVector> m_currentTagRects; + mutable QPixmap m_blurredThumbnail; }; } // namespace Core diff --git a/src/plugins/marketplace/productlistmodel.cpp b/src/plugins/marketplace/productlistmodel.cpp index 92e397a8710..511ee65836c 100644 --- a/src/plugins/marketplace/productlistmodel.cpp +++ b/src/plugins/marketplace/productlistmodel.cpp @@ -157,6 +157,7 @@ SectionedProducts::SectionedProducts(QWidget *parent) auto sectionedView = new QWidget; auto layout = new QVBoxLayout; + layout->setContentsMargins(0, 0, 0, 0); layout->addStretch(); sectionedView->setLayout(layout); area->setWidget(sectionedView); @@ -377,10 +378,9 @@ void SectionedProducts::addNewSection(const Section §ion, const QListsetFont(f); + sectionLabel->setContentsMargins(0, Core::WelcomePageHelpers::ItemGap, 0, 0); + sectionLabel->setFont(Core::WelcomePageHelpers::brandFont()); auto scrollArea = qobject_cast(widget(0)); auto vbox = qobject_cast(scrollArea->widget()->layout()); diff --git a/src/plugins/marketplace/qtmarketplacewelcomepage.cpp b/src/plugins/marketplace/qtmarketplacewelcomepage.cpp index 738ee04269b..1abb06dacc9 100644 --- a/src/plugins/marketplace/qtmarketplacewelcomepage.cpp +++ b/src/plugins/marketplace/qtmarketplacewelcomepage.cpp @@ -65,27 +65,33 @@ class QtMarketplacePageWidget : public QWidget public: QtMarketplacePageWidget() { - const int sideMargin = 27; auto searchBox = new Core::SearchBox(this); m_searcher = searchBox->m_lineEdit; m_searcher->setPlaceholderText(QtMarketplaceWelcomePage::tr("Search in Marketplace...")); auto vbox = new QVBoxLayout(this); - vbox->setContentsMargins(30, sideMargin, 0, 0); + vbox->setContentsMargins(0, 0, 0, Core::WelcomePageHelpers::ItemGap); + vbox->setSpacing(Core::WelcomePageHelpers::ItemGap); - auto hbox = new QHBoxLayout; + auto searchBar = Core::WelcomePageHelpers::panelBar(); + auto hbox = new QHBoxLayout(searchBar); + hbox->setContentsMargins(Core::WelcomePageHelpers::HSpacing, 0, + Core::WelcomePageHelpers::HSpacing, 0); hbox->addWidget(searchBox); - hbox->addSpacing(sideMargin); - vbox->addItem(hbox); + vbox->addWidget(searchBar); m_errorLabel = new QLabel(this); m_errorLabel->setVisible(false); vbox->addWidget(m_errorLabel); + auto resultWidget = new QWidget(this); + auto resultHBox = new QHBoxLayout(resultWidget); + resultHBox->setContentsMargins(Core::WelcomePageHelpers::HSpacing, 0, 0, 0); m_sectionedProducts = new SectionedProducts(this); auto progressIndicator = new Utils::ProgressIndicator(ProgressIndicatorSize::Large, this); progressIndicator->attachToWidget(m_sectionedProducts); progressIndicator->hide(); - vbox->addWidget(m_sectionedProducts); + resultHBox->addWidget(m_sectionedProducts); + vbox->addWidget(resultWidget); connect(m_sectionedProducts, &SectionedProducts::toggleProgressIndicator, progressIndicator, &Utils::ProgressIndicator::setVisible); diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index e0b8795f403..6607454443c 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -56,10 +57,13 @@ #include using namespace Core; +using namespace Core::WelcomePageHelpers; using namespace Utils; const int LINK_HEIGHT = 35; -const int SESSION_LINE_HEIGHT = 30; +const int TEXT_OFFSET_HORIZONTAL = 36; +const int SESSION_LINE_HEIGHT = 28; +const int SESSION_ARROW_RECT_WIDTH = 24; const char PROJECT_BASE_ID[] = "Welcome.OpenRecentProject"; namespace ProjectExplorer { @@ -188,7 +192,8 @@ static QColor themeColor(Theme::Color role) return Utils::creatorTheme()->color(role); } -static QFont sizedFont(int size, const QWidget *widget, bool underline = false) +static QFont sizedFont(int size, const QWidget *widget, + bool underline = false) { QFont f = widget->font(); f.setPixelSize(size); @@ -266,30 +271,32 @@ public: //const bool hovered = option.state & QStyle::State_MouseOver; const bool hovered = option.rect.contains(mousePos); const bool expanded = m_expandedSessions.contains(sessionName); - if (hovered) - painter->fillRect(expanded ? rc : rc.adjusted(0, 0, -24, 0), hoverColor); + painter->fillRect(rc, themeColor(Theme::Welcome_BackgroundSecondaryColor)); + painter->fillRect(rc.adjusted(0, 0, 0, -ItemGap), + hovered ? hoverColor : backgroundPrimaryColor); const int x = rc.x(); - const int x1 = x + 36; + const int x1 = x + TEXT_OFFSET_HORIZONTAL; const int y = rc.y(); const int firstBase = y + 18; painter->drawPixmap(x + 11, y + 6, sessionIcon); if (hovered && !expanded) { - const QRect arrowRect = rc.adjusted(rc.width() - 24, 0, 0, 0); - if (arrowRect.contains(mousePos)) - painter->fillRect(arrowRect, hoverColor); + const QRect arrowRect = rc.adjusted(rc.width() - SESSION_ARROW_RECT_WIDTH, 0, 0, 0); + const bool arrowRectHovered = arrowRect.contains(mousePos); + painter->fillRect(arrowRect.adjusted(0, 0, 0, -ItemGap), + arrowRectHovered ? hoverColor : backgroundPrimaryColor); } if (hovered || expanded) { static const QPixmap arrowUp = pixmap("expandarrow",Theme::Welcome_ForegroundSecondaryColor); static const QPixmap arrowDown = QPixmap::fromImage(arrowUp.toImage().mirrored(false, true)); - painter->drawPixmap(rc.right() - 20, y + 7, expanded ? arrowDown : arrowUp); + painter->drawPixmap(rc.right() - 19, y + 6, expanded ? arrowDown : arrowUp); } if (idx.row() < 9) { - painter->setPen(foregroundColor2); + painter->setPen(foregroundSecondaryColor); painter->setFont(sizedFont(10, option.widget)); painter->drawText(x + 3, firstBase, QString::number(idx.row() + 1)); } @@ -304,11 +311,16 @@ public: if (isActiveSession && !isDefaultVirgin) fullSessionName = ProjectWelcomePage::tr("%1 (current session)").arg(fullSessionName); - const QRect switchRect = QRect(x, y, rc.width() - 24, SESSION_LINE_HEIGHT); + const QRect switchRect = QRect(x, y, rc.width() - SESSION_ARROW_RECT_WIDTH, SESSION_LINE_HEIGHT); const bool switchActive = switchRect.contains(mousePos); + const int textSpace = rc.width() - TEXT_OFFSET_HORIZONTAL - 6; + const int sessionNameTextSpace = + textSpace -(hovered || expanded ? SESSION_ARROW_RECT_WIDTH : 0); painter->setPen(linkColor); painter->setFont(sizedFont(13, option.widget, switchActive)); - painter->drawText(x1, firstBase, fullSessionName); + const QString fullSessionNameElided = painter->fontMetrics().elidedText( + fullSessionName, Qt::ElideRight, sessionNameTextSpace); + painter->drawText(x1, firstBase, fullSessionNameElided); if (switchActive) m_activeSwitchToRect = switchRect; @@ -316,24 +328,24 @@ public: painter->setPen(textColor); painter->setFont(sizedFont(12, option.widget)); const QStringList projects = SessionManager::projectsForSessionName(sessionName); - int yy = firstBase + 25; + int yy = firstBase + SESSION_LINE_HEIGHT - 3; QFontMetrics fm(option.widget->font()); for (const QString &project : projects) { // Project name. FilePath projectPath = FilePath::fromString(project); QString completeBase = projectPath.completeBaseName(); painter->setPen(textColor); - painter->drawText(x1, yy, completeBase); + painter->drawText(x1, yy, fm.elidedText(completeBase, Qt::ElideMiddle, textSpace)); yy += 18; // Project path. QString pathWithTilde = Utils::withTildeHomePath(projectPath.toUserOutput()); - painter->setPen(foregroundColor1); - painter->drawText(x1, yy, fm.elidedText(pathWithTilde, Qt::ElideMiddle, rc.width() - 40)); + painter->setPen(foregroundPrimaryColor); + painter->drawText(x1, yy, fm.elidedText(pathWithTilde, Qt::ElideMiddle, textSpace)); yy += 22; } - yy += 5; + yy += 3; int xx = x1; const QStringList actions = { ProjectWelcomePage::tr("Clone"), @@ -343,15 +355,17 @@ public: for (int i = 0; i < 3; ++i) { const QString &action = actions.at(i); const int ww = fm.horizontalAdvance(action); - const QRect actionRect(xx, yy - 10, ww, 15); + const int spacing = 7; // Between action link and separator line + const QRect actionRect = + QRect(xx, yy - 10, ww, 15).adjusted(-spacing, -spacing, spacing, spacing); const bool isForcedDisabled = (i != 0 && sessionName == "default"); const bool isActive = actionRect.contains(mousePos) && !isForcedDisabled; painter->setPen(isForcedDisabled ? disabledLinkColor : linkColor); painter->setFont(sizedFont(12, option.widget, isActive)); painter->drawText(xx, yy, action); if (i < 2) { - xx += ww + 14; - int pp = xx - 7; + xx += ww + 2 * spacing; + int pp = xx - spacing; painter->setPen(textColor); painter->drawLine(pp, yy - 10, pp, yy); } @@ -367,9 +381,9 @@ public: QString sessionName = idx.data(Qt::DisplayRole).toString(); if (m_expandedSessions.contains(sessionName)) { QStringList projects = SessionManager::projectsForSessionName(sessionName); - h += projects.size() * 40 + LINK_HEIGHT; + h += projects.size() * 40 + LINK_HEIGHT - 6; } - return QSize(380, h); + return QSize(380, h + ItemGap); } bool editorEvent(QEvent *ev, QAbstractItemModel *model, @@ -379,7 +393,8 @@ public: const QMouseEvent *mouseEvent = static_cast(ev); const Qt::MouseButtons button = mouseEvent->button(); const QPoint pos = static_cast(ev)->pos(); - const QRect rc(option.rect.right() - 24, option.rect.top(), 24, SESSION_LINE_HEIGHT); + const QRect rc(option.rect.right() - SESSION_ARROW_RECT_WIDTH, option.rect.top(), + SESSION_ARROW_RECT_WIDTH, SESSION_LINE_HEIGHT); const QString sessionName = idx.data(Qt::DisplayRole).toString(); if (rc.contains(pos) || button == Qt::RightButton) { // The expand/collapse "button". @@ -408,7 +423,7 @@ public: if (ev->type() == QEvent::MouseMove) { emit model->layoutChanged({QPersistentModelIndex(idx)}); // Somewhat brutish. //update(option.rect); - return true; + return false; } return false; } @@ -418,9 +433,9 @@ private: const QColor textColor = themeColor(Theme::Welcome_TextColor); const QColor linkColor = themeColor(Theme::Welcome_LinkColor); const QColor disabledLinkColor = themeColor(Theme::Welcome_DisabledLinkColor); - const QColor backgroundColor = themeColor(Theme::Welcome_BackgroundColor); - const QColor foregroundColor1 = themeColor(Theme::Welcome_ForegroundPrimaryColor); // light-ish. - const QColor foregroundColor2 = themeColor(Theme::Welcome_ForegroundSecondaryColor); // blacker. + const QColor backgroundPrimaryColor = themeColor(Theme::Welcome_BackgroundPrimaryColor); + const QColor foregroundPrimaryColor = themeColor(Theme::Welcome_ForegroundPrimaryColor); + const QColor foregroundSecondaryColor = themeColor(Theme::Welcome_ForegroundSecondaryColor); QStringList m_expandedSessions; @@ -442,15 +457,18 @@ public: QRect rc = option.rect; const bool hovered = option.widget->isActiveWindow() && option.state & QStyle::State_MouseOver; - if (hovered) - painter->fillRect(rc, themeColor(Theme::Welcome_HoverColor)); + const QRect bgRect = rc.adjusted(0, 0, -ItemGap, -ItemGap); + painter->fillRect(rc, themeColor(Theme::Welcome_BackgroundSecondaryColor)); + painter->fillRect(bgRect, themeColor(hovered ? Theme::Welcome_HoverColor + : Theme::Welcome_BackgroundPrimaryColor)); const int x = rc.x(); const int y = rc.y(); const int firstBase = y + 18; const int secondBase = firstBase + 19; - static const QPixmap projectIcon = pixmap("project", Theme::Welcome_ForegroundSecondaryColor); + static const QPixmap projectIcon = + pixmap("project", Theme::Welcome_ForegroundSecondaryColor); painter->drawPixmap(x + 11, y + 6, projectIcon); QString projectName = idx.data(Qt::DisplayRole).toString(); @@ -462,14 +480,20 @@ public: if (idx.row() < 9) painter->drawText(x + 3, firstBase, QString::number(idx.row() + 1)); + const int textSpace = rc.width() - TEXT_OFFSET_HORIZONTAL - ItemGap - 6; + painter->setPen(themeColor(Theme::Welcome_LinkColor)); painter->setFont(sizedFont(13, option.widget, hovered)); - painter->drawText(x + 36, firstBase, projectName); + const QString projectNameElided = + painter->fontMetrics().elidedText(projectName, Qt::ElideRight, textSpace); + painter->drawText(x + TEXT_OFFSET_HORIZONTAL, firstBase, projectNameElided); painter->setPen(themeColor(Theme::Welcome_ForegroundPrimaryColor)); painter->setFont(sizedFont(13, option.widget)); QString pathWithTilde = Utils::withTildeHomePath(projectPath.toUserOutput()); - painter->drawText(x + 36, secondBase, pathWithTilde); + const QString pathWithTildeElided = + painter->fontMetrics().elidedText(pathWithTilde, Qt::ElideMiddle, textSpace); + painter->drawText(x + TEXT_OFFSET_HORIZONTAL, secondBase, pathWithTildeElided); } QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &idx) const final @@ -478,8 +502,8 @@ public: QString projectPath = idx.data(ProjectModel::FilePathRole).toString(); QFontMetrics fm(sizedFont(13, option.widget)); int width = std::max(fm.horizontalAdvance(projectName), - fm.horizontalAdvance(projectPath)) + 36; - return QSize(width, 48); + fm.horizontalAdvance(projectPath)) + TEXT_OFFSET_HORIZONTAL; + return QSize(width, 47 + ItemGap); } bool editorEvent(QEvent *ev, QAbstractItemModel *model, @@ -537,22 +561,16 @@ public: setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); setFocusPolicy(Qt::NoFocus); - QPalette pal; // Needed for classic theme (only). - pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundColor)); + QPalette pal; + pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundSecondaryColor)); viewport()->setPalette(pal); } - - void leaveEvent(QEvent *) final - { - QHoverEvent hev(QEvent::HoverLeave, QPointF(), QPointF()); - viewportEvent(&hev); // Seemingly needed to kill the hover paint. - } }; class SessionsPage : public QWidget { public: - SessionsPage(ProjectWelcomePage *projectWelcomePage) + explicit SessionsPage(ProjectWelcomePage *projectWelcomePage) { // FIXME: Remove once facilitateQml() is gone. if (!projectWelcomePage->m_sessionModel) @@ -561,26 +579,16 @@ public: projectWelcomePage->m_projectModel = new ProjectModel(this); auto manageSessionsButton = new WelcomePageButton(this); - manageSessionsButton->setText(ProjectWelcomePage::tr("Manage")); - manageSessionsButton->setIcon(pixmap("settings", Theme::Welcome_ForegroundSecondaryColor)); + manageSessionsButton->setText(ProjectWelcomePage::tr("Manage...")); + manageSessionsButton->setWithAccentColor(true); manageSessionsButton->setOnClicked([] { ProjectExplorerPlugin::showSessionManager(); }); - auto newButton = new WelcomePageButton(this); - newButton->setText(ProjectWelcomePage::tr("New")); - newButton->setIcon(pixmap("new", Theme::Welcome_ForegroundSecondaryColor)); - newButton->setOnClicked([] { ProjectExplorerPlugin::openNewProjectDialog(); }); - - auto openButton = new WelcomePageButton(this); - openButton->setText(ProjectWelcomePage::tr("Open")); - openButton->setIcon(pixmap("open", Theme::Welcome_ForegroundSecondaryColor)); - openButton->setOnClicked([] { ProjectExplorerPlugin::openOpenProjectDialog(); }); - auto sessionsLabel = new QLabel(this); - sessionsLabel->setFont(sizedFont(16, this)); + sessionsLabel->setFont(brandFont()); sessionsLabel->setText(ProjectWelcomePage::tr("Sessions")); auto recentProjectsLabel = new QLabel(this); - recentProjectsLabel->setFont(sizedFont(16, this)); + recentProjectsLabel->setFont(brandFont()); recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects")); auto sessionsList = new TreeView(this, "Sessions"); @@ -595,41 +603,31 @@ public: projectsList->setItemDelegate(&m_projectDelegate); projectsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - auto hbox11 = new QHBoxLayout; - hbox11->setContentsMargins(0, 0, 0, 0); + auto sessionHeader = panelBar(this); + auto hbox11 = new QHBoxLayout(sessionHeader); + hbox11->setContentsMargins(12, 0, 0, 0); hbox11->addWidget(sessionsLabel); - hbox11->addSpacing(16); - hbox11->addWidget(manageSessionsButton); hbox11->addStretch(1); + hbox11->addWidget(manageSessionsButton); - auto hbox21 = new QHBoxLayout; - hbox21->setContentsMargins(0, 0, 0, 0); + auto projectsHeader = panelBar(this); + auto hbox21 = new QHBoxLayout(projectsHeader); + hbox21->setContentsMargins(hbox11->contentsMargins()); hbox21->addWidget(recentProjectsLabel); - hbox21->addSpacing(16); - hbox21->addWidget(newButton); - hbox21->addSpacing(16); - hbox21->addWidget(openButton); - hbox21->addStretch(1); - auto vbox1 = new QVBoxLayout; - vbox1->setContentsMargins(0, 0, 0, 0); - vbox1->addItem(hbox11); - vbox1->addSpacing(16); - vbox1->addWidget(sessionsList); - - auto vbox2 = new QVBoxLayout; - vbox2->setContentsMargins(0, 0, 0, 0); - vbox2->addItem(hbox21); - vbox2->addSpacing(16); - vbox2->addWidget(projectsList); - - auto hbox = new QHBoxLayout(this); - hbox->setContentsMargins(30, 27, 0, 27); - hbox->addItem(vbox1); - hbox->setStretchFactor(vbox1, 1); - hbox->addSpacing(16); - hbox->addItem(vbox2); - hbox->setStretchFactor(vbox2, 3); + auto grid = new QGridLayout(this); + grid->setContentsMargins(0, 0, 0, ItemGap); + grid->setHorizontalSpacing(0); + grid->setVerticalSpacing(ItemGap); + grid->addWidget(panelBar(this), 0, 0); + grid->addWidget(sessionHeader, 0, 1); + grid->addWidget(sessionsList, 1, 1); + grid->addWidget(panelBar(this), 0, 2); + grid->setColumnStretch(1, 9); + grid->setColumnMinimumWidth(1, 200); + grid->addWidget(projectsHeader, 0, 3); + grid->addWidget(projectsList, 1, 3); + grid->setColumnStretch(3, 20); } SessionDelegate m_sessionDelegate; diff --git a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp index a036c095198..93b630c3eb2 100644 --- a/src/plugins/qtsupport/gettingstartedwelcomepage.cpp +++ b/src/plugins/qtsupport/gettingstartedwelcomepage.cpp @@ -247,21 +247,16 @@ protected: QTC_ASSERT(item, return); const auto exampleItem = static_cast(item); if (exampleItem->isVideo) { - QFont f = option.widget->font(); - f.setPixelSize(13); - painter->setFont(f); - QString videoLen = exampleItem->videoLength; - painter->drawText(currentPixmapRect.adjusted(0, 0, 0, painter->font().pixelSize() + 3), - videoLen, Qt::AlignBottom | Qt::AlignHCenter); + painter->save(); + painter->setFont(option.font); + painter->setCompositionMode(QPainter::CompositionMode_Difference); + painter->setPen(Qt::white); + painter->drawText(currentPixmapRect.translated(0, -WelcomePageHelpers::ItemGap), + exampleItem->videoLength, Qt::AlignBottom | Qt::AlignHCenter); + painter->restore(); } } - void adjustPixmapRect(QRect *pixmapRect) const override - { - if (!m_showExamples) - *pixmapRect = pixmapRect->adjusted(6, 20, -6, -15); - } - bool m_showExamples = true; }; @@ -272,7 +267,6 @@ public: : m_isExamples(isExamples) { m_exampleDelegate.setShowExamples(isExamples); - const int sideMargin = 27; static auto s_examplesModel = new ExamplesListModel(this); m_examplesModel = s_examplesModel; @@ -281,10 +275,14 @@ public: auto searchBox = new SearchBox(this); m_searcher = searchBox->m_lineEdit; - auto vbox = new QVBoxLayout(this); - vbox->setContentsMargins(30, sideMargin, 0, 0); + auto grid = new QGridLayout(this); + grid->setContentsMargins(0, 0, 0, WelcomePageHelpers::ItemGap); + grid->setHorizontalSpacing(0); + grid->setVerticalSpacing(WelcomePageHelpers::ItemGap); - auto hbox = new QHBoxLayout; + auto searchBar = WelcomePageHelpers::panelBar(this); + auto hbox = new QHBoxLayout(searchBar); + hbox->setContentsMargins(0, 0, 0, 0); if (m_isExamples) { m_searcher->setPlaceholderText(ExamplesWelcomePage::tr("Search in Examples...")); @@ -303,21 +301,22 @@ public: connect(exampleSetModel, &ExampleSetModel::selectedExampleSetChanged, exampleSetSelector, &QComboBox::setCurrentIndex); - hbox->setSpacing(17); + hbox->setSpacing(Core::WelcomePageHelpers::HSpacing); hbox->addWidget(exampleSetSelector); } else { m_searcher->setPlaceholderText(ExamplesWelcomePage::tr("Search in Tutorials...")); } hbox->addWidget(searchBox); - hbox->addSpacing(sideMargin); - vbox->addItem(hbox); + grid->addWidget(WelcomePageHelpers::panelBar(this), 0, 0); + grid->addWidget(searchBar, 0, 1); + grid->addWidget(WelcomePageHelpers::panelBar(this), 0, 2); auto gridView = new GridView(this); gridView->setModel(filteredModel); gridView->setItemDelegate(&m_exampleDelegate); if (auto sb = gridView->verticalScrollBar()) sb->setSingleStep(25); - vbox->addWidget(gridView); + grid->addWidget(gridView, 1, 1, 1, 2); connect(&m_exampleDelegate, &ExampleDelegate::tagClicked, this, &ExamplesPageWidget::onTagClicked); diff --git a/src/plugins/qtsupport/images/icons/qteventicon.png b/src/plugins/qtsupport/images/icons/qteventicon.png index a4d27e29a2888a47d58f97ee18f06881409b6c5b..e6beb718ba8562b84b8fb278bee981109c217598 100644 GIT binary patch literal 3403 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 diff --git a/src/plugins/qtsupport/images/icons/qteventicon@2x.png b/src/plugins/qtsupport/images/icons/qteventicon@2x.png index b3eb6e5eaf142ab1996a2ba3ae891a8d78636e05..2e6590d1e3a7256e12f10780c9a908c82747f716 100644 GIT binary patch literal 7047 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 W+=X^C#2FYE7(8A5T-G@yGywnz=dL0E literal 6527 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 diff --git a/src/plugins/qtsupport/images/icons/tutorialicon.png b/src/plugins/qtsupport/images/icons/tutorialicon.png index a3ac270f8cd2a9f55a678f00dca5b09058c3b9a4..6bd111c1324a435873d9d363dc1604070239d834 100644 GIT binary patch literal 5476 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 diff --git a/src/plugins/qtsupport/images/icons/tutorialicon@2x.png b/src/plugins/qtsupport/images/icons/tutorialicon@2x.png index 5c83982f2e762cb91d06f0a80cad35c3ac85b5f2..23d8af8c1ca2850190b73faa7d6454948384ef41 100644 GIT binary patch literal 11766 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 diff --git a/src/plugins/qtsupport/images/icons/videotutorialicon.png b/src/plugins/qtsupport/images/icons/videotutorialicon.png index 037adc27a35a9598800129a98d1170d0b419dbfb..17f22d3c2e1cd865099c56b38cdb935739476461 100644 GIT binary patch literal 4131 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 L>gTe~DWM4fABfjK literal 4062 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 diff --git a/src/plugins/qtsupport/images/icons/videotutorialicon@2x.png b/src/plugins/qtsupport/images/icons/videotutorialicon@2x.png index 04071e206e67d4b1e447f6f9075f83eb4042b6aa..c015be74f84fbd2f757aebd9031946a1226acb60 100644 GIT binary patch literal 8810 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 tiHrD7S;(09nukRlGg8B-v9m6@iX7Pd?`7< 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 HDWM4fR^f4r diff --git a/src/plugins/welcome/images/blogs@2x.png b/src/plugins/welcome/images/blogs@2x.png deleted file mode 100644 index 48c93a9253f4b1e96cd1f083a4f522d223889c00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(3riJmTwAr_~T6U2jz`f{Rv zzq02$z`)wG>uCB%Ee6K7_s;(iH89{X-FJLF!-|wc@qf4^By!#h1spiAoyqm!s-2U& zYn}#9o$|*yh+(0e?w3U8Ai>Yvv5W$Ha;Lkj`0%rJ<%9qK+xO&^%|6Ji8^O>}Ljz+2E8%a)^*Q|Myd9&LCy)26vc@3*9&M|Xutj}P4S|PkB zN#8moL9xo?lTO=;85~c$_a5hXRn+1AcflREGdnU^R#zP4@4e;kz&cqy?6`+wh(pfH zwog?H8Na^wkx)J(n=t)fL)Jy7mM596E4b1Pw#%Nf?&o-QJuF~j?}Hi1&8!wmdU4tg zN6s9yk>@zhV7bZ9>24w8kw}h2rkj3YAgXk1Tmh#3M ze+9NF9ZnNCxnQvmdCWHF6sRCx!4AQRe>Wp8%o&|~| MPgg&ebxsLQ07QPicmMzZ diff --git a/src/plugins/welcome/images/community.png b/src/plugins/welcome/images/community.png deleted file mode 100644 index 865a21a7ce4307ea8d47a3759c0cd90dc7029139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)RqSbMrShDd}br#LXA?cCv2 z=Ef%SU^Az0L!#=g2K`+PQo9&-E#%=T5&FR|{C%Egua3fviEWFNN>)jPa5GH3&Z#G= RAM6b>&ePS;Wt~$(699-mAkF{) diff --git a/src/plugins/welcome/images/community@2x.png b/src/plugins/welcome/images/community@2x.png deleted file mode 100644 index f632f3b9cbac9c45780f9c2a3d631c6700efb188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=JWm(L5R22v2?zKpwj`DR z{msw9Q_=7`nTbnciM&9-fd&6(H!!tvwupHARb0@JsIJI*v_-^1AV|U6gHd0RwTEYM zf<@zh4+gCx_Mhb^Ni1VJe_SK!1s6-&zyJOIjo&B#{~^M$DAPS$;FFN^KYIrCUEBAW S-dxuMa)GC-pUXO@geCx-f;a2{ diff --git a/src/plugins/welcome/images/download.png b/src/plugins/welcome/images/download.png deleted file mode 100644 index 7b98258ac34a0ab04d18912469e8c7d67cc6a263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdte8d_r6q7#K7(G<0-ybai!& zjg8C8%j@gwpFMl_{Q2{jFJHcT_3F!)FaQ7lZFMGa!V#TpQT*%-qnyIQ zhW?H0M=WaF9?r1n*l5v~D13PivyHmw7D+$J4*3U>XKoxWNHa`koZiS1@X?c%Rc)E2 x!rRFb5+(1b1|D!D?<_ruBlRaG= zLo|ZVoeb6k+;#enq4#0H63TLwM>~1rgKCnhBM7!efMlnmhE~qtB)T~ ztee1o>yv#!^h4E!)!Pph2v{xKcThz7BTpGG*Uv7up!^w4YXf+#4m((JS~9Xb`5kDS zAY7pEghl4Z%T}I!_X3y;4C>c0@TFC-Jo(JNV#@+Y-uW9E^nO=nZa8E9C*fX{oX^oJ TIq4P#1_lOCS3j3^P6Pj{ diff --git a/src/plugins/welcome/images/new@2x.png b/src/plugins/welcome/images/new@2x.png deleted file mode 100644 index 3fca87e14c7eb8ddaea65cf2232ac0018e740a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;IMrH;E2G1=owlgp=um$*pxH2#>{Qv)d>CO3f v85kHuJY5_^IA$jQ_<#JLJ@Zi(GY8ShjP_Acwjs>bu?!%cu6{1-oD!Mm3IsiMAvz8TU)cj6xkwLJ?d?&fgHIIXRza#RA5&QQMwpFd4qkv*i@| d(a&bU!oasbuVnhXcWxk)Jzf1=);T3K0RY?DB@zGt diff --git a/src/plugins/welcome/images/open@2x.png b/src/plugins/welcome/images/open@2x.png deleted file mode 100644 index d0cfd2555917a8c817b89b8945316ef6e9d6a3a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=T2B|p5R21$FCXM>P~d5O zIB$ldSt3)r!J0&yQ+h3tJl!XF=6nef=6~?s_5RlQS<5n?HgGgmi!tdcsgTe~DWM4f_`*b8 diff --git a/src/plugins/welcome/images/qtaccount.png b/src/plugins/welcome/images/qtaccount.png deleted file mode 100644 index 40eb4a5f104f3117547025f465815dfc3376f992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)RqRCu~LhDd}b|KMkmzs$mN z$-Z$WPr{{MMvgmzOwp1D60~C$@F-1S74K-|IC6kBOM$7hps`k^$tyJDGrQ7<^tt@{RjI!^!q diff --git a/src/plugins/welcome/images/qtaccount@2x.png b/src/plugins/welcome/images/qtaccount@2x.png deleted file mode 100644 index 96693c819536e1df50dde5fd337bdc3adb98b079..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(2=&z>%hAr_~TfAq8LE1Av3 zG2?5Eqgb*-()=mu49u;;H$>+=Om1M>xA}%hO=xNZ^Vj?c5uXGHrr-@47o5TtG_QQX zxygq4aWD^Sb)bmBo8ti+#6k~R@vyQ7ipm@dDBur0$jrm~|H#Crs{azJj71_HS*8_4 zw5&jxq=h6 z{pOz4blUQY{%;3z{*p>7%C#bz#_`Pz-z_0eUWdCB`6p?UHx3vIVCg!0Gb(Q A-T(jq diff --git a/src/plugins/welcome/images/settings.png b/src/plugins/welcome/images/settings.png deleted file mode 100644 index bc4d07a7414c6f6d455a5a171462b51c0bbe2ec5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)Rq%=dJ043P-W?Kk8)6d=O# zoQ1JEc)97cTNP)INZe3?cRfQ|Q+Sg;(Mh-TX_^m!0f3t=5evlCQwePi9)4ls$ zXSFm}Nj`agHszyGKIdaq^NT{4lJCzqiqMXlxNTMLsmRX6V}%kH6WTc(>>Kjl{9-hG zGKXzLx|~wfglhbHl_ir_)&sUu_+@6!x;dc;+i8=*ghs>T={vx#)$@!j<9^JH-!J zi%nc#T(e$#!E^RLxVmfI;m+_c?*&!-(<1T_xiJ0I^$-8MnQVKKWm3(LJiBqR#}7Q1Roa{2{W(o zbce|34I+&3N?#2kva2pP?sNX)!@i6!VHI;dU&3?Y{khpECh>`^QOs6$aZzJy@$pS# z=#k&LLLy)*bLxXb+fIr-s0;er#{J?(15d;5O*Kb#b~9|^`eCt+jZf_N=E(g5H~ze9 zZnMnTxis_k$Elf*W$$h|_05jqe#+%

    qHOh0!x(p~C7l=e#p*$0LEAKu#hub;6c V=iwutpjuGid%F6$taD0e0sz&ytMmW> diff --git a/src/plugins/welcome/images/userguide.png b/src/plugins/welcome/images/userguide.png deleted file mode 100644 index e23a4c891898c39151f6e28932315683f9d2fd69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4h9AW2CEqh_A)RqZ1Qw*43UszJ-F7(nUR6* z!r{Ffvv-@%U_H3&?(`4O4SU#9las53`ln6CC>kG;5D{q7mBn0MvJ zvr3s>*!kPKF^V_lnaGu22VQeun8Cnc+%2>%FP}>z+^A*l{P(#M?zfb0+;4vDtMYaQ m%c+lQ6ID)U28W)_nX2-?yvgs@+;&Z{FFalST-G@yGywo5cw7Pi diff --git a/src/plugins/welcome/images/userguide@2x.png b/src/plugins/welcome/images/userguide@2x.png deleted file mode 100644 index 709e79d5a1f6df2bda8e4fb4a5cead39e3b6b257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4h9AWhA=@@4F(3r37#&FArg|c2Mx1@6B&*_ zw7(SdW-dpTe(&DrUHW6tScm)gIfWuxuuQ$^3CB$PI8H(A8E z^Qj)^#mloUC|)(QRr+@By1-F2Lq^?rXHjN{4d#lEpUj>9Rz8|v|HKM6g@{Roh0~Ax z>*@&=xUKw3yH33{wpN|#$eJGa1GlA(c^7Cd?z39=>yBQI?DQ`@7HjSFugvPXw3(<;l8*!sGAYSUv8Epv0HHTA5qmJM&sui1j) N$kWx&Wt~$(699&;$R+>) diff --git a/src/plugins/welcome/welcome.qrc b/src/plugins/welcome/welcome.qrc index 70cf9cd9377..6734370f951 100644 --- a/src/plugins/welcome/welcome.qrc +++ b/src/plugins/welcome/welcome.qrc @@ -4,28 +4,12 @@ images/mode_welcome@2x.png images/mode_welcome_mask.png images/mode_welcome_mask@2x.png - images/blogs.png - images/blogs@2x.png - images/community.png - images/community@2x.png - images/open.png - images/open@2x.png images/project.png images/project@2x.png - images/qtaccount.png - images/qtaccount@2x.png images/session.png images/session@2x.png - images/userguide.png - images/userguide@2x.png - images/new.png - images/new@2x.png images/expandarrow.png images/expandarrow@2x.png images/border.png - images/download.png - images/download@2x.png - images/settings.png - images/settings@2x.png diff --git a/src/plugins/welcome/welcomeplugin.cpp b/src/plugins/welcome/welcomeplugin.cpp index fad1cf44d70..5299f36f6ce 100644 --- a/src/plugins/welcome/welcomeplugin.cpp +++ b/src/plugins/welcome/welcomeplugin.cpp @@ -34,11 +34,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -61,63 +63,69 @@ #include using namespace Core; +using namespace Core::WelcomePageHelpers; using namespace ExtensionSystem; using namespace Utils; namespace Welcome { namespace Internal { -class SideBar; +class TopArea; +class SideArea; +class BottomArea; -const int lrPadding = 34; const char currentPageSettingsKeyC[] = "Welcome2Tab"; +constexpr int buttonSpacing = 16; static QColor themeColor(Theme::Color role) { return Utils::creatorTheme()->color(role); } -static QFont sizedFont(int size, const QWidget *widget, bool underline = false) -{ - QFont f = widget->font(); - f.setPixelSize(size); - f.setUnderline(underline); - return f; -} - -static QPalette lightText() -{ - QPalette pal; - pal.setColor(QPalette::WindowText, themeColor(Theme::Welcome_ForegroundPrimaryColor)); - return pal; -} - static void addWeakVerticalSpacerToLayout(QVBoxLayout *layout, int maximumSize) { auto weakSpacer = new QWidget; weakSpacer->setMaximumHeight(maximumSize); + weakSpacer->setMinimumHeight(buttonSpacing); weakSpacer->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum); layout->addWidget(weakSpacer); layout->setStretchFactor(weakSpacer, 1); } -class WelcomeMode : public IMode +class ResizeSignallingWidget : public QWidget { Q_OBJECT + +public: + void resizeEvent(QResizeEvent *event); + +signals: + void resized(const QSize &size, const QSize &oldSize); +}; + +void ResizeSignallingWidget::resizeEvent(QResizeEvent *event) +{ + emit resized(event->size(), event->oldSize()); +} + +class WelcomeMode : public IMode +{ public: WelcomeMode(); ~WelcomeMode(); void initPlugins(); - Q_INVOKABLE bool openDroppedFiles(const QList &urls); + bool openDroppedFiles(const QList &urls); private: void addPage(IWelcomePage *page); - QWidget *m_modeWidget; + ResizeSignallingWidget *m_modeWidget; QStackedWidget *m_pageStack; - SideBar *m_sideBar; + TopArea *m_topArea; + SideArea *m_sideArea; + BottomArea *m_bottomArea; QList m_pluginList; QList m_pageButtons; Id m_activePage; @@ -165,145 +173,189 @@ public: WelcomeMode *m_welcomeMode = nullptr; }; -class IconAndLink : public QWidget -{ -public: - IconAndLink(const QString &iconSource, - const QString &title, - const QString &openUrl, - QWidget *parent) - : QWidget(parent), m_iconSource(iconSource), m_title(title), m_openUrl(openUrl) - { - setAutoFillBackground(true); - setMinimumHeight(35); - setToolTip(m_openUrl); - - const QString fileName = QString(":/welcome/images/%1.png").arg(iconSource); - const Icon icon({{FilePath::fromString(fileName), Theme::Welcome_ForegroundPrimaryColor}}, - Icon::Tint); - - m_icon = new QLabel; - m_icon->setPixmap(icon.pixmap()); - - m_label = new QLabel(title); - m_label->setFont(sizedFont(11, m_label, false)); - - auto layout = new QHBoxLayout; - layout->setContentsMargins(lrPadding, 0, lrPadding, 0); - layout->addWidget(m_icon); - layout->addSpacing(2); - layout->addWidget(m_label); - layout->addStretch(1); - setLayout(layout); - } - - void enterEvent(EnterEvent *) override - { - QPalette pal; - pal.setColor(QPalette::Window, themeColor(Theme::Welcome_HoverColor)); - setPalette(pal); - m_label->setFont(sizedFont(11, m_label, true)); - update(); - } - - void leaveEvent(QEvent *) override - { - QPalette pal; - pal.setColor(QPalette::Window, themeColor(Theme::Welcome_BackgroundColor)); - setPalette(pal); - m_label->setFont(sizedFont(11, m_label, false)); - update(); - } - - void mousePressEvent(QMouseEvent *) override - { - QDesktopServices::openUrl(m_openUrl); - } - - QString m_iconSource; - QString m_title; - const QString m_openUrl; - - QLabel *m_icon; - QLabel *m_label; -}; - -class SideBar : public QWidget +class TopArea : public QWidget { Q_OBJECT + public: - SideBar(QWidget *parent) + TopArea(QWidget *parent = nullptr) : QWidget(parent) { setAutoFillBackground(true); + setMinimumHeight(11); // For compact state setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - setPalette(themeColor(Theme::Welcome_BackgroundColor)); + setPalette(themeColor(Theme::Welcome_BackgroundPrimaryColor)); - auto vbox = new QVBoxLayout(this); - vbox->setSpacing(0); - vbox->setContentsMargins(0, 27, 0, 0); + m_title = new QWidget; + + auto hbox = new QHBoxLayout(m_title); + hbox->setSpacing(0); + hbox->setContentsMargins(HSpacing - 5, 2, 0, 2); { - auto l = m_pluginButtons = new QVBoxLayout; - l->setContentsMargins(lrPadding, 0, lrPadding, 0); - l->setSpacing(19); - vbox->addItem(l); + auto ideIconLabel = new QLabel; + const QPixmap logo = Core::Icons::QTCREATORLOGO_BIG.pixmap(); + ideIconLabel->setPixmap(logo.scaled(logo.size() * 0.6, Qt::IgnoreAspectRatio, + Qt::SmoothTransformation)); + hbox->addWidget(ideIconLabel, 0); + + hbox->addSpacing(16); + + QFont welcomeFont = brandFont(); + welcomeFont.setPixelSize(30); + welcomeFont.setWeight(QFont::Light); + welcomeFont.setWordSpacing(2); + + auto welcomeLabel = new QLabel("Welcome to"); + welcomeLabel->setFont(welcomeFont); + hbox->addWidget(welcomeLabel, 0); + + hbox->addSpacing(8); + + auto ideNameLabel = new QLabel(Core::Constants::IDE_DISPLAY_NAME); + ideNameLabel->setFont(welcomeFont); + ideNameLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); + QPalette pal = palette(); + pal.setColor(QPalette::WindowText, themeColor(Theme::Welcome_AccentColor)); + ideNameLabel->setPalette(pal); + hbox->addWidget(ideNameLabel, 1); } - addWeakVerticalSpacerToLayout(vbox, 62); + auto mainLayout = new QHBoxLayout(this); + mainLayout->setContentsMargins(0, 0, 0, 0); + mainLayout->addWidget(m_title); + } + + void setCompact(bool compact) + { + m_title->setVisible(!compact); + } + +private: + QWidget *m_title; +}; + +class SideArea : public QScrollArea +{ + Q_OBJECT + +public: + SideArea(QWidget *parent = nullptr) + : QScrollArea(parent) + { + setWidgetResizable(true); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setFrameShape(QFrame::NoFrame); + setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Ignored); + + auto mainWidget = new QWidget(this); + mainWidget->setAutoFillBackground(true); + mainWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + mainWidget->setPalette(themeColor(Theme::Welcome_BackgroundPrimaryColor)); + + auto vbox = new QVBoxLayout(mainWidget); + vbox->setSpacing(0); + vbox->setContentsMargins(HSpacing, 0, HSpacing, 0); { - auto l = new QVBoxLayout; - l->setContentsMargins(lrPadding, 0, lrPadding, 0); - l->setSpacing(12); + auto projectVBox = new QVBoxLayout; + projectVBox->setSpacing(buttonSpacing); + auto newButton = new WelcomePageButton(mainWidget); + newButton->setText(tr("Create Project...")); + newButton->setWithAccentColor(true); + newButton->setOnClicked([] { + QAction *openAction = ActionManager::command(Core::Constants::NEW)->action(); + openAction->trigger(); + }); + + auto openButton = new WelcomePageButton(mainWidget); + openButton->setText(tr("Open Project...")); + openButton->setWithAccentColor(true); + openButton->setOnClicked([] { + QAction *openAction = ActionManager::command(Core::Constants::OPEN)->action(); + openAction->trigger(); + }); + + projectVBox->addWidget(newButton); + projectVBox->addWidget(openButton); + vbox->addItem(projectVBox); + } + + addWeakVerticalSpacerToLayout(vbox, 34); + + { + auto newVBox = new QVBoxLayout; + newVBox->setSpacing(buttonSpacing / 3); + vbox->addItem(newVBox); auto newLabel = new QLabel(tr("New to Qt?"), this); - newLabel->setFont(sizedFont(18, this)); - l->addWidget(newLabel); + newLabel->setFont(brandFont()); + newLabel->setAlignment(Qt::AlignHCenter); + newVBox->addWidget(newLabel); - auto learnLabel = new QLabel(tr("Learn how to develop your own applications " - "and explore %1.") - .arg(Core::Constants::IDE_DISPLAY_NAME), this); - learnLabel->setMaximumWidth(200); - learnLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - learnLabel->setWordWrap(true); - learnLabel->setFont(sizedFont(12, this)); - learnLabel->setPalette(lightText()); - l->addWidget(learnLabel); - - l->addSpacing(8); - - auto getStartedButton = new WelcomePageButton(this); - getStartedButton->setText(tr("Get Started Now")); + auto getStartedButton = new WelcomePageButton(mainWidget); + getStartedButton->setText(tr("Get Started")); getStartedButton->setOnClicked([] { QDesktopServices::openUrl( QString("qthelp://org.qt-project.qtcreator/doc/creator-getting-started.html")); }); - l->addWidget(getStartedButton); + newVBox->addWidget(getStartedButton); + } + addWeakVerticalSpacerToLayout(vbox, 56); + + { + auto l = m_pluginButtons = new QVBoxLayout; + l->setSpacing(buttonSpacing); vbox->addItem(l); } vbox->addStretch(1); - { - auto l = new QVBoxLayout; - l->setContentsMargins(0, 0, 0, 0); - l->addWidget(new IconAndLink("download", tr("Get Qt"), "https://www.qt.io/download", this)); - l->addWidget(new IconAndLink("qtaccount", tr("Qt Account"), "https://account.qt.io", this)); - l->addWidget(new IconAndLink("community", tr("Online Community"), "https://forum.qt.io", this)); - l->addWidget(new IconAndLink("blogs", tr("Blogs"), "https://planet.qt.io", this)); - l->addWidget(new IconAndLink("userguide", tr("User Guide"), - "qthelp://org.qt-project.qtcreator/doc/index.html", this)); - vbox->addItem(l); - } - - addWeakVerticalSpacerToLayout(vbox, vbox->contentsMargins().top()); + setWidget(mainWidget); } QVBoxLayout *m_pluginButtons = nullptr; }; +class BottomArea : public QWidget +{ + Q_OBJECT + +public: + BottomArea(QWidget *parent = nullptr) + : QWidget(parent) + { + setAutoFillBackground(true); + setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + setPalette(themeColor(Theme::Welcome_BackgroundPrimaryColor)); + + auto hbox = new QHBoxLayout(this); + hbox->setSpacing(0); + hbox->setContentsMargins(0, 2 * ItemGap, HSpacing, 2 * ItemGap); + + const QList > links { + { tr("Get Qt"), "https://www.qt.io/download" }, + { tr("Qt Account"), "https://account.qt.io" }, + { tr("Online Community"), "https://forum.qt.io" }, + { tr("Blogs"), "https://planet.qt.io" }, + { tr("User Guide"), "qthelp://org.qt-project.qtcreator/doc/index.html" }, + }; + for (const QPair &link : links) { + auto button = new WelcomePageButton(this); + button->setSize(WelcomePageButton::SizeSmall); + button->setText(link.first); + button->setOnClicked([link]{ QDesktopServices::openUrl(link.second); }); + button->setWithAccentColor(true); + button->setMaximumWidth(220); + button->setToolTip(link.second); + if (hbox->count() > 0) + hbox->addStretch(1); + hbox->addWidget(button, 20); + } + } +}; + WelcomeMode::WelcomeMode() { setDisplayName(tr("Welcome")); @@ -321,39 +373,42 @@ WelcomeMode::WelcomeMode() setContext(Context(Constants::C_WELCOME_MODE)); QPalette palette = creatorTheme()->palette(); - palette.setColor(QPalette::Window, themeColor(Theme::Welcome_BackgroundColor)); + palette.setColor(QPalette::Window, themeColor(Theme::Welcome_BackgroundPrimaryColor)); - m_modeWidget = new QWidget; + m_modeWidget = new ResizeSignallingWidget; m_modeWidget->setPalette(palette); + connect(m_modeWidget, &ResizeSignallingWidget::resized, + [this](const QSize &size, const QSize &) { + const bool hideSideArea = size.width() <= 750; + const bool hideBottomArea = size.width() <= 850; + const bool compactVertically = size.height() <= 530; + QTimer::singleShot(0, [this, hideSideArea, hideBottomArea, compactVertically]() { + m_sideArea->setVisible(!hideSideArea); + m_bottomArea->setVisible(!(hideBottomArea || compactVertically)); + m_topArea->setCompact(compactVertically); + }); + }); - m_sideBar = new SideBar(m_modeWidget); - auto scrollableSideBar = new QScrollArea(m_modeWidget); - scrollableSideBar->setWidget(m_sideBar); - scrollableSideBar->setWidgetResizable(true); - scrollableSideBar->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - scrollableSideBar->setFrameShape(QFrame::NoFrame); - - auto divider = new QWidget(m_modeWidget); - divider->setMaximumWidth(1); - divider->setMinimumWidth(1); - divider->setAutoFillBackground(true); - divider->setPalette(themeColor(Theme::Welcome_DividerColor)); + m_sideArea = new SideArea(m_modeWidget); m_pageStack = new QStackedWidget(m_modeWidget); + palette.setColor(QPalette::Window, themeColor(Theme::Welcome_BackgroundSecondaryColor)); + m_pageStack->setPalette(palette); m_pageStack->setObjectName("WelcomeScreenStackedWidget"); m_pageStack->setAutoFillBackground(true); - auto hbox = new QHBoxLayout; - hbox->addWidget(scrollableSideBar); - hbox->addWidget(divider); - hbox->addWidget(m_pageStack); - hbox->setStretchFactor(m_pageStack, 10); + m_topArea = new TopArea; + m_bottomArea = new BottomArea; - auto layout = new QVBoxLayout(m_modeWidget); + auto layout = new QGridLayout(m_modeWidget); + layout->addWidget(new StyledBar(m_modeWidget), 0, 0, 1, 2); + layout->addWidget(m_topArea, 1, 0, 1, 2); + layout->addWidget(m_sideArea, 2, 0, 2, 1); + layout->addWidget(m_pageStack, 2, 1, 1, 1); + layout->setColumnStretch(1, 10); + layout->addWidget(m_bottomArea, 3, 1, 1, 1); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); - layout->addWidget(new StyledBar(m_modeWidget)); - layout->addItem(hbox); setWidget(m_modeWidget); } @@ -388,15 +443,6 @@ void WelcomeMode::initPlugins() bool WelcomeMode::openDroppedFiles(const QList &urls) { -// DropArea { -// anchors.fill: parent -// keys: ["text/uri-list"] -// onDropped: { -// if ((drop.supportedActions & Qt.CopyAction != 0) -// && welcomeMode.openDroppedFiles(drop.urls)) -// drop.accept(Qt.CopyAction); -// } -// } const QList localUrls = Utils::filtered(urls, &QUrl::isLocalFile); if (!localUrls.isEmpty()) { QTimer::singleShot(0, [localUrls]() { @@ -415,7 +461,7 @@ void WelcomeMode::addPage(IWelcomePage *page) if (m_pluginList.at(idx)->priority() >= pagePriority) break; } - auto pageButton = new WelcomePageButton(m_sideBar); + auto pageButton = new WelcomePageButton(m_sideArea); auto pageId = page->id(); pageButton->setText(page->title()); pageButton->setActiveChecker([this, pageId] { return m_activePage == pageId; }); @@ -423,7 +469,7 @@ void WelcomeMode::addPage(IWelcomePage *page) m_pluginList.insert(idx, page); m_pageButtons.insert(idx, pageButton); - m_sideBar->m_pluginButtons->insertWidget(idx, pageButton); + m_sideArea->m_pluginButtons->insertWidget(idx, pageButton); QWidget *stackPage = page->createWidget(); stackPage->setAutoFillBackground(true); diff --git a/src/tools/icons/qtcreatoricons.svg b/src/tools/icons/qtcreatoricons.svg index b6a0ca33613..9b50c8beee5 100644 --- a/src/tools/icons/qtcreatoricons.svg +++ b/src/tools/icons/qtcreatoricons.svg @@ -502,7 +502,7 @@ xlink:href="#linear-gradient-7" id="linearGradient2898" gradientUnits="userSpaceOnUse" - gradientTransform="matrix(75,0,0,-75,14430,8326)" + gradientTransform="matrix(75,0,0,-75,14430,8329)" x1="-190.82001" y1="109.69" x2="-191.87" @@ -516,7 +516,8 @@ fx="548.5" fy="91.5" r="18.5" - gradientUnits="userSpaceOnUse" /> + gradientUnits="userSpaceOnUse" + gradientTransform="translate(112,18)" /> + id="src/plugins/qtsupport/images/icons/videotutorialicon" + transform="translate(0,-32)"> + transform="translate(214,-32)"> + transform="translate(428,-32)"> + x="642" + y="91" /> - - - - - - - - - @@ -6646,131 +6608,6 @@ points="308,215 314,215 314,223 302,223 302,213 306,213 " style="fill:#000000;fill-opacity:1" /> - - - - - - - - - - - - - - - - - - - - - - - - - - -