~freshapplepy/rssn/main

« back to all changes in this revision

Viewing changes to rss_notify/gui.py

  • Committer: Isaiah Heyer
  • Date: 2009-09-26 03:56:06 UTC
  • Revision ID: freshapplepy@gmail.com-20090926035606-2owvsw68v2todhg6
Add Feed dialog now searches for feeds if a non-url is entered. Load feed button now toggles to a 'stop feed loading' button.

Show diffs side-by-side

added added

removed removed

Lines of Context:
354
354
 
355
355
        self.dialog = get("add_dialog")
356
356
        self.entry = get("add_dialog_entry")
 
357
        
 
358
        self.feedlist_sw = get("feedlist_sw")
 
359
 
 
360
        self.treeview = get("feed_treeview")
357
361
        self.feed_liststore = get("feed_liststore")
 
362
 
358
363
        self.progressbar = get("progressbar")
359
364
        self.progressbar.set_fraction(0.0)
360
365
 
365
370
 
366
371
        self.load_feed_button = get("load_feed_button")
367
372
 
 
373
        image = gtk.image_new_from_stock(gtk.STOCK_OK,
 
374
                    gtk.ICON_SIZE_BUTTON)
 
375
 
 
376
        self.load_feed_button.set_image(image)
 
377
 
 
378
 
368
379
        self.cbb = get("add_dialog_combobox")
369
380
 
370
381
        self.cat_dialog = get("cat_dialog")
371
382
        self.cat_dialog_entry = get("cat_dialog_entry")
372
383
        self.cat_dialog_cbb = get("cat_dialog_combobox")
 
384
        self.cat_dialog_ok_button = get("cat_dialog_ok_button")
373
385
 
374
386
 
375
387
        self.cat_liststore = get("cat_liststore")
401
413
 
402
414
        self.feeds_to_add = []
403
415
 
 
416
        self.loading = False
 
417
        self.done = False
 
418
        self.destroyed = False
 
419
 
404
420
    def _pulse(self):
405
421
 
406
422
        self.progressbar.pulse()
443
459
 
444
460
        gobject.idle_add(self._idle_func, self.feed_liststore.clear)
445
461
        
446
 
        try:
447
 
            feeds = rss_finder.get_feeds(url)
448
 
 
449
 
        except ValueError, data:
450
 
 
451
 
            feeds = None
 
462
        feeds = rss_finder.get_feeds(url)
452
463
 
453
464
        ### Either no feeds were found for the url
454
465
        ### or the user typed in an invalid url.
455
 
        if feeds == None:
 
466
        if len(feeds) == 0:
456
467
            self.progressbar_pulse_stop()
457
468
 
458
469
            gobject.idle_add(self._idle_func, self.feed_liststore.append, [None,
461
472
            return False
462
473
 
463
474
        for feed_url in feeds:
 
475
            
 
476
            sens = bool(len(self.feeds_to_add))
 
477
            gobject.idle_add(self._idle_func, self.ok_button.set_sensitive, sens)
 
478
 
464
479
            elem = self.FM.create_feed(feed_url)
465
480
            if elem != False:
466
481
                feed_title = elem.get("title")
468
483
                with lock:
469
484
                    self.feeds_to_add.append(elem)
470
485
 
471
 
                    gobject.idle_add(self._idle_func,
472
 
                        self.feed_liststore.append,
473
 
                        [True, feed_title, feed_url])
474
 
 
475
 
 
476
 
        if len(feeds):
477
 
            gobject.idle_add(self._idle_func, self.ok_button.set_sensitive, True)
478
 
 
479
 
 
480
 
        try:
481
 
            for widget in self.dialog.get_children()[0].get_children():
482
 
                gobject.idle_add(self._idle_func, widget.set_sensitive, True)
483
 
        except:
484
 
            pass
485
 
 
486
 
 
487
 
        self.progressbar_pulse_stop()
488
 
 
 
486
                if self.done:
 
487
                    break
 
488
 
 
489
                gobject.idle_add(self._idle_func,
 
490
                    self.feed_liststore.append,
 
491
                    [True, feed_title, feed_url])
 
492
 
 
493
 
 
494
        ### If the user closed the Dialog all of its widgets will
 
495
        ### be destroyed.
 
496
        if not self.destroyed:
 
497
 
 
498
            if len(feeds):
 
499
                gobject.idle_add(self._idle_func, self.ok_button.set_sensitive, True)
 
500
 
 
501
            self.set_loading(False)
 
502
 
 
503
            self.progressbar_pulse_stop()
 
504
 
 
505
    def get_loading(self):
 
506
        return self.loading
 
507
 
 
508
    def set_loading(self, loading):
 
509
        
 
510
        self.loading = loading
 
511
 
 
512
 
 
513
        sens = not loading
 
514
 
 
515
        for widget in self.dialog.get_children()[0]:
 
516
            if widget.get_name() != "add_dialog_hbox":
 
517
                gobject.idle_add(self._idle_func, widget.set_sensitive, sens)
 
518
 
 
519
        gobject.idle_add(self._idle_func, self.entry.set_sensitive, sens)
 
520
 
 
521
        ### Change the icon.
 
522
        def change_icon(self):
 
523
 
 
524
            #self.load_feed_button.remove(child)
 
525
            stock_id = [gtk.STOCK_OK, gtk.STOCK_STOP][loading]
 
526
 
 
527
            image = gtk.image_new_from_stock(stock_id,
 
528
                    gtk.ICON_SIZE_BUTTON)
 
529
 
 
530
            self.load_feed_button.set_image(image)
 
531
 
 
532
        gobject.idle_add(self._idle_func, change_icon, self)
489
533
 
490
534
    def on_load_feed_button_clicked(self, button, data=None):
491
535
 
492
 
        url = self.entry.get_text()
493
 
        url = url.strip()
494
 
 
495
 
        ### Make every button except cancel
496
 
        ### insensitive.
497
 
        for widget in self.dialog.get_children()[0].get_children():
498
 
            if not widget.get_name() == "dialog-action_area4":
499
 
                widget.set_sensitive(False)
500
 
 
501
 
        self.ok_button.set_sensitive(False)
502
 
        #self.cancel_button.set_sensitive(True)
503
 
 
504
 
        if url:
505
 
            self.thread = threading.Thread(target=self.show_feeds, args=[url])
506
 
            self.done = False
507
 
            self.thread.start()
508
 
 
509
 
 
 
536
        if self.get_loading() == False:
 
537
 
 
538
            url = self.entry.get_text()
 
539
            url = url.strip()
 
540
 
 
541
 
 
542
            if url:
 
543
                self.set_loading(True)
 
544
 
 
545
                self.done = False
 
546
                self.thread = threading.Thread(target=self.show_feeds, args=[url])
 
547
                self.thread.start()
 
548
        else:
 
549
            lock = threading.Lock()
 
550
            with lock:
 
551
                self.done = True
 
552
                self.set_loading(False)
 
553
                self.progressbar_pulse_stop()
 
554
 
 
555
 
 
556
 
 
557
    def on_cat_dialog_entry_changed(self, entry, data=None):
 
558
        
 
559
        active = bool(self.cat_dialog_entry.get_text().strip())
 
560
        self.cat_dialog_ok_button.set_sensitive(active)
 
561
        
510
562
    def on_add_dialog_combobox_changed(self, combobox, data=None):
511
563
 
512
564
        model = combobox.get_model()
513
565
 
 
566
        old_active = combobox.get_active()
 
567
 
514
568
        iter = combobox.get_active_iter()
515
569
        active = combobox.get_active()
516
570
 
522
576
        ### open "new category" dialog.
523
577
        if active != -1 and model[active].path == model[-1].path:
524
578
            
 
579
            element = None
 
580
            ### Remove the "New..." item.
525
581
            model.remove(model[-1].iter)
526
582
 
527
583
            response = self.cat_dialog.run()
528
584
            self.cat_dialog.hide()
529
585
            
530
 
            name = self.cat_dialog_entry.get_text()
531
 
            name = name.strip()
532
 
            if not name:
533
 
                return
534
 
 
535
 
            parent_key = self.cat_liststore.get_value(
536
 
                    self.cat_dialog_cbb.get_active_iter(), 2)
537
 
 
538
 
            if parent_key:
539
 
                parent = self.FM.get_category(parent_key)
540
 
            else:
541
 
                parent = None
542
 
 
543
 
            element = self.FM.add_category(name, parent)
544
 
            
545
 
            self.FM.populate_cbb_liststore(model)
546
 
 
 
586
            if response == gtk.RESPONSE_OK:
 
587
 
 
588
                name = self.cat_dialog_entry.get_text()
 
589
                name = name.strip()
 
590
                if name:
 
591
 
 
592
                    parent_key = self.cat_liststore.get_value(
 
593
                            self.cat_dialog_cbb.get_active_iter(), 2)
 
594
 
 
595
                    if parent_key:
 
596
                        parent = self.FM.get_category(parent_key)
 
597
                    else:
 
598
                        parent = None
 
599
 
 
600
                    element = self.FM.add_category(name, parent)
 
601
                    
 
602
                    self.FM.populate_cbb_liststore(model)
 
603
 
 
604
            ### Re-add the "New..." item.
547
605
            model.append([self.new_pixbuf, _("New..."), 0])
548
606
 
549
 
            iterator = zip(model, range(len(model)))
550
 
            for row, n in iterator:
551
 
                if row[2] != 0:
552
 
                    if self.FM.get_category(row[2]) is element:
553
 
                        self.cbb.set_active(n)
554
 
 
 
607
            ### Set the combobox to be on the newly created 
 
608
            ### category or None if we didn't create one.
 
609
            if element != None:
 
610
 
 
611
                iterator = zip(model, range(len(model)))
 
612
                for row, n in iterator:
 
613
                    if row[2] != 0:
 
614
                        if self.FM.get_category(row[2]) is element:
 
615
                            self.cbb.set_active(n)
 
616
            else:
 
617
                self.cbb.set_active(0)
 
618
 
 
619
        else:
 
620
            self.cbb.set_active(old_active)
555
621
 
556
622
 
557
623
    def run(self):
570
636
 
571
637
            category = None
572
638
            if key != 0:
573
 
                category = self.FM.get_category(key) #ELEMENTS[key]
 
639
                category = self.FM.get_category(key)
574
640
 
575
641
            ### The feed elements created in show_feeds are not
576
642
            ### yet added to the ElementTree.
577
643
            lock = threading.Lock()
578
644
            with lock:
579
 
                for elem in self.feeds_to_add:
580
 
                    self.FM.move_feed(elem, category)
 
645
                iterator = zip(self.feeds_to_add, self.feed_liststore)
 
646
                for elem, row in iterator:
 
647
                    ### Don't add feeds that were unchecked.
 
648
                    if row[0]:
 
649
                        self.FM.move_feed(elem, category)
581
650
 
582
651
    
 
652
        lock = threading.Lock()
 
653
        with lock:
 
654
            self.done = True
 
655
            self.destroyed = True
 
656
        
583
657
        self.dialog.destroy()
584
658
 
585
659