From edca922f5eb6618f175207e8312eaaa280c6a792 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Fri, 9 Dec 2016 21:09:12 +0800 Subject: [PATCH] support avatar Signed-off-by: Le Tan --- src/resources/vnote.qss | 1 + src/src.pro | 6 ++- src/vavatar.cpp | 107 ++++++++++++++++++++++++++++++++++++++++ src/vavatar.h | 41 +++++++++++++++ src/vmainwindow.cpp | 68 +++++++++++++++++-------- src/vmainwindow.h | 7 +++ src/vnote.cpp | 10 ++++ src/vnote.h | 5 +- 8 files changed, 221 insertions(+), 24 deletions(-) create mode 100644 src/vavatar.cpp create mode 100644 src/vavatar.h diff --git a/src/resources/vnote.qss b/src/resources/vnote.qss index fd2ecc84..8948d580 100644 --- a/src/resources/vnote.qss +++ b/src/resources/vnote.qss @@ -140,3 +140,4 @@ QToolBox::tab { QWidget[NotebookPanel="true"] { padding-left: 3px; } + diff --git a/src/src.pro b/src/src.pro index abb95b8b..7d9ce289 100644 --- a/src/src.pro +++ b/src/src.pro @@ -46,7 +46,8 @@ SOURCES += main.cpp\ vdirectory.cpp \ vfile.cpp \ vnotebookselector.cpp \ - vnofocusitemdelegate.cpp + vnofocusitemdelegate.cpp \ + vavatar.cpp HEADERS += vmainwindow.h \ vdirectorytree.h \ @@ -81,7 +82,8 @@ HEADERS += vmainwindow.h \ vdirectory.h \ vfile.h \ vnotebookselector.h \ - vnofocusitemdelegate.h + vnofocusitemdelegate.h \ + vavatar.h RESOURCES += \ vnote.qrc diff --git a/src/vavatar.cpp b/src/vavatar.cpp new file mode 100644 index 00000000..4ba9f8a7 --- /dev/null +++ b/src/vavatar.cpp @@ -0,0 +1,107 @@ +#include "vavatar.h" +#include +#include +#include +#include +#include +#include + +VAvatar::VAvatar(QWidget *p_parent) + : QWidget(p_parent, Qt::FramelessWindowHint | Qt::WindowSystemMenuHint), + m_avatarText("VN"), m_diameter(48), m_borderWidth(3) +{ + resize(m_diameter, m_diameter); +} + +void VAvatar::paintEvent(QPaintEvent *p_event) +{ + int diameter = width(); + int x = diameter / 2; + int y = x + 1; + + // Border + QPainterPath path; + path.addEllipse(QPoint(x, y), x - m_borderWidth, y - m_borderWidth); + + QPainter painter(this); + painter.setClipPath(path); + painter.setClipping(true); + painter.setRenderHint(QPainter::Antialiasing); + + if (!m_avatarPixmap.isEmpty()) { + drawPixmap(painter); + } else { + drawText(painter, x); + } + drawBorder(painter, path); +} + +void VAvatar::drawPixmap(QPainter &p_painter) +{ + p_painter.drawPixmap(rect(), m_pixmap); +} + +void VAvatar::drawText(QPainter &p_painter, int p_fontPixcel) +{ + p_painter.save(); + QFont font = p_painter.font(); + font.setPixelSize(p_fontPixcel); + p_painter.setPen(m_fgColor); + p_painter.setFont(font); + p_painter.drawText(rect(), Qt::AlignCenter, m_avatarText); + p_painter.restore(); +} + +void VAvatar::drawBorder(QPainter &p_painter, const QPainterPath &p_path) +{ + p_painter.save(); + p_painter.setClipping(false); + QPen borderPen(m_baseColor); + borderPen.setWidth(m_borderWidth); + p_painter.setPen(borderPen); + p_painter.drawPath(p_path); + p_painter.restore(); +} + +void VAvatar::setDiameter(int p_diameter) +{ + if (m_diameter == p_diameter) { + return; + } + m_diameter = p_diameter; + resize(m_diameter, m_diameter); +} + +void VAvatar::setAvatarText(const QString &p_avatarText) +{ + if (m_avatarText == p_avatarText) { + return; + } + m_avatarText = p_avatarText.left(2); + m_avatarPixmap.clear(); + update(); +} + +void VAvatar::setAvatarPixmap(const QString &p_avatarPixmap) +{ + if (m_avatarPixmap == p_avatarPixmap) { + return; + } + m_avatarPixmap = p_avatarPixmap; + m_pixmap = QPixmap(m_avatarPixmap); + m_avatarText.clear(); + update(); +} + +QSize VAvatar::sizeHint() const +{ + return QSize(m_diameter, m_diameter); +} + +void VAvatar::setColor(const QString &p_baseColor, const QString &p_fgColor, const QString &p_bgColor) +{ + m_baseColor.setNamedColor(p_baseColor); + m_fgColor.setNamedColor(p_fgColor); + m_bgColor.setNamedColor(p_bgColor); +} + diff --git a/src/vavatar.h b/src/vavatar.h new file mode 100644 index 00000000..a84d421c --- /dev/null +++ b/src/vavatar.h @@ -0,0 +1,41 @@ +#ifndef VAVATAR_H +#define VAVATAR_H + +#include +#include +#include +#include + +class QLabel; + +class VAvatar : public QWidget +{ + Q_OBJECT +public: + explicit VAvatar(QWidget *p_parent = 0); + void setDiameter(int p_diameter); + void setAvatarPixmap(const QString &p_avatarPixmap); + void setAvatarText(const QString &p_avatarText); + void setColor(const QString &p_baseColor, const QString &p_fgColor, const QString &p_bgColor); + QSize sizeHint() const Q_DECL_OVERRIDE; + +protected: + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; + +private: + void drawPixmap(QPainter &p_painter); + void drawText(QPainter &p_painter, int p_fontPixcel); + void drawBorder(QPainter &p_painter, const QPainterPath &p_path); + + // Draw a pixmap or characters. + QString m_avatarPixmap; + QString m_avatarText; + int m_diameter; + QColor m_baseColor; + QColor m_fgColor; + QColor m_bgColor; + int m_borderWidth; + QPixmap m_pixmap; +}; + +#endif // VAVATAR_H diff --git a/src/vmainwindow.cpp b/src/vmainwindow.cpp index 420503b5..2e3d314d 100644 --- a/src/vmainwindow.cpp +++ b/src/vmainwindow.cpp @@ -9,6 +9,7 @@ #include "veditarea.h" #include "voutline.h" #include "vnotebookselector.h" +#include "vavatar.h" extern VConfigManager vconfig; @@ -25,6 +26,7 @@ VMainWindow::VMainWindow(QWidget *parent) initToolBar(); initMenuBar(); initDockWindows(); + initAvatar(); restoreStateAndGeometry(); notebookSelector->update(); @@ -246,19 +248,19 @@ void VMainWindow::initActions() void VMainWindow::initToolBar() { - QToolBar *fileToolBar = addToolBar(tr("Note")); - fileToolBar->setObjectName("NoteToolBar"); - fileToolBar->setMovable(false); - fileToolBar->addAction(newRootDirAct); - fileToolBar->addAction(newNoteAct); - fileToolBar->addAction(noteInfoAct); - fileToolBar->addAction(deleteNoteAct); - fileToolBar->addSeparator(); - fileToolBar->addAction(editNoteAct); - fileToolBar->addAction(saveExitAct); - fileToolBar->addAction(discardExitAct); - fileToolBar->addAction(saveNoteAct); - fileToolBar->addSeparator(); + m_fileToolBar = addToolBar(tr("Note")); + m_fileToolBar->setObjectName("NoteToolBar"); + m_fileToolBar->setMovable(false); + m_fileToolBar->addAction(newRootDirAct); + m_fileToolBar->addAction(newNoteAct); + m_fileToolBar->addAction(noteInfoAct); + m_fileToolBar->addAction(deleteNoteAct); + m_fileToolBar->addSeparator(); + m_fileToolBar->addAction(editNoteAct); + m_fileToolBar->addAction(saveExitAct); + m_fileToolBar->addAction(discardExitAct); + m_fileToolBar->addAction(saveNoteAct); + m_fileToolBar->addSeparator(); newRootDirAct->setEnabled(false); newNoteAct->setEnabled(false); @@ -269,12 +271,12 @@ void VMainWindow::initToolBar() discardExitAct->setVisible(false); saveNoteAct->setVisible(false); - QToolBar *viewToolBar = addToolBar(tr("View")); - viewToolBar->setObjectName("ViewToolBar"); - viewToolBar->setMovable(false); - viewToolBar->addAction(twoPanelViewAct); - viewToolBar->addAction(onePanelViewAct); - viewToolBar->addAction(expandViewAct); + m_viewToolBar = addToolBar(tr("View")); + m_viewToolBar->setObjectName("ViewToolBar"); + m_viewToolBar->setMovable(false); + m_viewToolBar->addAction(twoPanelViewAct); + m_viewToolBar->addAction(onePanelViewAct); + m_viewToolBar->addAction(expandViewAct); } void VMainWindow::initMenuBar() @@ -352,6 +354,15 @@ void VMainWindow::initDockWindows() viewMenu->addAction(toolDock->toggleViewAction()); } +void VMainWindow::initAvatar() +{ + m_avatar = new VAvatar(this); + m_avatar->setAvatarPixmap(":/resources/icons/vnote.svg"); + m_avatar->setColor(vnote->getColorFromPalette("base-color"), vnote->getColorFromPalette("Indigo4"), + vnote->getColorFromPalette("teal4")); + m_avatar->hide(); +} + void VMainWindow::importNoteFromFile() { static QString lastPath = QDir::homePath(); @@ -633,7 +644,7 @@ void VMainWindow::restoreStateAndGeometry() const QVector >& VMainWindow::getPalette() const { - return vnote->getPallete(); + return vnote->getPalette(); } void VMainWindow::handleCurrentDirectoryChanged(const VDirectory *p_dir) @@ -645,3 +656,20 @@ void VMainWindow::handleCurrentNotebookChanged(const VNotebook *p_notebook) { newRootDirAct->setEnabled(p_notebook); } + +void VMainWindow::resizeEvent(QResizeEvent *event) +{ + repositionAvatar(); + QMainWindow::resizeEvent(event); +} + +void VMainWindow::repositionAvatar() +{ + int diameter = mainSplitter->pos().y(); + int x = width() - diameter - 5; + int y = 0; + qDebug() << "avatar:" << diameter << x << y; + m_avatar->setDiameter(diameter); + m_avatar->move(x, y); + m_avatar->show(); +} diff --git a/src/vmainwindow.h b/src/vmainwindow.h index 91b57426..07d6b758 100644 --- a/src/vmainwindow.h +++ b/src/vmainwindow.h @@ -25,6 +25,7 @@ class VEditArea; class QToolBox; class VOutline; class VNotebookSelector; +class VAvatar; class VMainWindow : public QMainWindow { @@ -51,6 +52,7 @@ private slots: protected: void closeEvent(QCloseEvent *event) Q_DECL_OVERRIDE; + void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; private: void setupUI(); @@ -59,6 +61,7 @@ private: void initToolBar(); void initMenuBar(); void initDockWindows(); + void initAvatar(); void initPredefinedColorPixmaps(); void initRenderBackgroundMenu(QMenu *menu); void initEditorBackgroundMenu(QMenu *menu); @@ -67,6 +70,7 @@ private: void updateToolbarFromTabChage(const VFile *p_file, bool p_editMode); void saveStateAndGeometry(); void restoreStateAndGeometry(); + void repositionAvatar(); VNote *vnote; QPointer m_curFile; @@ -81,6 +85,9 @@ private: QDockWidget *toolDock; QToolBox *toolBox; VOutline *outline; + VAvatar *m_avatar; + QToolBar *m_fileToolBar; + QToolBar *m_viewToolBar; // Actions QAction *newRootDirAct; diff --git a/src/vnote.cpp b/src/vnote.cpp index be27362e..02e370e7 100644 --- a/src/vnote.cpp +++ b/src/vnote.cpp @@ -46,6 +46,16 @@ void VNote::initPalette(QPalette palette) m_palette.append(QPair("Indigo4", "#5C6BC0")); } +QString VNote::getColorFromPalette(const QString &p_name) const +{ + for (int i = 0; i < m_palette.size(); ++i) { + if (m_palette[i].first == p_name) { + return m_palette[i].second; + } + } + return "White"; +} + void VNote::initTemplate() { if (templateHtml.isEmpty() || preTemplateHtml.isEmpty() diff --git a/src/vnote.h b/src/vnote.h index 0ba5bb96..a9e9fbdc 100644 --- a/src/vnote.h +++ b/src/vnote.h @@ -30,8 +30,9 @@ public: static QString preTemplateHtml; static QString postTemplateHtml; - inline const QVector > &getPallete() const; + inline const QVector > &getPalette() const; void initPalette(QPalette palette); + QString getColorFromPalette(const QString &p_name) const; public slots: void updateTemplate(); @@ -42,7 +43,7 @@ private: QVector > m_palette; }; -inline const QVector >& VNote::getPallete() const +inline const QVector >& VNote::getPalette() const { return m_palette; }