pyqflickr.py
author Dmitriy Morozov <morozov@cs.duke.edu>
Sat, 29 Mar 2008 05:23:36 -0400
changeset 0 544081ddbb13
child 1 0683f22a97d5
permissions -rwxr-xr-x
Initial commit

#!/usr/bin/env python

import sys
from PyQt4 import Qt, QtCore, QtGui

from ui_mainwin import Ui_MainWindow
import flickr, os


working_path = os.path.expanduser('~/.pyqflickr')
photo_size = ''       # medium

# Keyboard sensitive QLineEdit
class LineEditWithShortcuts(QtGui.QLineEdit):
    def event(self, event):
        if event.type() == QtCore.QEvent.KeyPress:
            if event.modifiers() & QtCore.Qt.ControlModifier:
                self.emit(QtCore.SIGNAL("shortcutPressed"), event.key())
                return True

        return QtGui.QLineEdit.event(self, event)

# Main window
class PyQFlickr(QtGui.QMainWindow):
    def shortcutPressed(self, key):
        if self.photos == None: return
        if   key == QtCore.Qt.Key_Right:
            self.photo = (self.photo + 1) % len(self.photos)
            self.show_photo()
        elif key == QtCore.Qt.Key_Left:
            self.photo = (self.photo - 1) % len(self.photos)
            self.show_photo()
        elif key == QtCore.Qt.Key_Up:
            self.photos = None
            self.photo = None
            self.show_sets()
        elif key == QtCore.Qt.Key_R:
            self.photos[self.photo].rotate()
            self.show_photo(force = True)

    def show_photo(self, force = False):
        photo = self.photos[self.photo]
        tags = photo.tags()
        tags_txt = '<b>Tags</b>:<br>'
        for t in tags:
            tags_txt = tags_txt + t + '<br>'

        txt = '''<center>
                 <table>
                    <tr>
                        <td margin="5" align="center">
                            <img src="%s">
                        </td>
                        <td bgcolor="#CCCCCC">%s</td>
                    </tr>
                 </table>
                 </center>''' % \
               (photo.get(working_path, photo_size, force), tags_txt)
        self.ui.interfaceBrowser.setHtml(txt)

    def anchorClicked(self, url):
        if self.photos == None:          # In set mode
            self.photos = flickr.photos(url.toString())     # url must be the setid
            self.photo = 0
            self.show_photo()

    def message(self, msg):
        QtGui.QMessageBox.warning(None, "Warning", msg)

    def show_sets(self):
        txt = '<table><tr>'
        i = 1
        for s in self.sets:
            txt = txt + '<td width="120" align="center"><a href="%s"><img src="%s"><br>%s</a></td>' % \
                         (s.id(), s.get_photo(working_path), s.name())
            if i % 8 == 0: txt = txt + '</tr><tr>'
            i += 1
        txt = txt + '</tr></table>'
        self.ui.interfaceBrowser.setHtml(txt)

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        # Setup ui
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.tagEdit = LineEditWithShortcuts(self.ui.centralwidget)
        self.ui.tagEdit.setObjectName("tagEdit")
        self.ui.vboxlayout.addWidget(self.ui.tagEdit)
        self.ui.interfaceBrowser.setOpenLinks(False)

        # Connect signals
        self.connect(self.ui.tagEdit, QtCore.SIGNAL("shortcutPressed"), self.shortcutPressed)
        self.connect(self.ui.interfaceBrowser, QtCore.SIGNAL("anchorClicked(const QUrl&)"), self.anchorClicked)

        # Init member
        self.sets = None
        self.photos = None
        self.photo = None

        # Deal with Flickr
        flickr.authenticate(self.message)
        self.sets = flickr.photosets()
        self.show_sets()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    win = PyQFlickr()
    win.show()
    sys.exit(app.exec_())