]> code.delx.au - notipod/blob - NotiPod.py
bb810ba38c50b4c0ff3c077ed8d2794da2b728b3
[notipod] / NotiPod.py
1 #!/usr/bin/env python
2 # Copyright 2009 James Bunton <jamesbunton@fastmail.fm>
3 # Licensed for distribution under the GPL version 2, check COPYING for details
4
5 import objc
6 from Foundation import *
7 from AppKit import *
8 from PyObjCTools import AppHelper
9
10 import libsyncitunes
11
12
13 class PlaylistTableModel(NSObject):
14 tableView = objc.IBOutlet()
15
16 def awakeFromNib(self):
17 self.playlists = []
18 self.tableView.setDataSource_(self)
19
20 def setPlaylists(self, playlists):
21 self.playlists = playlists
22 self.tableView.reloadData()
23
24 def tableView_objectValueForTableColumn_row_(self, tableView, col, row):
25 assert 0 <= row < len(self.playlists)
26 return self.playlists[row]
27
28 def numberOfRowsInTableView_(self, tableView):
29 print "get number of rows", len(self.playlists)
30 return len(self.playlists)
31
32
33
34 class NotiPodController(NSObject):
35 playlistModel = objc.IBOutlet()
36 folderPopup = objc.IBOutlet()
37 window = objc.IBOutlet()
38 loadingSheet = objc.IBOutlet()
39
40
41 def awakeFromNib(self):
42 self.performSelectorInBackground_withObject_(self.loadLibrary, None)
43 print "awakeFromNib"
44
45 def finishLoading(self):
46 self.playlistModel.setPlaylists(self.library.list_playlists())
47 self.folderPopup.addItemsWithTitles_(NSApp.delegate().folders())
48
49 def loadLibrary(self):
50 pool = NSAutoreleasePool.alloc().init()
51 NSApp.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.loadingSheet, self.window, None, None, None)
52 self.library = libsyncitunes.ITunesLibrary.alloc().init()
53 self.loadingSheet.close()
54 self.performSelectorOnMainThread_withObject_waitUntilDone_(self.finishLoading, None, True)
55 del pool
56
57 @objc.signature("v@:@ii")
58 def selectFolderEnd_returnCode_contextInfo_(self, panel, ret, _):
59 if ret == NSOKButton:
60 assert len(panel.filenames()) == 1
61 folder = panel.filenames()[0]
62 ### NSApp.delegate().addFolder_(folder)
63 self.folderPopup.insertItemWithTitle_atIndex_(folder, 2)
64 self.folderPopup.selectItemAtIndex_(2)
65
66 @objc.IBAction
67 def doSelectFolder_(self, sender):
68 print "select folder"
69 try:
70 folders = NSApp.delegate().folders()
71 if len(folders) > 0:
72 folder = folders[0]
73 else:
74 folder = None
75 panel = NSOpenPanel.openPanel()
76 panel.setCanChooseFiles_(False)
77 panel.setCanChooseDirectories_(True)
78 panel.setAllowsMultipleSelection_(False)
79 panel.beginSheetForDirectory_file_types_modalForWindow_modalDelegate_didEndSelector_contextInfo_(folder, None, None, self.window, self, self.selectFolderEnd_returnCode_contextInfo_, None)
80 except:
81 import traceback
82 traceback.print_exc()
83
84 @objc.IBAction
85 def doSync_(self, sender):
86 print "hello me"
87
88
89 class NotiPodAppDelegate(NSObject):
90
91 # Delegate methods
92
93 def applicationWillFinishLaunching_(self, _):
94 print "loading prefs"
95 prefs = NSUserDefaults.standardUserDefaults()
96 self._playlists = prefs.stringArrayForKey_("playlists")
97 self._folders = prefs.stringArrayForKey_("folders")
98 print "folders", self._folders
99 print "playlists", self._playlists
100
101 def applicationDidFinishLaunching_(self, _):
102 pass
103
104 def applicationWillTerminate_(self, _):
105 prefs = NSUserDefaults.standardUserDefaults()
106 prefs.synchronize()
107
108 def applicationShouldTerminateAfterLastWindowClosed_(self, _):
109 return True
110
111
112 # Public accessors
113
114 def playlists(self):
115 return self._playlists
116
117 def folders(self):
118 return self._folders or []
119
120 def addFolder_(self, folder):
121 self._folders.insert(0, folder)
122
123 def hasPlaylist_(self, playlist):
124 return playlist in self._playlists
125
126 def removePlaylist_(self, playlist):
127 self._playlists.remove(playlist)
128
129 def addPlaylist_(self, playlist):
130 self._playlists.append(playlist)
131
132
133
134 AppHelper.runEventLoop()
135