pyqflickr.py
author Dmitriy Morozov <morozov@cs.duke.edu>
Sat, 29 Mar 2008 07:06:33 -0400
changeset 1 0683f22a97d5
parent 0 544081ddbb13
child 2 b53ed7e259e5
permissions -rwxr-xr-x
All the basic functionality is in place

#!/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.showPhoto()
        elif key == QtCore.Qt.Key_Left:
            self.photo = (self.photo - 1) % len(self.photos)
            self.showPhoto()
        elif key == QtCore.Qt.Key_Up:
            self.photos = None
            self.photo = None
            self.showSets()
        elif key == QtCore.Qt.Key_R:
            self.photos[self.photo].rotate()
            self.showPhoto(force = True)
        elif key == QtCore.Qt.Key_P:
            self.photos[self.photo].toggle_public()
            self.showPhoto()

    def showPhoto(self, force = False):
        photo = self.photos[self.photo]
        tags = photo.getTags()
        info_txt = '<b>Tags</b>:<br>'
        for t in tags:
            info_txt = info_txt + t + '<br>'
        if photo.is_public():   info_txt = info_txt + "Public"
        else:                   info_txt = info_txt + "Private"

        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), info_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.showPhoto()

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

    def showSets(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 addTag(self):
        if self.photo == None: return       # Need to be in the photo editing mode
        tag = self.ui.tagEdit.text()
        self.photos[self.photo].addTag(tag)
        if tag not in self.tags: self.tags.append(tag)
        self.completions.setStringList(self.tags)
        self.ui.tagEdit.setText('')
        self.showPhoto()

    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.tagEdit, QtCore.SIGNAL("returnPressed()"), self.addTag)
        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.tags = flickr.tags().values()
        self.sets = flickr.photosets()
        self.showSets()
        
        # Tag completer
        self.completions = QtGui.QStringListModel(QtCore.QStringList(self.tags))
        self.completer = QtGui.QCompleter()
        self.completer.setModel(self.completions)
        self.completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.ui.tagEdit.setCompleter(self.completer)

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