Cleaned-up and re-designed preferences dialog
[gpodder.git] / src / gpodder / qtui.py
blob54ef1481e3e622fd6fb869be297e302fb1b548b2
1 #!/usr/bin/python
2 # gPodder Qt demo app in 100 lines of Python (line width < 80)
3 # Thomas Perl <thpinfo.com>; 2010-01-15
5 from PyQt4.QtGui import *
6 from PyQt4.QtCore import *
8 import sys
9 import os
10 import gpodder
12 from gpodder import model
13 from gpodder import dbsqlite
14 from gpodder import config
15 from gpodder import util
17 class gPodderListModel(QAbstractListModel):
18 def __init__(self, objects):
19 QAbstractListModel.__init__(self)
20 self._objects = objects
22 def get_object(self, index):
23 return self._objects[index.row()]
25 def rowCount(self, parent=QModelIndex()):
26 return len(self._objects)
28 def data(self, index, role):
29 if index.isValid() and role == Qt.DisplayRole:
30 return QVariant(self._format(self.get_object(index)))
31 return QVariant()
33 def _format(self, o):
34 return o.title.decode('utf-8')
36 class EpisodeModel(gPodderListModel):
37 def _format(self, episode):
38 title = episode.title.decode('utf-8')
39 if episode.was_downloaded(and_exists=True):
40 return u'[DL] ' + title
41 return title
43 class gPodderListView(QListView):
44 def __init__(self, on_item_selected):
45 QListView.__init__(self)
46 self.setProperty('FingerScrollable', True)
47 self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
48 self._on_item_selected = on_item_selected
49 QObject.connect(self, SIGNAL('activated(QModelIndex)'), self._row_cb)
51 def _row_cb(self, index):
52 if index.isValid():
53 model = self.model()
54 self._on_item_selected(model.get_object(index))
56 class qtPodder(QApplication):
57 def __init__(self, args, config, db):
58 QApplication.__init__(self, args)
60 podcasts = model.PodcastChannel.load_from_db(db, config.download_dir)
62 self.podcast_list = gPodderListView(self.on_podcast_selected)
63 self.podcast_list.setModel(gPodderListModel(podcasts))
65 self.podcast_window = QMainWindow()
66 self.podcast_window.setWindowTitle('gPodder Podcasts in Qt')
67 self.podcast_window.setCentralWidget(self.podcast_list)
68 self.podcast_window.show()
70 def on_podcast_selected(self, podcast):
71 self.episode_list = gPodderListView(self.on_episode_selected)
72 self.episode_list.setModel(EpisodeModel(podcast.get_all_episodes()))
74 self.episode_window = QMainWindow(self.podcast_window)
75 window_title = u'Episodes in %s' % podcast.title.decode('utf-8')
76 self.episode_window.setWindowTitle(window_title)
77 self.episode_window.setCentralWidget(self.episode_list)
78 self.episode_window.show()
80 def on_episode_selected(self, episode):
81 if episode.was_downloaded(and_exists=True):
82 util.gui_open(episode.local_filename(create=False))
83 else:
84 dialog = QMessageBox()
85 dialog.setWindowTitle(episode.title.decode('utf-8'))
86 dialog.setText('Episode not yet downloaded')
87 dialog.exec_()
89 if __name__ == '__main__':
90 config = config.Config(gpodder.config_file)
91 db = dbsqlite.Database(gpodder.database_file)
93 if os.path.exists('/etc/event.d/hildon-desktop'):
94 gpodder.ui.fremantle = True
95 else:
96 gpodder.ui.desktop = True
98 gui = qtPodder(sys.argv, config, db)
99 sys.exit(gui.exec_())