def __init__(self, detail_page, pkg_name, alias_name, star): ''' init docs ''' gtk.HBox.__init__(self) self.star = star self.pkg_name = pkg_name v_box = gtk.VBox() pkg_icon_image = gtk.image_new_from_pixbuf( gtk.gdk.pixbuf_new_from_file_at_size( get_icon_pixbuf_path(pkg_name), 32, 32)) pkg_alias_label = Label( alias_name, hover_color=app_theme.get_color("homepage_hover")) pkg_alias_label.set_clickable() pkg_alias_label.connect( "button-press-event", lambda w, e: detail_page.update_pkg_info(pkg_name)) self.pkg_star_box = gtk.HBox() self.pkg_star_view = StarView() self.pkg_star_view.star_buffer.star_level = int(star) self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(self.star, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) self.pack_start(pkg_icon_image, False, False) self.pack_start(v_box, True, True, 8) v_box.pack_start(pkg_alias_label, False, False, 2) v_box.pack_start(self.pkg_star_box, False, False, 2) self.pkg_star_box.pack_start(self.pkg_star_view, False, False) self.pkg_star_box.pack_start(self.pkg_star_mark, False, False)
def __init__(self, detail_page, pkg_name, alias_name, star): ''' init docs ''' gtk.HBox.__init__(self) self.star = star self.pkg_name = pkg_name v_box = gtk.VBox() pkg_icon_image = gtk.image_new_from_pixbuf( gtk.gdk.pixbuf_new_from_file_at_size(get_icon_pixbuf_path(pkg_name), 32, 32)) pkg_alias_label = Label(alias_name, hover_color=app_theme.get_color("homepage_hover")) pkg_alias_label.set_clickable() pkg_alias_label.connect("button-press-event", lambda w, e: detail_page.update_pkg_info(pkg_name)) self.pkg_star_box = gtk.HBox() self.pkg_star_view = StarView() self.pkg_star_view.star_buffer.star_level = int(star) self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(self.star, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) self.pack_start(pkg_icon_image, False, False) self.pack_start(v_box, True, True, 8) v_box.pack_start(pkg_alias_label, False, False, 2) v_box.pack_start(self.pkg_star_box, False, False, 2) self.pkg_star_box.pack_start(self.pkg_star_view, False, False) self.pkg_star_box.pack_start(self.pkg_star_mark, False, False)
def show_screenshot(self): container_remove_all(self.right_slide_box) screenshot_dir = os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name) if os.path.exists(screenshot_dir): screenshot_files = map( lambda filename: os.path.join(screenshot_dir, filename), filter(lambda file_name: file_name.endswith(".png"), os.listdir(screenshot_dir))) if len(screenshot_files) > 0: slide_switcher = SlideSwitcher( map( lambda screenshot_file: get_resize_pixbuf_with_height( screenshot_file, 290), screenshot_files), pointer_offset_x=-370, pointer_offset_y=-15, horizontal_align=ALIGN_MIDDLE, vertical_align=ALIGN_MIDDLE, height_offset=60, hover_switch=False, auto_switch=False, navigate_switch=True, ) slide_align = gtk.Alignment() slide_align.set(0.5, 0.5, 1, 1) slide_align.add(slide_switcher) slide_align.connect("expose-event", self.expose_resizable_label_background) self.right_slide_box.pack_start(slide_align, True, True) powered_link = Label( _("Powered by UpYun.com"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover"), ) powered_link.set_clickable() powered_link.connect( "button-press-event", lambda w, e: run_command( "xdg-open https://www.upyun.com/")) powered_link_align = gtk.Alignment() powered_link_align.set(1.0, 0.5, 0, 0) powered_link_align.set_padding(0, 0, 0, 100) powered_link_align.add(powered_link) self.right_slide_box.pack_start(powered_link_align, False, False) self.show_all() else: global_logger.error("%s haven't any screenshot from zip file" % self.pkg_name)
def __active_action(self, state): container_remove_all(self.ssid_entry_align) container_remove_all(self.password_entry_align) container_remove_all(self.active_align) if state == False: label1 = Label(self.ssid_entry.get_text()) label2 = Label(self.password_entry.get_text()) label1.connect("button-press-event", lambda w, e: self.__active_action(True)) label2.connect("button-press-event", lambda w, e: self.__active_action(True)) self.ssid_entry_align.add(label1) self.password_entry_align.add(label2) self.show_all() else: self.ssid_entry_align.add(self.ssid_entry) self.password_entry_align.add(self.password_entry) self.active_align.add(self.active_btn)
def show_screenshot(self): container_remove_all(self.right_slide_box) screenshot_dir = os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name) if os.path.exists(screenshot_dir): screenshot_files = map(lambda filename: os.path.join(screenshot_dir, filename), filter(lambda file_name: file_name.endswith(".png"), os.listdir(screenshot_dir))) if len(screenshot_files) > 0: slide_switcher = SlideSwitcher( map(lambda screenshot_file: get_resize_pixbuf_with_height(screenshot_file, 290), screenshot_files), pointer_offset_x=-370, pointer_offset_y=-15, horizontal_align=ALIGN_MIDDLE, vertical_align=ALIGN_MIDDLE, height_offset=60, hover_switch=False, auto_switch=False, navigate_switch=True, ) slide_align = gtk.Alignment() slide_align.set(0.5, 0.5, 1, 1) slide_align.add(slide_switcher) slide_align.connect("expose-event", self.expose_resizable_label_background) self.right_slide_box.pack_start(slide_align, True, True) powered_link = Label( _("Powered by UpYun.com"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover"), ) powered_link.set_clickable() powered_link.connect("button-press-event", lambda w, e: run_command("xdg-open https://www.upyun.com/")) powered_link_align = gtk.Alignment() powered_link_align.set(1.0, 0.5, 0, 0) powered_link_align.set_padding(0, 0, 0, 100) powered_link_align.add(powered_link) self.right_slide_box.pack_start(powered_link_align, False, False) self.show_all() else: global_logger.logerror("%s haven't any screenshot from zip file" % self.pkg_name)
def toggle_cb(self, widget): active = widget.get_active() if active: if self.proxysetting.get_proxy_mode() == "none": self.proxysetting.set_proxy_mode("manual") self.align = gtk.Alignment(0,0,0,0) self.align.set_padding(0,0,PADDING,11) label = Label(_("Proxy Configuration"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) label.connect("button-release-event", self.slide_to_event) self.align.add(label) self.add(self.align) self.show_all() else: self.align.destroy() self.proxysetting.set_proxy_mode("none")
def toggle_cb(self, widget): active = widget.get_active() if active: if self.proxysetting.get_proxy_mode() == "none": self.proxysetting.set_proxy_mode("manual") self.align = gtk.Alignment(0, 0, 0, 0) self.align.set_padding(0, 0, PADDING, 11) label = Label(_("Proxy Configuration"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) label.connect("button-release-event", self.slide_to_event) self.align.add(label) self.add(self.align) self.show_all() else: self.align.destroy() self.proxysetting.set_proxy_mode("none")
class VpnSection(Section): def __init__(self): Section.__init__(self) #init self.vpn = Contain(app_theme.get_pixbuf("network/vpn.png"), _("VPN Network"), lambda w: w) self.label = Label(_("Create a VPN connection"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) self.load(self.vpn, [self.label]) self.no_auto_connect = False self.no_vpn_connecting = False self.this_setting = None self.vpn_path = None def init_state(self): vpn_active = nm_module.nmclient.get_vpn_active_connection() if vpn_active: self.vpn.set_active(True) for active in vpn_active: self.connect_vpn_signals( nm_module.cache.get_spec_object(active.object_path)) self.__init_signals() @classmethod def show_or_hide(self): return True def __init_signals(self): self.label.connect("button-release-event", lambda w, p: self.jumpto_cb()) Dispatcher.connect("vpn-redraw", lambda w: self.vpn_redraw(None, None, None)) Dispatcher.connect('vpn-start', self.vpn_start_cb) event_manager.add_callback("vpn-connecting", self.on_vpn_connecting) event_manager.add_callback('vpn-connected', self.vpn_connected) event_manager.add_callback('vpn-disconnected', self.vpn_disconnected) event_manager.add_callback('vpn-user-disconnect', self.on_user_stop_vpn) event_manager.add_callback('user-toggle-off-vpn-tray', self.user_toggle_off_vpn_tray) event_manager.add_callback('vpn-connection-removed', self.vpn_redraw) def user_toggle_off_vpn_tray(self, name, event, data): log.debug("toggle off vpn from tray") self.vpn.set_active(False) def on_user_stop_vpn(self, name, event, data): self.vpn.set_active(False) def vpn_redraw(self, name, event, data): if self.vpn.get_active(): self.no_auto_connect = True self.vpn.set_active(True, emit=True) #self.toggle_on() self.show_all() def vpn_start_cb(self, widget, path): log.debug("vpn start by tray") vpn_active = nm_module.cache.get_spec_object(path) if vpn_active.get_vpnstate() < 5: self.vpn_path = path self.on_vpn_connecting(None, None, path) def connect_vpn_signals(self, active_vpn): active_vpn.connect("vpn-connected", self.vpn_connected) active_vpn.connect("vpn-disconnected", self.vpn_disconnected) active_vpn.connect('vpn-user-disconnect', lambda w: self.vpn.set_active(False)) def toggle_on(self): item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.delete_all_items() self.tree.add_items(item_list) def on_active_conn_create(self, active_conn): net_manager.emit_vpn_start(active_conn) def try_active_vpn(self): from lists import VpnAutoMonitor monitor = VpnAutoMonitor() monitor.start() return monitor #for active_conn in nm_module.nmclient.get_anti_vpn_active_connection(): #if len(nm_module.nmclient.get_vpn_active_connection()) == 0: #try: #active_conn.vpn_auto_connect(self.on_active_conn_create) #except: #pass #else: #break def toggle_on_after(self): if self.no_auto_connect: self.no_auto_connect = False pass else: if not self.vpn_path: self.monitor = self.try_active_vpn() else: self.on_vpn_connecting(None, None, self.vpn_path) vpn_active = nm_module.nmclient.get_vpn_active_connection() if vpn_active: # TODO fix for mutiple connection = vpn_active[0].get_connection() try: index = self.connection.index(connection) self.tree.visible_items[index].set_net_state(2) self.vpn_path = vpn_active[0].object_path return except Exception, e: log.error(e) else:
class DSLSection(Section): def __init__(self): Section.__init__(self) self.dsl = Contain(app_theme.get_pixbuf("network/dsl.png"), _("DSL"), lambda w: w) self.label = Label(_("Create a DSL connection"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) self.load(self.dsl, [self.label]) self.active_connection = None def init_state(self): self.wired_devices = net_manager.device_manager.get_wired_devices() if self.wired_devices: self.__init_signals() if nm_module.nmclient.get_pppoe_active_connection(): #print nm_module.nmclient.get_pppoe_active_connection() #print nm_module.nmclient.get_wired_active_connection() self.dsl.set_active(True) else: pass @classmethod def show_or_hide(self): if net_manager.device_manager.get_wired_devices(): return True else: return False def __init_signals(self): self.label.connect("button-release-event", lambda w, x: self.jumpto_setting()) Dispatcher.connect("dsl-redraw", lambda w: self.dsl_redraw(None, None, None)) event_manager.add_callback('dsl-connection-start', self.connection_start_by_user) event_manager.add_callback('dsl-connection-removed', self.dsl_redraw) signal_list = [ "device_active", "device_deactive", "device_unavailable", "activate_start", "activate_failed" ] for signal in signal_list: event_manager.add_callback(('dsl_%s' % signal).replace("_", "-"), getattr(self, signal)) def connection_start_by_user(self, name, event, data): connection = data self.active_connection = connection def device_active(self, name, event, data): print "device active" if not self.dsl.get_active(): self.dsl.set_active(True) if self.active_connection: index = self.connections.index(self.active_connection) if self.tree.visible_items != []: self.tree.visible_items[index].set_net_state(2) self.tree.queue_draw() def device_unavailable(self, name, event, data): print "device unavailable" def device_deactive(self, name, event, data): print "device deactive" new_state, old_state, reason = data if reason == 39: self.dsl.set_active(False) return if reason == 36: print "in fact there had device removed" ######################## net_manager.init_devices() self.wired_devices = net_manager.wired_devices self._init_signals() self.tree.delete_all_items() item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.add_items(item_list, 0, True) self.tree.set_size_request(-1, len(self.tree.visible_items) * 30) index = 0 for d in self.wired_devices: if d.get_state() == 100: self.tree.visible_items[index].set_net_state(2) index += 1 if not any([d.get_state() == 100 for d in net_manager.wired_devices]): self.dsl.set_active(False) def activate_start(self, name, event, data): print "active start in main" if self.active_connection: index = self.connections.index(self.active_connection) if self.tree.visible_items != []: self.tree.visible_items[index].set_net_state(1) self.tree.queue_draw() def activate_failed(self, name, event, data): print "device failded" def dsl_redraw(self, name, event, data): if self.dsl.get_active(): log.debug("dsl redraw action") self.dsl.set_active(True, emit=True) def toggle_on(self): self.tree.delete_all_items() item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.add_items(item_list) def toggle_on_after(self): active_dsl = nm_module.nmclient.get_pppoe_active_connection() if active_dsl: try: for a in active_dsl: connection = a.get_connection() index = self.connections.index(connection) self.tree.visible_items[index].set_net_state(2) except: index = [] else: # add auto connect stuff pass def toggle_off(self): active_dsl = nm_module.nmclient.get_pppoe_active_connection() if not active_dsl: return for wired_device in self.wired_devices: wired_device.nm_device_disconnect() def get_list(self): self.connections = nm_module.nm_remote_settings.get_pppoe_connections() log.debug(self.connections) return map(lambda c: DSLItem(c, None), self.connections) def jumpto_setting(self): Dispatcher.to_setting_page(DSLSetting(), hide_left=True) setting = nm_module.slider.get_page_by_name("setting") setting.create_new_connection()
class AccelEntry(ShortcutKeyEntry): ''' ''' TYPE_DP_GSETTINGS = 0 TYPE_CMP_GSETTINGS = 1 TYPE_GSETTINGS = 2 TYPE_GCONF = 3 TYPE_STRING = 4 TYPE_STRV = 5 __gsignals__ = { "accel-key-change": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (str, )), "accel-del": (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), } def __init__(self, content="", check_conflict_func=None, resolve_conflict_func=resolve_accel_entry_conflict, process_unmodifier_func=process_unmodifier_key, can_del=False): ''' @param content: a string container accelerator @param check_conflict_func: a function return a AccelEntry object, if their AccelBuffer is equal @param resolve_conflict_func: a function to resolve conflict @param process_unmodifier_func: a function to check the Accelerator is whether valid ''' super(AccelEntry, self).__init__() self.accel_buffer = AccelBuffer() self.accel_buffer.set_from_accel(content) self.accel_str = self.accel_buffer.get_accel_label() if not self.accel_str: self.accel_str = _('disable') self.accel_label = Label(self.accel_str, enable_select=False, enable_double_click=False) self.accel_align = gtk.Alignment() self.accel_align.set(0.0, 0.5, 0.0, 0.0) self.accel_align.set_padding(0, 0, 6, 0) self.accel_align.add(self.accel_label) self.grab_area = gtk.EventBox() #self.grab_area.set_size_request(1, -1) self.grab_area.set_can_focus(True) self.grab_area.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.grab_area.add_events(gtk.gdk.KEY_PRESS_MASK) self.del_button = ImageButton( app_theme.get_pixbuf("keyboard/delete-normal.png"), app_theme.get_pixbuf("keyboard/delete-hover.png"), app_theme.get_pixbuf("keyboard/delete-hover.png")) #self.del_button.set_no_show_all(True) self.h_box.remove(self.entry) self.h_box.pack_start(self.accel_align) self.h_box.pack_start(self.grab_area, False, False) #self.h_box.pack_start(self.del_button, False, False) self.grab_area.connect("button-press-event", self.__on_grab_area_button_press_cb) self.grab_area.connect("key-press-event", self.__on_grab_area_key_press_cb) self.grab_area.connect("key-release-event", self.__on_grab_area_key_release_cb) self.accel_label.connect("button-press-event", self.__on_label_button_press_cb) #self.accel_label.connect("enter-notify-event", self.__on_label_enter_cb) #self.accel_label.connect("leave-notify-event", self.__on_label_leave_cb) #self.del_button.connect("leave-notify-event", self.__on_del_button_leave_cb) self.del_button.connect("clicked", lambda w: self.emit("accel-del")) self.accel_label.keymap = {} self.check_conflict_func = check_conflict_func self.resolve_conflict_func = resolve_conflict_func self.process_unmodifier_func = process_unmodifier_func self.can_del = can_del widget_width = 200 if self.can_del: widget_width = 220 new_hbox = gtk.HBox() new_align = gtk.Alignment(0.5, 0.5, 1.0, 1.0) new_align.add(self.del_button) self.remove(self.align) self.pack_start(new_hbox, False, False) new_hbox.pack_start(self.align, False, False) new_hbox.pack_start(new_align, False, False) self.set_size(widget_width, 24) self.settings_description = "" self.settings_key = "" self.settings_obj = None self.settings_type = None self.settings_value_type = None self.connect("accel-key-change", self.__on_accel_key_change_cb) def __on_label_button_press_cb(self, widget, event): self.accel_label.set_text(_("Please input new shortcuts")) if gtk.gdk.keyboard_grab(self.grab_area.window, False, 0) != gtk.gdk.GRAB_SUCCESS: self.accel_label.set_text(self.accel_str) return None if gtk.gdk.pointer_grab(self.grab_area.window, False, gtk.gdk.BUTTON_PRESS_MASK, None, None, 0) != gtk.gdk.GRAB_SUCCESS: gtk.gdk.keyboard_ungrab(0) self.accel_label.set_text(self.accel_str) return None self.grab_area.grab_focus() if self.can_del and self.del_button in self.h_box.get_children(): self.del_button.hide() self.h_box.remove(self.del_button) self.emit("wait-key-input", self.shortcut_key) def __on_grab_area_button_press_cb(self, widget, event): gtk.gdk.keyboard_ungrab(0) gtk.gdk.pointer_ungrab(0) self.accel_label.set_text(self.accel_str) def __on_grab_area_key_release_cb(self, widget, event): if not event.is_modifier: return False if not gtk.gdk.pointer_is_grabbed(): return False event.state = event.state & (~gtk.gdk.MOD2_MASK) & ( ~gtk.gdk.MOD3_MASK) & (~gtk.gdk.MOD4_MASK) & (~gtk.gdk.MOD5_MASK) # is not Super key if not (event.keyval == gtk.keysyms.Super_R or event.keyval == gtk.keysyms.Super_L and event.state == gtk.gdk.SUPER_MASK): return False gtk.gdk.keyboard_ungrab(0) gtk.gdk.pointer_ungrab(0) tmp_accel_buf = AccelBuffer() tmp_accel_buf.set_keyval(0) tmp_accel_buf.set_state(gtk.gdk.SUPER_MASK) if self.check_conflict_func and self.resolve_conflict_func: conflict_entry = self.check_conflict_func(self, tmp_accel_buf) if conflict_entry: self.resolve_conflict_func(self, conflict_entry, tmp_accel_buf) return self.set_keyval_and_state(0, gtk.gdk.SUPER_MASK) def __on_grab_area_key_press_cb(self, widget, event): if event.is_modifier: return False if not gtk.gdk.pointer_is_grabbed(): return False gtk.gdk.keyboard_ungrab(0) gtk.gdk.pointer_ungrab(0) # HACK: we don't want to use SysRq as a keybinding, so we avoid its translation from Alt+Print. if event.keyval == gtk.keysyms.Sys_Req and event.state & gtk.gdk.MOD1_MASK: event.keyval = gtk.keysyms.Print keyval = event.keyval state = event.state = event.state & (~gtk.gdk.MOD2_MASK ) # ignore MOD2_MASK # cancel edit if keyval == gtk.keysyms.Escape: self.accel_label.set_text(self.accel_str) return # clear edit if keyval == gtk.keysyms.BackSpace: self.set_keyval_and_state(0, 0) return tmp_accel_buf = AccelBuffer() tmp_accel_buf.set_keyval(keyval) tmp_accel_buf.set_state(state) if self.check_unmodified_keys(event) and self.process_unmodifier_func: self.accel_label.set_text(self.accel_str) self.process_unmodifier_func(tmp_accel_buf) return if self.check_conflict_func and self.resolve_conflict_func: conflict_entry = self.check_conflict_func(self, tmp_accel_buf) if conflict_entry: self.resolve_conflict_func(self, conflict_entry, tmp_accel_buf) return self.set_keyval_and_state(keyval, state) def reassign_cancel(self, widget=None): ''' cancel reassign when it conflict ''' if widget: widget.destroy() self.accel_label.set_text(self.accel_str) def reassign(self, accel_buf, conflict_entry, widget=None): if widget: widget.destroy() conflict_entry.set_keyval_and_state(0, 0) self.set_keyval_and_state(accel_buf.get_keyval(), accel_buf.get_state()) def check_unmodified_keys(self, event): #Check for unmodified keys state = event.state keyval = event.keyval state = event.state & (~gtk.gdk.MOD2_MASK) # ignore MOD2_MASK forbidden_keyvals = [ # Navigation keys gtk.keysyms.Home, gtk.keysyms.Left, gtk.keysyms.Up, gtk.keysyms.Right, gtk.keysyms.Down, gtk.keysyms.Page_Up, gtk.keysyms.Page_Down, gtk.keysyms.End, gtk.keysyms.Tab, # Return gtk.keysyms.KP_Enter, gtk.keysyms.Return, gtk.keysyms.space, gtk.keysyms.Mode_switch ] return (state == 0 or state == gtk.gdk.SHIFT_MASK) and ( gtk.keysyms.a <= keyval <= gtk.keysyms.z or gtk.keysyms.A <= keyval <= gtk.keysyms.Z or gtk.keysyms._0 <= keyval <= gtk.keysyms._9 or gtk.keysyms.kana_fullstop <= keyval <= gtk.keysyms.semivoicedsound or gtk.keysyms.Arabic_comma <= keyval <= gtk.keysyms.Arabic_sukun or gtk.keysyms.Serbian_dje <= keyval <= gtk.keysyms.Cyrillic_HARDSIGN or gtk.keysyms.Greek_ALPHAaccent <= keyval <= gtk.keysyms.Greek_omega or gtk.keysyms.hebrew_doublelowline <= keyval <= gtk.keysyms.hebrew_taf or gtk.keysyms.Thai_kokai <= keyval <= gtk.keysyms.Thai_lekkao or gtk.keysyms.Hangul <= keyval <= gtk.keysyms.Hangul_Special or gtk.keysyms.Hangul_Kiyeog <= keyval <= gtk.keysyms.Hangul_J_YeorinHieuh or keyval in forbidden_keyvals) def set_keyval_and_state(self, keyval, state): self.accel_buffer.set_keyval(keyval) self.accel_buffer.set_state(state) self.emit("accel-key-change", self.accel_buffer.get_accel_name()) self.accel_str = self.accel_buffer.get_accel_label() if not self.accel_str: self.accel_str = _('disable') self.accel_label.set_text(self.accel_str) def set_size(self, width, height): super(AccelEntry, self).set_size(width, height) if self.can_del: self.accel_align.set_size_request(width - 20, height) self.accel_label.label_width = width - 20 self.accel_label.set_size_request(width - 20, height) else: self.accel_align.set_size_request(width, height) self.accel_label.label_width = width self.accel_label.set_size_request(width, height) def __on_accel_key_change_cb(self, widget, accel_name): if not self.settings_obj: return if self.settings_type == self.TYPE_GSETTINGS: if self.settings_value_type == self.TYPE_STRV: if accel_name: self.settings_obj.set_strv(self.settings_key, [accel_name]) else: self.settings_obj.set_strv(self.settings_key, []) elif self.settings_value_type == self.TYPE_STRING: self.settings_obj.set_string(self.settings_key, accel_name) elif self.settings_type == self.TYPE_DP_GSETTINGS: self.settings_obj.set_string( self.settings_key, "%s;%s" % (self.settings_value_type, accel_name)) elif self.settings_type == self.TYPE_CMP_GSETTINGS: settings.shortcuts_compiz_set(self.settings_plugin, self.settings_key, accel_name) elif self.settings_type == self.TYPE_GCONF: self.settings_obj.set_string("%s/binding" % (self.settings_key), accel_name) def __on_label_enter_cb(self, widget, event): if self.can_del: if self.del_button not in self.h_box.get_children(): self.h_box.pack_start(self.del_button, False, False) self.del_button.show() def __on_label_leave_cb(self, widget, event): x, y, w, h = widget.allocation if not (0 < event.y < h) or event.x <= 0: if self.del_button in self.h_box.get_children(): self.h_box.remove(self.del_button) self.del_button.hide() def __on_del_button_leave_cb(self, widget, event): x, y, w, h = widget.allocation if not (0 < event.y < h) or event.x >= w and self.del_button.get_visible(): if widget in self.h_box.get_children(): widget.hide() self.h_box.remove(self.del_button)
class DSLSection(Section): def __init__(self): Section.__init__(self) self.dsl = Contain(app_theme.get_pixbuf("network/dsl.png"), _("DSL"), lambda w: w) self.label = Label(_("Create a DSL connection"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) self.load(self.dsl, [self.label]) self.active_connection = None def init_state(self): self.wired_devices = net_manager.device_manager.get_wired_devices() if self.wired_devices: self.__init_signals() if nm_module.nmclient.get_pppoe_active_connection(): #print nm_module.nmclient.get_pppoe_active_connection() #print nm_module.nmclient.get_wired_active_connection() self.dsl.set_active(True) else: pass @classmethod def show_or_hide(self): if net_manager.device_manager.get_wired_devices(): return True else: return False def __init_signals(self): self.label.connect("button-release-event", lambda w,x: self.jumpto_setting()) Dispatcher.connect("dsl-redraw", lambda w: self.dsl_redraw(None, None,None)) event_manager.add_callback('dsl-connection-start', self.connection_start_by_user) event_manager.add_callback('dsl-connection-removed', self.dsl_redraw) signal_list = ["device_active", "device_deactive", "device_unavailable", "activate_start", "activate_failed"] for signal in signal_list: event_manager.add_callback(('dsl_%s'%signal).replace("_", "-"), getattr(self, signal)) def connection_start_by_user(self, name, event, data): connection = data self.active_connection = connection def device_active(self, name, event, data): print "device active" if not self.dsl.get_active(): self.dsl.set_active(True) if self.active_connection: index = self.connections.index(self.active_connection) if self.tree.visible_items != []: self.tree.visible_items[index].set_net_state(2) self.tree.queue_draw() def device_unavailable(self, name, event, data): print "device unavailable" def device_deactive(self, name, event, data): print "device deactive" new_state, old_state, reason = data if reason == 39: self.dsl.set_active(False) return if reason == 36: print "in fact there had device removed" ######################## net_manager.init_devices() self.wired_devices = net_manager.wired_devices self._init_signals() self.tree.delete_all_items() item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.add_items(item_list, 0, True) self.tree.set_size_request(-1, len(self.tree.visible_items)*30) index = 0 for d in self.wired_devices: if d.get_state() == 100: self.tree.visible_items[index].set_net_state(2) index += 1 if not any([d.get_state() == 100 for d in net_manager.wired_devices]): self.dsl.set_active(False) def activate_start(self, name, event, data): print "active start in main" if self.active_connection: index = self.connections.index(self.active_connection) if self.tree.visible_items != []: self.tree.visible_items[index].set_net_state(1) self.tree.queue_draw() def activate_failed(self, name, event, data): print "device failded" def dsl_redraw(self, name, event, data): if self.dsl.get_active(): log.debug("dsl redraw action") self.dsl.set_active(True, emit=True) def toggle_on(self): self.tree.delete_all_items() item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.add_items(item_list) def toggle_on_after(self): active_dsl = nm_module.nmclient.get_pppoe_active_connection() if active_dsl: try: for a in active_dsl: connection = a.get_connection() index = self.connections.index(connection) self.tree.visible_items[index].set_net_state(2) except: index = [] else: # add auto connect stuff pass def toggle_off(self): active_dsl = nm_module.nmclient.get_pppoe_active_connection() if not active_dsl: return for wired_device in self.wired_devices: wired_device.nm_device_disconnect() def get_list(self): self.connections = nm_module.nm_remote_settings.get_pppoe_connections() log.debug(self.connections) return map(lambda c: DSLItem(c, None), self.connections) def jumpto_setting(self): Dispatcher.to_setting_page(DSLSetting(),hide_left=True) setting = nm_module.slider.get_page_by_name("setting") setting.create_new_connection()
class WirelessSection(Section, WirelessDevice): def __init__(self): Section.__init__(self) WirelessDevice.__init__(self) self.wireless = Contain(app_theme.get_pixbuf("network/wifi.png"), _("Wireless"), lambda w:w) self.label = Label(_("Set up a hidden wireless connection"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) space = gtk.VBox() space.set_size_request(-1, 15) self.load(self.wireless, [space, self.label]) self.content_box.set_spacing(0) self.selected_item = None self.device_tree = None self.focused_device = None self.wireless_devices = None def add_switcher(self): if self.device_tree == None: self.device_tree = TreeView([DeviceToggleItem(self.wireless_devices, 0)]) self.device_tree.set_expand_column(1) self.content_box.pack_start(self.device_tree, False, True) self.content_box.reorder_child(self.device_tree, 0) net_manager.emit_wifi_switch(0) def remove_switcher(self): if self.device_tree\ and self.device_tree in self.content_box.get_children(): self.content_box.remove(self.device_tree) self.device_tree = None try: self.focused_device = self.wireless_devices[0] except: log.error("get no wireless devices but try to index") self.focused_device = None self.wireless_redraw(None) @classmethod def show_or_hide(self): if net_manager.device_manager.get_wireless_devices(): self.wireless_devices = net_manager.device_manager.get_wireless_devices() return True else: self.wireless_devices = [] return False def init_state(self): self.ap_list = [] self.wireless_devices = net_manager.device_manager.get_wireless_devices() if self.wireless_devices: #self.device_dict = dict() self.focused_device = self.wireless_devices[0] if len(self.wireless_devices) > 1: self.add_switcher() self.tree.connect("single-click-item", self.set_selected_item) ## check state if self.get_state(self.wireless_devices): self.wireless.set_active(True) else: pass self.init_signals() def init_signals(self): self._init_signals() Dispatcher.connect("switch-device", self.switch_devices) Dispatcher.connect("wireless-device-add", self.device_added) Dispatcher.connect("ap-added", self.ap_added_callback) Dispatcher.connect("ap-removed", self.ap_removed_callback) Dispatcher.connect("wireless-redraw", self.wireless_redraw) self.label.connect("button-release-event", self.create_a_hidden_network) event_manager.add_callback('hidden-connection-removed', self.on_delete_redraw) def switch_devices(self, widget, device): self.focused_device = device if self.device_tree: self.device_tree.visible_items[0].set_index(device) self.wireless_redraw(None) def on_delete_redraw(self, name, event, data): self.wireless_redraw(None) def wireless_redraw(self, widget): log.debug() if self.wireless.get_active(): self.wireless.set_active(True, emit=True) self.show_all() def device_added(self, widget, device): self.wireless_devices = net_manager.device_manager.get_wireless_devices() self._init_signals() if len(self.wireless_devices) > 1: self.add_switcher() else: self.remove_switcher() if self.wireless.get_active(): self.wireless.set_active(True, emit=True) def create_a_hidden_network(self, widget, c): from wlan_config import HiddenSetting Dispatcher.to_setting_page(HiddenSetting(None), False) def ap_added_callback(self, widget): if self.wireless.get_active(): self.wireless.set_active(True, emit=True) def ap_removed_callback(self, widget): if self.wireless.get_active(): self.wireless.set_active(True, emit=True) def set_selected_item(self, widget, item, column, x, y): log.debug(item) self.selected_item = item def get_actives(self, ap_list): def to_item_state(device): if device.get_state() <= 30: return 0 elif device.get_state() < 100: return 1 elif device.get_state() == 100: return 2 if not ap_list: return [] index = [] active_connection = self.focused_device.get_active_connection() if active_connection: try: ssid = active_connection.get_connection().get_setting("802-11-wireless").ssid index.append([[ap.get_ssid() for ap in ap_list].index(ssid), to_item_state(self.focused_device)]) except ValueError: print "not found in ap list" return index def _get_active_item(self): return filter(lambda i: i.get_net_state() > 0, self.tree.visible_items) def toggle_on_after(self): log.debug() indexs = self.get_actives(self.ap_list) if indexs: map(lambda (i, s): self.tree.visible_items[i].set_net_state(s), indexs) else: for d in self.wireless_devices: log.debug("try auto start") wifi = nm_module.cache.get_spec_object(d.object_path) wifi.auto_connect() def toggle_off(self): log.debug() self.ap_list = [] self.selected_item = None for wireless_device in self.wireless_devices: wireless_device.nm_device_disconnect() def get_list(self): self.ap_list = list() if not self.wireless_devices: return [] device_wifi = nm_module.cache.get_spec_object(self.focused_device.object_path) self.ap_list += device_wifi.order_ap_list() aps = map(lambda i:WirelessItem(i, self.focused_device), self.ap_list) hidden_list = self.get_hidden_connection() hiddens = map(lambda c: HidenItem(c), hidden_list) return aps + hiddens def __ap_list_merge(self): ap_ssid = set(map(lambda ap: ap.get_ssid(), self.ap_list)) merged_ap = [] for ap in self.ap_list: if ap.get_ssid() in ap_ssid: merged_ap.append(ap) ap_ssid.remove(ap.get_ssid()) return merged_ap def get_hidden_connection(self): from shared_methods import net_manager return net_manager.get_hiddens() ## need to filter all aps def get_state(self, devices): for d in devices: if d.get_state() == 100: return True return False def device_stop(self, device): device.nm_device_disconnect()
class MobileSection(Section, MobileDevice): def __init__(self): Section.__init__(self) MobileDevice.__init__(self) # init values self.mobile = Contain(app_theme.get_pixbuf("network/3g.png"), _("Mobile Network"), lambda w:w) self.label = Label(_("Mobile Configuration"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) self.load(self.mobile, []) #self.init_signal() def init_state(self): self.init_signal() pass def init_signal(self): self._init_signals() def get_item(self, device): modem_path =device.get_udi() try: index = self.devices.index(modem_path) return self.tree.visible_items[index] except: return None @classmethod def show_or_hide(self): return True def __init_signals(self): #nm_module.mmclient.connect("device-added", lambda w,p: mobile.set_active(True)) Dispatcher.connect("mmdevice-added", self.device_added) self.label.connect("button-release-event", lambda w,p: self.jumpto_cb()) def device_added(self, widget, device): self.init_signal() if self.mobile.get_active(): self.mobile.set_active(True) def toggle_on(self): item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.delete_all_items() self.tree.add_items(item_list) def toggle_on_after(self): pass def toggle_off(self): pass def get_list(self): self.cdma = nm_module.mmclient.get_cdma_device() self.gsm = nm_module.mmclient.get_gsm_device() #self.cdma = nm_module.nm_remote_settings.get_cdma_connections() #self.gsm = nm_module.nm_remote_settings.get_gsm_connections() self.devices = self.cdma + self.gsm return map(lambda c: MobileItem(c, None), self.devices) def jumpto_cb(self): Dispatcher.to_setting_page(MobileSetting(), False)
class DetailPage(gtk.HBox): ''' class docs ''' PADDING_Y = 20 ICON_SIZE = 64 ICON_PADDING_X = 50 STAR_PADDING_X = 36 STAR_PADDING_Y = 12 STAR_SIZE = 13 MARK_NUMBER_SIZE = 11 MARK_NUMBER_PADDING_X = 4 MARK_NUMBER_PADDING_Y = 10 INFO_RENDER_X = 10 INFO_RENDER_Y = 140 INFO_RENDER_HEIGHT = 18 INFO_CATEGORY_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT INFO_VERSION_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 2 INFO_SIZE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 3 INFO_DOWNLOAD_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 4 INFO_HOMEPAGE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 5 LEFT_INFO_PADDING_X = 18 LEFT_INFO_PADDING_Y = 50 LEFT_BUTTON_PADDING_Y = 50 LEFT_INFO_WIDTH = 164 RIGHT_INFO_PADDING_X = 30 RIGHT_TITLE_BOX_HEIGHT = 70 ALIAS_NAME_SIZE = 16 ALIAS_NAME_PADDING_Y = 20 LONG_DESC_PADDING_Y = 10 LONG_DESC_WRAP_WIDTH = 630 LONG_DESC_INIT_HEIGHT = 45 MARK_SIZE = 11 MARK_PADDING_X = 5 MARK_PADDING_Y = -3 def __init__(self, data_manager): ''' init docs ''' gtk.HBox.__init__(self) self.data_manager = data_manager self.pkg_name = None self.alias_name = "" self.pkg_pixbuf = None self.pkg_star_view = None self.left_view_box = gtk.VBox() self.left_view_box.set_size_request(self.LEFT_INFO_WIDTH, -1) self.left_logo_box = gtk.VBox() self.left_logo_box.set_size_request(-1, 90) self.star_box = gtk.HBox() self.star_align = gtk.Alignment(0.4, 0.5, 0, 0) self.star_align.set_padding(0, 5, 0, 0) self.star_align.add(self.star_box) self.left_action_box = gtk.HBox() self.left_action_align = gtk.Alignment() self.left_action_align.set(0.5, 0.5, 0, 0) self.left_action_align.set_padding(0, 30, 0, 0) self.left_action_align.add(self.left_action_box) self.left_label_table = gtk.Table(4, 1) self.left_label_table.set_row_spacings(4) self.left_label_align = gtk.Alignment() self.left_label_align.set(0.0, 0.5, 0, 0) self.left_label_align.set_padding(0, 0, 14, 0) self.left_category_name_label = Label() self.left_category_label = Label( hover_color=app_theme.get_color("homepage_hover")) self.left_category_label.set_clickable() self.left_category_label_align = gtk.Alignment() self.left_category_label_align.set(0.0, 0.5, 0, 0) self.left_category_label_align.add(self.left_category_label) self.left_category_label_box = gtk.HBox() self.left_category_label_box.pack_start(self.left_category_name_label, False, False) self.left_category_label_box.pack_start(self.left_category_label_align, True, True) self.left_category_box = gtk.VBox() self.left_version_label = Label(label_width=136) show_label_tooltip(self.left_version_label) self.left_version_label.set_ellipsize(pango.ELLIPSIZE_END) self.left_download_label = Label() self.left_size_label = Label() self.left_homepage_box = gtk.HBox() self.left_homepage_box_align = gtk.Alignment() self.left_homepage_box_align.set(0.0, 0.5, 0, 0) self.left_homepage_box_align.add(self.left_homepage_box) self.left_recommend_box = gtk.VBox() self.left_recommend_box_align = gtk.Alignment() self.left_recommend_box_align.set(0.0, 0.0, 0, 0) self.left_recommend_box_align.set_padding(30, 0, 14, 0) self.left_recommend_box_align.add(self.left_recommend_box) self.left_recommend_label = Label(_("Popular recommendations")) self.right_info_box = gtk.VBox() self.scrolled_window = ScrolledWindow(0, 0) self.right_view_box = gtk.VBox() self.right_top_box = gtk.HBox() self.right_top_box.set_size_request(-1, self.RIGHT_TITLE_BOX_HEIGHT) self.right_desc_box = gtk.VBox() self.right_slide_box = gtk.VBox() self.right_comment_box = gtk.VBox() self.right_title_box = gtk.VBox() self.return_button = ImageButton( app_theme.get_pixbuf("detail/normal.png"), app_theme.get_pixbuf("detail/hover.png"), app_theme.get_pixbuf("detail/press.png"), ) self.return_align = gtk.Alignment() self.return_align.set(0.5, 0.5, 1, 1) self.return_align.set_padding(self.ALIAS_NAME_PADDING_Y, 0, 0, self.RIGHT_INFO_PADDING_X) self.return_align.add(self.return_button) self.return_button.connect( "clicked", lambda w: global_event.emit("switch-from-detail-page")) self.right_top_box.pack_start(self.right_title_box, True, True) self.right_top_box.pack_start(self.return_align, False, False) self.right_view_box.pack_start(self.right_top_box, False, False) self.right_view_box.pack_start(self.right_desc_box, False, False) self.right_view_box.pack_start(self.right_slide_box, False, False) self.right_view_box.pack_start(self.right_comment_box, False, False) self.scrolled_window.add_child(self.right_view_box) self.left_view_box.pack_start(self.left_logo_box, False, False) self.left_view_box.pack_start(self.star_align, False, False) self.left_view_box.pack_start(self.left_action_align, False, False) self.left_label_table.attach(self.left_category_box, 0, 1, 0, 1) self.left_label_table.attach(self.left_version_label, 0, 1, 1, 2) self.left_label_table.attach(self.left_size_label, 0, 1, 2, 3) self.left_label_table.attach(self.left_download_label, 0, 1, 3, 4) self.left_label_table.attach(self.left_homepage_box_align, 0, 1, 4, 5) self.left_label_align.add(self.left_label_table) self.left_view_box.pack_start(self.left_label_align, False, False) self.left_view_box.pack_start(self.left_recommend_box_align, False, False) self.right_info_box.pack_start(self.scrolled_window, True, True) self.pack_start(self.left_view_box, False, False) self.pack_start(self.right_info_box, True, True) self.left_view_box.connect("expose-event", self.expose_left_view) self.right_view_box.connect("expose-event", self.expose_right_view) self.left_logo_box.connect("expose-event", self.expose_left_logo_box) self.right_top_box.connect("expose-event", self.expose_right_top_box) self.right_title_box.connect("expose-event", self.expose_right_title_box) self.connect("hierarchy-changed", self.hierarchy_change) self.left_category_label.connect("button-press-event", lambda w, e: self.jump_to_category()) global_event.register_event("download-screenshot-finish", self.download_screenshot_finish) self.loading_label = Label(_("Loading comments...")) self.loading_label_align = gtk.Alignment(0.5, 0, 0, 0) self.loading_label_align.add(self.loading_label) self.loading_label_align.set_padding(10, 0, 0, 0) self.update_pkg_time = 0 self.update_pkg_interval = 0.2 # in seconds def hierarchy_change(self, widget, previous_toplevel): # When detail page remove from it's container, previous_toplevel is not None. if previous_toplevel != None: container_remove_all( self.right_slide_box ) # remove slide box first, to avoid screenshot area flash container_remove_all( self.right_comment_box ) # remove comment box first, to avoid comment area flash def grade_pkg(self): if self.pkg_star_view: global_event.emit("grade-pkg", (self.pkg_name, self.pkg_star_view), self.pkg_star_view.star_buffer.star_level) self.pkg_star_view.set_star_level(int(self.star)) self.pkg_star_view.queue_draw() def jump_to_category(self): global_event.emit("jump-to-category", self.category[0], self.category[1]) def expose_left_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() # Draw split line. cr.set_source_rgb(*color_hex_to_cairo("#AAAAAA")) cr.rectangle(rect.x + rect.width - 1, rect.y, 1, rect.height) cr.fill() def expose_right_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_left_logo_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw pkg icon. self.pkg_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( get_icon_pixbuf_path(utils.get_origin_name(self.pkg_name)), self.ICON_SIZE, self.ICON_SIZE) draw_pixbuf( cr, self.pkg_pixbuf, rect.x + self.ICON_PADDING_X + (self.ICON_SIZE - self.pkg_pixbuf.get_width()) / 2, rect.y + self.PADDING_Y) def expose_right_top_box(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_right_title_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw alias name. draw_text(cr, "<b>%s</b>" % self.alias_name, rect.x + self.RIGHT_INFO_PADDING_X, rect.y + self.ALIAS_NAME_PADDING_Y, rect.width - self.RIGHT_INFO_PADDING_X, self.ALIAS_NAME_SIZE, text_size=self.ALIAS_NAME_SIZE) def expose_resizable_label_background(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def button_press_start_button(self, widget, event, desktops): pixbuf = app_theme.get_pixbuf("button/start_normal.png").get_pixbuf() desktop_infos = self.data_manager.get_pkg_desktop_info(desktops) global_event.emit( "start-pkg", self.alias_name, desktop_infos, (int(event.x), int(event.y), pixbuf.get_width() / 2, 0)) @post_gui def update_some_info(self, info): self.star = float(info[0]['mark'].encode('utf-8').strip()) if self.pkg_star_view: self.pkg_star_view.star_buffer.star_level = int(self.star) self.pkg_star_view.queue_draw() self.pkg_star_mark.update_star(self.star) self.pkg_star_mark.queue_draw() self.downlad_number = info[0]['down_nums'].encode('utf-8').strip() self.left_download_label.set_text( _('Download: %s') % self.downlad_number) def update_pkg_info(self, pkg_name): current_time = time.time() if current_time - self.update_pkg_time < self.update_pkg_interval: return False else: self.update_pkg_time = current_time FetchPackageInfo(pkg_name, self.update_some_info).start() self.pkg_name = pkg_name detail_info = self.data_manager.get_pkg_detail_info(self.pkg_name) self.category = detail_info['category'] self.long_desc = detail_info['long_desc'] self.version = detail_info['version'] self.homepage = detail_info['homepage'] self.alias_name = detail_info['alias_name'] self.recommend_pkgs = detail_info['recommend_pkgs'] self.pkg_star_view = StarView() self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(5.0, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) container_remove_all(self.star_box) self.star_box.pack_start(self.pkg_star_view, False, False) self.star_box.pack_start(self.pkg_star_mark, False, False) self.fetch_pkg_status() container_remove_all(self.left_category_box) if self.category != None: self.left_category_name_label.set_text(_("Category: ")) self.left_category_label.set_text( get_category_name(self.category[1])) self.left_category_box.add(self.left_category_label_box) self.left_version_label.set_text(_("Version: %s") % self.version) self.left_download_label.set_text(_("Download: 0")) self.left_size_label.set_text(_("Size: calculating...")) container_remove_all(self.left_homepage_box) if self.homepage != "": homepage_label = Label( _("Visit Homepage"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover")) homepage_label.set_clickable() homepage_label.connect( "button-press-event", lambda w, e: run_command("xdg-open %s" % self.homepage)) self.left_homepage_box.pack_start(homepage_label) container_remove_all(self.left_recommend_box) if len(self.recommend_pkgs) > 0: self.left_recommend_box.pack_start(self.left_recommend_label, False, False, 8) for (recommend_pkg_name, alias_name, star) in self.recommend_pkgs: self.left_recommend_box.pack_start( RecommendPkgItem(self, recommend_pkg_name, alias_name, star), False, False, 4) container_remove_all(self.right_desc_box) resizable_label = ResizableLabel( self.long_desc.replace("&", "&").replace("<", "<").replace( ">", ">"), self.LONG_DESC_WRAP_WIDTH, self.LONG_DESC_INIT_HEIGHT, 3) resizable_align = gtk.Alignment() resizable_align.set(0.5, 0.5, 1, 1) resizable_align.set_padding(0, 0, self.RIGHT_INFO_PADDING_X, self.RIGHT_INFO_PADDING_X) resizable_align.add(resizable_label) resizable_align.connect("expose-event", self.expose_resizable_label_background) self.right_desc_box.pack_start(resizable_align, False, False) self.show_screenshot() self.fetch_comment() self.show_all() def handle_pkg_status(self, reply, success): container_remove_all(self.left_action_box) if success: install_status = str(reply) if install_status == "uninstalled": action_button = ImageButton( app_theme.get_pixbuf("button/install_normal.png"), app_theme.get_pixbuf("button/install_hover.png"), app_theme.get_pixbuf("button/install_press.png"), ) action_button.connect( "clicked", lambda w: global_event.emit( "install-pkg", [self.pkg_name])) self.left_action_box.pack_start(action_button) elif install_status == "unknown": status_label = Label(_("Not found")) self.left_action_box.pack_start(status_label) else: try: desktops = json.loads(install_status) if not desktops: status_label = Label(_("Successfully installed")) self.left_action_box.pack_start(status_label) else: action_button = ImageButton( app_theme.get_pixbuf("button/start_normal.png"), app_theme.get_pixbuf("button/start_hover.png"), app_theme.get_pixbuf("button/start_press.png"), ) action_button.connect( "button-press-event", lambda w, e: self.button_press_start_button( w, e, desktops)) self.left_action_box.pack_start(action_button) except: logging.error("detail install status: %s = %s" % (self.pkg_name, install_status)) self.left_action_box.show_all() global_event.emit('update-current-status-pkg-page', self) else: global_logger.error("get_pkg_installed handle_dbus_error") global_logger.error(reply) def handle_pkg_download_size(self, reply, success): # FIXME: download information display if success: if reply[0] == PKG_SIZE_OWN or reply[0] == PKG_SIZE_DOWNLOAD: self.left_size_label.set_text( _("Size: %s") % bit_to_human_str(reply[1])) elif reply[0] == PKG_SIZE_ERROR: self.left_size_label.set_text("") global_logger.error("Error for calculate pkg size!") else: global_logger.error( "request_pkgs_install_status handle_dbus_error") global_logger.error(reply) def fetch_pkg_status(self): self.data_manager.get_pkg_installed(self.pkg_name, self.handle_pkg_status) self.data_manager.get_pkg_download_size(self.pkg_name, self.handle_pkg_download_size) def open_url(self, webview, frame, network_request, nav_action, policy_dec): webbrowser.open(network_request.get_uri()) def webview_console_message_handler(self, webview, message, line, source_id): return True def fetch_comment(self): if is_network_connected(): container_remove_all(self.right_comment_box) loading_label = Label(_("Loading comments...")) loading_label_align = gtk.Alignment(0.5, 0, 0, 0) loading_label_align.add(loading_label) loading_label_align.set_padding(10, 0, 0, 0) self.right_comment_box.pack_start(loading_label_align, False, False) web_view = WebView(os.path.join(CONFIG_DIR, "cookie.txt")) web_view.connect("new-window-policy-decision-requested", self.open_url) web_view.connect('console-message', self.webview_console_message_handler) web_view_align = gtk.Alignment() web_view_align.set(0.5, 0, 0, 0) web_view_align.set_padding(33, 33, 33, 33) web_view_align.add(web_view) web_settings = web_view.get_settings() web_settings.set_property("enable-plugins", False) web_settings.set_property("enable-scripts", True) web_view.open("%s/softcenter/v1/comment?n=%s&hl=%s" % ( SERVER_ADDRESS, self.pkg_name, LANGUAGE, )) web_view.connect("load-finished", self.comment_load_finished_cb, web_view_align) create_thread(self.fetch_screenshot).start() def comment_load_finished_cb(self, webview, frame, web_view_align): self.scrolled_window.connect( "vscrollbar-state-changed", lambda w, p: self.load_more_comment(p, webview)) container_remove_all(self.right_comment_box) self.right_comment_box.pack_start(web_view_align, True, True) self.right_comment_box.show_all() def load_more_comment(self, postion, webview): if postion == "bottom": webview.execute_script('$("#nav_next").click();') def fetch_screenshot(self): screenshot_dir = os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name) screenshot_md5_path = os.path.join(screenshot_dir, "screenshot_md5.txt") remote_screenshot_md5_url = "%s/zh_CN/%s/screenshot_md5.txt" % ( SCREENSHOT_HOST, self.pkg_name) remote_screenshot_zip_url = "%s/zh_CN/%s/screenshot.zip" % ( SCREENSHOT_HOST, self.pkg_name) try: remote_md5 = urllib2.urlopen(remote_screenshot_md5_url).read() need_download = False if os.path.exists(screenshot_dir): if os.path.exists(screenshot_md5_path): local_md5 = read_file(screenshot_md5_path) if remote_md5 != local_md5: need_download = True else: need_download = True else: need_download = True if need_download: write_file(screenshot_md5_path, remote_md5, True) try: urllib.urlretrieve( remote_screenshot_zip_url, os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name, "screenshot.zip")) global_event.emit("download-screenshot-finish", self.pkg_name) except Exception, e: global_logger.error("Download screenshot error: %s" % e) except Exception, e: global_logger.error("fetch_screenshot got error: %s" % e)
def share_to_weibo_result(self): '''result of share to weibo''' font_color = ui_theme.get_color("category_item") res_hbox = gtk.HBox(False) res_hbox.set_size_request(-1, 240) res_left_box = DialogLeftButtonBox() res_right_box = DialogRightButtonBox() res_left_box.button_align.set(0.5, 0.0, 0, 1) res_right_box.button_align.set(0.5, 0.0, 0, 1) res_left_box.button_align.set_padding(5, 9, 19, 0) res_right_box.button_align.set_padding(30, 0, 0, 0) res_left_box.set_size_request(405, -1) res_right_box.set_size_request(195, -1) res_hbox.pack_start(res_left_box) res_hbox.pack_start( VSeparator(app_theme.get_shadow_color("VSeparator").get_color_info(), 0, 0)) res_hbox.pack_start(res_right_box) res_vbox = gtk.VBox(False) follow_vbox = gtk.VBox(False) tmp_img = gtk.Image() # only use as a placeholder tmp_img.set_size_request(-1, 50) res_vbox.pack_start(tmp_img, False, False) follow_tip_hbox = gtk.HBox(False) img = gtk.image_new_from_icon_name("deepin-logo", 16) if img.get_pixel_size() == -1: img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/deepin_logo.png")) follow_tip_hbox.pack_start(img, False, False, 5) follow_tip_hbox.pack_start( Label("%s %s" % (_("Follow"), "Linux Deepin"), text_color=app_theme_get_dynamic_color("#5f5f5f"), text_size=12, enable_select=False), False, False) follow_vbox.pack_start(follow_tip_hbox, False, False, 13) for weibo in self.to_share_weibo_res: vbox = gtk.VBox(False, 1) tip_box = gtk.HBox() error_box = gtk.HBox() vbox.pack_start(tip_box, False, False) vbox.pack_start(error_box, False, False) if self.to_share_weibo_res[weibo][0]: # upload succeed img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/share_succeed.png")) #link = LinkButton(_(weibo.t_type), text_size=13, self.to_share_weibo_res[weibo][1]) link = Label(self.weibo_name_l18n[weibo.t_type], text_size=12, text_color=ui_theme.get_color("link_text")) #, enable_gaussian=True, gaussian_radious=1, border_radious=0) link.add_events(gtk.gdk.BUTTON_PRESS_MASK) link.connect("enter-notify-event", lambda w, e: self.__draw_under_line(w)) link.connect("leave-notify-event", lambda w, e: w.queue_draw()) link.connect("button-press-event", self.goto_weibo_button_clicked, weibo) link_box = gtk.HBox(False) link_box.pack_start(link, False, False) utils.set_clickable_cursor(link) text = _("Share to") label = Label(text, text_size=12, text_color=font_color, enable_select=False) text = _("Successful") label1 = Label(text, text_size=12, text_color=font_color, enable_select=False) tip_box.pack_start(img, False, False, 15) tip_box.pack_start(label, False, False, 3) tip_box.pack_start(link_box, False, False, 3) tip_box.pack_start(label1, False, False) # only use as a placeholder img = gtk.Image() img.set_size_request(20, 1) error_box.pack_start(img, False, False, 16) tmp = Label(" ", text_size=9, label_width=200) tmp.set_size_request(200, 1) error_box.pack_start(tmp, False, False) #print text else: # upload failed img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/share_failed.png")) #text = "% %s %s." % (_(weibo.t_type), _("upload failed")) text = _("Share to") label1 = Label(text, text_size=12, text_color=font_color, enable_select=False) label2 = Label(_(weibo.t_type), text_size=12, text_color=font_color, enable_select=False) text = _("Failed") label3 = Label(text, text_size=12, text_color=font_color, enable_select=False) if weibo.curl.error: error = "(%s)" % _(weibo.curl.error) elif weibo.get_error_msg(): error = "(%s)" % _(weibo.get_error_msg()) else: error = "(%s)" % _("Unknown reason") #print "%s: %s" % (weibo.t_type, error) #print "%s: %s" % (weibo.t_type, weibo.get_error_msg()) label = Label(text, text_size=12, text_color=font_color, enable_select=False) tip_box.pack_start(img, False, False, 15) tip_box.pack_start(label1, False, False, 3) tip_box.pack_start(label2, False, False, 3) tip_box.pack_start(label3, False, False) img = gtk.Image() # only use as a placeholder img.set_size_request(20, 20) error_box.pack_start(img, False, False, 16) error_box.pack_start(Label(error, text_size=9, label_width=200, text_color=font_color, enable_select=False), False, False) #print text res_vbox.pack_start(vbox, False, False, 10) for weibo in self.deepin_info: box = gtk.HBox(False, 15) # followed img = gtk.image_new_from_pixbuf(app_theme.get_pixbuf("share/"+weibo.t_type+".png").get_pixbuf()) box.pack_start(img, False, False) if self.deepin_info[weibo] is not None and self.deepin_info[weibo][3]: if not default_locale.startswith("zh_"): button = gtk.image_new_from_pixbuf( app_theme.get_pixbuf("share/followed_en.png").get_pixbuf()) else: button = gtk.image_new_from_pixbuf( app_theme.get_pixbuf("share/followed.png").get_pixbuf()) else: # to follow if not default_locale.startswith("zh_"): button = ImageButton( app_theme.get_pixbuf("share/follow_normal_en.png"), app_theme.get_pixbuf("share/follow_hover_en.png"), app_theme.get_pixbuf("share/follow_press_en.png")) else: button = ImageButton( app_theme.get_pixbuf("share/follow_normal.png"), app_theme.get_pixbuf("share/follow_hover.png"), app_theme.get_pixbuf("share/follow_press.png")) button.connect("clicked", self.friendships_add_button_clicked, weibo, box) box.pack_start(button, False, False) align = gtk.Alignment() align.set(0.0, 0.5, 0, 0) align.set_padding(0, 0, 30, 0) align.add(box) follow_vbox.pack_start(align, False, False, 8) res_left_box.set_buttons([res_vbox]) res_right_box.set_buttons([follow_vbox]) self.result_box.pack_start(res_hbox, False, False) self.result_box.show_all() self.set_slide_index(2)
class AccelEntry(ShortcutKeyEntry): ''' ''' TYPE_DP_GSETTINGS = 0 TYPE_CMP_GSETTINGS = 1 TYPE_GSETTINGS = 2 TYPE_GCONF = 3 TYPE_STRING = 4 TYPE_STRV = 5 __gsignals__ = { "accel-key-change" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (str,)), "accel-del" : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), } def __init__(self, content="", check_conflict_func=None, resolve_conflict_func=resolve_accel_entry_conflict, process_unmodifier_func=process_unmodifier_key, can_del=False): ''' @param content: a string container accelerator @param check_conflict_func: a function return a AccelEntry object, if their AccelBuffer is equal @param resolve_conflict_func: a function to resolve conflict @param process_unmodifier_func: a function to check the Accelerator is whether valid ''' super(AccelEntry, self).__init__() self.accel_buffer = AccelBuffer() self.accel_buffer.set_from_accel(content) self.accel_str = self.accel_buffer.get_accel_label() if not self.accel_str: self.accel_str = _('disable') self.accel_label = Label(self.accel_str, enable_select=False, enable_double_click=False) self.accel_align = gtk.Alignment() self.accel_align.set(0.0, 0.5, 0.0, 0.0) self.accel_align.set_padding(0, 0, 6, 0) self.accel_align.add(self.accel_label) self.grab_area = gtk.EventBox() #self.grab_area.set_size_request(1, -1) self.grab_area.set_can_focus(True) self.grab_area.add_events(gtk.gdk.BUTTON_PRESS_MASK) self.grab_area.add_events(gtk.gdk.KEY_PRESS_MASK) self.del_button = ImageButton(app_theme.get_pixbuf("keyboard/delete-normal.png"), app_theme.get_pixbuf("keyboard/delete-hover.png"), app_theme.get_pixbuf("keyboard/delete-hover.png")) #self.del_button.set_no_show_all(True) self.h_box.remove(self.entry) self.h_box.pack_start(self.accel_align) self.h_box.pack_start(self.grab_area, False, False) #self.h_box.pack_start(self.del_button, False, False) self.grab_area.connect("button-press-event", self.__on_grab_area_button_press_cb) self.grab_area.connect("key-press-event", self.__on_grab_area_key_press_cb) self.grab_area.connect("key-release-event", self.__on_grab_area_key_release_cb) self.accel_label.connect("button-press-event", self.__on_label_button_press_cb) #self.accel_label.connect("enter-notify-event", self.__on_label_enter_cb) #self.accel_label.connect("leave-notify-event", self.__on_label_leave_cb) #self.del_button.connect("leave-notify-event", self.__on_del_button_leave_cb) self.del_button.connect("clicked", lambda w:self.emit("accel-del")) self.accel_label.keymap = {} self.check_conflict_func = check_conflict_func self.resolve_conflict_func = resolve_conflict_func self.process_unmodifier_func = process_unmodifier_func self.can_del = can_del widget_width = 200 if self.can_del: widget_width = 220 new_hbox = gtk.HBox() new_align = gtk.Alignment(0.5, 0.5, 1.0, 1.0) new_align.add(self.del_button) self.remove(self.align) self.pack_start(new_hbox, False, False) new_hbox.pack_start(self.align, False, False) new_hbox.pack_start(new_align, False, False) self.set_size(widget_width, 24) self.settings_description = "" self.settings_key = "" self.settings_obj = None self.settings_type = None self.settings_value_type = None self.connect("accel-key-change", self.__on_accel_key_change_cb) def __on_label_button_press_cb(self, widget, event): self.accel_label.set_text(_("Please input new shortcuts")) if gtk.gdk.keyboard_grab(self.grab_area.window, False, 0) != gtk.gdk.GRAB_SUCCESS: self.accel_label.set_text(self.accel_str) return None if gtk.gdk.pointer_grab(self.grab_area.window, False, gtk.gdk.BUTTON_PRESS_MASK, None, None, 0) != gtk.gdk.GRAB_SUCCESS: gtk.gdk.keyboard_ungrab(0) self.accel_label.set_text(self.accel_str) return None self.grab_area.grab_focus() if self.can_del and self.del_button in self.h_box.get_children(): self.del_button.hide() self.h_box.remove(self.del_button) self.emit("wait-key-input", self.shortcut_key) def __on_grab_area_button_press_cb(self, widget, event): gtk.gdk.keyboard_ungrab(0) gtk.gdk.pointer_ungrab(0) self.accel_label.set_text(self.accel_str) def __on_grab_area_key_release_cb(self, widget, event): if not event.is_modifier: return False if not gtk.gdk.pointer_is_grabbed(): return False event.state = event.state & (~gtk.gdk.MOD2_MASK) & (~gtk.gdk.MOD3_MASK) & (~gtk.gdk.MOD4_MASK) & (~gtk.gdk.MOD5_MASK) # is not Super key if not (event.keyval == gtk.keysyms.Super_R or event.keyval == gtk.keysyms.Super_L and event.state == gtk.gdk.SUPER_MASK): return False gtk.gdk.keyboard_ungrab(0) gtk.gdk.pointer_ungrab(0) tmp_accel_buf = AccelBuffer() tmp_accel_buf.set_keyval(0) tmp_accel_buf.set_state(gtk.gdk.SUPER_MASK) if self.check_conflict_func and self.resolve_conflict_func: conflict_entry = self.check_conflict_func(self, tmp_accel_buf) if conflict_entry: self.resolve_conflict_func(self, conflict_entry, tmp_accel_buf) return self.set_keyval_and_state(0, gtk.gdk.SUPER_MASK) def __on_grab_area_key_press_cb(self, widget, event): if event.is_modifier: return False if not gtk.gdk.pointer_is_grabbed(): return False gtk.gdk.keyboard_ungrab(0) gtk.gdk.pointer_ungrab(0) # HACK: we don't want to use SysRq as a keybinding, so we avoid its translation from Alt+Print. if event.keyval == gtk.keysyms.Sys_Req and event.state & gtk.gdk.MOD1_MASK: event.keyval = gtk.keysyms.Print keyval = event.keyval state = event.state = event.state & (~gtk.gdk.MOD2_MASK) # ignore MOD2_MASK # cancel edit if keyval == gtk.keysyms.Escape: self.accel_label.set_text(self.accel_str) return # clear edit if keyval == gtk.keysyms.BackSpace: self.set_keyval_and_state(0, 0) return tmp_accel_buf = AccelBuffer() tmp_accel_buf.set_keyval(keyval) tmp_accel_buf.set_state(state) if self.check_unmodified_keys(event) and self.process_unmodifier_func: self.accel_label.set_text(self.accel_str) self.process_unmodifier_func(tmp_accel_buf) return if self.check_conflict_func and self.resolve_conflict_func: conflict_entry = self.check_conflict_func(self, tmp_accel_buf) if conflict_entry: self.resolve_conflict_func(self, conflict_entry, tmp_accel_buf) return self.set_keyval_and_state(keyval, state) def reassign_cancel(self, widget=None): ''' cancel reassign when it conflict ''' if widget: widget.destroy() self.accel_label.set_text(self.accel_str) def reassign(self, accel_buf, conflict_entry, widget=None): if widget: widget.destroy() conflict_entry.set_keyval_and_state(0, 0) self.set_keyval_and_state(accel_buf.get_keyval(), accel_buf.get_state()) def check_unmodified_keys(self, event): #Check for unmodified keys state = event.state keyval = event.keyval state = event.state & (~gtk.gdk.MOD2_MASK) # ignore MOD2_MASK forbidden_keyvals = [ # Navigation keys gtk.keysyms.Home, gtk.keysyms.Left, gtk.keysyms.Up, gtk.keysyms.Right, gtk.keysyms.Down, gtk.keysyms.Page_Up, gtk.keysyms.Page_Down, gtk.keysyms.End, gtk.keysyms.Tab, # Return gtk.keysyms.KP_Enter, gtk.keysyms.Return, gtk.keysyms.space, gtk.keysyms.Mode_switch] return (state == 0 or state == gtk.gdk.SHIFT_MASK) and ( gtk.keysyms.a <= keyval <= gtk.keysyms.z or gtk.keysyms.A <= keyval <= gtk.keysyms.Z or gtk.keysyms._0 <= keyval <= gtk.keysyms._9 or gtk.keysyms.kana_fullstop <= keyval <= gtk.keysyms.semivoicedsound or gtk.keysyms.Arabic_comma <= keyval <= gtk.keysyms.Arabic_sukun or gtk.keysyms.Serbian_dje <= keyval <= gtk.keysyms.Cyrillic_HARDSIGN or gtk.keysyms.Greek_ALPHAaccent <= keyval <= gtk.keysyms.Greek_omega or gtk.keysyms.hebrew_doublelowline <= keyval <= gtk.keysyms.hebrew_taf or gtk.keysyms.Thai_kokai <= keyval <= gtk.keysyms.Thai_lekkao or gtk.keysyms.Hangul <= keyval <= gtk.keysyms.Hangul_Special or gtk.keysyms.Hangul_Kiyeog <= keyval <= gtk.keysyms.Hangul_J_YeorinHieuh or keyval in forbidden_keyvals) def set_keyval_and_state(self, keyval, state): self.accel_buffer.set_keyval(keyval) self.accel_buffer.set_state(state) self.emit("accel-key-change", self.accel_buffer.get_accel_name()) self.accel_str = self.accel_buffer.get_accel_label() if not self.accel_str: self.accel_str = _('disable') self.accel_label.set_text(self.accel_str) def set_size(self, width, height): super(AccelEntry, self).set_size(width, height) if self.can_del: self.accel_align.set_size_request(width-20, height) self.accel_label.label_width = width - 20 self.accel_label.set_size_request(width-20, height) else: self.accel_align.set_size_request(width, height) self.accel_label.label_width = width self.accel_label.set_size_request(width, height) def __on_accel_key_change_cb(self, widget, accel_name): if not self.settings_obj: return if self.settings_type == self.TYPE_GSETTINGS: if self.settings_value_type == self.TYPE_STRV: if accel_name: self.settings_obj.set_strv(self.settings_key, [accel_name]) else: self.settings_obj.set_strv(self.settings_key, []) elif self.settings_value_type == self.TYPE_STRING: self.settings_obj.set_string(self.settings_key, accel_name) elif self.settings_type == self.TYPE_DP_GSETTINGS: self.settings_obj.set_string(self.settings_key, "%s;%s" %(self.settings_value_type, accel_name)) elif self.settings_type == self.TYPE_CMP_GSETTINGS: settings.shortcuts_compiz_set(self.settings_plugin, self.settings_key, accel_name) elif self.settings_type == self.TYPE_GCONF: self.settings_obj.set_string("%s/binding" % (self.settings_key), accel_name) def __on_label_enter_cb(self, widget, event): if self.can_del: if self.del_button not in self.h_box.get_children(): self.h_box.pack_start(self.del_button, False, False) self.del_button.show() def __on_label_leave_cb(self, widget, event): x, y, w, h = widget.allocation if not (0 < event.y < h) or event.x <= 0: if self.del_button in self.h_box.get_children(): self.h_box.remove(self.del_button) self.del_button.hide() def __on_del_button_leave_cb(self, widget, event): x, y, w, h = widget.allocation if not (0 < event.y < h) or event.x >= w and self.del_button.get_visible(): if widget in self.h_box.get_children(): widget.hide() self.h_box.remove(self.del_button)
class VpnSection(Section): def __init__(self): Section.__init__(self) #init self.vpn = Contain(app_theme.get_pixbuf("network/vpn.png"), _("VPN Network"), lambda w:w) self.label = Label(_("Create a VPN connection"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) self.load(self.vpn, [self.label]) self.no_auto_connect = False self.no_vpn_connecting = False self.this_setting = None self.vpn_path = None def init_state(self): vpn_active = nm_module.nmclient.get_vpn_active_connection() if vpn_active: self.vpn.set_active(True) for active in vpn_active: self.connect_vpn_signals(nm_module.cache.get_spec_object(active.object_path)) self.__init_signals() @classmethod def show_or_hide(self): return True def __init_signals(self): self.label.connect("button-release-event", lambda w,p: self.jumpto_cb()) Dispatcher.connect("vpn-redraw", lambda w: self.vpn_redraw(None, None, None)) Dispatcher.connect('vpn-start', self.vpn_start_cb) event_manager.add_callback("vpn-connecting", self.on_vpn_connecting) event_manager.add_callback('vpn-connected', self.vpn_connected) event_manager.add_callback('vpn-disconnected', self.vpn_disconnected) event_manager.add_callback('vpn-user-disconnect', self.on_user_stop_vpn) event_manager.add_callback('user-toggle-off-vpn-tray', self.user_toggle_off_vpn_tray) event_manager.add_callback('vpn-connection-removed', self.vpn_redraw) def user_toggle_off_vpn_tray(self, name, event, data): log.debug("toggle off vpn from tray") self.vpn.set_active(False) def on_user_stop_vpn(self, name, event, data): self.vpn.set_active(False) def vpn_redraw(self, name, event, data): if self.vpn.get_active(): self.no_auto_connect = True self.vpn.set_active(True, emit=True) #self.toggle_on() self.show_all() def vpn_start_cb(self, widget, path): log.debug("vpn start by tray") vpn_active = nm_module.cache.get_spec_object(path) if vpn_active.get_vpnstate() < 5: self.vpn_path = path self.on_vpn_connecting(None, None, path) def connect_vpn_signals(self, active_vpn): active_vpn.connect("vpn-connected", self.vpn_connected) active_vpn.connect("vpn-disconnected", self.vpn_disconnected) active_vpn.connect('vpn-user-disconnect', lambda w: self.vpn.set_active(False)) def toggle_on(self): item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.delete_all_items() self.tree.add_items(item_list) def on_active_conn_create(self, active_conn): net_manager.emit_vpn_start(active_conn) def try_active_vpn(self): from lists import VpnAutoMonitor monitor = VpnAutoMonitor() monitor.start() return monitor #for active_conn in nm_module.nmclient.get_anti_vpn_active_connection(): #if len(nm_module.nmclient.get_vpn_active_connection()) == 0: #try: #active_conn.vpn_auto_connect(self.on_active_conn_create) #except: #pass #else: #break def toggle_on_after(self): if self.no_auto_connect: self.no_auto_connect = False pass else: if not self.vpn_path: self.monitor = self.try_active_vpn() else: self.on_vpn_connecting(None, None, self.vpn_path) vpn_active = nm_module.nmclient.get_vpn_active_connection() if vpn_active: # TODO fix for mutiple connection = vpn_active[0].get_connection() try: index = self.connection.index(connection) self.tree.visible_items[index].set_net_state(2) self.vpn_path = vpn_active[0].object_path return except Exception, e: log.error(e) else:
def update_pkg_info(self, pkg_name): current_time = time.time() if current_time - self.update_pkg_time < self.update_pkg_interval: return False else: self.update_pkg_time = current_time FetchPackageInfo(pkg_name, self.update_some_info).start() self.pkg_name = pkg_name detail_info = self.data_manager.get_pkg_detail_info(self.pkg_name) self.category = detail_info['category'] self.long_desc = detail_info['long_desc'] self.version = detail_info['version'] self.homepage = detail_info['homepage'] self.alias_name = detail_info['alias_name'] self.recommend_pkgs = detail_info['recommend_pkgs'] self.pkg_star_view = StarView() self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(5.0, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) container_remove_all(self.star_box) self.star_box.pack_start(self.pkg_star_view, False, False) self.star_box.pack_start(self.pkg_star_mark, False, False) self.fetch_pkg_status() container_remove_all(self.left_category_box) if self.category != None: self.left_category_name_label.set_text(_("Category: ")) self.left_category_label.set_text(get_category_name(self.category[1])) self.left_category_box.add(self.left_category_label_box) self.left_version_label.set_text(_("Version: %s") % self.version) self.left_download_label.set_text(_("Download: 0")) self.left_size_label.set_text(_("Size: calculating...")) container_remove_all(self.left_homepage_box) if self.homepage != "": homepage_label = Label(_("Visit Homepage"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover")) homepage_label.set_clickable() homepage_label.connect("button-press-event", lambda w, e: run_command("xdg-open %s" % self.homepage)) self.left_homepage_box.pack_start(homepage_label) container_remove_all(self.left_recommend_box) if len(self.recommend_pkgs) > 0: self.left_recommend_box.pack_start(self.left_recommend_label, False, False, 8) for (recommend_pkg_name, alias_name, star) in self.recommend_pkgs: self.left_recommend_box.pack_start(RecommendPkgItem(self, recommend_pkg_name, alias_name, star), False, False, 4) container_remove_all(self.right_desc_box) resizable_label = ResizableLabel(self.long_desc.replace("&", "&").replace("<", "<").replace(">", ">"), self.LONG_DESC_WRAP_WIDTH, self.LONG_DESC_INIT_HEIGHT, 3) resizable_align = gtk.Alignment() resizable_align.set(0.5, 0.5, 1, 1) resizable_align.set_padding(0, 0, self.RIGHT_INFO_PADDING_X, self.RIGHT_INFO_PADDING_X) resizable_align.add(resizable_label) resizable_align.connect("expose-event", self.expose_resizable_label_background) self.right_desc_box.pack_start(resizable_align, False, False) self.show_screenshot() self.fetch_comment() self.show_all()
class MobileSection(Section, MobileDevice): def __init__(self): Section.__init__(self) MobileDevice.__init__(self) # init values self.mobile = Contain(app_theme.get_pixbuf("network/3g.png"), _("Mobile Network"), lambda w: w) self.label = Label(_("Mobile Configuration"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) self.load(self.mobile, []) #self.init_signal() def init_state(self): self.init_signal() pass def init_signal(self): self._init_signals() def get_item(self, device): modem_path = device.get_udi() try: index = self.devices.index(modem_path) return self.tree.visible_items[index] except: return None @classmethod def show_or_hide(self): return True def __init_signals(self): #nm_module.mmclient.connect("device-added", lambda w,p: mobile.set_active(True)) Dispatcher.connect("mmdevice-added", self.device_added) self.label.connect("button-release-event", lambda w, p: self.jumpto_cb()) def device_added(self, widget, device): self.init_signal() if self.mobile.get_active(): self.mobile.set_active(True) def toggle_on(self): item_list = self.get_list() if item_list: item_list[-1].is_last = True self.tree.delete_all_items() self.tree.add_items(item_list) def toggle_on_after(self): pass def toggle_off(self): pass def get_list(self): self.cdma = nm_module.mmclient.get_cdma_device() self.gsm = nm_module.mmclient.get_gsm_device() #self.cdma = nm_module.nm_remote_settings.get_cdma_connections() #self.gsm = nm_module.nm_remote_settings.get_gsm_connections() self.devices = self.cdma + self.gsm return map(lambda c: MobileItem(c, None), self.devices) def jumpto_cb(self): Dispatcher.to_setting_page(MobileSetting(), False)
class DetailPage(gtk.HBox): ''' class docs ''' PADDING_Y = 20 ICON_SIZE = 64 ICON_PADDING_X = 50 STAR_PADDING_X = 36 STAR_PADDING_Y = 12 STAR_SIZE = 13 MARK_NUMBER_SIZE = 11 MARK_NUMBER_PADDING_X = 4 MARK_NUMBER_PADDING_Y = 10 INFO_RENDER_X = 10 INFO_RENDER_Y = 140 INFO_RENDER_HEIGHT = 18 INFO_CATEGORY_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT INFO_VERSION_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 2 INFO_SIZE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 3 INFO_DOWNLOAD_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 4 INFO_HOMEPAGE_RENDER_Y = INFO_RENDER_Y + INFO_RENDER_HEIGHT * 5 LEFT_INFO_PADDING_X = 18 LEFT_INFO_PADDING_Y = 50 LEFT_BUTTON_PADDING_Y = 50 LEFT_INFO_WIDTH = 164 RIGHT_INFO_PADDING_X = 30 RIGHT_TITLE_BOX_HEIGHT = 70 ALIAS_NAME_SIZE = 16 ALIAS_NAME_PADDING_Y = 20 LONG_DESC_PADDING_Y = 10 LONG_DESC_WRAP_WIDTH = 630 LONG_DESC_INIT_HEIGHT = 45 MARK_SIZE = 11 MARK_PADDING_X = 5 MARK_PADDING_Y = -3 def __init__(self, data_manager): ''' init docs ''' gtk.HBox.__init__(self) self.data_manager = data_manager self.pkg_name = None self.alias_name = "" self.pkg_pixbuf = None self.pkg_star_view = None self.left_view_box = gtk.VBox() self.left_view_box.set_size_request(self.LEFT_INFO_WIDTH, - 1) self.left_logo_box = gtk.VBox() self.left_logo_box.set_size_request(-1, 90) self.star_box = gtk.HBox() self.star_align = gtk.Alignment(0.4, 0.5, 0, 0) self.star_align.set_padding(0, 5, 0, 0) self.star_align.add(self.star_box) self.left_action_box = gtk.HBox() self.left_action_align = gtk.Alignment() self.left_action_align.set(0.5, 0.5, 0, 0) self.left_action_align.set_padding(0, 30, 0, 0) self.left_action_align.add(self.left_action_box) self.left_label_table = gtk.Table(4, 1) self.left_label_table.set_row_spacings(4) self.left_label_align = gtk.Alignment() self.left_label_align.set(0.0, 0.5, 0, 0) self.left_label_align.set_padding(0, 0, 14, 0) self.left_category_name_label = Label() self.left_category_label = Label(hover_color=app_theme.get_color("homepage_hover")) self.left_category_label.set_clickable() self.left_category_label_align = gtk.Alignment() self.left_category_label_align.set(0.0, 0.5, 0, 0) self.left_category_label_align.add(self.left_category_label) self.left_category_label_box = gtk.HBox() self.left_category_label_box.pack_start(self.left_category_name_label, False, False) self.left_category_label_box.pack_start(self.left_category_label_align, True, True) self.left_category_box = gtk.VBox() self.left_version_label = Label(label_width=136) show_label_tooltip(self.left_version_label) self.left_version_label.set_ellipsize(pango.ELLIPSIZE_END) self.left_download_label = Label() self.left_size_label = Label() self.left_homepage_box = gtk.HBox() self.left_homepage_box_align = gtk.Alignment() self.left_homepage_box_align.set(0.0, 0.5, 0, 0) self.left_homepage_box_align.add(self.left_homepage_box) self.left_recommend_box = gtk.VBox() self.left_recommend_box_align = gtk.Alignment() self.left_recommend_box_align.set(0.0, 0.0, 0, 0) self.left_recommend_box_align.set_padding(30, 0, 14, 0) self.left_recommend_box_align.add(self.left_recommend_box) self.left_recommend_label = Label(_("Popular recommendations")) self.right_info_box = gtk.VBox() self.scrolled_window = ScrolledWindow(0, 0) self.right_view_box = gtk.VBox() self.right_top_box = gtk.HBox() self.right_top_box.set_size_request(-1, self.RIGHT_TITLE_BOX_HEIGHT) self.right_desc_box = gtk.VBox() self.right_slide_box = gtk.VBox() self.right_comment_box = gtk.VBox() self.right_title_box = gtk.VBox() self.return_button = ImageButton( app_theme.get_pixbuf("detail/normal.png"), app_theme.get_pixbuf("detail/hover.png"), app_theme.get_pixbuf("detail/press.png"), ) self.return_align = gtk.Alignment() self.return_align.set(0.5, 0.5, 1, 1) self.return_align.set_padding(self.ALIAS_NAME_PADDING_Y, 0, 0, self.RIGHT_INFO_PADDING_X) self.return_align.add(self.return_button) self.return_button.connect("clicked", lambda w: global_event.emit("switch-from-detail-page")) self.right_top_box.pack_start(self.right_title_box, True, True) self.right_top_box.pack_start(self.return_align, False, False) self.right_view_box.pack_start(self.right_top_box, False, False) self.right_view_box.pack_start(self.right_desc_box, False, False) self.right_view_box.pack_start(self.right_slide_box, False, False) self.right_view_box.pack_start(self.right_comment_box, False, False) self.scrolled_window.add_child(self.right_view_box) self.left_view_box.pack_start(self.left_logo_box, False, False) self.left_view_box.pack_start(self.star_align, False, False) self.left_view_box.pack_start(self.left_action_align, False, False) self.left_label_table.attach(self.left_category_box, 0, 1, 0, 1) self.left_label_table.attach(self.left_version_label, 0, 1, 1, 2) self.left_label_table.attach(self.left_size_label, 0, 1, 2, 3) self.left_label_table.attach(self.left_download_label, 0, 1, 3, 4) self.left_label_table.attach(self.left_homepage_box_align, 0, 1, 4, 5) self.left_label_align.add(self.left_label_table) self.left_view_box.pack_start(self.left_label_align, False, False) self.left_view_box.pack_start(self.left_recommend_box_align, False, False) self.right_info_box.pack_start(self.scrolled_window, True, True) self.pack_start(self.left_view_box, False, False) self.pack_start(self.right_info_box, True, True) self.left_view_box.connect("expose-event", self.expose_left_view) self.right_view_box.connect("expose-event", self.expose_right_view) self.left_logo_box.connect("expose-event", self.expose_left_logo_box) self.right_top_box.connect("expose-event", self.expose_right_top_box) self.right_title_box.connect("expose-event", self.expose_right_title_box) self.connect("hierarchy-changed", self.hierarchy_change) self.left_category_label.connect("button-press-event", lambda w, e: self.jump_to_category()) global_event.register_event("download-screenshot-finish", self.download_screenshot_finish) self.loading_label = Label(_("Loading comments...")) self.loading_label_align = gtk.Alignment(0.5, 0, 0, 0) self.loading_label_align.add(self.loading_label) self.loading_label_align.set_padding(10, 0, 0, 0) self.update_pkg_time = 0 self.update_pkg_interval = 0.2 # in seconds def hierarchy_change(self, widget, previous_toplevel): # When detail page remove from it's container, previous_toplevel is not None. if previous_toplevel != None: container_remove_all(self.right_slide_box) # remove slide box first, to avoid screenshot area flash container_remove_all(self.right_comment_box) # remove comment box first, to avoid comment area flash def grade_pkg(self): if self.pkg_star_view: global_event.emit("grade-pkg", (self.pkg_name, self.pkg_star_view), self.pkg_star_view.star_buffer.star_level) self.pkg_star_view.set_star_level(int(self.star)) self.pkg_star_view.queue_draw() def jump_to_category(self): global_event.emit("jump-to-category", self.category[0], self.category[1]) def expose_left_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() # Draw split line. cr.set_source_rgb(*color_hex_to_cairo("#AAAAAA")) cr.rectangle(rect.x + rect.width - 1, rect.y, 1, rect.height) cr.fill() def expose_right_view(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_left_logo_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw pkg icon. self.pkg_pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( get_icon_pixbuf_path( utils.get_origin_name(self.pkg_name)), self.ICON_SIZE, self.ICON_SIZE) draw_pixbuf(cr, self.pkg_pixbuf, rect.x + self.ICON_PADDING_X + (self.ICON_SIZE - self.pkg_pixbuf.get_width()) / 2, rect.y + self.PADDING_Y) def expose_right_top_box(self, widget, event): # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def expose_right_title_box(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw alias name. draw_text( cr, "<b>%s</b>" % self.alias_name, rect.x + self.RIGHT_INFO_PADDING_X, rect.y + self.ALIAS_NAME_PADDING_Y, rect.width - self.RIGHT_INFO_PADDING_X, self.ALIAS_NAME_SIZE, text_size=self.ALIAS_NAME_SIZE) def expose_resizable_label_background(self, widget, event): if self.pkg_name != None: # Init. cr = widget.window.cairo_create() rect = widget.allocation # Draw background. cr.set_source_rgb(*color_hex_to_cairo("#FFFFFF")) cr.rectangle(rect.x, rect.y, rect.width, rect.height) cr.fill() def button_press_start_button(self, widget, event, desktops): pixbuf = app_theme.get_pixbuf("button/start_normal.png").get_pixbuf() desktop_infos = self.data_manager.get_pkg_desktop_info(desktops) global_event.emit("start-pkg", self.alias_name, desktop_infos, (int(event.x), int(event.y), pixbuf.get_width() / 2, 0)) @post_gui def update_some_info(self, info): self.star = float(info[0]['mark'].encode('utf-8').strip()) if self.pkg_star_view: self.pkg_star_view.star_buffer.star_level = int(self.star) self.pkg_star_view.queue_draw() self.pkg_star_mark.update_star(self.star) self.pkg_star_mark.queue_draw() self.downlad_number = info[0]['down_nums'].encode('utf-8').strip() self.left_download_label.set_text(_('Download: %s') % self.downlad_number) def update_pkg_info(self, pkg_name): current_time = time.time() if current_time - self.update_pkg_time < self.update_pkg_interval: return False else: self.update_pkg_time = current_time FetchPackageInfo(pkg_name, self.update_some_info).start() self.pkg_name = pkg_name detail_info = self.data_manager.get_pkg_detail_info(self.pkg_name) self.category = detail_info['category'] self.long_desc = detail_info['long_desc'] self.version = detail_info['version'] self.homepage = detail_info['homepage'] self.alias_name = detail_info['alias_name'] self.recommend_pkgs = detail_info['recommend_pkgs'] self.pkg_star_view = StarView() self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(5.0, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) container_remove_all(self.star_box) self.star_box.pack_start(self.pkg_star_view, False, False) self.star_box.pack_start(self.pkg_star_mark, False, False) self.fetch_pkg_status() container_remove_all(self.left_category_box) if self.category != None: self.left_category_name_label.set_text(_("Category: ")) self.left_category_label.set_text(get_category_name(self.category[1])) self.left_category_box.add(self.left_category_label_box) self.left_version_label.set_text(_("Version: %s") % self.version) self.left_download_label.set_text(_("Download: 0")) self.left_size_label.set_text(_("Size: calculating...")) container_remove_all(self.left_homepage_box) if self.homepage != "": homepage_label = Label(_("Visit Homepage"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover")) homepage_label.set_clickable() homepage_label.connect("button-press-event", lambda w, e: run_command("xdg-open %s" % self.homepage)) self.left_homepage_box.pack_start(homepage_label) container_remove_all(self.left_recommend_box) if len(self.recommend_pkgs) > 0: self.left_recommend_box.pack_start(self.left_recommend_label, False, False, 8) for (recommend_pkg_name, alias_name, star) in self.recommend_pkgs: self.left_recommend_box.pack_start(RecommendPkgItem(self, recommend_pkg_name, alias_name, star), False, False, 4) container_remove_all(self.right_desc_box) resizable_label = ResizableLabel(self.long_desc.replace("&", "&").replace("<", "<").replace(">", ">"), self.LONG_DESC_WRAP_WIDTH, self.LONG_DESC_INIT_HEIGHT, 3) resizable_align = gtk.Alignment() resizable_align.set(0.5, 0.5, 1, 1) resizable_align.set_padding(0, 0, self.RIGHT_INFO_PADDING_X, self.RIGHT_INFO_PADDING_X) resizable_align.add(resizable_label) resizable_align.connect("expose-event", self.expose_resizable_label_background) self.right_desc_box.pack_start(resizable_align, False, False) self.show_screenshot() self.fetch_comment() self.show_all() def handle_pkg_status(self, reply, success): container_remove_all(self.left_action_box) if success: install_status = str(reply) if install_status == "uninstalled": action_button = ImageButton( app_theme.get_pixbuf("button/install_normal.png"), app_theme.get_pixbuf("button/install_hover.png"), app_theme.get_pixbuf("button/install_press.png"), ) action_button.connect("clicked", lambda w: global_event.emit("install-pkg", [self.pkg_name])) self.left_action_box.pack_start(action_button) elif install_status == "unknown": status_label = Label(_("Not found")) self.left_action_box.pack_start(status_label) else: try: desktops = json.loads(install_status) if not desktops: status_label = Label(_("Successfully installed")) self.left_action_box.pack_start(status_label) else: action_button = ImageButton( app_theme.get_pixbuf("button/start_normal.png"), app_theme.get_pixbuf("button/start_hover.png"), app_theme.get_pixbuf("button/start_press.png"), ) action_button.connect("button-press-event", lambda w, e:self.button_press_start_button(w, e, desktops)) self.left_action_box.pack_start(action_button) except: logging.error("detail install status: %s = %s" % (self.pkg_name, install_status)) self.left_action_box.show_all() global_event.emit('update-current-status-pkg-page', self) else: global_logger.logerror("get_pkg_installed handle_dbus_error") global_logger.logerror(reply) def handle_pkg_download_size(self, reply, success): # FIXME: download information display if success: if reply[0] == PKG_SIZE_OWN or reply[0] == PKG_SIZE_DOWNLOAD: self.left_size_label.set_text(_("Size: %s") % bit_to_human_str(reply[1])) elif reply[0] == PKG_SIZE_ERROR: self.left_size_label.set_text("") global_logger.logerror("Error for calculate pkg size!") else: global_logger.logerror("request_pkgs_install_status handle_dbus_error") global_logger.logerror(reply) def fetch_pkg_status(self): self.data_manager.get_pkg_installed(self.pkg_name, self.handle_pkg_status) self.data_manager.get_pkg_download_size(self.pkg_name, self.handle_pkg_download_size) def open_url(self, webview, frame, network_request, nav_action, policy_dec): webbrowser.open(network_request.get_uri()) def webview_console_message_handler(self, webview, message, line, source_id): return True def fetch_comment(self): if is_network_connected(): container_remove_all(self.right_comment_box) loading_label = Label(_("Loading comments...")) loading_label_align = gtk.Alignment(0.5, 0, 0, 0) loading_label_align.add(loading_label) loading_label_align.set_padding(10, 0, 0, 0) self.right_comment_box.pack_start(loading_label_align, False, False) web_view = WebView(os.path.join(CONFIG_DIR, "cookie.txt")) web_view.connect("new-window-policy-decision-requested", self.open_url) web_view.connect('console-message', self.webview_console_message_handler) web_view_align = gtk.Alignment() web_view_align.set(0.5, 0, 0, 0) web_view_align.set_padding(33, 33, 33, 33) web_view_align.add(web_view) web_settings = web_view.get_settings() web_settings.set_property("enable-plugins", False) web_settings.set_property("enable-scripts", True) web_view.open("%s/softcenter/v1/comment?n=%s&hl=%s" % ( SERVER_ADDRESS, self.pkg_name, LANGUAGE, )) web_view.connect("load-finished", self.comment_load_finished_cb, web_view_align) create_thread(self.fetch_screenshot).start() def comment_load_finished_cb(self, webview, frame, web_view_align): self.scrolled_window.connect("vscrollbar-state-changed", lambda w, p: self.load_more_comment(p, webview)) container_remove_all(self.right_comment_box) self.right_comment_box.pack_start(web_view_align, True, True) self.right_comment_box.show_all() def load_more_comment(self, postion, webview): if postion == "bottom": webview.execute_script('$("#nav_next").click();') def fetch_screenshot(self): screenshot_dir = os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name) screenshot_md5_path = os.path.join(screenshot_dir, "screenshot_md5.txt") remote_screenshot_md5_url = "%s/zh_CN/%s/screenshot_md5.txt" % (SCREENSHOT_HOST, self.pkg_name) remote_screenshot_zip_url = "%s/zh_CN/%s/screenshot.zip" % (SCREENSHOT_HOST, self.pkg_name) try: remote_md5 = urllib2.urlopen(remote_screenshot_md5_url).read() need_download = False if os.path.exists(screenshot_dir): if os.path.exists(screenshot_md5_path): local_md5 = read_file(screenshot_md5_path) if remote_md5 != local_md5: need_download = True else: need_download = True else: need_download = True if need_download: write_file(screenshot_md5_path, remote_md5, True) try: urllib.urlretrieve(remote_screenshot_zip_url, os.path.join(SCREENSHOT_DOWNLOAD_DIR, self.pkg_name, "screenshot.zip") ) global_event.emit("download-screenshot-finish", self.pkg_name) except Exception, e: global_logger.logerror("Download screenshot error: %s" % e) except Exception, e: global_logger.logerror("fetch_screenshot got error: %s" % e)
class WirelessSection(Section, WirelessDevice): def __init__(self): Section.__init__(self) WirelessDevice.__init__(self) self.wireless = Contain(app_theme.get_pixbuf("network/wifi.png"), _("Wireless"), lambda w: w) self.label = Label(_("Set up a hidden wireless connection"), LABEL_COLOR, underline=True, enable_select=False, enable_double_click=False) space = gtk.VBox() space.set_size_request(-1, 15) self.load(self.wireless, [space, self.label]) self.content_box.set_spacing(0) self.selected_item = None self.device_tree = None self.focused_device = None self.wireless_devices = None def add_switcher(self): if self.device_tree == None: self.device_tree = TreeView( [DeviceToggleItem(self.wireless_devices, 0)]) self.device_tree.set_expand_column(1) self.content_box.pack_start(self.device_tree, False, True) self.content_box.reorder_child(self.device_tree, 0) net_manager.emit_wifi_switch(0) def remove_switcher(self): if self.device_tree\ and self.device_tree in self.content_box.get_children(): self.content_box.remove(self.device_tree) self.device_tree = None try: self.focused_device = self.wireless_devices[0] except: log.error("get no wireless devices but try to index") self.focused_device = None self.wireless_redraw(None) @classmethod def show_or_hide(self): if net_manager.device_manager.get_wireless_devices(): self.wireless_devices = net_manager.device_manager.get_wireless_devices( ) return True else: self.wireless_devices = [] return False def init_state(self): self.ap_list = [] self.wireless_devices = net_manager.device_manager.get_wireless_devices( ) if self.wireless_devices: #self.device_dict = dict() self.focused_device = self.wireless_devices[0] if len(self.wireless_devices) > 1: self.add_switcher() self.tree.connect("single-click-item", self.set_selected_item) ## check state if self.get_state(self.wireless_devices): self.wireless.set_active(True) else: pass self.init_signals() def init_signals(self): self._init_signals() Dispatcher.connect("switch-device", self.switch_devices) Dispatcher.connect("wireless-device-add", self.device_added) Dispatcher.connect("ap-added", self.ap_added_callback) Dispatcher.connect("ap-removed", self.ap_removed_callback) Dispatcher.connect("wireless-redraw", self.wireless_redraw) self.label.connect("button-release-event", self.create_a_hidden_network) event_manager.add_callback('hidden-connection-removed', self.on_delete_redraw) def switch_devices(self, widget, device): self.focused_device = device if self.device_tree: self.device_tree.visible_items[0].set_index(device) self.wireless_redraw(None) def on_delete_redraw(self, name, event, data): self.wireless_redraw(None) def wireless_redraw(self, widget): log.debug() if self.wireless.get_active(): self.wireless.set_active(True, emit=True) self.show_all() def device_added(self, widget, device): self.wireless_devices = net_manager.device_manager.get_wireless_devices( ) self._init_signals() if len(self.wireless_devices) > 1: self.add_switcher() else: self.remove_switcher() if self.wireless.get_active(): self.wireless.set_active(True, emit=True) def create_a_hidden_network(self, widget, c): from wlan_config import HiddenSetting Dispatcher.to_setting_page(HiddenSetting(None), False) def ap_added_callback(self, widget): if self.wireless.get_active(): self.wireless.set_active(True, emit=True) def ap_removed_callback(self, widget): if self.wireless.get_active(): self.wireless.set_active(True, emit=True) def set_selected_item(self, widget, item, column, x, y): log.debug(item) self.selected_item = item def get_actives(self, ap_list): def to_item_state(device): if device.get_state() <= 30: return 0 elif device.get_state() < 100: return 1 elif device.get_state() == 100: return 2 if not ap_list: return [] index = [] active_connection = self.focused_device.get_active_connection() if active_connection: try: ssid = active_connection.get_connection().get_setting( "802-11-wireless").ssid index.append([[ap.get_ssid() for ap in ap_list].index(ssid), to_item_state(self.focused_device)]) except ValueError: print "not found in ap list" return index def _get_active_item(self): return filter(lambda i: i.get_net_state() > 0, self.tree.visible_items) def toggle_on_after(self): log.debug() indexs = self.get_actives(self.ap_list) if indexs: map(lambda (i, s): self.tree.visible_items[i].set_net_state(s), indexs) else: for d in self.wireless_devices: log.debug("try auto start") wifi = nm_module.cache.get_spec_object(d.object_path) wifi.auto_connect() def toggle_off(self): log.debug() self.ap_list = [] self.selected_item = None for wireless_device in self.wireless_devices: wireless_device.nm_device_disconnect() def get_list(self): self.ap_list = list() if not self.wireless_devices: return [] device_wifi = nm_module.cache.get_spec_object( self.focused_device.object_path) self.ap_list += device_wifi.order_ap_list() aps = map(lambda i: WirelessItem(i, self.focused_device), self.ap_list) hidden_list = self.get_hidden_connection() hiddens = map(lambda c: HidenItem(c), hidden_list) return aps + hiddens def __ap_list_merge(self): ap_ssid = set(map(lambda ap: ap.get_ssid(), self.ap_list)) merged_ap = [] for ap in self.ap_list: if ap.get_ssid() in ap_ssid: merged_ap.append(ap) ap_ssid.remove(ap.get_ssid()) return merged_ap def get_hidden_connection(self): from shared_methods import net_manager return net_manager.get_hiddens() ## need to filter all aps def get_state(self, devices): for d in devices: if d.get_state() == 100: return True return False def device_stop(self, device): device.nm_device_disconnect()
def share_to_weibo_result(self): '''result of share to weibo''' font_color = app_theme.get_color("share_result_text") res_hbox = gtk.HBox(False) res_hbox.set_size_request(-1, 240) res_left_box = DialogLeftButtonBox() res_right_box = DialogRightButtonBox() res_left_box.button_align.set(0.5, 0.0, 0, 1) res_right_box.button_align.set(0.5, 0.0, 0, 1) res_left_box.button_align.set_padding(5, 9, 19, 0) res_right_box.button_align.set_padding(30, 0, 0, 0) res_left_box.set_size_request(405, -1) res_right_box.set_size_request(195, -1) res_hbox.pack_start(res_left_box) res_hbox.pack_start( VSeparator(app_theme.get_shadow_color("VSeparator").get_color_info(), 0, 0)) res_hbox.pack_start(res_right_box) res_vbox = gtk.VBox(False) follow_vbox = gtk.VBox(False) tmp_img = gtk.Image() # only use as a placeholder tmp_img.set_size_request(-1, 50) res_vbox.pack_start(tmp_img, False, False) follow_tip_hbox = gtk.HBox(False) img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/deepin_logo.png")) follow_tip_hbox.pack_start(img, False, False, 5) follow_tip_hbox.pack_start( Label("%s %s" % (_("Follow"), "Linux Deepin"), text_color=app_theme_get_dynamic_color("#5f5f5f"), text_size=12, enable_select=False), False, False) follow_vbox.pack_start(follow_tip_hbox, False, False, 13) for weibo in self.to_share_weibo_res: vbox = gtk.VBox(False, 1) tip_box = gtk.HBox() error_box = gtk.HBox() vbox.pack_start(tip_box, False, False) vbox.pack_start(error_box, False, False) if self.to_share_weibo_res[weibo][0]: # upload succeed img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/share_succeed.png")) #link = LinkButton(_(weibo.t_type), text_size=13, self.to_share_weibo_res[weibo][1]) link = Label(_(weibo.t_type), text_size=12, text_color=app_theme.get_color("link_text")) #, enable_gaussian=True, gaussian_radious=1, border_radious=0) link.add_events(gtk.gdk.BUTTON_PRESS_MASK) link.connect("enter-notify-event", lambda w, e: self.__draw_under_line(w)) link.connect("leave-notify-event", lambda w, e: w.queue_draw()) link.connect("button-press-event", self.goto_weibo_button_clicked, weibo) link_box = gtk.HBox(False) link_box.pack_start(link, False, False) utils.set_clickable_cursor(link) text = _("Share to") label = Label(text, text_size=12, text_color=font_color, enable_select=False) text = _("Successful") label1 = Label(text, text_size=12, text_color=font_color, enable_select=False) tip_box.pack_start(img, False, False, 15) tip_box.pack_start(label, False, False, 3) tip_box.pack_start(link_box, False, False, 3) tip_box.pack_start(label1, False, False) # only use as a placeholder img = gtk.Image() img.set_size_request(20, 1) error_box.pack_start(img, False, False, 16) tmp = Label(" ", text_size=9, label_width=200) tmp.set_size_request(200, 1) error_box.pack_start(tmp, False, False) #print text else: # upload failed img = gtk.image_new_from_file(app_theme.get_theme_file_path("image/share/share_failed.png")) #text = "% %s %s." % (_(weibo.t_type), _("upload failed")) text = _("Share to") label1 = Label(text, text_size=12, text_color=font_color, enable_select=False) label2 = Label(_(weibo.t_type), text_size=12, text_color=font_color, enable_select=False) text = _("Failed") label3 = Label(text, text_size=12, text_color=font_color, enable_select=False) if weibo.curl.error: error = "(%s)" % _(weibo.curl.error) elif weibo.get_error_msg(): error = "(%s)" % _(weibo.get_error_msg()) else: error = "(%s)" % _("Unknown reason") #print "%s: %s" % (weibo.t_type, error) #print "%s: %s" % (weibo.t_type, weibo.get_error_msg()) label = Label(text, text_size=12, text_color=font_color, enable_select=False) tip_box.pack_start(img, False, False, 15) tip_box.pack_start(label1, False, False, 3) tip_box.pack_start(label2, False, False, 3) tip_box.pack_start(label3, False, False) img = gtk.Image() # only use as a placeholder img.set_size_request(20, 20) error_box.pack_start(img, False, False, 16) error_box.pack_start(Label(error, text_size=9, label_width=200, text_color=font_color, enable_select=False), False, False) #print text res_vbox.pack_start(vbox, False, False, 10) for weibo in self.deepin_info: box = gtk.HBox(False, 15) # followed img = gtk.image_new_from_pixbuf(app_theme.get_pixbuf("share/"+weibo.t_type+".png").get_pixbuf()) box.pack_start(img, False, False) if self.deepin_info[weibo] is not None and self.deepin_info[weibo][3]: if not default_locale.startswith("zh_"): button = gtk.image_new_from_pixbuf( app_theme.get_pixbuf("share/followed_en.png").get_pixbuf()) else: button = gtk.image_new_from_pixbuf( app_theme.get_pixbuf("share/followed.png").get_pixbuf()) else: # to follow if not default_locale.startswith("zh_"): button = ImageButton( app_theme.get_pixbuf("share/follow_normal_en.png"), app_theme.get_pixbuf("share/follow_hover_en.png"), app_theme.get_pixbuf("share/follow_press_en.png")) else: button = ImageButton( app_theme.get_pixbuf("share/follow_normal.png"), app_theme.get_pixbuf("share/follow_hover.png"), app_theme.get_pixbuf("share/follow_press.png")) button.connect("clicked", self.friendships_add_button_clicked, weibo, box) box.pack_start(button, False, False) align = gtk.Alignment() align.set(0.0, 0.5, 0, 0) align.set_padding(0, 0, 30, 0) align.add(box) follow_vbox.pack_start(align, False, False, 8) res_left_box.set_buttons([res_vbox]) res_right_box.set_buttons([follow_vbox]) self.result_box.pack_start(res_hbox, False, False) self.result_box.show_all() self.set_slide_index(2)
def update_pkg_info(self, pkg_name): current_time = time.time() if current_time - self.update_pkg_time < self.update_pkg_interval: return False else: self.update_pkg_time = current_time FetchPackageInfo(pkg_name, self.update_some_info).start() self.pkg_name = pkg_name detail_info = self.data_manager.get_pkg_detail_info(self.pkg_name) self.category = detail_info['category'] self.long_desc = detail_info['long_desc'] self.version = detail_info['version'] self.homepage = detail_info['homepage'] self.alias_name = detail_info['alias_name'] self.recommend_pkgs = detail_info['recommend_pkgs'] self.pkg_star_view = StarView() self.pkg_star_view.connect("clicked", lambda w: self.grade_pkg()) self.pkg_star_mark = StarMark(5.0, self.MARK_SIZE, self.MARK_PADDING_X, self.MARK_PADDING_Y) container_remove_all(self.star_box) self.star_box.pack_start(self.pkg_star_view, False, False) self.star_box.pack_start(self.pkg_star_mark, False, False) self.fetch_pkg_status() container_remove_all(self.left_category_box) if self.category != None: self.left_category_name_label.set_text(_("Category: ")) self.left_category_label.set_text( get_category_name(self.category[1])) self.left_category_box.add(self.left_category_label_box) self.left_version_label.set_text(_("Version: %s") % self.version) self.left_download_label.set_text(_("Download: 0")) self.left_size_label.set_text(_("Size: calculating...")) container_remove_all(self.left_homepage_box) if self.homepage != "": homepage_label = Label( _("Visit Homepage"), text_color=app_theme.get_color("homepage"), hover_color=app_theme.get_color("homepage_hover")) homepage_label.set_clickable() homepage_label.connect( "button-press-event", lambda w, e: run_command("xdg-open %s" % self.homepage)) self.left_homepage_box.pack_start(homepage_label) container_remove_all(self.left_recommend_box) if len(self.recommend_pkgs) > 0: self.left_recommend_box.pack_start(self.left_recommend_label, False, False, 8) for (recommend_pkg_name, alias_name, star) in self.recommend_pkgs: self.left_recommend_box.pack_start( RecommendPkgItem(self, recommend_pkg_name, alias_name, star), False, False, 4) container_remove_all(self.right_desc_box) resizable_label = ResizableLabel( self.long_desc.replace("&", "&").replace("<", "<").replace( ">", ">"), self.LONG_DESC_WRAP_WIDTH, self.LONG_DESC_INIT_HEIGHT, 3) resizable_align = gtk.Alignment() resizable_align.set(0.5, 0.5, 1, 1) resizable_align.set_padding(0, 0, self.RIGHT_INFO_PADDING_X, self.RIGHT_INFO_PADDING_X) resizable_align.add(resizable_label) resizable_align.connect("expose-event", self.expose_resizable_label_background) self.right_desc_box.pack_start(resizable_align, False, False) self.show_screenshot() self.fetch_comment() self.show_all()