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()
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()
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)