Skip to content

Commit

Permalink
Add grid layouts
Browse files Browse the repository at this point in the history
Grid layouts allow a lot more videos to be displayed at once, especially
the bigger the window is. Currently, they're being used for the Home and
Subscriptions tabs on the main page.

There are some things that need to be done with this still. See issue #10.
  • Loading branch information
BowDown097 committed Sep 6, 2023
1 parent 5441833 commit 016a834
Show file tree
Hide file tree
Showing 13 changed files with 285 additions and 73 deletions.
10 changes: 8 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,14 @@ set(SOURCE_FILES
src/ui/widgets/accountmenu/accountmenuwidget.cpp
src/ui/widgets/accountmenu/accountswitcherwidget.cpp
src/ui/widgets/labels/channellabel.cpp
src/ui/widgets/labels/elidedtubelabel.cpp
src/ui/widgets/labels/iconlabel.cpp
src/ui/widgets/labels/tubelabel.cpp
src/ui/widgets/renderers/browsechannelrenderer.cpp
src/ui/widgets/renderers/browsenotificationrenderer.cpp
src/ui/widgets/renderers/browsevideorenderer.cpp
src/ui/widgets/renderers/video/browsevideorenderer.cpp
src/ui/widgets/renderers/video/gridvideorenderer.cpp
src/ui/widgets/renderers/video/videorenderer.cpp
src/ui/widgets/subscribe/notificationbell.cpp
src/ui/widgets/subscribe/subscribelabel.cpp
src/ui/widgets/subscribe/subscribewidget.cpp
Expand Down Expand Up @@ -140,11 +143,14 @@ set(HEADERS
src/ui/widgets/accountmenu/accountmenuwidget.h
src/ui/widgets/accountmenu/accountswitcherwidget.h
src/ui/widgets/labels/channellabel.h
src/ui/widgets/labels/elidedtubelabel.h
src/ui/widgets/labels/iconlabel.h
src/ui/widgets/labels/tubelabel.h
src/ui/widgets/renderers/browsechannelrenderer.h
src/ui/widgets/renderers/browsenotificationrenderer.h
src/ui/widgets/renderers/browsevideorenderer.h
src/ui/widgets/renderers/video/browsevideorenderer.h
src/ui/widgets/renderers/video/gridvideorenderer.h
src/ui/widgets/renderers/video/videorenderer.h
src/ui/widgets/subscribe/notificationbell.h
src/ui/widgets/subscribe/subscribelabel.h
src/ui/widgets/subscribe/subscribewidget.h
Expand Down
4 changes: 1 addition & 3 deletions src/ui/forms/livechatwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,7 @@
</sizepolicy>
</property>
<property name="styleSheet">
<string notr="true">QListWidget::item {
background: transparent;
}</string>
<string notr="true">QListWidget::item { background: transparent; }</string>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
Expand Down
33 changes: 30 additions & 3 deletions src/ui/forms/mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@
<iconset resource="../../../res/resources.qrc">
<normaloff>:/qttube.svg</normaloff>:/qttube.svg</iconset>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<widget class="QStackedWidget" name="centralwidget">
<widget class="QWidget" name="mainPage">
<layout class="QGridLayout" name="gridLayout">
Expand All @@ -44,12 +41,27 @@
<layout class="QGridLayout" name="gridLayout_16">
<item row="0" column="0">
<widget class="QListWidget" name="homeWidget">
<property name="styleSheet">
<string notr="true">QListWidget::item { background: transparent;}</string>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="flow">
<enum>QListView::LeftToRight</enum>
</property>
<property name="isWrapping" stdset="0">
<bool>true</bool>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="spacing">
<number>3</number>
</property>
</widget>
</item>
</layout>
Expand Down Expand Up @@ -78,12 +90,27 @@
<layout class="QGridLayout" name="gridLayout_18">
<item row="0" column="0">
<widget class="QListWidget" name="subscriptionsWidget">
<property name="styleSheet">
<string notr="true">QListWidget::item { background: transparent; }</string>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="verticalScrollMode">
<enum>QAbstractItemView::ScrollPerPixel</enum>
</property>
<property name="flow">
<enum>QListView::LeftToRight</enum>
</property>
<property name="isWrapping" stdset="0">
<bool>true</bool>
</property>
<property name="resizeMode">
<enum>QListView::Adjust</enum>
</property>
<property name="spacing">
<number>3</number>
</property>
</widget>
</item>
</layout>
Expand Down
67 changes: 67 additions & 0 deletions src/ui/widgets/labels/elidedtubelabel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "elidedtubelabel.h"
#include <QMouseEvent>
#include <QTextLayout>

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
void ElidedTubeLabel::enterEvent(QEnterEvent*)
#else
void ElidedTubeLabel::enterEvent(QEvent*)
#endif
{
if (m_clickable)
setCursor(QCursor(Qt::CursorShape::PointingHandCursor));
if (m_underline)
setStyleSheet("QLabel { text-decoration: underline; }");
}

void ElidedTubeLabel::leaveEvent(QEvent*)
{
if (m_clickable)
setCursor(QCursor());
if (m_underline)
setStyleSheet("");
}

void ElidedTubeLabel::mousePressEvent(QMouseEvent* event)
{
if (m_clickable && event->button() == Qt::LeftButton)
emit clicked();
}

void ElidedTubeLabel::setText(const QString& text)
{
QFontMetrics fm(font());
int lineSpacing = fm.lineSpacing();
int y = 0;

QTextLayout textLayout(text, font());
textLayout.beginLayout();

QString outText;
forever
{
QTextLine line = textLayout.createLine();
if (!line.isValid())
break;

line.setLineWidth(width());
int nextLineY = y + lineSpacing;

if (maximumHeight() >= nextLineY + lineSpacing)
{
outText += QStringView(text.mid(line.textStart(), line.textLength()));
y = nextLineY;
}
else
{
QString lastLine = text.mid(line.textStart());
QString elidedLastLine = fm.elidedText(lastLine, Qt::ElideRight, width());
outText += elidedLastLine;
line = textLayout.createLine();
break;
}
}

textLayout.endLayout();
QLabel::setText(outText);
}
29 changes: 29 additions & 0 deletions src/ui/widgets/labels/elidedtubelabel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#ifndef ELIDEDTUBELABEL_H
#define ELIDEDTUBELABEL_H
#include <QLabel>

class ElidedTubeLabel : public QLabel
{
Q_OBJECT
public:
explicit ElidedTubeLabel(QWidget* parent = nullptr) : QLabel(parent) {}
ElidedTubeLabel(const QString& text, QWidget* parent = nullptr) : ElidedTubeLabel(parent) { setText(text); }

void setClickable(bool clickable, bool underline) { m_clickable = clickable; m_underline = underline; }
void setText(const QString& text);
protected:
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
void enterEvent(QEnterEvent*) override;
#else
void enterEvent(QEvent*) override;
#endif
void leaveEvent(QEvent*) override;
void mousePressEvent(QMouseEvent* event) override;
signals:
void clicked();
private:
bool m_clickable = false;
bool m_underline = false;
};

#endif // ELIDEDTUBELABEL_H
13 changes: 13 additions & 0 deletions src/ui/widgets/renderers/video/browsevideorenderer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include "browsevideorenderer.h"

BrowseVideoRenderer::BrowseVideoRenderer(QWidget* parent)
: VideoRenderer(parent), hbox(new QHBoxLayout(this)), textVbox(new QVBoxLayout)
{
setThumbnailSize(QSize(240, 0));
textVbox->addWidget(titleLabel);
textVbox->addWidget(channelLabel);
textVbox->addWidget(metadataLabel);

hbox->addWidget(thumbLabel);
hbox->addLayout(textVbox, 1);
}
15 changes: 15 additions & 0 deletions src/ui/widgets/renderers/video/browsevideorenderer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#ifndef BROWSEVIDEORENDERER_H
#define BROWSEVIDEORENDERER_H
#include "videorenderer.h"
#include <QVBoxLayout>

class BrowseVideoRenderer : public VideoRenderer
{
public:
explicit BrowseVideoRenderer(QWidget* parent = nullptr);
private:
QHBoxLayout* hbox;
QVBoxLayout* textVbox;
};

#endif // BROWSEVIDEORENDERER_H
23 changes: 23 additions & 0 deletions src/ui/widgets/renderers/video/gridvideorenderer.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#include "gridvideorenderer.h"
#include "utils/uiutils.h"
#include <QApplication>

GridVideoRenderer::GridVideoRenderer(QWidget* parent) : VideoRenderer(parent), vbox(new QVBoxLayout(this))
{
setThumbnailSize(QSize(205, 115));

titleLabel->setFont(QFont(qApp->font().toString(), qApp->font().pointSize() + 1, QFont::Bold));
titleLabel->setWordWrap(true);
UIUtils::setMaximumLines(titleLabel, 2);

channelLabel->text->setFont(QFont(qApp->font().toString(), qApp->font().pointSize() - 1));

metadataLabel->setFont(QFont(qApp->font().toString(), qApp->font().pointSize() - 1));
metadataLabel->setWordWrap(true);
UIUtils::setMaximumLines(metadataLabel, 2);

vbox->addWidget(thumbLabel);
vbox->addWidget(titleLabel);
vbox->addWidget(channelLabel);
vbox->addWidget(metadataLabel);
}
14 changes: 14 additions & 0 deletions src/ui/widgets/renderers/video/gridvideorenderer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef GRIDVIDEORENDERER_H
#define GRIDVIDEORENDERER_H
#include "videorenderer.h"
#include <QVBoxLayout>

class GridVideoRenderer : public VideoRenderer
{
public:
explicit GridVideoRenderer(QWidget* parent = nullptr);
private:
QVBoxLayout* vbox;
};

#endif // GRIDVIDEORENDERER_H
Loading

0 comments on commit 016a834

Please sign in to comment.