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 *
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
)))
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
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
):
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))
84 dialog
= QMessageBox()
85 dialog
.setWindowTitle(episode
.title
.decode('utf-8'))
86 dialog
.setText('Episode not yet downloaded')
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
96 gpodder
.ui
.desktop
= True
98 gui
= qtPodder(sys
.argv
, config
, db
)