def main(): from twisted.internet import reactor from twisted.internet import defer defer.Deferred.debug = 1 log.init('DAD_DEBUG') log.logTwisted() log.debug('main', 'start') parser = optparse.OptionParser() parser.add_options(scouch.couchdb_option_list) parser.add_options(scouch.user_option_list) options, args = parser.parse_args() try: title = args[0] except: title = 'Love' # FIXME: allow customizing model and/or view(s) modelType = 'Couch' viewTypes = ['GTK', ] server = client.CouchDB(host=options.host, port=options.port) dbName = options.database db = daddb.DADDB(server, dbName) modelModule = 'dad%s.models.app.%sAppModel' % (modelType.lower(), modelType) amodel = reflect.namedAny(modelModule)(db) acontroller = app.AppController(amodel) for viewType in viewTypes: viewModule = 'dad%s.views.app.%sAppView' % (viewType.lower(), viewType) aview = reflect.namedAny(viewModule)() acontroller.addView(aview) # FIXME: gtk-specific aview.widget.connect('destroy', lambda _: reactor.stop()) controller, model, views = acontroller.getTriad('Track') view = trackv.TrackView() view = views[0] aview.add(view) # start loading artists and albums d = defer.Deferred() # get the first track matching the arg for title # FIXME: add an exception for a missing view d.addCallback(lambda _: db.viewDocs('view-tracks-title', couch.Track, include_docs=True, startkey=title, endkey=title + 'Z')) def eb(failure): log.warningFailure(failure) print 'track.py: FAILURE: ', failure reactor.stop() d.addCallback(lambda g: list(g)[0].id) d.addCallback(lambda t: controller.populate(t, userName=options.user)) d.addErrback(eb) d.callback(None) reactor.run()
def main(): from twisted.internet import reactor from twisted.internet import defer defer.Deferred.debug = 1 log.init('DAD_DEBUG') log.logTwisted() log.debug('main', 'start') parser = optparse.OptionParser() parser.add_options(couch.couchdb_option_list) options, args = parser.parse_args() # FIXME: allow customizing model and/or view(s) modelType = 'Couch' viewTypes = ['GTK', ] # this rebinds and makes it break in views # db = client.CouchDB('localhost', dbName='dad') cache = client.MemoryCache() server = client.CouchDB(host=options.host, port=options.port, cache=cache) dbName = options.database db = daddb.DADDB(server, dbName) # cache artists from dadcouch.model import couch as mcouch d = db.viewDocs('artists', mcouch.Artist) def cacheCb(_): print 'THOMAS: cache: hits %r lookups %r' % ( db.db._cache.hits, db.db._cache.lookups) d.addCallback(cacheCb) modelModule = 'dad%s.models.app.%sAppModel' % (modelType.lower(), modelType) amodel = reflect.namedAny(modelModule)(db) acontroller = app.AppController(amodel) for viewType in viewTypes: viewModule = 'dad%s.views.app.%sAppView' % (viewType.lower(), viewType) aview = reflect.namedAny(viewModule)() acontroller.addView(aview) # FIXME: gtk-specific aview.widget.connect('destroy', lambda _: reactor.stop()) vbox = gtk.VBox() hbox = gtk.HBox() vbox.add(hbox) aview.widget.add(vbox) artistView = views.ArtistSelectorView() artistModel = daddb.ArtistSelectorModel(db) artistController = selector.ArtistSelectorController(artistModel) artistController.addView(artistView) acontroller.add(artistController) hbox.pack_start(artistView) albumView = views.AlbumSelectorView() albumModel = daddb.AlbumSelectorModel(db) albumController = selector.AlbumSelectorController(albumModel) albumController.addView(albumView) acontroller.add(albumController) hbox.pack_start(albumView) trackView = scheduler.TracksUI(selector=True) trackModel = daddb.TrackSelectorModel(db) trackController = selector.TrackSelectorController(trackModel) acontroller.add(trackController) trackController.addView(trackView) vbox.add(trackView) aview.widget.show_all() # listen to changes on artist selection so we can filter the albums view def artist_selected_cb(self, ids): album_ids = [] if ids: print 'THOMAS: selected artist ids', ids album_ids = albumModel.get_artists_albums(ids) albumView.set_album_ids(album_ids) trackView.set_artist_ids(ids) artistView.connect('selected', artist_selected_cb) def track_selected_cb(self, trackObj): w = gtk.Window() from dadgtk.views import track view = track.TrackView() w.add(view.widget) model = daddb.TrackModel(db) controller = trackc.TrackController(model) controller.addView(view) # FIXME: don't hardcode options.user = '******' d = controller.populate(trackObj.id, userName=options.user) d.addCallback(lambda _: w.set_title(trackObj.name)) w.show_all() trackView.connect('clicked', track_selected_cb) # start loading artists and albums d = defer.Deferred() d.addCallback(lambda _: artistController.populate()) d.addCallback(lambda _: albumController.populate()) d.addCallback(lambda _: trackController.populate()) d.addCallback(cacheCb) d.callback(None) reactor.run()