TwitterMicroBlog plugin made operational.
[choqok:choqok-obsolete.git] / libchoqok / ui / microblogwidget.cpp
1 /*
2 This file is part of Choqok, the KDE micro-blogging client
3
4 Copyright (C) 2008-2009 Mehrdad Momeny <mehrdad.momeny@gmail.com>
5
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as
8 published by the Free Software Foundation; either version 2 of
9 the License or (at your option) version 3 or any later version
10 accepted by the membership of KDE e.V. (or its successor approved
11 by the membership of KDE e.V.), which shall act as a proxy
12 defined in Section 14 of version 3 of the license.
13
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, see http://www.gnu.org/licenses/
22 */
23
24 #include "microblogwidget.h"
25 #include "microblog.h"
26 #include "account.h"
27 #include <KDebug>
28 #include <QHBoxLayout>
29 #include <QApplication>
30 #include "timelinewidget.h"
31 #include <ktabwidget.h>
32 #include "composerwidget.h"
33 #include <QLayout>
34
35 namespace Choqok
36 {
37
38 class MicroBlogWidget::MBPrivate
39 {
40 public:
41     MBPrivate(Account *acc)
42     :account(acc), blog(acc->microblog()), composer(0)
43     {}
44     Account *account;
45     MicroBlog *blog;
46     ComposerWidget *composer;
47 };
48
49 MicroBlogWidget::MicroBlogWidget( Account *account, QWidget* parent, Qt::WindowFlags f)
50     :QWidget(parent, f), d(new MBPrivate(account))
51 {
52     kDebug();
53     setupUi();
54     connect(qApp, SIGNAL(aboutToQuit()), SLOT(aboutToQuit()));
55     connect(d->blog, SIGNAL(timelineDataReceived(QString,QList<Choqok::Post*>)),
56              this, SLOT(newTimelineDataRecieved(QString,QList<Choqok::Post*>)) );
57     initTimelines();
58 }
59
60 Account * MicroBlogWidget::currentAccount() const
61 {
62     return d->account;
63 }
64
65 void MicroBlogWidget::setupUi()
66 {
67     QVBoxLayout *layout = new QVBoxLayout(this);
68     if(d->composer)
69         layout->addWidget(d->composer);
70     timelinesTabWidget = new KTabWidget(this);
71     layout->addWidget( timelinesTabWidget );
72 //     timelinesTabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
73     this->layout()->setContentsMargins( 0, 0, 0, 0 );
74 }
75
76 void MicroBlogWidget::setComposerWidget(ComposerWidget *widget)
77 {
78     if(d->composer)
79         d->composer->deleteLater();
80     d->composer = widget;
81     d->composer->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum);
82     qobject_cast<QVBoxLayout*>( this->layout() )->insertWidget(0, d->composer);
83     foreach(TimelineWidget *mbw, timelines.values())
84         connect(mbw, SIGNAL(forwardResendPost(QString)), d->composer, SLOT(setText(QString)));
85 }
86
87 MicroBlogWidget::~MicroBlogWidget()
88 {
89     delete d;
90 }
91
92 void MicroBlogWidget::settingsChanged()
93 {
94     kDebug();
95 }
96
97 void MicroBlogWidget::updateTimelines()
98 {
99     kDebug()<<d->account->alias();
100     d->account->microblog()->updateTimelines();
101 }
102
103 void MicroBlogWidget::aboutToQuit()
104 {
105 }
106
107 void MicroBlogWidget::newTimelineDataRecieved( const QString &type, QList<Post*> data )
108 {
109     kDebug()<<d->account->alias()<<": "<<type;
110     if(timelines.contains(type)){
111         timelines.value(type)->addNewPosts(data);
112     } else {
113         if(TimelineWidget *wd = addTimelineWidgetToUi(type) )
114             wd->addNewPosts(data);
115     }
116 }
117
118 void MicroBlogWidget::initTimelines()
119 {
120     kDebug();
121     foreach( QString timeline, d->blog->timelineTypes() ){
122         addTimelineWidgetToUi(timeline);
123     }
124 }
125
126 TimelineWidget* MicroBlogWidget::addTimelineWidgetToUi(const QString& name)
127 {
128     TimelineWidget *mbw = d->blog->createTimelineWidget(d->account, this);
129     if(mbw) {
130         mbw->setTimelineType(name);
131         timelines.insert(name, mbw);
132         timelinesTabWidget->addTab(mbw, name);
133         connect(this, SIGNAL(markAllAsRead()), mbw, SLOT(markAllAsRead()));
134         return mbw;
135     } else {
136         kError()<<"Cannot Create a new TimelineWidget for timeline "<<name;
137         return 0L;
138     }
139     if(timelinesTabWidget->count() == 1)
140         timelinesTabWidget->setTabBarHidden(true);
141     else
142         timelinesTabWidget->setTabBarHidden(false);
143 }
144
145 }