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 <eike.ziller@qt.io>
This commit is contained in:
Alessandro Portale
2021-11-29 20:48:43 +01:00
parent 03e4548d24
commit 196aee97b1
43 changed files with 626 additions and 664 deletions

View File

@@ -303,13 +303,13 @@ Debugger_WatchItem_ValueChanged=ffff6666
Debugger_Breakpoint_TextMarkColor=ffff4040 Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=text Welcome_TextColor=text
Welcome_ForegroundPrimaryColor=ff999999 Welcome_ForegroundPrimaryColor=ffa3a3a3
Welcome_ForegroundSecondaryColor=ff808080 Welcome_ForegroundSecondaryColor=ff808080
Welcome_BackgroundColor=normalBackground Welcome_BackgroundPrimaryColor=normalBackground
Welcome_ButtonBackgroundColor=normalBackground Welcome_BackgroundSecondaryColor=shadowBackground
Welcome_DividerColor=ff555555 Welcome_HoverColor=ff404040
Welcome_HoverColor=ff444444 Welcome_AccentColor=ff57d658
Welcome_LinkColor=ff78bb39 Welcome_LinkColor=ff67e668
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=text Timeline_TextColor=text

View File

@@ -293,13 +293,13 @@ Debugger_WatchItem_ValueChanged=ffc80000
Debugger_Breakpoint_TextMarkColor=ffff4040 Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=ff000000 Welcome_TextColor=ff000000
Welcome_ForegroundPrimaryColor=ff555759 Welcome_ForegroundPrimaryColor=shadowBackground
Welcome_ForegroundSecondaryColor=ff727476 Welcome_ForegroundSecondaryColor=ff939393
Welcome_BackgroundColor=fff8f8f8 Welcome_BackgroundPrimaryColor=fffafafa
Welcome_ButtonBackgroundColor=ffdfdfdf Welcome_BackgroundSecondaryColor=ffffffff
Welcome_DividerColor=ffd6d6d6 Welcome_HoverColor=ffefefef
Welcome_HoverColor=ffe8e8e8 Welcome_AccentColor=ff45ce55
Welcome_LinkColor=ff5caa15 Welcome_LinkColor=ff20a020
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=darkText Timeline_TextColor=darkText

View File

@@ -308,13 +308,13 @@ Debugger_WatchItem_ValueChanged=ffbf0303
Debugger_Breakpoint_TextMarkColor=ffff4040 Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=ff000000 Welcome_TextColor=ff000000
Welcome_ForegroundPrimaryColor=ff404244 Welcome_ForegroundPrimaryColor=ff404040
Welcome_ForegroundSecondaryColor=ff727476 Welcome_ForegroundSecondaryColor=ff727272
Welcome_BackgroundColor=normalBackground Welcome_BackgroundPrimaryColor=ffeaeaea
Welcome_ButtonBackgroundColor=normalBackground Welcome_BackgroundSecondaryColor=ffefefef
Welcome_DividerColor=ffd6d6d6 Welcome_HoverColor=ffe1e1e1
Welcome_HoverColor=fff6f6f6 Welcome_AccentColor=ff25709a
Welcome_LinkColor=ff5caa15 Welcome_LinkColor=ff104090
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=text Timeline_TextColor=text

View File

@@ -305,13 +305,13 @@ Debugger_WatchItem_ValueChanged=ffff6666
Debugger_Breakpoint_TextMarkColor=ffff4040 Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=text Welcome_TextColor=text
Welcome_ForegroundPrimaryColor=ff999999 Welcome_ForegroundPrimaryColor=ffa3a3a3
Welcome_ForegroundSecondaryColor=ff808080 Welcome_ForegroundSecondaryColor=ff808080
Welcome_BackgroundColor=normalBackground Welcome_BackgroundPrimaryColor=ff242424
Welcome_ButtonBackgroundColor=normalBackground Welcome_BackgroundSecondaryColor=ff1c1c1c
Welcome_DividerColor=ff555555 Welcome_HoverColor=ff2b2a2a
Welcome_HoverColor=ff444444 Welcome_AccentColor=ff3f8ccc
Welcome_LinkColor=ff7fc63c Welcome_LinkColor=ff5fafef
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=text Timeline_TextColor=text

View File

@@ -309,11 +309,11 @@ Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=text Welcome_TextColor=text
Welcome_ForegroundPrimaryColor=ff999999 Welcome_ForegroundPrimaryColor=ff999999
Welcome_ForegroundSecondaryColor=ff808080 Welcome_ForegroundSecondaryColor=ff808080
Welcome_BackgroundColor=normalBackground Welcome_BackgroundPrimaryColor=normalBackground
Welcome_ButtonBackgroundColor=normalBackground Welcome_BackgroundSecondaryColor=ff242628
Welcome_DividerColor=ff555555 Welcome_HoverColor=ff404243
Welcome_HoverColor=ff444444 Welcome_AccentColor=ff36c148
Welcome_LinkColor=ff7fc63c Welcome_LinkColor=ff5fcf4f
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=text Timeline_TextColor=text

View File

@@ -303,13 +303,13 @@ Debugger_WatchItem_ValueChanged=ffbf0303
Debugger_Breakpoint_TextMarkColor=ffff4040 Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=ff000000 Welcome_TextColor=ff000000
Welcome_ForegroundPrimaryColor=ff404244 Welcome_ForegroundPrimaryColor=ff232323
Welcome_ForegroundSecondaryColor=ff727476 Welcome_ForegroundSecondaryColor=ff939393
Welcome_BackgroundColor=normalBackground Welcome_BackgroundPrimaryColor=fffafafa
Welcome_ButtonBackgroundColor=normalBackground Welcome_BackgroundSecondaryColor=ffffffff
Welcome_DividerColor=ffd6d6d6 Welcome_HoverColor=ffefefef
Welcome_HoverColor=fff6f6f6 Welcome_AccentColor=ff45ce55
Welcome_LinkColor=ff5caa15 Welcome_LinkColor=ff20a020
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=text Timeline_TextColor=text

View File

@@ -302,12 +302,12 @@ Debugger_Breakpoint_TextMarkColor=ffff4040
Welcome_TextColor=ff000000 Welcome_TextColor=ff000000
Welcome_ForegroundPrimaryColor=shadowBackground Welcome_ForegroundPrimaryColor=shadowBackground
Welcome_ForegroundSecondaryColor=ff727476 Welcome_ForegroundSecondaryColor=ff939393
Welcome_BackgroundColor=normalBackground Welcome_BackgroundPrimaryColor=fffafafa
Welcome_ButtonBackgroundColor=normalBackground Welcome_BackgroundSecondaryColor=ffffffff
Welcome_DividerColor=ffd6d6d6 Welcome_HoverColor=ffefefef
Welcome_HoverColor=fff6f6f6 Welcome_AccentColor=ff45ce55
Welcome_LinkColor=ff5caa15 Welcome_LinkColor=ff20a020
Welcome_DisabledLinkColor=textDisabled Welcome_DisabledLinkColor=textDisabled
Timeline_TextColor=text Timeline_TextColor=text

View File

@@ -249,11 +249,11 @@ public:
Welcome_TextColor, Welcome_TextColor,
Welcome_ForegroundPrimaryColor, Welcome_ForegroundPrimaryColor,
Welcome_ForegroundSecondaryColor, Welcome_ForegroundSecondaryColor,
Welcome_BackgroundColor, Welcome_BackgroundPrimaryColor,
Welcome_ButtonBackgroundColor, Welcome_BackgroundSecondaryColor,
Welcome_DividerColor,
Welcome_LinkColor,
Welcome_HoverColor, Welcome_HoverColor,
Welcome_AccentColor,
Welcome_LinkColor,
Welcome_DisabledLinkColor, Welcome_DisabledLinkColor,
/* Timeline Library */ /* Timeline Library */

View File

@@ -205,5 +205,19 @@ if ((NOT WIN32) AND (NOT APPLE))
endforeach() endforeach()
endif() 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 # transitional qmake plugin build support
qtc_add_public_header(coreplugin_dependencies.pri) qtc_add_public_header(coreplugin_dependencies.pri)

View File

@@ -178,6 +178,12 @@ Project {
] ]
} }
Group {
name: "studiofonts"
prefix: "../../share/3rdparty/studiofonts/"
files: "studiofonts.qrc"
}
Group { Group {
name: "Action Manager" name: "Action Manager"
prefix: "actionmanager/" prefix: "actionmanager/"

View File

@@ -26,6 +26,7 @@
#include "iwelcomepage.h" #include "iwelcomepage.h"
#include "icore.h" #include "icore.h"
#include "welcomepagehelper.h"
#include <utils/icon.h> #include <utils/icon.h>
#include <utils/theme/theme.h> #include <utils/theme/theme.h>
@@ -33,13 +34,18 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QPainter> #include <QPainter>
#include <QPainterPath>
#include <QPixmap> #include <QPixmap>
#include <QUrl> #include <QUrl>
#include <qdrawutil.h>
using namespace Utils; using namespace Utils;
namespace Core { namespace Core {
const char WITHACCENTCOLOR_PROPERTY_NAME[] = "_withAccentColor";
static QList<IWelcomePage *> g_welcomePages; static QList<IWelcomePage *> g_welcomePages;
const QList<IWelcomePage *> IWelcomePage::allWelcomePages() const QList<IWelcomePage *> IWelcomePage::allWelcomePages()
@@ -64,10 +70,10 @@ QPalette WelcomePageFrame::buttonPalette(bool isActive, bool isCursorInside, boo
if (isActive) { if (isActive) {
if (forText) { if (forText) {
pal.setColor(QPalette::Window, theme->color(Theme::Welcome_ForegroundPrimaryColor)); 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 { } else {
pal.setColor(QPalette::Window, theme->color(Theme::Welcome_ForegroundPrimaryColor)); pal.setColor(QPalette::Window, theme->color(Theme::Welcome_AccentColor));
pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_ForegroundPrimaryColor)); pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_AccentColor));
} }
} else { } else {
if (isCursorInside) { 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::Window, theme->color(Theme::Welcome_ForegroundPrimaryColor));
pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_TextColor)); pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_TextColor));
} else { } 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)); pal.setColor(QPalette::WindowText, theme->color(Theme::Welcome_ForegroundSecondaryColor));
} }
} }
@@ -100,27 +106,28 @@ WelcomePageFrame::WelcomePageFrame(QWidget *parent)
void WelcomePageFrame::paintEvent(QPaintEvent *event) void WelcomePageFrame::paintEvent(QPaintEvent *event)
{ {
QWidget::paintEvent(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); 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 class WelcomePageButtonPrivate
{ {
public: public:
WelcomePageButtonPrivate(WelcomePageButton *parent) : q(parent) {} explicit WelcomePageButtonPrivate(WelcomePageButton *parent)
: q(parent) {}
bool isActive() const; bool isActive() const;
void doUpdate(bool cursorInside); void doUpdate(bool cursorInside);
WelcomePageButton *q; WelcomePageButton *q;
QHBoxLayout *m_layout = nullptr; QHBoxLayout *m_layout = nullptr;
QLabel *m_label = nullptr; QLabel *m_label = nullptr;
QLabel *m_icon = nullptr;
std::function<void()> onClicked; std::function<void()> onClicked;
std::function<bool()> activeChecker; std::function<bool()> activeChecker;
@@ -131,17 +138,16 @@ WelcomePageButton::WelcomePageButton(QWidget *parent)
{ {
setAutoFillBackground(true); setAutoFillBackground(true);
setPalette(buttonPalette(false, false, false)); 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 = new QLabel(this);
d->m_label->setFont(f);
d->m_label->setPalette(buttonPalette(false, false, true)); d->m_label->setPalette(buttonPalette(false, false, true));
d->m_label->setAlignment(Qt::AlignCenter);
d->m_layout = new QHBoxLayout; d->m_layout = new QHBoxLayout;
d->m_layout->setContentsMargins(13, 5, 20, 5);
d->m_layout->setSpacing(0); d->m_layout->setSpacing(0);
d->m_layout->addWidget(d->m_label); d->m_layout->addWidget(d->m_label);
setSize(SizeLarge);
setLayout(d->m_layout); setLayout(d->m_layout);
} }
@@ -177,8 +183,6 @@ void WelcomePageButtonPrivate::doUpdate(bool cursorInside)
q->setPalette(WelcomePageFrame::buttonPalette(active, cursorInside, false)); q->setPalette(WelcomePageFrame::buttonPalette(active, cursorInside, false));
const QPalette lpal = WelcomePageFrame::buttonPalette(active, cursorInside, true); const QPalette lpal = WelcomePageFrame::buttonPalette(active, cursorInside, true);
m_label->setPalette(lpal); m_label->setPalette(lpal);
if (m_icon)
m_icon->setPalette(lpal);
q->update(); q->update();
} }
@@ -187,14 +191,17 @@ void WelcomePageButton::setText(const QString &text)
d->m_label->setText(text); d->m_label->setText(text);
} }
void WelcomePageButton::setIcon(const QPixmap &pixmap) void WelcomePageButton::setSize(Size size)
{ {
if (!d->m_icon) { const int hMargin = size == SizeSmall ? 12 : 26;
d->m_icon = new QLabel(this); const int vMargin = size == SizeSmall ? 2 : 4;
d->m_layout->insertWidget(0, d->m_icon); d->m_layout->setContentsMargins(hMargin, vMargin, hMargin, vMargin);
d->m_layout->insertSpacing(1, 10); d->m_label->setFont(size == SizeSmall ? font() : WelcomePageHelpers::brandFont());
} }
d->m_icon->setPixmap(pixmap);
void WelcomePageButton::setWithAccentColor(bool withAccent)
{
setProperty(WITHACCENTCOLOR_PROPERTY_NAME, withAccent);
} }
void WelcomePageButton::setActiveChecker(const std::function<bool ()> &value) void WelcomePageButton::setActiveChecker(const std::function<bool ()> &value)

View File

@@ -75,6 +75,11 @@ public:
class CORE_EXPORT WelcomePageButton : public WelcomePageFrame class CORE_EXPORT WelcomePageButton : public WelcomePageFrame
{ {
public: public:
enum Size {
SizeSmall,
SizeLarge,
};
WelcomePageButton(QWidget *parent); WelcomePageButton(QWidget *parent);
~WelcomePageButton() override; ~WelcomePageButton() override;
@@ -83,7 +88,8 @@ public:
void leaveEvent(QEvent *) override; void leaveEvent(QEvent *) override;
void setText(const QString &text); void setText(const QString &text);
void setIcon(const QPixmap &pixmap); void setSize(enum Size);
void setWithAccentColor(bool withAccent);
void setOnClicked(const std::function<void ()> &value); void setOnClicked(const std::function<void ()> &value);
void setActiveChecker(const std::function<bool ()> &value); void setActiveChecker(const std::function<bool ()> &value);
void recheckActive(); void recheckActive();

View File

@@ -28,9 +28,11 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fancylineedit.h> #include <utils/fancylineedit.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/stylehelper.h>
#include <utils/theme/theme.h> #include <utils/theme/theme.h>
#include <QEasingCurve> #include <QEasingCurve>
#include <QFontDatabase>
#include <QHeaderView> #include <QHeaderView>
#include <QHoverEvent> #include <QHoverEvent>
#include <QLayout> #include <QLayout>
@@ -57,23 +59,58 @@ static QFont sizedFont(int size, const QWidget *widget)
return f; 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) SearchBox::SearchBox(QWidget *parent)
: WelcomePageFrame(parent) : WelcomePageFrame(parent)
{ {
QPalette pal = buttonPalette(false, false, true); setAutoFillBackground(true);
pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundColor));
// for macOS dark mode
pal.setColor(QPalette::Text, themeColor(Theme::Welcome_TextColor));
setPalette(pal);
m_lineEdit = new FancyLineEdit; m_lineEdit = new FancyLineEdit;
m_lineEdit->setFiltering(true); m_lineEdit->setFiltering(true);
m_lineEdit->setFrame(false); 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); 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); auto box = new QHBoxLayout(this);
box->setContentsMargins(10, 3, 3, 3); box->setContentsMargins(10, 0, 1, 0);
box->addWidget(m_lineEdit); box->addWidget(m_lineEdit);
} }
@@ -89,7 +126,7 @@ GridView::GridView(QWidget *parent)
setUniformItemSizes(true); setUniformItemSizes(true);
QPalette pal; 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. setPalette(pal); // Makes a difference on Mac.
} }
@@ -99,7 +136,7 @@ void GridView::leaveEvent(QEvent *)
viewportEvent(&hev); // Seemingly needed to kill the hover paint. 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) ListModel::ListModel(QObject *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
@@ -223,7 +260,7 @@ struct SearchStringLexer
inline void yyinp() { yychar = *codePtr++; } inline void yyinp() { yychar = *codePtr++; }
SearchStringLexer(const QString &code) explicit SearchStringLexer(const QString &code)
: code(code) : code(code)
, codePtr(code.unicode()) , codePtr(code.unicode())
, yychar(QLatin1Char(' ')) { } , yychar(QLatin1Char(' ')) { }
@@ -327,11 +364,12 @@ bool ListModelFilter::leaveFilterAcceptsRowBeforeFiltering(const ListItem *, boo
} }
ListItemDelegate::ListItemDelegate() 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, 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<Core::ListItem *>(); const ListItem *item = index.data(ListModel::ItemRole).value<Core::ListItem *>();
// Quick hack for empty items in the last row.
if (!item)
return;
const QRect rc = option.rect; 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 bool hovered = option.state & QStyle::State_MouseOver;
const int tagsBase = TagsSeparatorY + 10; constexpr int tagsBase = TagsSeparatorY + 17;
const int shiftY = TagsSeparatorY - 20; constexpr int shiftY = TagsSeparatorY - 16;
const int nameY = TagsSeparatorY - 20; 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; QTextOption wrapped;
wrapped.setWrapMode(QTextOption::WordWrap); wrapped.setWrapMode(QTextOption::WordWrap);
@@ -365,121 +404,135 @@ void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti
if (hovered) { if (hovered) {
if (index != m_previousIndex) { if (index != m_previousIndex) {
m_previousIndex = index; m_previousIndex = index;
m_blurredThumbnail = QPixmap();
m_startTime.start(); m_startTime.start();
m_currentArea = rc; m_currentArea = rc;
m_currentWidget = qobject_cast<QAbstractItemView *>( m_currentWidget = qobject_cast<QAbstractItemView *>(
const_cast<QWidget *>(option.widget)); const_cast<QWidget *>(option.widget));
} }
animationProgress = m_startTime.elapsed() / 200.0; // Duration 200 ms. constexpr float hoverAnimationDuration = 260;
static const QEasingCurve animationCurve(QEasingCurve::OutQuad); animationProgress = m_startTime.elapsed() / hoverAnimationDuration;
static const QEasingCurve animationCurve(QEasingCurve::OutCubic);
offset = animationCurve.valueForProgress(animationProgress) * shiftY; offset = animationCurve.valueForProgress(animationProgress) * shiftY;
if (offset < shiftY) if (offset < shiftY)
QTimer::singleShot(10, this, &ListItemDelegate::goon); QTimer::singleShot(10, this, &ListItemDelegate::goon);
else if (offset > shiftY)
offset = shiftY;
} else { } else {
m_previousIndex = QModelIndex(); m_previousIndex = QModelIndex();
} }
const QFontMetrics fm(option.widget->font());
const QRect shiftedTextRect = textRect.adjusted(0, -offset, 0, -offset); const QRect shiftedTextRect = textRect.adjusted(0, -offset, 0, -offset);
// The pixmap. // The pixmap.
if (offset < shiftY) { const QPixmap pm = index.data(ListModel::ItemImageRole).value<QPixmap>();
QPixmap pm = index.data(ListModel::ItemImageRole).value<QPixmap>(); QPoint thumbnailPos = thumbnailBgRect.center();
QRect inner(x + 11, y, ListModel::defaultImageSize.width(), if (!pm.isNull()) {
ListModel::defaultImageSize.height()); painter->fillRect(thumbnailBgRect, backgroundSecondaryColor);
QRect pixmapRect = inner;
if (!pm.isNull()) {
painter->setPen(foregroundColor2);
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(); painter->setPen(foregroundPrimaryColor);
pixmapPos.rx() -= pm.width() / pm.devicePixelRatio() / 2; drawPixmapOverlay(item, painter, option, thumbnailBgRect);
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);
} else { } else {
nameRect = QRect(x, y + nameY, x + w, y + nameY + 20); // The description text as fallback.
QString elidedName = fm.elidedText(item->name, Qt::ElideRight, w - 20); painter->setPen(textColor);
painter->drawText(nameRect, elidedName); 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) { if (offset) {
int ll = nameRect.bottom() + 5; // The title of the example
painter->setPen(lightColor); 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->setOpacity(animationProgress); // "fade in" separator line and description
painter->drawLine(x, ll, x + w, ll); painter->drawLine(line);
}
// The description text. // The description text.
if (offset) { const int dd = ll + 5;
int dd = nameRect.height() + 10; const QRect descRect = shiftedTextRect.adjusted(0, dd, 0, dd);
QRect descRect = shiftedTextRect.adjusted(0, dd, 0, dd); painter->setPen(textColor);
painter->setPen(foregroundColor2);
painter->setFont(sizedFont(11, option.widget)); painter->setFont(sizedFont(11, option.widget));
painter->drawText(descRect, item->description, wrapped); painter->drawText(descRect, item->description, wrapped);
painter->setOpacity(1); 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 // Separator line between text and 'Tags:' section
painter->setPen(lightColor); painter->setPen(foregroundPrimaryColor);
painter->drawLine(x, y + TagsSeparatorY, x + w, y + TagsSeparatorY); painter->drawLine(QLineF(textArea.topLeft(), textArea.topRight())
.translated(0, TagsSeparatorY));
// The 'Tags:' section // The 'Tags:' section
const int tagsHeight = h - tagsBase; painter->setPen(foregroundPrimaryColor);
const QFont tagsFont = sizedFont(10, option.widget); 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->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)); painter->setPen(themeColor(Theme::Welcome_LinkColor));
m_currentTagRects.clear(); m_currentTagRects.clear();
int xx = 0; int xx = 0;
int yy = y + tagsBase; int yy = 0;
for (const QString &tag : item->tags) { for (const QString &tag : item->tags) {
const int ww = tagsFontMetrics.horizontalAdvance(tag) + 5; const int ww = fm.horizontalAdvance(tag) + tagsHorSpacing;
if (xx + ww > w - 30) { if (xx + ww > textArea.width() - tagsLabelRect.width()) {
yy += 15; yy += fm.lineSpacing();
xx = 0; 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); painter->drawText(tagRect, tag);
m_currentTagRects.append({ tag, tagRect }); m_currentTagRects.append({ tag, tagRect.translated(rc.topLeft()) });
xx += ww; xx += ww;
} }
// Box it when hovered. painter->restore();
if (hovered)
qDrawPlainRect(painter, rc, lightColor);
} }
bool ListItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, 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() void ListItemDelegate::goon()
{ {
if (m_currentWidget) if (m_currentWidget)

View File

@@ -40,10 +40,19 @@ namespace Utils { class FancyLineEdit; }
namespace Core { 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 class CORE_EXPORT SearchBox : public WelcomePageFrame
{ {
public: public:
SearchBox(QWidget *parent); explicit SearchBox(QWidget *parent);
Utils::FancyLineEdit *m_lineEdit = nullptr; Utils::FancyLineEdit *m_lineEdit = nullptr;
}; };
@@ -121,10 +130,10 @@ public:
void paint(QPainter *painter, const QStyleOptionViewItem &option, void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const override; const QModelIndex &index) const override;
static constexpr int GridItemWidth = 230; static constexpr int GridItemGap = 3 * WelcomePageHelpers::ItemGap;
static constexpr int GridItemHeight = 230; static constexpr int GridItemWidth = 240 + GridItemGap;
static constexpr int GridItemGap = 10; static constexpr int GridItemHeight = GridItemWidth;
static constexpr int TagsSeparatorY = GridItemHeight - 60; static constexpr int TagsSeparatorY = GridItemHeight - GridItemGap - 52;
signals: signals:
void tagClicked(const QString &tag); void tagClicked(const QString &tag);
@@ -138,14 +147,14 @@ protected:
const QStyleOptionViewItem &option, const QStyleOptionViewItem &option,
const QRect &currentPixmapRect) const; const QRect &currentPixmapRect) const;
virtual void clickAction(const ListItem *item) const; virtual void clickAction(const ListItem *item) const;
virtual void adjustPixmapRect(QRect *pixmapRect) const;
void goon(); void goon();
QColor lightColor; const QColor backgroundPrimaryColor;
QColor backgroundColor; const QColor backgroundSecondaryColor;
QColor foregroundColor1; const QColor foregroundPrimaryColor;
QColor foregroundColor2; const QColor hoverColor;
const QColor textColor;
private: private:
mutable QPersistentModelIndex m_previousIndex; mutable QPersistentModelIndex m_previousIndex;
@@ -153,6 +162,7 @@ private:
mutable QRect m_currentArea; mutable QRect m_currentArea;
mutable QPointer<QAbstractItemView> m_currentWidget; mutable QPointer<QAbstractItemView> m_currentWidget;
mutable QVector<QPair<QString, QRect>> m_currentTagRects; mutable QVector<QPair<QString, QRect>> m_currentTagRects;
mutable QPixmap m_blurredThumbnail;
}; };
} // namespace Core } // namespace Core

View File

@@ -157,6 +157,7 @@ SectionedProducts::SectionedProducts(QWidget *parent)
auto sectionedView = new QWidget; auto sectionedView = new QWidget;
auto layout = new QVBoxLayout; auto layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->addStretch(); layout->addStretch();
sectionedView->setLayout(layout); sectionedView->setLayout(layout);
area->setWidget(sectionedView); area->setWidget(sectionedView);
@@ -377,10 +378,9 @@ void SectionedProducts::addNewSection(const Section &section, const QList<Core::
m_productModels.insert(section, productModel); m_productModels.insert(section, productModel);
const auto it = m_gridViews.insert(section, gridView); const auto it = m_gridViews.insert(section, gridView);
QFont f = font();
f.setPixelSize(16);
auto sectionLabel = new QLabel(section.name); auto sectionLabel = new QLabel(section.name);
sectionLabel->setFont(f); sectionLabel->setContentsMargins(0, Core::WelcomePageHelpers::ItemGap, 0, 0);
sectionLabel->setFont(Core::WelcomePageHelpers::brandFont());
auto scrollArea = qobject_cast<QScrollArea *>(widget(0)); auto scrollArea = qobject_cast<QScrollArea *>(widget(0));
auto vbox = qobject_cast<QVBoxLayout *>(scrollArea->widget()->layout()); auto vbox = qobject_cast<QVBoxLayout *>(scrollArea->widget()->layout());

View File

@@ -65,27 +65,33 @@ class QtMarketplacePageWidget : public QWidget
public: public:
QtMarketplacePageWidget() QtMarketplacePageWidget()
{ {
const int sideMargin = 27;
auto searchBox = new Core::SearchBox(this); auto searchBox = new Core::SearchBox(this);
m_searcher = searchBox->m_lineEdit; m_searcher = searchBox->m_lineEdit;
m_searcher->setPlaceholderText(QtMarketplaceWelcomePage::tr("Search in Marketplace...")); m_searcher->setPlaceholderText(QtMarketplaceWelcomePage::tr("Search in Marketplace..."));
auto vbox = new QVBoxLayout(this); 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->addWidget(searchBox);
hbox->addSpacing(sideMargin); vbox->addWidget(searchBar);
vbox->addItem(hbox);
m_errorLabel = new QLabel(this); m_errorLabel = new QLabel(this);
m_errorLabel->setVisible(false); m_errorLabel->setVisible(false);
vbox->addWidget(m_errorLabel); 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); m_sectionedProducts = new SectionedProducts(this);
auto progressIndicator = new Utils::ProgressIndicator(ProgressIndicatorSize::Large, this); auto progressIndicator = new Utils::ProgressIndicator(ProgressIndicatorSize::Large, this);
progressIndicator->attachToWidget(m_sectionedProducts); progressIndicator->attachToWidget(m_sectionedProducts);
progressIndicator->hide(); progressIndicator->hide();
vbox->addWidget(m_sectionedProducts); resultHBox->addWidget(m_sectionedProducts);
vbox->addWidget(resultWidget);
connect(m_sectionedProducts, &SectionedProducts::toggleProgressIndicator, connect(m_sectionedProducts, &SectionedProducts::toggleProgressIndicator,
progressIndicator, &Utils::ProgressIndicator::setVisible); progressIndicator, &Utils::ProgressIndicator::setVisible);

View File

@@ -35,6 +35,7 @@
#include <coreplugin/icontext.h> #include <coreplugin/icontext.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/iwizardfactory.h> #include <coreplugin/iwizardfactory.h>
#include <coreplugin/welcomepagehelper.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
@@ -56,10 +57,13 @@
#include <QTreeView> #include <QTreeView>
using namespace Core; using namespace Core;
using namespace Core::WelcomePageHelpers;
using namespace Utils; using namespace Utils;
const int LINK_HEIGHT = 35; 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"; const char PROJECT_BASE_ID[] = "Welcome.OpenRecentProject";
namespace ProjectExplorer { namespace ProjectExplorer {
@@ -188,7 +192,8 @@ static QColor themeColor(Theme::Color role)
return Utils::creatorTheme()->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(); QFont f = widget->font();
f.setPixelSize(size); f.setPixelSize(size);
@@ -266,30 +271,32 @@ public:
//const bool hovered = option.state & QStyle::State_MouseOver; //const bool hovered = option.state & QStyle::State_MouseOver;
const bool hovered = option.rect.contains(mousePos); const bool hovered = option.rect.contains(mousePos);
const bool expanded = m_expandedSessions.contains(sessionName); const bool expanded = m_expandedSessions.contains(sessionName);
if (hovered) painter->fillRect(rc, themeColor(Theme::Welcome_BackgroundSecondaryColor));
painter->fillRect(expanded ? rc : rc.adjusted(0, 0, -24, 0), hoverColor); painter->fillRect(rc.adjusted(0, 0, 0, -ItemGap),
hovered ? hoverColor : backgroundPrimaryColor);
const int x = rc.x(); const int x = rc.x();
const int x1 = x + 36; const int x1 = x + TEXT_OFFSET_HORIZONTAL;
const int y = rc.y(); const int y = rc.y();
const int firstBase = y + 18; const int firstBase = y + 18;
painter->drawPixmap(x + 11, y + 6, sessionIcon); painter->drawPixmap(x + 11, y + 6, sessionIcon);
if (hovered && !expanded) { if (hovered && !expanded) {
const QRect arrowRect = rc.adjusted(rc.width() - 24, 0, 0, 0); const QRect arrowRect = rc.adjusted(rc.width() - SESSION_ARROW_RECT_WIDTH, 0, 0, 0);
if (arrowRect.contains(mousePos)) const bool arrowRectHovered = arrowRect.contains(mousePos);
painter->fillRect(arrowRect, hoverColor); painter->fillRect(arrowRect.adjusted(0, 0, 0, -ItemGap),
arrowRectHovered ? hoverColor : backgroundPrimaryColor);
} }
if (hovered || expanded) { if (hovered || expanded) {
static const QPixmap arrowUp = pixmap("expandarrow",Theme::Welcome_ForegroundSecondaryColor); static const QPixmap arrowUp = pixmap("expandarrow",Theme::Welcome_ForegroundSecondaryColor);
static const QPixmap arrowDown = QPixmap::fromImage(arrowUp.toImage().mirrored(false, true)); 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) { if (idx.row() < 9) {
painter->setPen(foregroundColor2); painter->setPen(foregroundSecondaryColor);
painter->setFont(sizedFont(10, option.widget)); painter->setFont(sizedFont(10, option.widget));
painter->drawText(x + 3, firstBase, QString::number(idx.row() + 1)); painter->drawText(x + 3, firstBase, QString::number(idx.row() + 1));
} }
@@ -304,11 +311,16 @@ public:
if (isActiveSession && !isDefaultVirgin) if (isActiveSession && !isDefaultVirgin)
fullSessionName = ProjectWelcomePage::tr("%1 (current session)").arg(fullSessionName); 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 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->setPen(linkColor);
painter->setFont(sizedFont(13, option.widget, switchActive)); 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) if (switchActive)
m_activeSwitchToRect = switchRect; m_activeSwitchToRect = switchRect;
@@ -316,24 +328,24 @@ public:
painter->setPen(textColor); painter->setPen(textColor);
painter->setFont(sizedFont(12, option.widget)); painter->setFont(sizedFont(12, option.widget));
const QStringList projects = SessionManager::projectsForSessionName(sessionName); const QStringList projects = SessionManager::projectsForSessionName(sessionName);
int yy = firstBase + 25; int yy = firstBase + SESSION_LINE_HEIGHT - 3;
QFontMetrics fm(option.widget->font()); QFontMetrics fm(option.widget->font());
for (const QString &project : projects) { for (const QString &project : projects) {
// Project name. // Project name.
FilePath projectPath = FilePath::fromString(project); FilePath projectPath = FilePath::fromString(project);
QString completeBase = projectPath.completeBaseName(); QString completeBase = projectPath.completeBaseName();
painter->setPen(textColor); painter->setPen(textColor);
painter->drawText(x1, yy, completeBase); painter->drawText(x1, yy, fm.elidedText(completeBase, Qt::ElideMiddle, textSpace));
yy += 18; yy += 18;
// Project path. // Project path.
QString pathWithTilde = Utils::withTildeHomePath(projectPath.toUserOutput()); QString pathWithTilde = Utils::withTildeHomePath(projectPath.toUserOutput());
painter->setPen(foregroundColor1); painter->setPen(foregroundPrimaryColor);
painter->drawText(x1, yy, fm.elidedText(pathWithTilde, Qt::ElideMiddle, rc.width() - 40)); painter->drawText(x1, yy, fm.elidedText(pathWithTilde, Qt::ElideMiddle, textSpace));
yy += 22; yy += 22;
} }
yy += 5; yy += 3;
int xx = x1; int xx = x1;
const QStringList actions = { const QStringList actions = {
ProjectWelcomePage::tr("Clone"), ProjectWelcomePage::tr("Clone"),
@@ -343,15 +355,17 @@ public:
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
const QString &action = actions.at(i); const QString &action = actions.at(i);
const int ww = fm.horizontalAdvance(action); 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 isForcedDisabled = (i != 0 && sessionName == "default");
const bool isActive = actionRect.contains(mousePos) && !isForcedDisabled; const bool isActive = actionRect.contains(mousePos) && !isForcedDisabled;
painter->setPen(isForcedDisabled ? disabledLinkColor : linkColor); painter->setPen(isForcedDisabled ? disabledLinkColor : linkColor);
painter->setFont(sizedFont(12, option.widget, isActive)); painter->setFont(sizedFont(12, option.widget, isActive));
painter->drawText(xx, yy, action); painter->drawText(xx, yy, action);
if (i < 2) { if (i < 2) {
xx += ww + 14; xx += ww + 2 * spacing;
int pp = xx - 7; int pp = xx - spacing;
painter->setPen(textColor); painter->setPen(textColor);
painter->drawLine(pp, yy - 10, pp, yy); painter->drawLine(pp, yy - 10, pp, yy);
} }
@@ -367,9 +381,9 @@ public:
QString sessionName = idx.data(Qt::DisplayRole).toString(); QString sessionName = idx.data(Qt::DisplayRole).toString();
if (m_expandedSessions.contains(sessionName)) { if (m_expandedSessions.contains(sessionName)) {
QStringList projects = SessionManager::projectsForSessionName(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, bool editorEvent(QEvent *ev, QAbstractItemModel *model,
@@ -379,7 +393,8 @@ public:
const QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(ev); const QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(ev);
const Qt::MouseButtons button = mouseEvent->button(); const Qt::MouseButtons button = mouseEvent->button();
const QPoint pos = static_cast<QMouseEvent *>(ev)->pos(); const QPoint pos = static_cast<QMouseEvent *>(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(); const QString sessionName = idx.data(Qt::DisplayRole).toString();
if (rc.contains(pos) || button == Qt::RightButton) { if (rc.contains(pos) || button == Qt::RightButton) {
// The expand/collapse "button". // The expand/collapse "button".
@@ -408,7 +423,7 @@ public:
if (ev->type() == QEvent::MouseMove) { if (ev->type() == QEvent::MouseMove) {
emit model->layoutChanged({QPersistentModelIndex(idx)}); // Somewhat brutish. emit model->layoutChanged({QPersistentModelIndex(idx)}); // Somewhat brutish.
//update(option.rect); //update(option.rect);
return true; return false;
} }
return false; return false;
} }
@@ -418,9 +433,9 @@ private:
const QColor textColor = themeColor(Theme::Welcome_TextColor); const QColor textColor = themeColor(Theme::Welcome_TextColor);
const QColor linkColor = themeColor(Theme::Welcome_LinkColor); const QColor linkColor = themeColor(Theme::Welcome_LinkColor);
const QColor disabledLinkColor = themeColor(Theme::Welcome_DisabledLinkColor); const QColor disabledLinkColor = themeColor(Theme::Welcome_DisabledLinkColor);
const QColor backgroundColor = themeColor(Theme::Welcome_BackgroundColor); const QColor backgroundPrimaryColor = themeColor(Theme::Welcome_BackgroundPrimaryColor);
const QColor foregroundColor1 = themeColor(Theme::Welcome_ForegroundPrimaryColor); // light-ish. const QColor foregroundPrimaryColor = themeColor(Theme::Welcome_ForegroundPrimaryColor);
const QColor foregroundColor2 = themeColor(Theme::Welcome_ForegroundSecondaryColor); // blacker. const QColor foregroundSecondaryColor = themeColor(Theme::Welcome_ForegroundSecondaryColor);
QStringList m_expandedSessions; QStringList m_expandedSessions;
@@ -442,15 +457,18 @@ public:
QRect rc = option.rect; QRect rc = option.rect;
const bool hovered = option.widget->isActiveWindow() && option.state & QStyle::State_MouseOver; const bool hovered = option.widget->isActiveWindow() && option.state & QStyle::State_MouseOver;
if (hovered) const QRect bgRect = rc.adjusted(0, 0, -ItemGap, -ItemGap);
painter->fillRect(rc, themeColor(Theme::Welcome_HoverColor)); 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 x = rc.x();
const int y = rc.y(); const int y = rc.y();
const int firstBase = y + 18; const int firstBase = y + 18;
const int secondBase = firstBase + 19; 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); painter->drawPixmap(x + 11, y + 6, projectIcon);
QString projectName = idx.data(Qt::DisplayRole).toString(); QString projectName = idx.data(Qt::DisplayRole).toString();
@@ -462,14 +480,20 @@ public:
if (idx.row() < 9) if (idx.row() < 9)
painter->drawText(x + 3, firstBase, QString::number(idx.row() + 1)); 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->setPen(themeColor(Theme::Welcome_LinkColor));
painter->setFont(sizedFont(13, option.widget, hovered)); 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->setPen(themeColor(Theme::Welcome_ForegroundPrimaryColor));
painter->setFont(sizedFont(13, option.widget)); painter->setFont(sizedFont(13, option.widget));
QString pathWithTilde = Utils::withTildeHomePath(projectPath.toUserOutput()); 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 QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &idx) const final
@@ -478,8 +502,8 @@ public:
QString projectPath = idx.data(ProjectModel::FilePathRole).toString(); QString projectPath = idx.data(ProjectModel::FilePathRole).toString();
QFontMetrics fm(sizedFont(13, option.widget)); QFontMetrics fm(sizedFont(13, option.widget));
int width = std::max(fm.horizontalAdvance(projectName), int width = std::max(fm.horizontalAdvance(projectName),
fm.horizontalAdvance(projectPath)) + 36; fm.horizontalAdvance(projectPath)) + TEXT_OFFSET_HORIZONTAL;
return QSize(width, 48); return QSize(width, 47 + ItemGap);
} }
bool editorEvent(QEvent *ev, QAbstractItemModel *model, bool editorEvent(QEvent *ev, QAbstractItemModel *model,
@@ -537,22 +561,16 @@ public:
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
setFocusPolicy(Qt::NoFocus); setFocusPolicy(Qt::NoFocus);
QPalette pal; // Needed for classic theme (only). QPalette pal;
pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundColor)); pal.setColor(QPalette::Base, themeColor(Theme::Welcome_BackgroundSecondaryColor));
viewport()->setPalette(pal); 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 class SessionsPage : public QWidget
{ {
public: public:
SessionsPage(ProjectWelcomePage *projectWelcomePage) explicit SessionsPage(ProjectWelcomePage *projectWelcomePage)
{ {
// FIXME: Remove once facilitateQml() is gone. // FIXME: Remove once facilitateQml() is gone.
if (!projectWelcomePage->m_sessionModel) if (!projectWelcomePage->m_sessionModel)
@@ -561,26 +579,16 @@ public:
projectWelcomePage->m_projectModel = new ProjectModel(this); projectWelcomePage->m_projectModel = new ProjectModel(this);
auto manageSessionsButton = new WelcomePageButton(this); auto manageSessionsButton = new WelcomePageButton(this);
manageSessionsButton->setText(ProjectWelcomePage::tr("Manage")); manageSessionsButton->setText(ProjectWelcomePage::tr("Manage..."));
manageSessionsButton->setIcon(pixmap("settings", Theme::Welcome_ForegroundSecondaryColor)); manageSessionsButton->setWithAccentColor(true);
manageSessionsButton->setOnClicked([] { ProjectExplorerPlugin::showSessionManager(); }); 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); auto sessionsLabel = new QLabel(this);
sessionsLabel->setFont(sizedFont(16, this)); sessionsLabel->setFont(brandFont());
sessionsLabel->setText(ProjectWelcomePage::tr("Sessions")); sessionsLabel->setText(ProjectWelcomePage::tr("Sessions"));
auto recentProjectsLabel = new QLabel(this); auto recentProjectsLabel = new QLabel(this);
recentProjectsLabel->setFont(sizedFont(16, this)); recentProjectsLabel->setFont(brandFont());
recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects")); recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects"));
auto sessionsList = new TreeView(this, "Sessions"); auto sessionsList = new TreeView(this, "Sessions");
@@ -595,41 +603,31 @@ public:
projectsList->setItemDelegate(&m_projectDelegate); projectsList->setItemDelegate(&m_projectDelegate);
projectsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); projectsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
auto hbox11 = new QHBoxLayout; auto sessionHeader = panelBar(this);
hbox11->setContentsMargins(0, 0, 0, 0); auto hbox11 = new QHBoxLayout(sessionHeader);
hbox11->setContentsMargins(12, 0, 0, 0);
hbox11->addWidget(sessionsLabel); hbox11->addWidget(sessionsLabel);
hbox11->addSpacing(16);
hbox11->addWidget(manageSessionsButton);
hbox11->addStretch(1); hbox11->addStretch(1);
hbox11->addWidget(manageSessionsButton);
auto hbox21 = new QHBoxLayout; auto projectsHeader = panelBar(this);
hbox21->setContentsMargins(0, 0, 0, 0); auto hbox21 = new QHBoxLayout(projectsHeader);
hbox21->setContentsMargins(hbox11->contentsMargins());
hbox21->addWidget(recentProjectsLabel); hbox21->addWidget(recentProjectsLabel);
hbox21->addSpacing(16);
hbox21->addWidget(newButton);
hbox21->addSpacing(16);
hbox21->addWidget(openButton);
hbox21->addStretch(1);
auto vbox1 = new QVBoxLayout; auto grid = new QGridLayout(this);
vbox1->setContentsMargins(0, 0, 0, 0); grid->setContentsMargins(0, 0, 0, ItemGap);
vbox1->addItem(hbox11); grid->setHorizontalSpacing(0);
vbox1->addSpacing(16); grid->setVerticalSpacing(ItemGap);
vbox1->addWidget(sessionsList); grid->addWidget(panelBar(this), 0, 0);
grid->addWidget(sessionHeader, 0, 1);
auto vbox2 = new QVBoxLayout; grid->addWidget(sessionsList, 1, 1);
vbox2->setContentsMargins(0, 0, 0, 0); grid->addWidget(panelBar(this), 0, 2);
vbox2->addItem(hbox21); grid->setColumnStretch(1, 9);
vbox2->addSpacing(16); grid->setColumnMinimumWidth(1, 200);
vbox2->addWidget(projectsList); grid->addWidget(projectsHeader, 0, 3);
grid->addWidget(projectsList, 1, 3);
auto hbox = new QHBoxLayout(this); grid->setColumnStretch(3, 20);
hbox->setContentsMargins(30, 27, 0, 27);
hbox->addItem(vbox1);
hbox->setStretchFactor(vbox1, 1);
hbox->addSpacing(16);
hbox->addItem(vbox2);
hbox->setStretchFactor(vbox2, 3);
} }
SessionDelegate m_sessionDelegate; SessionDelegate m_sessionDelegate;

View File

@@ -247,21 +247,16 @@ protected:
QTC_ASSERT(item, return); QTC_ASSERT(item, return);
const auto exampleItem = static_cast<const ExampleItem *>(item); const auto exampleItem = static_cast<const ExampleItem *>(item);
if (exampleItem->isVideo) { if (exampleItem->isVideo) {
QFont f = option.widget->font(); painter->save();
f.setPixelSize(13); painter->setFont(option.font);
painter->setFont(f); painter->setCompositionMode(QPainter::CompositionMode_Difference);
QString videoLen = exampleItem->videoLength; painter->setPen(Qt::white);
painter->drawText(currentPixmapRect.adjusted(0, 0, 0, painter->font().pixelSize() + 3), painter->drawText(currentPixmapRect.translated(0, -WelcomePageHelpers::ItemGap),
videoLen, Qt::AlignBottom | Qt::AlignHCenter); 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; bool m_showExamples = true;
}; };
@@ -272,7 +267,6 @@ public:
: m_isExamples(isExamples) : m_isExamples(isExamples)
{ {
m_exampleDelegate.setShowExamples(isExamples); m_exampleDelegate.setShowExamples(isExamples);
const int sideMargin = 27;
static auto s_examplesModel = new ExamplesListModel(this); static auto s_examplesModel = new ExamplesListModel(this);
m_examplesModel = s_examplesModel; m_examplesModel = s_examplesModel;
@@ -281,10 +275,14 @@ public:
auto searchBox = new SearchBox(this); auto searchBox = new SearchBox(this);
m_searcher = searchBox->m_lineEdit; m_searcher = searchBox->m_lineEdit;
auto vbox = new QVBoxLayout(this); auto grid = new QGridLayout(this);
vbox->setContentsMargins(30, sideMargin, 0, 0); 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) { if (m_isExamples) {
m_searcher->setPlaceholderText(ExamplesWelcomePage::tr("Search in Examples...")); m_searcher->setPlaceholderText(ExamplesWelcomePage::tr("Search in Examples..."));
@@ -303,21 +301,22 @@ public:
connect(exampleSetModel, &ExampleSetModel::selectedExampleSetChanged, connect(exampleSetModel, &ExampleSetModel::selectedExampleSetChanged,
exampleSetSelector, &QComboBox::setCurrentIndex); exampleSetSelector, &QComboBox::setCurrentIndex);
hbox->setSpacing(17); hbox->setSpacing(Core::WelcomePageHelpers::HSpacing);
hbox->addWidget(exampleSetSelector); hbox->addWidget(exampleSetSelector);
} else { } else {
m_searcher->setPlaceholderText(ExamplesWelcomePage::tr("Search in Tutorials...")); m_searcher->setPlaceholderText(ExamplesWelcomePage::tr("Search in Tutorials..."));
} }
hbox->addWidget(searchBox); hbox->addWidget(searchBox);
hbox->addSpacing(sideMargin); grid->addWidget(WelcomePageHelpers::panelBar(this), 0, 0);
vbox->addItem(hbox); grid->addWidget(searchBar, 0, 1);
grid->addWidget(WelcomePageHelpers::panelBar(this), 0, 2);
auto gridView = new GridView(this); auto gridView = new GridView(this);
gridView->setModel(filteredModel); gridView->setModel(filteredModel);
gridView->setItemDelegate(&m_exampleDelegate); gridView->setItemDelegate(&m_exampleDelegate);
if (auto sb = gridView->verticalScrollBar()) if (auto sb = gridView->verticalScrollBar())
sb->setSingleStep(25); sb->setSingleStep(25);
vbox->addWidget(gridView); grid->addWidget(gridView, 1, 1, 1, 2);
connect(&m_exampleDelegate, &ExampleDelegate::tagClicked, connect(&m_exampleDelegate, &ExampleDelegate::tagClicked,
this, &ExamplesPageWidget::onTagClicked); this, &ExamplesPageWidget::onTagClicked);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 457 B

View File

@@ -4,28 +4,12 @@
<file>images/mode_welcome@2x.png</file> <file>images/mode_welcome@2x.png</file>
<file>images/mode_welcome_mask.png</file> <file>images/mode_welcome_mask.png</file>
<file>images/mode_welcome_mask@2x.png</file> <file>images/mode_welcome_mask@2x.png</file>
<file>images/blogs.png</file>
<file>images/blogs@2x.png</file>
<file>images/community.png</file>
<file>images/community@2x.png</file>
<file>images/open.png</file>
<file>images/open@2x.png</file>
<file>images/project.png</file> <file>images/project.png</file>
<file>images/project@2x.png</file> <file>images/project@2x.png</file>
<file>images/qtaccount.png</file>
<file>images/qtaccount@2x.png</file>
<file>images/session.png</file> <file>images/session.png</file>
<file>images/session@2x.png</file> <file>images/session@2x.png</file>
<file>images/userguide.png</file>
<file>images/userguide@2x.png</file>
<file>images/new.png</file>
<file>images/new@2x.png</file>
<file>images/expandarrow.png</file> <file>images/expandarrow.png</file>
<file>images/expandarrow@2x.png</file> <file>images/expandarrow@2x.png</file>
<file>images/border.png</file> <file>images/border.png</file>
<file>images/download.png</file>
<file>images/download@2x.png</file>
<file>images/settings.png</file>
<file>images/settings@2x.png</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@@ -34,11 +34,13 @@
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actionmanager.h>
#include <coreplugin/actionmanager/command.h> #include <coreplugin/actionmanager/command.h>
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/coreicons.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/imode.h> #include <coreplugin/imode.h>
#include <coreplugin/iwelcomepage.h> #include <coreplugin/iwelcomepage.h>
#include <coreplugin/iwizardfactory.h> #include <coreplugin/iwizardfactory.h>
#include <coreplugin/modemanager.h> #include <coreplugin/modemanager.h>
#include <coreplugin/welcomepagehelper.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
@@ -61,63 +63,69 @@
#include <QVBoxLayout> #include <QVBoxLayout>
using namespace Core; using namespace Core;
using namespace Core::WelcomePageHelpers;
using namespace ExtensionSystem; using namespace ExtensionSystem;
using namespace Utils; using namespace Utils;
namespace Welcome { namespace Welcome {
namespace Internal { namespace Internal {
class SideBar; class TopArea;
class SideArea;
class BottomArea;
const int lrPadding = 34;
const char currentPageSettingsKeyC[] = "Welcome2Tab"; const char currentPageSettingsKeyC[] = "Welcome2Tab";
constexpr int buttonSpacing = 16;
static QColor themeColor(Theme::Color role) static QColor themeColor(Theme::Color role)
{ {
return Utils::creatorTheme()->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) static void addWeakVerticalSpacerToLayout(QVBoxLayout *layout, int maximumSize)
{ {
auto weakSpacer = new QWidget; auto weakSpacer = new QWidget;
weakSpacer->setMaximumHeight(maximumSize); weakSpacer->setMaximumHeight(maximumSize);
weakSpacer->setMinimumHeight(buttonSpacing);
weakSpacer->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum); weakSpacer->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum);
layout->addWidget(weakSpacer); layout->addWidget(weakSpacer);
layout->setStretchFactor(weakSpacer, 1); layout->setStretchFactor(weakSpacer, 1);
} }
class WelcomeMode : public IMode class ResizeSignallingWidget : public QWidget
{ {
Q_OBJECT 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: public:
WelcomeMode(); WelcomeMode();
~WelcomeMode(); ~WelcomeMode();
void initPlugins(); void initPlugins();
Q_INVOKABLE bool openDroppedFiles(const QList<QUrl> &urls); bool openDroppedFiles(const QList<QUrl> &urls);
private: private:
void addPage(IWelcomePage *page); void addPage(IWelcomePage *page);
QWidget *m_modeWidget; ResizeSignallingWidget *m_modeWidget;
QStackedWidget *m_pageStack; QStackedWidget *m_pageStack;
SideBar *m_sideBar; TopArea *m_topArea;
SideArea *m_sideArea;
BottomArea *m_bottomArea;
QList<IWelcomePage *> m_pluginList; QList<IWelcomePage *> m_pluginList;
QList<WelcomePageButton *> m_pageButtons; QList<WelcomePageButton *> m_pageButtons;
Id m_activePage; Id m_activePage;
@@ -165,145 +173,189 @@ public:
WelcomeMode *m_welcomeMode = nullptr; WelcomeMode *m_welcomeMode = nullptr;
}; };
class IconAndLink : public QWidget class TopArea : 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
{ {
Q_OBJECT Q_OBJECT
public: public:
SideBar(QWidget *parent) TopArea(QWidget *parent = nullptr)
: QWidget(parent) : QWidget(parent)
{ {
setAutoFillBackground(true); setAutoFillBackground(true);
setMinimumHeight(11); // For compact state
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
setPalette(themeColor(Theme::Welcome_BackgroundColor)); setPalette(themeColor(Theme::Welcome_BackgroundPrimaryColor));
auto vbox = new QVBoxLayout(this); m_title = new QWidget;
vbox->setSpacing(0);
vbox->setContentsMargins(0, 27, 0, 0); auto hbox = new QHBoxLayout(m_title);
hbox->setSpacing(0);
hbox->setContentsMargins(HSpacing - 5, 2, 0, 2);
{ {
auto l = m_pluginButtons = new QVBoxLayout; auto ideIconLabel = new QLabel;
l->setContentsMargins(lrPadding, 0, lrPadding, 0); const QPixmap logo = Core::Icons::QTCREATORLOGO_BIG.pixmap();
l->setSpacing(19); ideIconLabel->setPixmap(logo.scaled(logo.size() * 0.6, Qt::IgnoreAspectRatio,
vbox->addItem(l); 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; auto projectVBox = new QVBoxLayout;
l->setContentsMargins(lrPadding, 0, lrPadding, 0); projectVBox->setSpacing(buttonSpacing);
l->setSpacing(12); 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); auto newLabel = new QLabel(tr("New to Qt?"), this);
newLabel->setFont(sizedFont(18, this)); newLabel->setFont(brandFont());
l->addWidget(newLabel); newLabel->setAlignment(Qt::AlignHCenter);
newVBox->addWidget(newLabel);
auto learnLabel = new QLabel(tr("Learn how to develop your own applications " auto getStartedButton = new WelcomePageButton(mainWidget);
"and explore %1.") getStartedButton->setText(tr("Get Started"));
.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"));
getStartedButton->setOnClicked([] { getStartedButton->setOnClicked([] {
QDesktopServices::openUrl( QDesktopServices::openUrl(
QString("qthelp://org.qt-project.qtcreator/doc/creator-getting-started.html")); 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->addItem(l);
} }
vbox->addStretch(1); vbox->addStretch(1);
{ setWidget(mainWidget);
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());
} }
QVBoxLayout *m_pluginButtons = nullptr; 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<QPair<QString, QString> > 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<QString, QString> &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() WelcomeMode::WelcomeMode()
{ {
setDisplayName(tr("Welcome")); setDisplayName(tr("Welcome"));
@@ -321,39 +373,42 @@ WelcomeMode::WelcomeMode()
setContext(Context(Constants::C_WELCOME_MODE)); setContext(Context(Constants::C_WELCOME_MODE));
QPalette palette = creatorTheme()->palette(); 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); 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); m_sideArea = new SideArea(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_pageStack = new QStackedWidget(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->setObjectName("WelcomeScreenStackedWidget");
m_pageStack->setAutoFillBackground(true); m_pageStack->setAutoFillBackground(true);
auto hbox = new QHBoxLayout; m_topArea = new TopArea;
hbox->addWidget(scrollableSideBar); m_bottomArea = new BottomArea;
hbox->addWidget(divider);
hbox->addWidget(m_pageStack);
hbox->setStretchFactor(m_pageStack, 10);
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->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0); layout->setSpacing(0);
layout->addWidget(new StyledBar(m_modeWidget));
layout->addItem(hbox);
setWidget(m_modeWidget); setWidget(m_modeWidget);
} }
@@ -388,15 +443,6 @@ void WelcomeMode::initPlugins()
bool WelcomeMode::openDroppedFiles(const QList<QUrl> &urls) bool WelcomeMode::openDroppedFiles(const QList<QUrl> &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<QUrl> localUrls = Utils::filtered(urls, &QUrl::isLocalFile); const QList<QUrl> localUrls = Utils::filtered(urls, &QUrl::isLocalFile);
if (!localUrls.isEmpty()) { if (!localUrls.isEmpty()) {
QTimer::singleShot(0, [localUrls]() { QTimer::singleShot(0, [localUrls]() {
@@ -415,7 +461,7 @@ void WelcomeMode::addPage(IWelcomePage *page)
if (m_pluginList.at(idx)->priority() >= pagePriority) if (m_pluginList.at(idx)->priority() >= pagePriority)
break; break;
} }
auto pageButton = new WelcomePageButton(m_sideBar); auto pageButton = new WelcomePageButton(m_sideArea);
auto pageId = page->id(); auto pageId = page->id();
pageButton->setText(page->title()); pageButton->setText(page->title());
pageButton->setActiveChecker([this, pageId] { return m_activePage == pageId; }); pageButton->setActiveChecker([this, pageId] { return m_activePage == pageId; });
@@ -423,7 +469,7 @@ void WelcomeMode::addPage(IWelcomePage *page)
m_pluginList.insert(idx, page); m_pluginList.insert(idx, page);
m_pageButtons.insert(idx, pageButton); m_pageButtons.insert(idx, pageButton);
m_sideBar->m_pluginButtons->insertWidget(idx, pageButton); m_sideArea->m_pluginButtons->insertWidget(idx, pageButton);
QWidget *stackPage = page->createWidget(); QWidget *stackPage = page->createWidget();
stackPage->setAutoFillBackground(true); stackPage->setAutoFillBackground(true);

View File

@@ -502,7 +502,7 @@
xlink:href="#linear-gradient-7" xlink:href="#linear-gradient-7"
id="linearGradient2898" id="linearGradient2898"
gradientUnits="userSpaceOnUse" gradientUnits="userSpaceOnUse"
gradientTransform="matrix(75,0,0,-75,14430,8326)" gradientTransform="matrix(75,0,0,-75,14430,8329)"
x1="-190.82001" x1="-190.82001"
y1="109.69" y1="109.69"
x2="-191.87" x2="-191.87"
@@ -516,7 +516,8 @@
fx="548.5" fx="548.5"
fy="91.5" fy="91.5"
r="18.5" r="18.5"
gradientUnits="userSpaceOnUse" /> gradientUnits="userSpaceOnUse"
gradientTransform="translate(112,18)" />
<linearGradient <linearGradient
inkscape:collect="always" inkscape:collect="always"
xlink:href="#linearGradient2550" xlink:href="#linearGradient2550"
@@ -672,17 +673,18 @@
id="layer7" id="layer7"
inkscape:label="Welcome screen thumbnails"> inkscape:label="Welcome screen thumbnails">
<g <g
id="src/plugins/qtsupport/images/icons/videotutorialicon"> id="src/plugins/qtsupport/images/icons/videotutorialicon"
transform="translate(0,-32)">
<rect <rect
id="rect2451" id="rect2451"
height="110" height="160"
width="176" width="214"
class="cls-1" class="cls-1"
x="0" x="0"
y="0" y="0"
style="fill:#26282a" /> style="fill:#26282a" />
<path <path
d="M 83.73,67.34 V 56.12 l 9.62,5.61 z m -0.53,-14 a 1,1 0 0 0 -1.06,0 1.05,1.05 0 0 0 -0.54,0.93 V 69.2 a 1,1 0 0 0 0.54,0.92 1,1 0 0 0 0.53,0.15 1,1 0 0 0 0.53,-0.15 L 96,62.65 a 1.06,1.06 0 0 0 0,-1.84 z m 32.53,-11.88 v 38.4 a 1.07,1.07 0 0 1 -2.13,0 V 41.47 A 1.07,1.07 0 0 0 112.53,40.4 H 63.47 a 1.07,1.07 0 0 0 -1.07,1.07 v 41.6 h 52.27 a 1.07,1.07 0 0 1 0,2.13 H 61.33 A 1.06,1.06 0 0 1 60.27,84.13 V 41.47 a 3.2,3.2 0 0 1 3.2,-3.2 h 49.06 a 3.2,3.2 0 0 1 3.2,3.2 z M 76.27,91.6 a 1.07,1.07 0 1 1 1.06,-1.07 1.07,1.07 0 0 1 -1.06,1.07 z m 36.26,-2.13 H 79.27 a 3.18,3.18 0 0 0 -6,0 H 65.6 a 1.07,1.07 0 1 0 0,2.13 h 7.66 a 3.18,3.18 0 0 0 6,0 h 33.26 a 1.07,1.07 0 1 0 0,-2.13 z m 5.34,3.2 a 3.21,3.21 0 0 1 -3.2,3.2 H 61.33 a 3.21,3.21 0 0 1 -3.2,-3.2 V 39.33 a 3.21,3.21 0 0 1 3.2,-3.2 h 53.34 a 3.21,3.21 0 0 1 3.2,3.2 z M 114.67,34 H 61.33 A 5.33,5.33 0 0 0 56,39.33 V 92.67 A 5.33,5.33 0 0 0 61.33,98 h 53.34 A 5.33,5.33 0 0 0 120,92.67 V 39.33 A 5.33,5.33 0 0 0 114.67,34 Z" d="M 102.73,92.34 V 81.12 l 9.62,5.61 z m -0.53,-14 a 1,1 0 0 0 -1.06,0 1.05,1.05 0 0 0 -0.54,0.93 V 94.2 a 1,1 0 0 0 0.54,0.92 1,1 0 0 0 0.53,0.15 1,1 0 0 0 0.53,-0.15 L 115,87.65 a 1.06,1.06 0 0 0 0,-1.84 z m 32.53,-11.88 v 38.4 a 1.07,1.07 0 0 1 -2.13,0 V 66.47 A 1.07,1.07 0 0 0 131.53,65.4 H 82.47 a 1.07,1.07 0 0 0 -1.07,1.07 v 41.6 h 52.27 a 1.07,1.07 0 0 1 0,2.13 H 80.33 a 1.06,1.06 0 0 1 -1.06,-1.07 V 66.47 a 3.2,3.2 0 0 1 3.2,-3.2 h 49.06 a 3.2,3.2 0 0 1 3.2,3.2 z M 95.27,116.6 a 1.07,1.07 0 1 1 1.06,-1.07 1.07,1.07 0 0 1 -1.06,1.07 z m 36.26,-2.13 H 98.27 a 3.18,3.18 0 0 0 -6,0 H 84.6 a 1.07,1.07 0 1 0 0,2.13 h 7.66 a 3.18,3.18 0 0 0 6,0 h 33.26 a 1.07,1.07 0 1 0 0,-2.13 z m 5.34,3.2 a 3.21,3.21 0 0 1 -3.2,3.2 H 80.33 a 3.21,3.21 0 0 1 -3.2,-3.2 V 64.33 a 3.21,3.21 0 0 1 3.2,-3.2 h 53.34 a 3.21,3.21 0 0 1 3.2,3.2 z M 133.67,59 H 80.33 A 5.33,5.33 0 0 0 75,64.33 v 53.34 a 5.33,5.33 0 0 0 5.33,5.33 h 53.34 A 5.33,5.33 0 0 0 139,117.67 V 64.33 A 5.33,5.33 0 0 0 133.67,59 Z"
class="cls-2" class="cls-2"
id="video-player" id="video-player"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
@@ -690,45 +692,45 @@
<path <path
id="path2480" id="path2480"
style="fill:#17a81a" style="fill:#17a81a"
d="M 137.7,21.74 V 9 h 2 v 12.74 z m -2.58,-6.22 v 4.1 a 0.91,0.91 0 0 0 0.21,0.58 1,1 0 0 0 0.59,0.25 l -0.06,1.49 a 3.8,3.8 0 0 1 -2.39,-0.66 6.91,6.91 0 0 1 -2.9,0.66 c -1.79,0 -2.68,-1 -2.68,-2.86 a 2.44,2.44 0 0 1 0.73,-2 4,4 0 0 1 2.24,-0.74 l 2.32,-0.2 V 15.5 a 1.33,1.33 0 0 0 -0.31,-1 1.35,1.35 0 0 0 -0.93,-0.29 c -0.77,0 -1.73,0 -2.88,0.14 h -0.58 L 128.41,13 a 15.72,15.72 0 0 1 3.61,-0.46 3.31,3.31 0 0 1 2.38,0.71 3,3 0 0 1 0.72,2.27 z m -4,2.23 a 1.21,1.21 0 0 0 -1.24,1.35 c 0,0.83 0.37,1.24 1.1,1.24 a 7.1,7.1 0 0 0 1.91,-0.29 l 0.32,-0.11 v -2.39 z m -6.99,-6.54 V 9.14 h 2 v 2.07 z m 0,10.53 v -9 h 2 v 9 z m -6.5,0 v -9 h 1.94 v 1.08 a 8.5,8.5 0 0 1 3.06,-1.27 v 2 a 12.57,12.57 0 0 0 -2.64,0.79 l -0.4,0.16 v 6.28 z m -9.05,-8.02 a 4.67,4.67 0 0 1 6.18,0 5.57,5.57 0 0 1 0.92,3.51 5.76,5.76 0 0 1 -0.9,3.52 4.66,4.66 0 0 1 -6.22,0 5.76,5.76 0 0 1 -0.9,-3.52 5.57,5.57 0 0 1 0.92,-3.51 z m 1.47,5.85 a 2.18,2.18 0 0 0 3.24,0 5,5 0 0 0 0.41,-2.36 4.42,4.42 0 0 0 -0.44,-2.32 2.18,2.18 0 0 0 -3.18,0 4.42,4.42 0 0 0 -0.44,2.32 5,5 0 0 0 0.41,2.36 z m -3.56,-5.15 H 104 v 4 a 4.12,4.12 0 0 0 0.17,1.46 c 0.1,0.24 0.38,0.36 0.82,0.36 l 1.48,-0.06 0.09,1.57 a 11.12,11.12 0 0 1 -1.84,0.23 2.55,2.55 0 0 1 -2.09,-0.7 4.41,4.41 0 0 1 -0.57,-2.65 v -4.21 h -1.15 v -1.68 h 1.15 V 10.13 H 104 v 2.61 h 2.49 z m -9.17,-1.68 h 2 v 9 h -2 v -0.55 a 4.93,4.93 0 0 1 -2.43,0.75 2.71,2.71 0 0 1 -2.48,-1 7,7 0 0 1 -0.63,-3.5 v -4.7 h 2 v 4.72 A 5.78,5.78 0 0 0 94,19.64 c 0.18,0.37 0.6,0.56 1.26,0.56 a 4.32,4.32 0 0 0 1.78,-0.36 l 0.27,-0.11 z M 82.67,11.2 V 9.41 h 9 V 11.2 H 88.2 v 10.54 h -2 V 11.2 Z m -12.05,2.52 a 4.65,4.65 0 0 1 6.17,0 5.57,5.57 0 0 1 0.93,3.51 5.76,5.76 0 0 1 -0.9,3.52 3.65,3.65 0 0 1 -3.11,1.19 3.66,3.66 0 0 1 -3.12,-1.19 5.76,5.76 0 0 1 -0.9,-3.52 5.57,5.57 0 0 1 0.93,-3.51 z m 1.47,5.85 a 1.69,1.69 0 0 0 1.62,0.72 1.71,1.71 0 0 0 1.62,-0.72 5.08,5.08 0 0 0 0.41,-2.36 4.42,4.42 0 0 0 -0.44,-2.32 2.18,2.18 0 0 0 -3.18,0 4.41,4.41 0 0 0 -0.45,2.32 4.93,4.93 0 0 0 0.42,2.36 z m -4.7,0.55 0.5,-0.05 v 1.46 a 19.1,19.1 0 0 1 -3.64,0.41 3.44,3.44 0 0 1 -2.87,-1.1 5.65,5.65 0 0 1 -0.87,-3.51 q 0,-4.78 3.91,-4.78 3.91,0 3.78,4.12 l -0.13,1.4 h -5.54 a 2.41,2.41 0 0 0 0.47,1.64 2.27,2.27 0 0 0 1.74,0.52 c 0.87,0 1.75,-0.03 2.65,-0.11 z m -1.08,-3.56 a 3.07,3.07 0 0 0 -0.42,-1.86 1.71,1.71 0 0 0 -1.43,-0.53 1.78,1.78 0 0 0 -1.47,0.55 3,3 0 0 0 -0.48,1.84 z M 58.61,9 v 12.74 h -2 v -0.46 a 5.42,5.42 0 0 1 -2.41,0.66 3,3 0 0 1 -2.58,-1.06 5.92,5.92 0 0 1 -0.82,-3.56 5.81,5.81 0 0 1 0.91,-3.64 3.39,3.39 0 0 1 2.83,-1.13 13.15,13.15 0 0 1 2,0.23 V 9 Z m -2.27,10.87 0.3,-0.12 v -5.33 a 12.14,12.14 0 0 0 -2,-0.18 c -1.22,0 -1.82,1 -1.82,3 a 4.48,4.48 0 0 0 0.42,2.3 1.5,1.5 0 0 0 1.34,0.64 4.66,4.66 0 0 0 1.76,-0.31 z M 46.92,11.21 V 9.14 h 2 v 2.07 z m 0,10.53 v -9 h 2 v 9 z M 43.29,9.41 h 2.09 l -3,12.33 h -3.95 l -3,-12.33 h 2.09 L 39.94,20 h 0.9 z" d="M 157.135,41.74 V 29 h 2 v 12.74 z m -2.58,-6.22 v 4.1 a 0.91,0.91 0 0 0 0.21,0.58 1,1 0 0 0 0.59,0.25 l -0.06,1.49 a 3.8,3.8 0 0 1 -2.39,-0.66 6.91,6.91 0 0 1 -2.9,0.66 c -1.79,0 -2.68,-1 -2.68,-2.86 a 2.44,2.44 0 0 1 0.73,-2 4,4 0 0 1 2.24,-0.74 l 2.32,-0.2 V 35.5 a 1.33,1.33 0 0 0 -0.31,-1 1.35,1.35 0 0 0 -0.93,-0.29 c -0.77,0 -1.73,0 -2.88,0.14 h -0.58 L 147.845,33 a 15.72,15.72 0 0 1 3.61,-0.46 3.31,3.31 0 0 1 2.38,0.71 3,3 0 0 1 0.72,2.27 z m -4,2.23 a 1.21,1.21 0 0 0 -1.24,1.35 c 0,0.83 0.37,1.24 1.1,1.24 a 7.1,7.1 0 0 0 1.91,-0.29 l 0.32,-0.11 v -2.39 z m -6.99,-6.54 v -2.07 h 2 v 2.07 z m 0,10.53 v -9 h 2 v 9 z m -6.5,0 v -9 h 1.94 v 1.08 a 8.5,8.5 0 0 1 3.06,-1.27 v 2 a 12.57,12.57 0 0 0 -2.64,0.79 l -0.4,0.16 v 6.28 z m -9.05,-8.02 a 4.67,4.67 0 0 1 6.18,0 5.57,5.57 0 0 1 0.92,3.51 5.76,5.76 0 0 1 -0.9,3.52 4.66,4.66 0 0 1 -6.22,0 5.76,5.76 0 0 1 -0.9,-3.52 5.57,5.57 0 0 1 0.92,-3.51 z m 1.47,5.85 a 2.18,2.18 0 0 0 3.24,0 5,5 0 0 0 0.41,-2.36 4.42,4.42 0 0 0 -0.44,-2.32 2.18,2.18 0 0 0 -3.18,0 4.42,4.42 0 0 0 -0.44,2.32 5,5 0 0 0 0.41,2.36 z m -3.56,-5.15 h -2.49 v 4 a 4.12,4.12 0 0 0 0.17,1.46 c 0.1,0.24 0.38,0.36 0.82,0.36 l 1.48,-0.06 0.09,1.57 a 11.12,11.12 0 0 1 -1.84,0.23 2.55,2.55 0 0 1 -2.09,-0.7 4.41,4.41 0 0 1 -0.57,-2.65 v -4.21 h -1.15 v -1.68 h 1.15 v -2.61 h 1.94 v 2.61 h 2.49 z m -9.17,-1.68 h 2 v 9 h -2 v -0.55 a 4.93,4.93 0 0 1 -2.43,0.75 2.71,2.71 0 0 1 -2.48,-1 7,7 0 0 1 -0.63,-3.5 v -4.7 h 2 v 4.72 a 5.78,5.78 0 0 0 0.22,2.18 c 0.18,0.37 0.6,0.56 1.26,0.56 a 4.32,4.32 0 0 0 1.78,-0.36 l 0.27,-0.11 z m -14.65,-1.54 v -1.79 h 9 v 1.79 h -3.47 v 10.54 h -2 V 31.2 Z m -12.05,2.52 a 4.65,4.65 0 0 1 6.17,0 5.57,5.57 0 0 1 0.93,3.51 5.76,5.76 0 0 1 -0.9,3.52 3.65,3.65 0 0 1 -3.11,1.19 3.66,3.66 0 0 1 -3.12,-1.19 5.76,5.76 0 0 1 -0.9,-3.52 5.57,5.57 0 0 1 0.93,-3.51 z m 1.47,5.85 a 1.69,1.69 0 0 0 1.62,0.72 1.71,1.71 0 0 0 1.62,-0.72 5.08,5.08 0 0 0 0.41,-2.36 4.42,4.42 0 0 0 -0.44,-2.32 2.18,2.18 0 0 0 -3.18,0 4.41,4.41 0 0 0 -0.45,2.32 4.93,4.93 0 0 0 0.42,2.36 z m -4.7,0.55 0.5,-0.05 v 1.46 a 19.1,19.1 0 0 1 -3.64,0.41 3.44,3.44 0 0 1 -2.87,-1.1 5.65,5.65 0 0 1 -0.87,-3.51 q 0,-4.78 3.91,-4.78 3.91,0 3.78,4.12 l -0.13,1.4 h -5.54 a 2.41,2.41 0 0 0 0.47,1.64 2.27,2.27 0 0 0 1.74,0.52 c 0.87,0 1.75,-0.03 2.65,-0.11 z m -1.08,-3.56 a 3.07,3.07 0 0 0 -0.42,-1.86 1.71,1.71 0 0 0 -1.43,-0.53 1.78,1.78 0 0 0 -1.47,0.55 3,3 0 0 0 -0.48,1.84 z M 78.045,29 v 12.74 h -2 v -0.46 a 5.42,5.42 0 0 1 -2.41,0.66 3,3 0 0 1 -2.58,-1.06 5.92,5.92 0 0 1 -0.82,-3.56 5.81,5.81 0 0 1 0.91,-3.64 3.39,3.39 0 0 1 2.83,-1.13 13.15,13.15 0 0 1 2,0.23 V 29 Z m -2.27,10.87 0.3,-0.12 v -5.33 a 12.14,12.14 0 0 0 -2,-0.18 c -1.22,0 -1.82,1 -1.82,3 a 4.48,4.48 0 0 0 0.42,2.3 1.5,1.5 0 0 0 1.34,0.64 4.66,4.66 0 0 0 1.76,-0.31 z m -9.42,-8.66 v -2.07 h 2 v 2.07 z m 0,10.53 v -9 h 2 v 9 z m -3.63,-12.33 h 2.09 l -3,12.33 h -3.95 l -3,-12.33 h 2.09 L 59.375,40 h 0.9 z"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
</g> </g>
<g <g
id="src/plugins/qtsupport/images/icons/tutorialicon" id="src/plugins/qtsupport/images/icons/tutorialicon"
transform="translate(177)"> transform="translate(214,-32)">
<rect <rect
id="rect2579" id="rect2579"
height="110" height="160"
width="176" width="214"
class="cls-1" class="cls-1"
x="0" x="0"
y="0" y="0"
style="fill:#ffffff" /> style="fill:#ffffff" />
<path <path
style="fill:url(#linear-gradient-7)" style="fill:url(#linear-gradient-7)"
d="m 126.67,54 a 1.34,1.34 0 0 0 -1.34,1.33 v 0.44 l -16,6.59 V 60 l 17.85,-7.38 a 1.36,1.36 0 0 0 0.82,-1.24 1.34,1.34 0 0 0 -0.82,-1.23 l -38.67,-16 a 1.38,1.38 0 0 0 -1,0 l -38.67,16 a 1.34,1.34 0 0 0 -0.84,1.18 1.36,1.36 0 0 0 0.82,1.24 l 38.67,16 a 1.24,1.24 0 0 0 1,0 l 14,-5.78 a 1.33,1.33 0 0 0 -1,-2.46 L 88,65.89 52.82,51.33 88,36.78 123.18,51.33 107.87,57.67 93.21,52.19 a 3,3 0 0 0 0.12,-0.86 c 0,-2.24 -2.34,-4 -5.33,-4 -2.99,0 -5.33,1.76 -5.33,4 0,2.24 2.34,4 5.33,4 a 6.41,6.41 0 0 0 3.45,-0.95 l 15.22,5.68 v 4.28 0 28.57 a 4,4 0 1 0 2.66,0 v -7.57 a 16.19,16.19 0 0 0 5.26,-6.9 1.32,1.32 0 0 0 0.08,-0.44 v -9.33 a 1.34,1.34 0 1 0 -2.67,0 v 9.08 a 13.49,13.49 0 0 1 -2.67,4 V 65.24 L 127.17,57.9 A 1.34,1.34 0 0 0 128,56.67 V 55.33 A 1.34,1.34 0 0 0 126.67,54 Z M 85.33,51.33 c 0,-0.54 1,-1.33 2.67,-1.33 1.67,0 2.67,0.79 2.67,1.33 0,0.54 -1,1.34 -2.67,1.34 -1.67,0 -2.67,-0.79 -2.67,-1.34 z M 108,98 A 1.34,1.34 0 1 1 109.33,96.67 1.33,1.33 0 0 1 108,98 Z M 87.49,73.9 48.82,57.9 A 1.34,1.34 0 0 1 48,56.67 v -1.34 a 1.34,1.34 0 0 1 2.67,0 v 0.45 L 88,71.22 102.15,65.36 a 1.36,1.36 0 0 1 1.75,0.73 1.33,1.33 0 0 1 -0.72,1.74 L 88.51,73.9 a 1.35,1.35 0 0 1 -1,0 z m 15.77,15.54 A 34.28,34.28 0 0 1 88,92.67 C 67.33,92.67 61.66,79.07 61.43,78.5 A 1.44,1.44 0 0 1 61.33,78 v -9.33 a 1.34,1.34 0 1 1 2.67,0 v 9 c 0.77,1.67 6.11,11.7 22.67,12.23 V 78 a 1.33,1.33 0 0 1 2.66,0 v 12 a 31,31 0 0 0 12.75,-2.91 1.3327134,1.3327134 0 0 1 1.18,2.39 z m 6.07,13.89 v 4 a 1.33,1.33 0 1 1 -2.66,0 v -4 a 1.33,1.33 0 1 1 2.66,0 z m -4,-1 -1.33,5.33 a 1.33,1.33 0 0 1 -1.29,1 1.86,1.86 0 0 1 -0.33,0 1.34,1.34 0 0 1 -1,-1.62 l 1.34,-5.33 a 1.33,1.33 0 0 1 2.58,0.64 z m 9.34,4.69 a 1.34,1.34 0 0 1 -1,1.62 1.86,1.86 0 0 1 -0.33,0 1.33,1.33 0 0 1 -1.29,-1 l -1.33,-5.34 a 1.33,1.33 0 1 1 2.58,-0.64 l 1.34,5.33 z" d="m 145.67,81.5 a 1.34,1.34 0 0 0 -1.34,1.33 v 0.44 l -16,6.59 V 87.5 l 17.85,-7.38 a 1.36,1.36 0 0 0 0.82,-1.24 1.34,1.34 0 0 0 -0.82,-1.23 l -38.67,-16 a 1.38,1.38 0 0 0 -1,0 l -38.67,16 a 1.34,1.34 0 0 0 -0.84,1.18 1.36,1.36 0 0 0 0.82,1.24 l 38.67,16 a 1.24,1.24 0 0 0 1,0 l 14,-5.78 a 1.33,1.33 0 0 0 -1,-2.46 L 107,93.39 71.82,78.83 107,64.28 l 35.18,14.55 -15.31,6.34 -14.66,-5.48 a 3,3 0 0 0 0.12,-0.86 c 0,-2.24 -2.34,-4 -5.33,-4 -2.99,0 -5.33,1.76 -5.33,4 0,2.24 2.34,4 5.33,4 a 6.41,6.41 0 0 0 3.45,-0.95 l 15.22,5.68 v 4.28 0 28.57 a 4,4 0 1 0 2.66,0 v -7.57 a 16.19,16.19 0 0 0 5.26,-6.9 1.32,1.32 0 0 0 0.08,-0.44 v -9.33 a 1.34,1.34 0 1 0 -2.67,0 v 9.08 a 13.49,13.49 0 0 1 -2.67,4 V 92.74 L 146.17,85.4 A 1.34,1.34 0 0 0 147,84.17 v -1.34 a 1.34,1.34 0 0 0 -1.33,-1.33 z m -41.34,-2.67 c 0,-0.54 1,-1.33 2.67,-1.33 1.67,0 2.67,0.79 2.67,1.33 0,0.54 -1,1.34 -2.67,1.34 -1.67,0 -2.67,-0.79 -2.67,-1.34 z M 127,125.5 a 1.34,1.34 0 1 1 1.33,-1.33 1.33,1.33 0 0 1 -1.33,1.33 z M 106.49,101.4 67.82,85.4 A 1.34,1.34 0 0 1 67,84.17 v -1.34 a 1.34,1.34 0 0 1 2.67,0 v 0.45 L 107,98.72 121.15,92.86 a 1.36,1.36 0 0 1 1.75,0.73 1.33,1.33 0 0 1 -0.72,1.74 l -14.67,6.07 a 1.35,1.35 0 0 1 -1,0 z m 15.77,15.54 A 34.28,34.28 0 0 1 107,120.17 c -20.67,0 -26.34,-13.6 -26.57,-14.17 a 1.44,1.44 0 0 1 -0.1,-0.5 v -9.33 a 1.34,1.34 0 1 1 2.67,0 v 9 c 0.77,1.67 6.11,11.7 22.67,12.23 v -11.9 a 1.33,1.33 0 0 1 2.66,0 v 12 a 31,31 0 0 0 12.75,-2.91 1.3327134,1.3327134 0 0 1 1.18,2.39 z m 6.07,13.89 v 4 a 1.33,1.33 0 1 1 -2.66,0 v -4 a 1.33,1.33 0 1 1 2.66,0 z m -4,-1 -1.33,5.33 a 1.33,1.33 0 0 1 -1.29,1 1.86,1.86 0 0 1 -0.33,0 1.34,1.34 0 0 1 -1,-1.62 l 1.34,-5.33 a 1.33,1.33 0 0 1 2.58,0.64 z m 9.34,4.69 a 1.34,1.34 0 0 1 -1,1.62 1.86,1.86 0 0 1 -0.33,0 1.33,1.33 0 0 1 -1.29,-1 l -1.33,-5.34 a 1.33,1.33 0 1 1 2.58,-0.64 l 1.34,5.33 z"
class="cls-2" class="cls-2"
id="graduation-hat" id="graduation-hat"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
id="path2598" id="path2598"
style="fill:#222840" style="fill:#222840"
d="M 114,21.74 V 9 h 2 v 12.74 z m -2.57,-6.22 v 4.1 a 0.86,0.86 0 0 0 0.2,0.58 1,1 0 0 0 0.59,0.25 v 1.49 a 3.81,3.81 0 0 1 -2.4,-0.66 6.91,6.91 0 0 1 -2.9,0.66 c -1.79,0 -2.68,-1 -2.68,-2.86 a 2.44,2.44 0 0 1 0.73,-2 4,4 0 0 1 2.24,-0.74 l 2.32,-0.2 V 15.5 a 1.33,1.33 0 0 0 -0.31,-1 1.35,1.35 0 0 0 -0.93,-0.29 c -0.77,0 -1.73,0 -2.88,0.14 h -0.57 L 104.71,13 a 15.72,15.72 0 0 1 3.61,-0.46 3.31,3.31 0 0 1 2.38,0.71 3.05,3.05 0 0 1 0.73,2.27 z m -4,2.23 a 1.21,1.21 0 0 0 -1.25,1.35 c 0,0.83 0.37,1.24 1.1,1.24 a 7,7 0 0 0 1.91,-0.29 l 0.32,-0.11 v -2.39 z m -7,-6.54 V 9.14 h 2 v 2.07 z m 0,10.53 v -9 h 2 v 9 z m -6.5,0 v -9 h 1.95 v 1.08 a 8.42,8.42 0 0 1 3.06,-1.27 v 2 a 12.5,12.5 0 0 0 -2.65,0.79 l -0.4,0.16 v 6.28 z m -9.04,-8.02 a 4.65,4.65 0 0 1 6.17,0 5.57,5.57 0 0 1 0.94,3.51 5.76,5.76 0 0 1 -0.9,3.52 4.67,4.67 0 0 1 -6.23,0 5.76,5.76 0 0 1 -0.9,-3.52 5.57,5.57 0 0 1 0.92,-3.51 z m 1.46,5.85 a 1.71,1.71 0 0 0 1.62,0.72 1.69,1.69 0 0 0 1.62,-0.72 A 4.93,4.93 0 0 0 90,17.21 4.53,4.53 0 0 0 89.56,14.89 1.76,1.76 0 0 0 88,14.2 a 1.74,1.74 0 0 0 -1.59,0.69 4.53,4.53 0 0 0 -0.44,2.32 5.08,5.08 0 0 0 0.38,2.36 z m -3.56,-5.15 h -2.48 v 4 a 4.19,4.19 0 0 0 0.16,1.46 c 0.11,0.24 0.38,0.36 0.83,0.36 l 1.47,-0.06 0.09,1.57 a 10.91,10.91 0 0 1 -1.83,0.23 2.59,2.59 0 0 1 -2.1,-0.7 4.41,4.41 0 0 1 -0.57,-2.65 v -4.21 h -1.15 v -1.68 h 1.15 v -2.61 h 2 v 2.61 h 2.48 z m -9.16,-1.68 h 1.94 v 9 h -1.94 v -0.55 a 5,5 0 0 1 -2.43,0.75 2.72,2.72 0 0 1 -2.49,-1 7,7 0 0 1 -0.63,-3.5 v -4.7 h 2 v 4.72 a 5.78,5.78 0 0 0 0.27,2.18 c 0.18,0.37 0.6,0.56 1.26,0.56 a 4.36,4.36 0 0 0 1.78,-0.36 l 0.27,-0.11 z M 59,11.2 V 9.41 h 9 v 1.79 h -3.5 v 10.54 h -2 V 11.2 Z" d="M 133.5,41.74 V 29 h 2 v 12.74 z m -2.57,-6.22 v 4.1 a 0.86,0.86 0 0 0 0.2,0.58 1,1 0 0 0 0.59,0.25 v 1.49 a 3.81,3.81 0 0 1 -2.4,-0.66 6.91,6.91 0 0 1 -2.9,0.66 c -1.79,0 -2.68,-1 -2.68,-2.86 a 2.44,2.44 0 0 1 0.73,-2 4,4 0 0 1 2.24,-0.74 l 2.32,-0.2 V 35.5 a 1.33,1.33 0 0 0 -0.31,-1 1.35,1.35 0 0 0 -0.93,-0.29 c -0.77,0 -1.73,0 -2.88,0.14 h -0.57 L 124.21,33 a 15.72,15.72 0 0 1 3.61,-0.46 3.31,3.31 0 0 1 2.38,0.71 3.05,3.05 0 0 1 0.73,2.27 z m -4,2.23 a 1.21,1.21 0 0 0 -1.25,1.35 c 0,0.83 0.37,1.24 1.1,1.24 a 7,7 0 0 0 1.91,-0.29 l 0.32,-0.11 v -2.39 z m -7,-6.54 v -2.07 h 2 v 2.07 z m 0,10.53 v -9 h 2 v 9 z m -6.5,0 v -9 h 1.95 v 1.08 a 8.42,8.42 0 0 1 3.06,-1.27 v 2 a 12.5,12.5 0 0 0 -2.65,0.79 l -0.4,0.16 v 6.28 z m -9.04,-8.02 a 4.65,4.65 0 0 1 6.17,0 5.57,5.57 0 0 1 0.94,3.51 5.76,5.76 0 0 1 -0.9,3.52 4.67,4.67 0 0 1 -6.23,0 5.76,5.76 0 0 1 -0.9,-3.52 5.57,5.57 0 0 1 0.92,-3.51 z m 1.46,5.85 a 1.71,1.71 0 0 0 1.62,0.72 1.69,1.69 0 0 0 1.62,-0.72 4.93,4.93 0 0 0 0.41,-2.36 4.53,4.53 0 0 0 -0.44,-2.32 1.76,1.76 0 0 0 -1.56,-0.69 1.74,1.74 0 0 0 -1.59,0.69 4.53,4.53 0 0 0 -0.44,2.32 5.08,5.08 0 0 0 0.38,2.36 z m -3.56,-5.15 h -2.48 v 4 a 4.19,4.19 0 0 0 0.16,1.46 c 0.11,0.24 0.38,0.36 0.83,0.36 l 1.47,-0.06 0.09,1.57 a 10.91,10.91 0 0 1 -1.83,0.23 2.59,2.59 0 0 1 -2.1,-0.7 4.41,4.41 0 0 1 -0.57,-2.65 v -4.21 h -1.15 v -1.68 h 1.15 v -2.61 h 2 v 2.61 h 2.48 z m -9.16,-1.68 h 1.94 v 9 h -1.94 v -0.55 a 5,5 0 0 1 -2.43,0.75 2.72,2.72 0 0 1 -2.49,-1 7,7 0 0 1 -0.63,-3.5 v -4.7 h 2 v 4.72 a 5.78,5.78 0 0 0 0.27,2.18 c 0.18,0.37 0.6,0.56 1.26,0.56 a 4.36,4.36 0 0 0 1.78,-0.36 l 0.27,-0.11 z M 78.5,31.2 v -1.79 h 9 V 31.2 H 84 V 41.74 H 82 V 31.2 Z"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
</g> </g>
<g <g
id="src/plugins/qtsupport/images/icons/qteventicon" id="src/plugins/qtsupport/images/icons/qteventicon"
transform="translate(354)"> transform="translate(428,-32)">
<rect <rect
id="rect2709" id="rect2709"
height="110" height="160"
width="176" width="214"
class="cls-1" class="cls-1"
x="0" x="0"
y="0" y="0"
style="fill:#ffffff" /> style="fill:#ffffff" />
<path <path
d="m 120,37.2 v 4.27 a 1.06,1.06 0 0 1 -1.07,1.06 h -1.06 v 24.54 a 1.07,1.07 0 0 1 -2.14,0 v -25.6 a 1.07,1.07 0 0 1 1.07,-1.07 h 1.07 V 38.27 H 58.13 v 2.13 h 54.4 a 1.07,1.07 0 1 1 0,2.13 H 57.07 A 1.06,1.06 0 0 1 56,41.47 V 37.2 a 1.07,1.07 0 0 1 1.07,-1.07 h 29.86 v -1.06 a 1.07,1.07 0 1 1 2.14,0 v 1.06 h 29.86 A 1.07,1.07 0 0 1 120,37.2 Z M 69.87,51.07 h 8.53 a 1.07,1.07 0 0 0 0,-2.14 h -8.53 a 1.07,1.07 0 0 0 0,2.14 z m 0,6.4 h 19.2 a 1.07,1.07 0 0 0 0,-2.14 h -19.2 a 1.07,1.07 0 0 0 0,2.14 z m 17.06,-6.4 a 1.07,1.07 0 0 0 0,-2.14 h -4.26 a 1.07,1.07 0 0 0 0,2.14 z m -17.06,12.8 h 3.2 a 1.07,1.07 0 0 0 0,-2.14 h -3.2 a 1.07,1.07 0 0 0 0,2.14 z m 19.2,-2.14 H 78.4 a 1.07,1.07 0 0 0 0,2.14 h 10.67 a 1.07,1.07 0 0 0 0,-2.14 z m 19.27,6.42 a 1.11,1.11 0 0 0 -1.13,0.92 L 104,92.52 a 1.06,1.06 0 0 0 0.91,1.2 h 0.15 a 1.06,1.06 0 0 0 1.05,-0.92 l 3.08,-22.52 c 3.68,0.09 6.2,0.79 7.49,2.08 a 4.34,4.34 0 0 1 1.18,3.23 v 17.08 a 1.07,1.07 0 0 0 2.13,0 V 75.6 a 6.46,6.46 0 0 0 -1.8,-4.74 c -1.83,-1.82 -5.06,-2.71 -9.86,-2.71 z m -9.68,0.91 3.2,23.46 a 1.07,1.07 0 0 1 -2.12,0.29 L 96.67,70.27 h -17.2 v 4.26 H 91.2 a 1.06,1.06 0 0 1 1.06,1 l 2.13,21.34 a 1.05,1.05 0 0 1 -1,1.16 h -0.11 a 1.07,1.07 0 0 1 -1.06,-1 l -2,-20.37 h -14 c -5,0 -7.47,-4.79 -7.47,-7.47 a 1.07,1.07 0 0 1 1.07,-1.07 H 97.6 a 1.08,1.08 0 0 1 1.06,0.93 z m -21.33,1.21 h -6.21 c 0.52,1.74 2.16,4.26 5.15,4.26 h 1.06 z m 27.74,0 a 2.14,2.14 0 1 0 -4.27,0 2.11,2.11 0 0 0 1.07,1.83 v 7.77 a 1.07,1.07 0 0 0 2.13,0 V 72.1 a 2.14,2.14 0 0 0 1.07,-1.83 z m 6.4,-19.2 v 0.28 a 2.15,2.15 0 0 1 1.06,1.85 v 2.13 a 2.12,2.12 0 0 1 -1.1,1.87 12.85,12.85 0 0 1 -1.14,3.94 c -1,1.94 -2.43,4.86 -7.36,4.86 C 98,66 96.55,63.08 95.58,61.14 A 12.55,12.55 0 0 1 94.44,57.2 2.13,2.13 0 0 1 93.33,55.33 V 53.2 a 2.13,2.13 0 0 1 1.07,-1.85 v -0.28 a 6.41,6.41 0 0 1 6.4,-6.4 h 4.27 a 6.41,6.41 0 0 1 6.4,6.4 z m -1.07,2.13 a 1.07,1.07 0 0 1 -1.07,-1.07 v -1.06 a 4.27,4.27 0 0 0 -4.26,-4.27 h -4.27 a 4.27,4.27 0 0 0 -4.27,4.27 v 1.06 a 1.06,1.06 0 0 1 -1.06,1.07 v 2.13 a 1.06,1.06 0 0 1 1.06,1.07 9.93,9.93 0 0 0 1,3.79 c 1.11,2.22 2.09,3.68 5.44,3.68 3.35,0 4.34,-1.46 5.45,-3.68 a 10,10 0 0 0 1,-3.79 1.07,1.07 0 0 1 1.07,-1.07 V 53.2 Z m -4.27,0 h -1.06 a 1.07,1.07 0 1 0 0,2.13 h 1.06 a 1.07,1.07 0 1 0 0,-2.13 z m -5.33,0 h -1.07 a 1.07,1.07 0 0 0 0,2.13 h 1.07 a 1.07,1.07 0 1 0 0,-2.13 z m 11.73,27.73 A 1.06,1.06 0 0 0 111.47,82 v 14.93 a 1.07,1.07 0 1 0 2.13,0 V 82 a 1.07,1.07 0 0 0 -1.07,-1.07 z M 88,80.93 H 63.47 a 3.12,3.12 0 0 1 -3.2,-3.2 v -32 a 1.07,1.07 0 0 0 -2.14,0 v 32 a 5.29,5.29 0 0 0 5.34,5.34 H 88 a 1.07,1.07 0 0 0 0,-2.14 z" d="m 139,66.2 v 4.27 a 1.06,1.06 0 0 1 -1.07,1.06 h -1.06 v 24.54 a 1.07,1.07 0 0 1 -2.14,0 v -25.6 a 1.07,1.07 0 0 1 1.07,-1.07 h 1.07 V 67.27 H 77.13 v 2.13 h 54.4 a 1.07,1.07 0 1 1 0,2.13 H 76.07 A 1.06,1.06 0 0 1 75,70.47 V 66.2 a 1.07,1.07 0 0 1 1.07,-1.07 h 29.86 v -1.06 a 1.07,1.07 0 1 1 2.14,0 v 1.06 h 29.86 A 1.07,1.07 0 0 1 139,66.2 Z M 88.87,80.07 h 8.53 a 1.07,1.07 0 0 0 0,-2.14 h -8.53 a 1.07,1.07 0 0 0 0,2.14 z m 0,6.4 h 19.2 a 1.07,1.07 0 0 0 0,-2.14 h -19.2 a 1.07,1.07 0 0 0 0,2.14 z m 17.06,-6.4 a 1.07,1.07 0 0 0 0,-2.14 h -4.26 a 1.07,1.07 0 0 0 0,2.14 z m -17.06,12.8 h 3.2 a 1.07,1.07 0 0 0 0,-2.14 h -3.2 a 1.07,1.07 0 0 0 0,2.14 z m 19.2,-2.14 H 97.4 a 1.07,1.07 0 0 0 0,2.14 h 10.67 a 1.07,1.07 0 0 0 0,-2.14 z m 19.27,6.42 a 1.11,1.11 0 0 0 -1.13,0.92 L 123,121.52 a 1.06,1.06 0 0 0 0.91,1.2 h 0.15 a 1.06,1.06 0 0 0 1.05,-0.92 l 3.08,-22.52 c 3.68,0.09 6.2,0.79 7.49,2.08 a 4.34,4.34 0 0 1 1.18,3.23 v 17.08 a 1.07,1.07 0 0 0 2.13,0 V 104.6 a 6.46,6.46 0 0 0 -1.8,-4.74 c -1.83,-1.82 -5.06,-2.71 -9.86,-2.71 z m -9.68,0.91 3.2,23.46 a 1.07,1.07 0 0 1 -2.12,0.29 l -3.07,-22.54 h -17.2 v 4.26 h 11.73 a 1.06,1.06 0 0 1 1.06,1 l 2.13,21.34 a 1.05,1.05 0 0 1 -1,1.16 h -0.11 a 1.07,1.07 0 0 1 -1.06,-1 l -2,-20.37 h -14 c -5,0 -7.47,-4.79 -7.47,-7.47 a 1.07,1.07 0 0 1 1.07,-1.07 h 27.78 a 1.08,1.08 0 0 1 1.06,0.93 z m -21.33,1.21 h -6.21 c 0.52,1.74 2.16,4.26 5.15,4.26 h 1.06 z m 27.74,0 a 2.14,2.14 0 1 0 -4.27,0 2.11,2.11 0 0 0 1.07,1.83 v 7.77 a 1.07,1.07 0 0 0 2.13,0 v -7.77 a 2.14,2.14 0 0 0 1.07,-1.83 z m 6.4,-19.2 v 0.28 a 2.15,2.15 0 0 1 1.06,1.85 v 2.13 a 2.12,2.12 0 0 1 -1.1,1.87 12.85,12.85 0 0 1 -1.14,3.94 c -1,1.94 -2.43,4.86 -7.36,4.86 -4.93,0 -6.38,-2.92 -7.35,-4.86 a 12.55,12.55 0 0 1 -1.14,-3.94 2.13,2.13 0 0 1 -1.11,-1.87 V 82.2 a 2.13,2.13 0 0 1 1.07,-1.85 v -0.28 a 6.41,6.41 0 0 1 6.4,-6.4 h 4.27 a 6.41,6.41 0 0 1 6.4,6.4 z m -1.07,2.13 a 1.07,1.07 0 0 1 -1.07,-1.07 v -1.06 a 4.27,4.27 0 0 0 -4.26,-4.27 h -4.27 a 4.27,4.27 0 0 0 -4.27,4.27 v 1.06 a 1.06,1.06 0 0 1 -1.06,1.07 v 2.13 a 1.06,1.06 0 0 1 1.06,1.07 9.93,9.93 0 0 0 1,3.79 c 1.11,2.22 2.09,3.68 5.44,3.68 3.35,0 4.34,-1.46 5.45,-3.68 a 10,10 0 0 0 1,-3.79 1.07,1.07 0 0 1 1.07,-1.07 V 82.2 Z m -4.27,0 h -1.06 a 1.07,1.07 0 1 0 0,2.13 h 1.06 a 1.07,1.07 0 1 0 0,-2.13 z m -5.33,0 h -1.07 a 1.07,1.07 0 0 0 0,2.13 h 1.07 a 1.07,1.07 0 1 0 0,-2.13 z m 11.73,27.73 a 1.06,1.06 0 0 0 -1.06,1.07 v 14.93 a 1.07,1.07 0 1 0 2.13,0 V 111 a 1.07,1.07 0 0 0 -1.07,-1.07 z m -24.53,0 H 82.47 a 3.12,3.12 0 0 1 -3.2,-3.2 v -32 a 1.07,1.07 0 0 0 -2.14,0 v 32 a 5.29,5.29 0 0 0 5.34,5.34 H 107 a 1.07,1.07 0 0 0 0,-2.14 z"
class="cls-2" class="cls-2"
id="presentation-man" id="presentation-man"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
@@ -736,7 +738,7 @@
<path <path
id="path2724" id="path2724"
style="fill:#17a81a" style="fill:#17a81a"
d="m 108.63,21.74 h -2 V 9 h 2 v 7.36 l 1.11,-0.11 2.13,-3.51 h 2.19 l -2.59,4.26 2.74,4.78 H 112 l -2.2,-3.78 -1.17,0.12 z m -6.41,0 V 9 h 2 v 12.74 z m -2.57,-6.22 v 4.1 a 0.86,0.86 0 0 0 0.2,0.58 1,1 0 0 0 0.59,0.25 l -0.06,1.49 A 3.8,3.8 0 0 1 98,21.28 6.91,6.91 0 0 1 95.1,21.94 c -1.79,0 -2.68,-1 -2.68,-2.86 a 2.44,2.44 0 0 1 0.73,-2 4,4 0 0 1 2.24,-0.74 l 2.32,-0.2 V 15.5 a 1.33,1.33 0 0 0 -0.31,-1 1.35,1.35 0 0 0 -0.93,-0.29 c -0.77,0 -1.73,0 -2.88,0.14 H 93.01 L 92.93,13 a 15.72,15.72 0 0 1 3.61,-0.46 3.31,3.31 0 0 1 2.38,0.71 3.05,3.05 0 0 1 0.73,2.27 z m -4,2.23 a 1.21,1.21 0 0 0 -1.24,1.35 c 0,0.83 0.37,1.24 1.1,1.24 a 7,7 0 0 0 1.91,-0.29 l 0.32,-0.11 V 17.55 Z M 84,11.2 V 9.41 h 9 v 1.79 h -3.49 v 10.54 h -2 V 11.2 Z m -4.62,3.22 h -2.49 v 4 a 4.12,4.12 0 0 0 0.17,1.46 c 0.1,0.24 0.38,0.36 0.82,0.36 l 1.48,-0.06 0.09,1.57 A 11,11 0 0 1 77.61,21.98 2.55,2.55 0 0 1 75.52,21.28 4.41,4.41 0 0 1 75,18.59 V 14.42 H 73.8 V 12.74 H 75 v -2.61 h 1.94 v 2.61 h 2.49 z m -11.94,7.52 c -1.87,0 -3.17,-0.5 -3.91,-1.51 a 8.16,8.16 0 0 1 -1.11,-4.78 8.43,8.43 0 0 1 1.13,-4.85 c 0.75,-1.06 2,-1.58 3.89,-1.58 1.89,0 3.15,0.52 3.89,1.57 a 8.41,8.41 0 0 1 1.12,4.85 11.08,11.08 0 0 1 -0.45,3.49 4,4 0 0 1 -1.5,2 l 1.5,2.47 -1.86,0.86 -1.6,-2.63 a 3.68,3.68 0 0 1 -1.1,0.11 z m -2.34,-2.8 a 3.13,3.13 0 0 0 4.68,0 7.43,7.43 0 0 0 0.6,-3.5 7.78,7.78 0 0 0 -0.62,-3.58 3,3 0 0 0 -4.64,0 7.56,7.56 0 0 0 -0.63,3.56 7.47,7.47 0 0 0 0.61,3.52 z" d="m 127.32716,41.74 h -2 V 29 h 2 v 7.36 l 1.11,-0.11 2.13,-3.51 h 2.19 l -2.59,4.26 2.74,4.78 h -2.21 l -2.2,-3.78 -1.17,0.12 z m -6.41,0 V 29 h 2 v 12.74 z m -2.57,-6.22 v 4.1 a 0.86,0.86 0 0 0 0.2,0.58 1,1 0 0 0 0.59,0.25 l -0.06,1.49 a 3.8,3.8 0 0 1 -2.38,-0.66 6.91,6.91 0 0 1 -2.9,0.66 c -1.79,0 -2.68,-1 -2.68,-2.86 a 2.44,2.44 0 0 1 0.73,-2 4,4 0 0 1 2.24,-0.74 l 2.32,-0.2 V 35.5 a 1.33,1.33 0 0 0 -0.31,-1 1.35,1.35 0 0 0 -0.93,-0.29 c -0.77,0 -1.73,0 -2.88,0.14 h -0.58 l -0.08,-1.35 a 15.72,15.72 0 0 1 3.61,-0.46 3.31,3.31 0 0 1 2.38,0.71 3.05,3.05 0 0 1 0.73,2.27 z m -4,2.23 a 1.21,1.21 0 0 0 -1.24,1.35 c 0,0.83 0.37,1.24 1.1,1.24 a 7,7 0 0 0 1.91,-0.29 l 0.32,-0.11 v -2.39 z m -11.65,-6.55 v -1.79 h 9 v 1.79 h -3.49 v 10.54 h -2 V 31.2 Z m -4.619996,3.22 h -2.49 v 4 a 4.12,4.12 0 0 0 0.17,1.46 c 0.1,0.24 0.38,0.36 0.82,0.36 l 1.48,-0.06 0.09,1.57 a 11,11 0 0 1 -1.84,0.23 2.55,2.55 0 0 1 -2.09,-0.7 4.41,4.41 0 0 1 -0.52,-2.69 v -4.17 h -1.2 v -1.68 h 1.2 v -2.61 h 1.94 v 2.61 h 2.49 z m -11.94,7.52 c -1.87,0 -3.17,-0.5 -3.91,-1.51 a 8.16,8.16 0 0 1 -1.11,-4.78 8.43,8.43 0 0 1 1.13,-4.85 c 0.75,-1.06 2,-1.58 3.89,-1.58 1.89,0 3.15,0.52 3.89,1.57 a 8.41,8.41 0 0 1 1.12,4.85 11.08,11.08 0 0 1 -0.45,3.49 4,4 0 0 1 -1.5,2 l 1.5,2.47 -1.86,0.86 -1.6,-2.63 a 3.68,3.68 0 0 1 -1.1,0.11 z m -2.34,-2.8 a 3.13,3.13 0 0 0 4.68,0 7.43,7.43 0 0 0 0.6,-3.5 7.78,7.78 0 0 0 -0.62,-3.58 3,3 0 0 0 -4.64,0 7.56,7.56 0 0 0 -0.63,3.56 7.47,7.47 0 0 0 0.61,3.52 z"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
</g> </g>
<rect <rect
@@ -744,8 +746,8 @@
id="src/plugins/welcome/images/border" id="src/plugins/welcome/images/border"
width="37" width="37"
height="37" height="37"
x="530" x="642"
y="73" /> y="91" />
</g> </g>
<g <g
inkscape:groupmode="layer" inkscape:groupmode="layer"
@@ -6559,46 +6561,6 @@
d="m 52,564 c 8,-8 8,-8 8,-8" d="m 52,564 c 8,-8 8,-8 8,-8"
style="fill:none;stroke:#000000;stroke-width:1.42;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> style="fill:none;stroke:#000000;stroke-width:1.42;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g> </g>
<g
transform="translate(-34,374)"
id="src/plugins/welcome/images/new">
<rect
id="rect4886-1-4"
height="16"
width="16"
y="209.99899"
x="50"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" />
<rect
id="rect4922-3"
height="16"
width="2"
y="210"
x="57"
style="fill:#000000;fill-opacity:1" />
<rect
id="rect4924-6"
height="2"
width="16"
y="217"
x="50"
style="fill:#000000;fill-opacity:1" />
</g>
<g
transform="translate(-68,374)"
id="src/plugins/welcome/images/open">
<rect
id="rect4886-1-5"
height="16"
width="16"
y="210"
x="100"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" />
<polygon
id="polygon4927-6"
points="113,224 116,217 104,217 102.715,220 102,220 102,215 114.637,215 115,213 108,213 106,211 100,211 100,220 100,224 101,224 102,224 104,224 "
style="fill:#000000;fill-opacity:1" />
</g>
<g <g
transform="translate(-202,374)" transform="translate(-202,374)"
id="src/plugins/welcome/images/session"> id="src/plugins/welcome/images/session">
@@ -6646,131 +6608,6 @@
points="308,215 314,215 314,223 302,223 302,213 306,213 " points="308,215 314,215 314,223 302,223 302,213 306,213 "
style="fill:#000000;fill-opacity:1" /> style="fill:#000000;fill-opacity:1" />
</g> </g>
<g
transform="translate(46,324)"
id="src/plugins/welcome/images/qtaccount">
<rect
id="rect4886-1"
height="16"
width="16"
y="260"
x="50"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="csscsccscccsc"
style="fill:#000000;fill-opacity:1"
inkscape:connector-curvature="0"
d="m 60.447,269.795 c -0.207,-0.04 -0.431,-0.726 0,-1.363 0.521,-0.77 1.225,-2.879 1.225,-4.146 0,-2.366 -1.645,-4.284 -3.672,-4.285 -2.027,0.001 -3.672,1.919 -3.672,4.285 0,1.268 0.701,3.377 1.225,4.146 0.43,0.638 0.206,1.323 0,1.363 -3.284,0.648 -5.053,1.389 -5.053,3.408 v 1.798 h 7.5 7.5 v -1.798 c 0,-2.019 -1.77,-2.76 -5.053,-3.408 z"
id="path4884-6" />
</g>
<g
transform="translate(-38,324)"
id="src/plugins/welcome/images/blogs">
<rect
id="rect4904-3"
height="16"
width="16"
y="260"
x="150"
style="fill:#ffffff;fill-opacity:1" />
<ellipse
style="fill:#000000;fill-opacity:1"
cx="151.74353"
cy="274.25867"
id="circle4896-4"
rx="1.7435256"
ry="1.7418367" />
<path
id="path4900-5"
d="m 150.00001,260.001 v 3.65466 c 7.11422,0.007 12.3428,5.23401 12.3428,12.34434 l 3.6572,10e-4 c 0,-8.83117 -7.16227,-15.993 -16,-16 z"
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1"
sodipodi:nodetypes="ccccc" />
<path
id="path4902-7"
d="m 150.5665,266.32241 c -0.18916,0 -0.37933,0.008 -0.56649,0.02 v 3.38368 c 0.18616,-0.017 0.37532,-0.027 0.56649,-0.027 3.3119,0 5.72701,2.41277 5.72701,5.72146 0,0.19599 -0.011,0.38897 -0.028,0.57995 h 3.38696 c 0.012,-0.19198 0.02,-0.38496 0.02,-0.57995 0,-5.02452 -4.07657,-9.09814 -9.10597,-9.09814 z"
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1" />
</g>
<g
transform="translate(-72,324)"
id="src/plugins/welcome/images/community">
<rect
id="rect4909-9"
height="16"
width="16"
y="260"
x="200"
style="fill:#ffffff;fill-opacity:1" />
<path
id="path4907-4"
d="M 211.523,260 H 200 v 13 h 6 v 3 l 4.537,-3 H 216 v -7.331 C 216,262.563 214.5,260 211.523,260 Z"
inkscape:connector-curvature="0"
style="fill:#000000;fill-opacity:1"
sodipodi:nodetypes="sccccccss" />
</g>
<g
id="src/plugins/welcome/images/userguide"
transform="translate(16)">
<rect
style="fill:#ffffff;fill-opacity:1"
x="128"
y="584"
width="16"
height="16"
id="rect4909-9-8" />
<path
sodipodi:nodetypes="ssssscssccscsssccscccccsccssscccscsccccscsscccc"
inkscape:connector-curvature="0"
d="m 136,584 c -4.4176,0 -8,3.5824 -8,8 0,4.4176 3.5824,8 8,8 4.4176,0 8,-3.5824 8,-8 0,-4.4176 -3.5824,-8 -8,-8 z m 0.76817,12.9456 c -0.2192,0.2152 -0.4832,0.3216 -0.7912,0.3216 -0.1496,0 -0.2912,-0.028 -0.4264,-0.084 -0.1352,-0.056 -0.2544,-0.1304 -0.3568,-0.224 -0.1032,-0.0936 -0.184,-0.2056 -0.2456,-0.336 -0.0608,-0.1304 -0.0904,-0.2704 -0.0904,-0.42 0,-0.2984 0.1096,-0.5552 0.3288,-0.7696 0.2184,-0.2144 0.4824,-0.3216 0.7904,-0.3216 0.2992,0 0.56,0.1024 0.784,0.308 0.224,0.2056 0.336,0.4576 0.336,0.756 0,0.2976 -0.1104,0.5544 -0.3288,0.7696 z m 2.1904,-6.384 c -0.0832,0.2336 -0.196,0.448 -0.336,0.644 -0.14,0.196 -0.3008,0.3832 -0.4832,0.56 -0.1824,0.1776 -0.376,0.364 -0.5816,0.56 -0.1304,0.1208 -0.2424,0.2288 -0.336,0.3216 -0.0928,0.0936 -0.1704,0.1888 -0.2304,0.2872 -0.0608,0.0976 -0.1056,0.2096 -0.1336,0.336 -0.0272,0.1256 -0.0416,0.2776 -0.0416,0.4552 v 0.27418 h -1.6808 V 593.488 c 0,-0.2048 0.012,-0.38 0.0352,-0.5248 0.0232,-0.1448 0.0648,-0.2752 0.1256,-0.392 0.0608,-0.1168 0.14,-0.2288 0.2384,-0.336 0.0976,-0.1072 0.2168,-0.236 0.3568,-0.3848 l 1.0784,-1.092 c 0.2328,-0.2336 0.3504,-0.536 0.3504,-0.9096 0,-0.364 -0.1192,-0.66 -0.3568,-0.8888 -0.2384,-0.2288 -0.5392,-0.3432 -0.9032,-0.3432 -0.392,0 -0.7144,0.1328 -0.9664,0.3992 -0.2512,0.2664 -0.396,0.5904 -0.4336,0.9728 l -1.792,-0.14 c 0.056,-0.448 0.1728,-0.8472 0.3504,-1.1968 0.1776,-0.3504 0.4088,-0.6464 0.6928,-0.8888 0.284,-0.2424 0.6144,-0.4272 0.9872,-0.5528 0.3728,-0.1264 0.7832,-0.1888 1.232,-0.1888 0.4192,0 0.8096,0.0608 1.1688,0.1824 0.3592,0.1216 0.672,0.2968 0.9376,0.5248 0.2664,0.2288 0.4744,0.5136 0.6232,0.8536 0.1488,0.3408 0.224,0.7304 0.224,1.1688 8e-4,0.3056 -0.0416,0.5768 -0.1256,0.8104 z"
id="path5457-0-5"
style="display:inline" />
</g>
<g
id="src/plugins/welcome/images/download"
transform="translate(32)">
<use
style="display:inline"
x="0"
y="0"
xlink:href="#backgroundRect"
id="use5933-0-9-4"
width="100%"
height="100%"
transform="translate(144,148)" />
<path
id="path2540"
style="fill:none;stroke:#000000;stroke-width:2;stroke-linejoin:round"
d="m 128,599 h 16 m -14.5,-9.5 6.5,6.5 6.5,-6.5 M 136,584 v 12"
sodipodi:nodetypes="ccccccc" />
</g>
<g
id="src/plugins/welcome/images/settings">
<use
style="display:inline"
x="0"
y="0"
xlink:href="#backgroundRect"
id="use4519"
width="100%"
height="100%"
transform="translate(192,148)" />
<use
x="0"
y="0"
xlink:href="#gear_small"
id="use4295"
width="100%"
height="100%"
style="display:inline"
transform="matrix(1.3333313,0,0,1.3333318,-2125.3299,-175.99908)" />
<circle
style="fill:#ffffff"
id="path2610"
cx="184"
cy="592"
r="4" />
</g>
<g <g
id="src/libs/utils/images/member" id="src/libs/utils/images/member"
transform="translate(-28)"> transform="translate(-28)">

Before

Width:  |  Height:  |  Size: 373 KiB

After

Width:  |  Height:  |  Size: 366 KiB