示例#1
0
class FileBrowser(hippo.CanvasWindow):
    __gsignals__ = {
        "activated" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,))
    }
    def __init__(self, stock):
        super(FileBrowser, self).__init__(gtk.WINDOW_TOPLEVEL)
        
        self.__stock = stock
        self.__single_selected_item = None
        self.__multiple_items_visible = False    
        
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(65535,65535,65535))        

        self.set_title('Files')
        self.set_default_size(750, 600)
    
        self.__box = CanvasVBox(xalign=hippo.ALIGNMENT_FILL, yalign=hippo.ALIGNMENT_FILL)
        self.__box.set_property('background-color', 0xEEEEEEFF)

        browse_box = CanvasHBox(xalign=hippo.ALIGNMENT_START, yalign=hippo.ALIGNMENT_START, padding_top=4)
        self.__box.append(browse_box)

        browse_text = hippo.CanvasText(text="Browse:", font="Bold 12px", color=0x3F3F3FFF, padding_right=6, xalign=hippo.ALIGNMENT_START, yalign=hippo.ALIGNMENT_START)
        browse_box.append(browse_text)

        browse_options = CanvasVBox(xalign=hippo.ALIGNMENT_START, yalign=hippo.ALIGNMENT_START)
        browse_box.append(browse_options)

        local_files_link = ActionLink(text="Local Files", font="14px", padding_bottom=4, xalign=hippo.ALIGNMENT_START, yalign=hippo.ALIGNMENT_START)
        local_files_link.connect("activated", self.__on_browse_local_files_clicked)
        browse_options.append(local_files_link)
 
        for google_account in self.__stock.googles:
            # don't list invalid accounts we might have picked up from the signons file
            if google_account.get_current_auth_credentials_known_bad():
                continue  
            google_docs_link = ActionLink(text=google_account.get_account().get_username_as_google_email() + " Docs", font="14px", padding_bottom=4, xalign=hippo.ALIGNMENT_START, yalign=hippo.ALIGNMENT_START)
            google_docs_link.connect("activated", webbrowser.open, create_account_url(google_account.get_account().get_username_as_google_email()))
            browse_options.append(google_docs_link)

        self.__search_box = CanvasHBox(padding_top=4, padding_bottom=4)        
        self.__search_text = hippo.CanvasText(text="Search Recent Files:", font="Bold 12px",
                                              color=0x3F3F3FFF, xalign=hippo.ALIGNMENT_START, padding_right=4)
        self.__search_box.append(self.__search_text)
        self.__search_input = hippo.CanvasEntry(box_width=250)
        self.__search_input.connect("notify::text", self.__on_search_changed)
        self.__search_input.connect("key-press-event", self.__on_search_keypress)
        self.__idle_search_id = 0
        self.__search_box.append(self.__search_input)

        search_local_files_link = ActionLink(text="Search All Local Files", font="14px", padding_left=10)
        search_local_files_link.connect("activated", self.__on_search_local_files_clicked)
        self.__search_box.append(search_local_files_link)
        
        self.__box.append(self.__search_box)

        self.__section_head = hippo.CanvasBox(orientation=hippo.ORIENTATION_HORIZONTAL, color=0xAAAAAAFF, border_bottom=1, border_color=0xAAAAAAFF)
        self.__section_head.append(hippo.CanvasText(text="Recent Files", font="Bold 14px", xalign=hippo.ALIGNMENT_START))
        self.__box.append(self.__section_head)

        self.__files_outter_box = CanvasVBox(background_color=0xFFFFFFFF)
        self.__box.append(self.__files_outter_box, hippo.PACK_EXPAND)

        self.__right_scroll = hippo.CanvasScrollbars()
        self.__right_scroll.set_policy(hippo.ORIENTATION_HORIZONTAL,
                                       hippo.SCROLLBAR_NEVER)
        self.__files_box = CanvasVBox(border=0, background_color=0xFFFFFFFF, padding=2)
        self.__files_outter_box.append(self.__right_scroll, hippo.PACK_EXPAND)
        
        self.__file_list = OverviewTable()
        self.__files_box.append(self.__file_list, hippo.PACK_EXPAND)

        self.__right_scroll.set_root(self.__files_box) 

        self.__file_items = []
        self.refresh_files()

        self.connect("delete-event", lambda *args: self.__hide() or True)
        self.connect("key-press-event", lambda win, event: self.__on_keypress(event))

        self.set_root(self.__box)

    def __set_visibility(self, item):
        search = self.__get_search_text()
        visible = search == None or item.link.get_property("text").lower().find(search) >= 0    
        item.set_force_prelight(False)      
        item.set_visible(visible)           
        if self.__single_selected_item is None and visible:
            self.__single_selected_item = item
        elif visible:
            self.__multiple_items_visible = True    

    def __prelight_single_selected_item(self): 
        if not self.__multiple_items_visible and self.__single_selected_item is not None:
            self.__single_selected_item.set_force_prelight(True)      

    def refresh_files(self):
        self.__single_selected_item = None
        self.__multiple_items_visible = False    

        self.__file_list.remove_all()
        self.__file_items = []
        for a_file in self.__stock.get_files():         
            if a_file.is_valid():                          
                link = a_file.create_icon_link()
                self.__file_list.add_column_item(0, link)
                self.__file_items.append(link)
                self.__set_visibility(link)

        self.__prelight_single_selected_item()

    def __on_search_changed(self, input, text):
        if self.__idle_search_id > 0:
            return
        self.__idle_search_id = gobject.timeout_add(500, self.__idle_do_search)
        
    def __on_search_keypress(self, entry, event):
        if event.key == hippo.KEY_RETURN:
            search = self.__get_search_text()
            # if there is only one file that matches the search, we'll open it
            # don't open the file if the search has changed, but we haven't updated the results yet
            if self.__single_selected_item is not None and (len(self.__stock.get_files()) == 1 or search is not None and self.__single_selected_item.link.get_property("text").lower().find(search) >= 0):
                self.__single_selected_item.link.emit("activated")

    def __get_search_text(self):
        search = self.__search_input.get_property("text")
        if search.strip() == "":
            return None
        else:
            return search.lower()

    def __idle_do_search(self):
        self.__single_selected_item = None
        self.__multiple_items_visible = False          

        for item in self.__file_items:
            self.__set_visibility(item)

        self.__prelight_single_selected_item()

        self.__idle_search_id = 0          

    def __on_browse_local_files_clicked(self, canvas_item):
        subprocess.Popen(['nautilus', '--browser', self.__stock.desktop_path])

    def __on_search_local_files_clicked(self, canvas_item):
        # we don't want to turn "" into None, or change everything to be lowercase
        search = self.__search_input.get_property("text")
        if not command_works(['beagle-search', search]):
            if not command_works(['tracker-search-tool', search]):
                subprocess.Popen(['gnome-search-tool', '--named', search])

    def __on_link_clicked(self, canvas_item, url):
        subprocess.Popen(['gnome-open', url])

    def __hide(self):
        self.hide()
        
    def __on_keypress(self, event):
        if event.keyval == 65307:
            self.__hide()
示例#2
0
class AppBrowser(hippo.CanvasWindow):
    def __init__(self):
        super(AppBrowser, self).__init__(gtk.WINDOW_TOPLEVEL)

        self.__repo = apps.get_apps_repo()
        
        self.__all_apps = []
        
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(65535,65535,65535))        

        self.set_title('Applications')
    
        self.__box = CanvasHBox()
    
        self.__left_box = CanvasVBox(spacing=6, padding=6, box_width=250)
        self.__left_box.set_property('background-color', 0xEEEEEEFF)
        self.__box.append(self.__left_box)
        
        self.__search_text = hippo.CanvasText(text="Search All Applications:", font="Bold 12px",
                                              color=0x3F3F3FFF, xalign=hippo.ALIGNMENT_START)
        self.__left_box.append(self.__search_text)
        self.__search_input = hippo.CanvasEntry()
        #self.__search_input.set_property('border-color', 0xAAAAAAFF)
        self.__search_input.connect("notify::text", self.__on_search_changed)
        self.__idle_search_id = 0
        self.__left_box.append(self.__search_input)        
    
        self.__overview = AppOverview()
        self.__overview.connect("more-info", lambda o, app: self.__on_show_more_info(app))
        self.__overview.connect("toggle-pinned", lambda o, app, active: self.__on_toggle_app_pinned(app, active))
        self.__overview.connect("move-up", lambda o, app: self.__on_move_app(app, True))
        self.__overview.connect("move-down", lambda o, app: self.__on_move_app(app, False))
        self.__overview.get_header().connect("button-press-event", lambda l,e: self.__on_app_launch()) 
        self.__overview.get_action_button().connect("activated", lambda l: self.__on_app_launch()) 
        self.__left_box.append(self.__overview)
        
        self.__cat_usage = AppCategoryUsage()
        self.__left_box.append(self.__cat_usage)   

        self.__left_box.append(hippo.CanvasText(text="Tools", font="Bold 12px",
                                                color=0x3F3F3FFF, xalign=hippo.ALIGNMENT_START))
                                                               
        browse_link = ActionLink(text="Find New Applications", underline=pango.UNDERLINE_LOW, xalign=hippo.ALIGNMENT_START)
        browse_link.connect("button-press-event", lambda l,e: self.__on_browse_popular_apps())
        self.__left_box.append(browse_link)
        spinbox = CanvasHBox()
        spinbox.append(hippo.CanvasText(text='Visible applications: '))
        self.__apps_spinner = CanvasSpinner()
        gconf.client_get_default().notify_add(GCONF_KEY_APP_SIZE, self.__on_visible_apps_key_changed)
        self.__apps_spinner.spinner.connect('value-changed', self.__on_visible_apps_spin_changed)
        self.__apps_spinner.spinner.get_adjustment().set_all(gconf.client_get_default().get_int(GCONF_KEY_APP_SIZE),
                                                             1, 20, 1, 1, 1)
        spinbox.append(self.__apps_spinner)
        self.__left_box.append(spinbox)
    
        self.__right_scroll = hippo.CanvasScrollbars()
        self.__right_scroll.set_policy(hippo.ORIENTATION_HORIZONTAL,
                                       hippo.SCROLLBAR_NEVER)
        self.__right_box = CanvasVBox(border=0, background_color=0xFFFFFFFF)
        self.__box.append(self.__right_scroll, hippo.PACK_EXPAND)
        
        self.__app_list = AppList()
        self.__right_box.append(self.__app_list, hippo.PACK_EXPAND)
        self.__app_list.connect("selected", lambda list, app: self.__on_app_selected(app))
        self.__app_list.connect("launch", lambda list: self.__on_app_launch()) 
        self.__app_list.connect("more-info", lambda list, app: self.__on_show_more_info(app)) 
        
        self.__right_scroll.set_root(self.__right_box)        
        
        self.set_default_size(1000, 600)
        self.connect("delete-event", lambda *args: self.__hide_reset() or True)
        self.connect("key-press-event", lambda win, event: self.__on_keypress(event))
               
        self.set_root(self.__box)

        self.__repo.connect("my-pinned-apps-changed", self.__on_pinned_apps_changed)
        
    @defer_idle_func(logger=_logger)
    def __on_visible_apps_spin_changed(self, *args):
        _logger.debug("spinner changed")
        count = self.__apps_spinner.spinner.get_value()
        curval = gconf.client_get_default().get_int(GCONF_KEY_APP_SIZE) or 4
        if curval != count:        
            gconf.client_get_default().set_int(GCONF_KEY_APP_SIZE, int(count))
        
    def __on_visible_apps_key_changed(self, *args):
        _logger.debug("apps count key changed")
        curval = gconf.client_get_default().get_int(GCONF_KEY_APP_SIZE) or 4
        if curval != self.__apps_spinner.spinner.get_value():
            self.__apps_spinner.set_value(curval)
                
    def __on_app_selected(self, app):
        self.__overview.set_app(app)

    def __reset(self):
        self.__search_input.set_property('text', '')
        self.__app_list.reset_category()

    def __hide_reset(self):
        self.__reset()
        self.hide()

    @log_except(_logger)
    def __on_show_more_info(self, app):
        if app:
            _logger.debug("showing app: %s", app)
            libbig.show_url(urlparse.urljoin(globals.get_baseurl(), "application?id=" + app.get_id()))
        self.__hide_reset()

    def __on_toggle_app_pinned(self, app, active):
        _logger.debug("Toggle app " + app.get_id() + " pinned = " + str(active))

        self.__repo.set_app_pinned(app, active)

    def __on_move_app(self, app, up):
        _logger.debug("Move app up= " + str(up))
        if up:
            pass
        else:
            pass        

    def __on_app_launch(self):
        self.__overview.launch()
        self.__hide_reset()
        
    def __on_keypress(self, event):
        if event.keyval == 65307:
            self.__hide_reset()

    def __on_browse_popular_apps(self):
        libbig.show_url(urlparse.urljoin(globals.get_baseurl(), "applications"))
        self.__hide_reset()
            
    def __on_search_changed(self, input, text):
        if self.__idle_search_id > 0:
            return
        self.__idle_search_id = gobject.timeout_add(1500, self.__idle_do_search)
        
    def __idle_do_search(self):
        search_terms = self.__search_input.get_property("text")
        _logger.debug("Search terms: " + str(search_terms))
        self.__app_list.set_search(search_terms)
        self.__idle_search_id = 0

    def __on_pinned_apps_changed(self, mugshot, pinned_apps):
        _logger.debug("Pinned apps changed: " + str(map(lambda x: x.get_id(), pinned_apps)))
        self.__overview.sync_pinned_checkbox()
示例#3
0
class PeopleBrowser(hippo.CanvasWindow):
    def __init__(self, stock):
        super(PeopleBrowser, self).__init__(gtk.WINDOW_TOPLEVEL)
        
        self.__stock = stock
        
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(65535,65535,65535))        

        self.set_title('People')
    
        self.__box = CanvasHBox()
    
        self.__left_box = CanvasVBox(spacing=6, padding=6, box_width=250)
        self.__left_box.set_property('background-color', 0xEEEEEEFF)
        self.__box.append(self.__left_box)
        
        self.__search_text = hippo.CanvasText(text="Search People:", font="Bold 12px",
                                              color=0x3F3F3FFF, xalign=hippo.ALIGNMENT_START)
        self.__left_box.append(self.__search_text)
        self.__search_input = hippo.CanvasEntry()
        #self.__search_input.set_property('border-color', 0xAAAAAAFF)
        self.__search_input.connect("notify::text", self.__on_search_changed)
        self.__search_input.connect("key-press-event", self.__on_search_keypress)
        self.__idle_search_id = 0
        self.__left_box.append(self.__search_input)

        self.__profile_box = CanvasVBox(border=1, border_color=0x999999FF, background_color=0xFFFFFFFF)
        self.__left_box.append(self.__profile_box)
        self.__set_profile_person(None)
    
        self.__right_scroll = hippo.CanvasScrollbars()
        self.__right_scroll.set_policy(hippo.ORIENTATION_HORIZONTAL,
                                       hippo.SCROLLBAR_NEVER)
        self.__right_box = CanvasVBox(border=0, background_color=0xFFFFFFFF)
        self.__box.append(self.__right_scroll, hippo.PACK_EXPAND)
        
        self.__people_list = PeopleList()
        self.__right_box.append(self.__people_list, hippo.PACK_EXPAND)

        self.__people_list.connect("selected", self.__on_person_selected)
        
        self.__right_scroll.set_root(self.__right_box)        
        
        self.set_default_size(750, 600)
        self.connect("delete-event", lambda *args: self.__hide_reset() or True)
        self.connect("key-press-event", lambda win, event: self.__on_keypress(event))
               
        self.set_root(self.__box)

        self.__tracker = PeopleTracker()
        self.__tracker.contacts.connect("added", self.__on_contact_added)
        self.__tracker.contacts.connect("removed", self.__on_contact_removed)
        self.__tracker.local_people.connect("added", self.__on_local_person_added)
        self.__tracker.local_people.connect("removed", self.__on_local_person_removed)
        self.__tracker.aim_people.connect("added", self.__on_aim_person_added)
        self.__tracker.aim_people.connect("removed", self.__on_aim_person_removed)
        self.__tracker.xmpp_people.connect("added", self.__on_xmpp_person_added)
        self.__tracker.xmpp_people.connect("removed", self.__on_xmpp_person_removed)

        self.__model = DataModel(bigboard.globals.server_name)

        for person in self.__tracker.contacts:
            self.__on_contact_added(self.__tracker.contacts, person)
            
        for person in self.__tracker.local_people:
            self.__on_local_person_added(self.__tracker.local_people, person)

        for person in self.__tracker.aim_people:
            self.__on_aim_person_added(self.__tracker.aim_people, person)

        for person in self.__tracker.xmpp_people:
            self.__on_xmpp_person_added(self.__tracker.xmpp_people, person)

    def __set_profile_person(self, person):
        self.__profile_box.clear()
        if person == None:
            self.__profile_box.set_property("box-height", 300)
        else:
            self.__profile_box.set_property("box_height", -1)
            self.__profile_box.append(ProfileItem(person))

    def __reset(self):
        self.__search_input.set_property('text', '')

    def __hide_reset(self):
        self.__reset()
        self.hide()

    def __idle_do_search(self):
        self.__people_list.set_search(self.__search_input.get_property("text"))
        self.__idle_search_id = 0
        
    def __on_keypress(self, event):
        if event.keyval == 65307:
            self.__hide_reset()

    def __on_search_changed(self, input, text):
        if self.__idle_search_id > 0:
            return
        self.__idle_search_id = gobject.timeout_add(500, self.__idle_do_search)
        
    def __on_search_keypress(self, entry, event):
        if event.key == hippo.KEY_RETURN:
            self.__people_list.select_single_visible_person()

    def __on_person_selected(self, list, person):
         self.__set_profile_person(person)
         
    def __on_contact_added(self, list, contact):
        self.__people_list.add_person(contact, CONTACTS)
        
    def __on_contact_removed(self, list, contact):
        self.__people_list.remove_person(contact, CONTACTS)
        
    def __on_local_person_added(self, list, person):
        if person == self.__model.self_resource:
            return
        
        self.__people_list.add_person(person, LOCAL_PEOPLE)
        
    def __on_local_person_removed(self, list, person):
        self.__people_list.remove_person(person, LOCAL_PEOPLE)

    def __on_aim_person_added(self, list, person):
        if person == self.__model.self_resource:
            return
        
        self.__people_list.add_person(person, AIM_PEOPLE)
        
    def __on_aim_person_removed(self, list, person):
        self.__people_list.remove_person(person, AIM_PEOPLE)

    def __on_xmpp_person_added(self, list, person):
        if person == self.__model.self_resource:
            return
        
        self.__people_list.add_person(person, XMPP_PEOPLE)
        
    def __on_xmpp_person_removed(self, list, person):
        self.__people_list.remove_person(person, XMPP_PEOPLE)