Added very basic sharing functionality.
authorJan Dumon <j.dumon@option.com>
Thu, 4 Mar 2010 22:03:14 +0000 (23:03 +0100)
committerJan Dumon <j.dumon@option.com>
Thu, 4 Mar 2010 22:03:14 +0000 (23:03 +0100)
src/contentwindow.cpp
src/contentwindow.h
src/entrieswindow.cpp
src/googlereader.cpp
src/googlereader.h
src/grr.qrc
src/images/shared-0.png [new file with mode: 0644]
src/images/shared-1.png [new file with mode: 0644]
src/images/star-0.png
src/images/star-1.png

index 8d49b20..2acc73e 100644 (file)
@@ -210,6 +210,11 @@ ContentWindow::ContentWindow(QWidget *parent, Entry *e) : QMainWindow(parent) {
        starred->setChecked((entry->flags & ENTRY_FLAG_STARRED));
        menuBar()->addAction(starred);
 
+       shared = new QAction(tr("Shared"), this);
+       shared->setCheckable(true);
+       shared->setChecked((entry->flags & ENTRY_FLAG_SHARED));
+       menuBar()->addAction(shared);
+
        keepUnread = new QAction(tr("Keep unread"), this);
        keepUnread->setCheckable(true);
        keepUnread->setEnabled((entry->flags & ENTRY_FLAG_LOCKED) == 0);
@@ -260,22 +265,18 @@ void ContentWindow::closeEvent(QCloseEvent *event) {
        grabZoomKeys(false);
        entry->markRead(!keepUnread->isChecked());
        entry->markStar(starred->isChecked());
+       entry->markShared(shared->isChecked());
        QMainWindow::closeEvent(event);
 }
 
 void ContentWindow::grabZoomKeys(bool grab) {
-       if (!winId()) {
-               qWarning("Can't grab keys unless we have a window id");
+       if(!winId())
                return;
-       }
 
        unsigned long val = (grab) ? 1 : 0;
        Atom atom = XInternAtom(QX11Info::display(), "_HILDON_ZOOM_KEY_ATOM", False);
-       if (!atom) {
-               qWarning("Unable to obtain _HILDON_ZOOM_KEY_ATOM. This example will only work "
-                       "on a Maemo 5 device!");
+       if(!atom)
                return;
-       }
 
        XChangeProperty (QX11Info::display(), winId(), atom, XA_INTEGER, 32, PropModeReplace,
                reinterpret_cast<unsigned char *>(&val), 1);
index 26ad9bb..cdc0a78 100644 (file)
@@ -24,6 +24,7 @@ class ContentWindow : public QMainWindow {
                Entry *entry;
                QGraphicsWebView *webview;
                QAction *starred;
+               QAction *shared;
                QAction *keepUnread;
 
                void grabZoomKeys(bool grab);
index 7106aab..02192bc 100644 (file)
@@ -123,7 +123,7 @@ void EntryListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opt
        QRect rect = option.rect;
        rect.adjust(20, 8, -20, -8);
        QPoint topleft = rect.topLeft();
-       topleft.ry() += 2;
+       QPoint bottomleft = rect.bottomLeft();
        rect.adjust(36, 0, 0, 0);
 
        painter->save();
@@ -154,6 +154,12 @@ void EntryListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opt
                painter->drawImage(topleft, img);
        }
 
+       if(e->flags & ENTRY_FLAG_SHARED) {
+               QImage img = QImage(QLatin1String(":/images/shared-1"));
+               bottomleft.ry() -= img.height();
+               painter->drawImage(bottomleft, img);
+       }
+
        painter->restore();
 }
 
index 5919ca4..9cf88ba 100644 (file)
@@ -58,7 +58,15 @@ GoogleReader::GoogleReader() {
        Feed *feed = new Feed(this);
        feed->id = "user/-/state/com.google/starred";
        feed->title = "Starred items";
-       feed->special = true;
+       feed->special = 2;
+       feeds.insert(feed->id, feed);
+       connect(feed, SIGNAL(allReadChanged()), SIGNAL(allReadChanged()));
+
+       /* Add the virtual 'Shared items' feed */
+       feed = new Feed(this);
+       feed->id = "user/-/state/com.google/broadcast";
+       feed->title = "Shared items";
+       feed->special = 1;
        feeds.insert(feed->id, feed);
        connect(feed, SIGNAL(allReadChanged()), SIGNAL(allReadChanged()));
 }
@@ -196,6 +204,8 @@ void GoogleReader::parseFeed(QDomDocument dom) {
                                                entry.flags |= ENTRY_FLAG_READ;
                                        else if(label == "starred")
                                                entry.flags |= ENTRY_FLAG_STARRED;
+                                       else if(label == "broadcast")
+                                               entry.flags |= ENTRY_FLAG_SHARED;
                                }
                        }
 
@@ -218,6 +228,8 @@ void GoogleReader::parseFeed(QDomDocument dom) {
                else if(name == "id") {
                        if(e.text().endsWith("/state/com.google/starred"))
                                feedsource = "user/-/state/com.google/starred";
+                       else if(e.text().endsWith("/state/com.google/broadcast"))
+                               feedsource = "user/-/state/com.google/broadcast";
                }
        }
 
@@ -284,7 +296,7 @@ void GoogleReader::parseSubscriptions(QDomDocument dom) {
 
        /* Delete feeds no longer subscribed to  */
        for(i = feeds.begin(); i != feeds.end(); ++i) {
-               if(i.value()->subscription_updated == false && i.value()->special == false) {
+               if(i.value()->subscription_updated == false && i.value()->special == 0) {
                        printf("DELETED: %s\n", i.value()->title.toLatin1().data());
                        i = feeds.erase(i);
                }
@@ -394,11 +406,8 @@ void GoogleReader::updateUnread() {
 }
 
 static bool compareFeedItems(const Feed *f1, const Feed *f2) {
-       if(f1->special && !f2->special)
-               return true;
-
-       if(f2->special && !f1->special)
-               return false;
+       if(f1->special || f2->special)
+               return f1->special > f2->special;
 
        if(f1->cat_label == f2->cat_label)
                return f1->title.toLower() < f2->title.toLower();
@@ -550,3 +559,36 @@ void Entry::markStar(bool mark_star) {
                flags &= ~ENTRY_FLAG_STARRED;
        }
 }
+
+void Entry::markShared(bool mark_shared) {
+       /* Check if the shared flag differs from the requested state */
+       if(((flags & ENTRY_FLAG_SHARED) != 0) == mark_shared)
+               return;
+
+       QNetworkRequest request;
+       request.setUrl(feed->reader->edittag_url);
+
+       postshared.open(QBuffer::ReadWrite | QBuffer::Truncate);
+       postshared.write("i=");
+       postshared.write(QUrl::toPercentEncoding(id));
+       if(mark_shared)
+               postshared.write("&a=");
+       else
+               postshared.write("&r=");
+       postshared.write(QUrl::toPercentEncoding("user/-/state/com.google/broadcast"));
+       postshared.write("&ac=edit-tags&T=");
+       postshared.write(QUrl::toPercentEncoding(feed->reader->token));
+       postshared.seek(0);
+       feed->reader->manager.post(request, &postshared);
+
+       Feed *shared = feed->reader->feeds.value("user/-/state/com.google/broadcast");
+
+       if(mark_shared) {
+               shared->addEntry(this);
+               flags |= ENTRY_FLAG_SHARED;
+       }
+       else {
+               shared->delEntry(this);
+               flags &= ~ENTRY_FLAG_SHARED;
+       }
+}
index 24cad09..cd47dd2 100644 (file)
@@ -33,14 +33,14 @@ class Feed : public QObject {
 
                GoogleReader *reader;
 
-               bool special;
+               int special;
 
                void updateSubscription(Feed *feed);
 
                Feed(GoogleReader *gr = NULL) : QObject() {
                        unread = 0;
                        reader = gr;
-                       special = false;
+                       special = 0;
                }
 
                void fetch(bool);
@@ -66,6 +66,7 @@ Q_DECLARE_METATYPE(Feed *)
 #define ENTRY_FLAG_READ                0x00000001
 #define ENTRY_FLAG_STARRED     0x00000002
 #define ENTRY_FLAG_LOCKED      0x00000004
+#define ENTRY_FLAG_SHARED      0x00000008
 
 class Entry : public QObject {
        Q_OBJECT
@@ -101,10 +102,12 @@ class Entry : public QObject {
 
                void markRead(bool);
                void markStar(bool);
+               void markShared(bool);
 
        private:
                QBuffer postread;
                QBuffer poststar;
+               QBuffer postshared;
 };
 
 Q_DECLARE_METATYPE(Entry *)
index cd8145e..199dab1 100644 (file)
@@ -1,7 +1,7 @@
 <!DOCTYPE RCC><RCC version="1.0">
   <qresource>
-    <file>images/star-0.png</file>
     <file>images/star-1.png</file>
+    <file>images/shared-1.png</file>
   </qresource>
 </RCC>
 
diff --git a/src/images/shared-0.png b/src/images/shared-0.png
new file mode 100644 (file)
index 0000000..ab42956
Binary files /dev/null and b/src/images/shared-0.png differ
diff --git a/src/images/shared-1.png b/src/images/shared-1.png
new file mode 100644 (file)
index 0000000..49dbddf
Binary files /dev/null and b/src/images/shared-1.png differ
index f3d9a16..30c733e 100644 (file)
Binary files a/src/images/star-0.png and b/src/images/star-0.png differ
index f6f5555..ca3ab68 100644 (file)
Binary files a/src/images/star-1.png and b/src/images/star-1.png differ