Skip to content

Commit

Permalink
add douban channel manager
Browse files Browse the repository at this point in the history
  • Loading branch information
zonyitoo committed Apr 29, 2014
1 parent 443bd17 commit cd3a335
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 39 deletions.
14 changes: 7 additions & 7 deletions channelwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ ChannelWidget::ChannelWidget(QWidget *parent) :
ui->slider->currentObject()->setStyleSheet(DARK_STYLE);
ui->slider->scrollToIndex(1);
ui->slider->currentObject()->setStyleSheet(HIGHTLIGHT_STYLE);
}else
doubanfm.getNewPlayList(-3);
qDebug() << "LoginoffSucceed. Refreshing Playlist";

} else {
doubanfm.getNewPlayList(channel);
}
qDebug() << "Logoff successfully. Refreshing playlist";
});

connect(this, SIGNAL(channelChanged(qint32)),
Expand Down Expand Up @@ -86,19 +86,19 @@ void ChannelWidget::on_nextButton_clicked()
void ChannelWidget::setChannels(const QList<DoubanChannel>& channels) {
this->channels = channels;
int curindex = 0;
QList< QWidget*>* labels= new QList<QWidget*>();
QList<QWidget *> labels;
for (int i = 0; i < channels.size(); ++ i) {
const DoubanChannel& channel = channels[i];
QLabel *label = new QLabel(ui->slider);
QFont font("文泉驿微米黑", 12);
QFont font("Sans", 12);
font.setStyleStrategy(QFont::PreferAntialias);
label->setFont(font);
label->setText(channel.name+" MHz");
label->setStyleSheet(DARK_STYLE);
label->setMinimumSize(ui->slider->width() / 3, ui->slider->height());
label->setMaximumSize(ui->slider->width() / 3, ui->slider->height());
label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
labels->append(label);
labels.append(label);
if (channel.channel_id == this->channel) curindex = i;
}
ui->slider->setChildren(labels);
Expand Down
6 changes: 4 additions & 2 deletions doubanfm-qt.pro
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ SOURCES += main.cpp\
albumwidget.cpp \
libs/doubanplayer.cpp \
settingdialog.cpp \
plugins/doubanfmplugin.cpp
plugins/doubanfmplugin.cpp \
libs/doubanchannelmanager.cpp

HEADERS += mainwidget.h \
channelwidget.h \
Expand All @@ -51,7 +52,8 @@ HEADERS += mainwidget.h \
libs/doubanplayer.h \
settingdialog.h \
plugins/doubanfmplugin.h \
plugins/plugin.hpp
plugins/plugin.hpp \
libs/doubanchannelmanager.h

!win32:!macx {
QT += dbus
Expand Down
57 changes: 42 additions & 15 deletions horizontalslider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,39 @@
#include <QDebug>

HorizontalSlider::HorizontalSlider(QWidget *parent) :
QWidget(parent)
QWidget(parent), hbox(nullptr)
{
container = new QWidget(this);
container->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
curIndex = 0;
}

HorizontalSlider::~HorizontalSlider() {
delete container;
}

void HorizontalSlider::clear() {
if (hbox != nullptr) {
container->setLayout(nullptr);
delete hbox;
}
hbox = new QHBoxLayout(container);
hbox->setMargin(0);
hbox->setSpacing(0);
hbox->setContentsMargins(0, 0, 0, 0);
container->setLayout(hbox);
container->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
curIndex = 0;
items = nullptr;
}

HorizontalSlider::~HorizontalSlider() {
delete items;
delete hbox;
}
void HorizontalSlider::setChildren(const QList<QWidget *>& list) {
clear();

void HorizontalSlider::setChildren(QList<QWidget*>* list) {
if(items != nullptr) delete items;
items = list;
int accu = 0;
for (QObject const *object : *list) {
hbox->addWidget((QWidget *) object);
widths.append(((QWidget *) object)->width());
accu += ((QWidget *) object)->width();
for (QWidget *object : list) {
object->setParent(container);
hbox->addWidget(object);
widths.append(object->width());
accu += object->width();
}
container->setMaximumWidth(accu);
container->setMinimumWidth(accu);
Expand All @@ -40,6 +47,14 @@ void HorizontalSlider::setChildren(QList<QWidget*>* list) {
refresh();
}

void HorizontalSlider::addChild(QWidget *widget) {
hbox->addWidget(widget);
widths.append(widget->width());
auto orig_width = container->maximumWidth();
container->setMaximumWidth(orig_width + widget->width());
container->setMinimumWidth(orig_width + widget->width());
}

void HorizontalSlider::scrollToIndex(int index) {
if (index == curIndex) return;
if (index > numberOfChildren() - 1) return;
Expand All @@ -66,7 +81,7 @@ void HorizontalSlider::scrollToIndex(int index) {
}

int HorizontalSlider::numberOfChildren() {
return widths.size();
return items.size();
}

int HorizontalSlider::currentIndex() {
Expand All @@ -76,3 +91,15 @@ int HorizontalSlider::currentIndex() {
void HorizontalSlider::refresh() {

}

QWidget *HorizontalSlider::currentObject() const {
return items[curIndex];
}

QWidget *HorizontalSlider::preObject() const {
return items[curIndex - 1];
}

QWidget *HorizontalSlider::nextObject() const {
return items[curIndex + 1];
}
23 changes: 8 additions & 15 deletions horizontalslider.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,30 +12,23 @@ class HorizontalSlider : public QWidget
explicit HorizontalSlider(QWidget *parent = 0);
~HorizontalSlider();

void setChildren(QList<QWidget*> *list);
void setChildren(const QList<QWidget *>& list);
void addChild(QWidget *widget);

void scrollToIndex(int index);
int numberOfChildren();

void clear();

int currentIndex();
QWidget* currentObject(){ return (*items)[curIndex]; }
QWidget* preObject(){
if(curIndex>0)
return (*items)[curIndex - 1];
else
return nullptr;
}
QWidget* nextObject(){
if(curIndex<items->length()-1)
return (*items)[curIndex + 1];
else
return nullptr;
}
QWidget *currentObject() const;
QWidget *preObject() const;
QWidget *nextObject() const;

private:
QHBoxLayout *hbox;
QWidget *container;
QList<QWidget*>* items;
QList<QWidget *> items;
QList<int> widths;
int curIndex;

Expand Down
33 changes: 33 additions & 0 deletions libs/doubanchannelmanager.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "doubanchannelmanager.h"
#include "doubanfm.h"

DoubanChannelManager::DoubanChannelManager(QObject *parent) :
QObject(parent),
curIndex(-1),
doubanfm(DoubanFM::getInstance())
{
connect(&doubanfm, &DoubanFM::receivedChannels, [&] (const QList<DoubanChannel>& channels) {
this->channels = channels;
curIndex = 0;
});
}

DoubanChannelManager& DoubanChannelManager::getInstance() {
static DoubanChannelManager _INSTANCE;
return _INSTANCE;
}

DoubanChannel DoubanChannelManager::currentChannel() const {
return channels[curIndex];
}

DoubanChannel &DoubanChannelManager::currentChannel() {
return channels[curIndex];
}

void DoubanChannelManager::reload() {
channels.clear();
curIndex = -1;

doubanfm.getChannels();
}
34 changes: 34 additions & 0 deletions libs/doubanchannelmanager.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#ifndef DOUBANCHANNELMANAGER_H
#define DOUBANCHANNELMANAGER_H

#include <QObject>

#include <libs/douban_types.h>
class DoubanFM;

class DoubanChannelManager : public QObject
{
Q_OBJECT
public:
static DoubanChannelManager& getInstance();

DoubanChannel currentChannel() const;
DoubanChannel& currentChannel();

signals:
void reloadChannels();
void channelChanged(const DoubanChannel& channel);

public slots:
void reload();

private:
explicit DoubanChannelManager(QObject *parent = nullptr);

QList<DoubanChannel> channels;
QList<DoubanChannel>::size_type curIndex;

DoubanFM &doubanfm;
};

#endif // DOUBANCHANNELMANAGER_H

0 comments on commit cd3a335

Please sign in to comment.