def create_source_update_frequency_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Update applications lists")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) self.is_auto_update_button = CheckButton(label_text=_('Update automatically')) self.is_auto_update_button.connect('toggled', self.change_auto_update) self.update_label = Label(_("Time interval: ")) self.update_spin = SpinBox(int(get_update_interval()), 0, 168, 1) self.update_spin.connect("value-changed", lambda w, v: set_update_interval(v)) self.hour_lablel = Label(_(" hour")) self.hour_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(self.update_label, False, False) spin_hbox.pack_start(self.update_spin, False, False) spin_hbox.pack_start(self.hour_lablel, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.is_auto_update_button, 0, 1, 2, 3, xpadding=10, xoptions=gtk.FILL) main_table.attach(spin_hbox, 1, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) if is_auto_update(): self.is_auto_update_button.set_active(True) else: self.is_auto_update_button.toggled() return main_table
def create_play_box(self): main_table = gtk.Table(5, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) play_title_label = Label(_("Playback settings")) play_title_label.set_size_request(350, 12) fade_check_hbox = gtk.HBox() self.fade_check_button = CheckButton(_("Enable crossfade")) fade_check_hbox.pack_start(self.fade_check_button, False, False) fade_check_hbox.pack_start(create_right_align(), True, True) self.album_check_button = CheckButton(_("Seamless switching between the same album")) album_check_hbox = gtk.HBox() album_check_hbox.pack_start(self.album_check_button, False, False) album_check_hbox.pack_start(create_right_align(), True, True) fade_label = Label("%s" % _("Crossfade")) self.fade_spin = SpinBox(200, 0, 900, 100) millisecond_lablel = Label(_(" ms")) millisecond_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(fade_label, False, False) spin_hbox.pack_start(self.fade_spin, False, False) spin_hbox.pack_start(millisecond_lablel, False, False) main_table.attach(play_title_label, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(fade_check_hbox, 0, 2, 2, 3, yoptions=gtk.FILL) main_table.attach(album_check_hbox, 0, 2, 3, 4, yoptions=gtk.FILL) main_table.attach(spin_hbox, 0, 1, 4, 5, yoptions=gtk.FILL, xpadding=8) return main_table
def create_play_box(self): main_table = gtk.Table(4, 2) main_table.set_row_spacings(10) play_title_label = Label(_("Playing")) play_title_label.set_size_request(350, 12) fade_check_hbox = gtk.HBox() self.fade_check_button = CheckButton(_("Crossfade")) fade_check_hbox.pack_start(self.fade_check_button, False, False) fade_check_hbox.pack_start(create_right_align(), True, True) self.album_check_button = CheckButton(_("Crossfade gapless album")) fade_label = Label(_("Fade timeout:")) self.fade_spin = SpinBox(300, 1, 1000, 100) millisecond_lablel = Label(_(" ms")) millisecond_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(fade_label, False, False) spin_hbox.pack_start(self.fade_spin, False, False) spin_hbox.pack_start(millisecond_lablel, False, False) main_table.attach(play_title_label, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(fade_check_hbox, 0, 1, 2, 3, yoptions=gtk.FILL) main_table.attach(self.album_check_button, 1, 2, 2, 3, yoptions=gtk.FILL) main_table.attach(spin_hbox, 0, 1, 3, 4, yoptions=gtk.FILL, xpadding=8) return main_table
def create_lyrics_dir_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Lyrics directory")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) self.dir_entry = InputEntry() self.dir_entry.set_text(os.path.expanduser(config.get("lyrics", "save_lrc_path", "~/.lyrics"))) self.dir_entry.set_editable(False) self.dir_entry.set_size(250, 25) modify_button = Button(_("Change")) modify_button.connect("clicked", self.change_lyrics_save_dir) hbox = gtk.HBox(spacing=5) hbox.pack_start(self.dir_entry, False, False) hbox.pack_start(modify_button, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(hbox, 0, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) return main_table
def create_combo_label(self, title, content=""): hbox = gtk.HBox(spacing=5) title_label = Label("%s:" % title) content_label = Label(content) content_label.set_size_request(200, -1) hbox.pack_start(title_label, False, False) hbox.pack_start(content_label, False, False) return hbox, content_label
def create_combo_label(self, title, content=""): hbox = gtk.HBox(spacing=5) title_label = Label(title) content_label = Label(content) content_label.set_size_request(200, -1) hbox.pack_start(title_label, False, False) hbox.pack_start(content_label, False, False) return hbox, content_label
class BluetoothProgressDialog(DialogBox): DIALOG_MASK_SINGLE_PAGE = 0 def __init__(self, default_width=300, default_height=160, cancel_cb=None): DialogBox.__init__(self, "", default_width, default_height, self.DIALOG_MASK_SINGLE_PAGE) self.cancel_cb = cancel_cb self.message_align = gtk.Alignment() self.message_align.set(0, 0, 0, 0) self.message_align.set_padding(0, 0, 10, 0) self.message_label = Label("", label_width=300) self.message_align.add(self.message_label) self.progress_align = gtk.Alignment() self.progress_align.set(0, 0, 0, 0) self.progress_align.set_padding(20, 0, 10, 10) self.progress_bar = ProgressBar() self.progress_bar.set_size_request(default_width, -1) self.progress_align.add(self.progress_bar) self.percentage_align = gtk.Alignment() self.percentage_align.set(0, 0, 0, 0) self.percentage_align.set_padding(10, 0, 140, 0) self.percentage_label = Label("0%", label_width=300) self.percentage_label.set_size_request(default_width, -1) self.percentage_align.add(self.percentage_label) self.cancel_align = gtk.Alignment() self.cancel_align.set(0, 0, 0, 0) self.cancel_align.set_padding(20, 0, 200, 0) self.cancel_button = Button(_("Cancel")) self.cancel_button.set_size_request(70, WIDGET_HEIGHT) self.cancel_button.connect("clicked", self.__on_cancel_button_clicked) self.cancel_align.add(self.cancel_button) self.body_box.pack_start(self.message_align, False, False) self.body_box.pack_start(self.progress_align, False, False) self.body_box.pack_start(self.percentage_align, False, False) self.body_box.pack_start(self.cancel_align) def set_message(self, message): self.message_label.set_text(message) def set_progress(self, progress): self.progress_bar.set_progress(progress) self.percentage_label.set_text(_("Sent %d") % progress + "%") def __on_cancel_button_clicked(self, widget): if self.cancel_cb: self.cancel_cb() self.destroy()
def create_uninstall_box(self): main_table = gtk.Table(2, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) uninstall_title_label = Label(_("On uninstall software")) uninstall_title_label.set_size_request(350, 12) # mini_check_button self.delete_check_button = CheckButton(_("Delete configuration files")) self.delete_check_button.set_active(get_purg_flag()) self.delete_check_button.connect("toggled", lambda w: set_purge_flag(self.delete_check_button.get_active())) main_table.attach(uninstall_title_label, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.delete_check_button, 0, 1, 2, 3, yoptions=gtk.FILL) return main_table
def create_close_box(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) close_title_label = Label(_("When pressing the close button")) close_title_label.set_size_request(350, 12) # mini_check_button self.tray_radio_button = RadioButton(_("Minimize to tray")) self.quit_radio_button = RadioButton(_("Quit")) main_table.attach(close_title_label, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.tray_radio_button, 0, 1, 2, 3, yoptions=gtk.FILL) main_table.attach(self.quit_radio_button, 1, 2, 2, 3) return main_table
def create_mirror_select_table(self): vbox = gtk.VBox() vbox.set_size_request(423, -1) main_table = gtk.Table(2, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Select mirror")) dir_title_label.set_size_request(423, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 10, 0) label_align.add(dir_title_label) self.mirrors_dir = os.path.join(get_parent_dir(__file__, 2), 'mirrors') self.current_mirror_hostname = utils.get_current_mirror_hostname() self.mirror_items = self.get_mirror_items() self.mirror_view = TreeView(self.mirror_items, enable_drag_drop=False, enable_multiple_select=False, #mask_bound_height=0, ) self.mirror_view.set_expand_column(1) self.mirror_view.set_size_request(-1, len(self.mirror_view.visible_items) * self.mirror_view.visible_items[0].get_height()) self.mirror_view.draw_mask = self.mirror_treeview_draw_mask #self.display_current_mirror() self.mirror_test_progressbar = ProgressBar() main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) title = _("Select best mirror") info_message = _("Please wait. The process will take 30 seconds or more depending on your network connection") self.select_best_mirror_dialog = WaitingDialog(title, info_message, self.cancel_mirror_test) global_event.register_event("mirror-changed", self.mirror_changed_handler) global_event.register_event("update-list-finish", self.update_list_finish_handler) vbox.pack_start(main_table, False, False) vbox.pack_start(self.mirror_view, False, False) return vbox
def create_start_box(self): main_table = gtk.Table(4, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) start_title_label = Label(_("On starting the player")) start_title_label.set_size_request(350, 12) label_align = gtk.Alignment() label_align.set_padding(20, 0, 0, 0) label_align.add(start_title_label) # splash check_button self.splash_check_button = CheckButton(_("Display splash-screen")) splash_hbox = gtk.HBox() splash_hbox.pack_start(self.splash_check_button, False, False) splash_hbox.pack_start(create_right_align(), True, True) # open_lyrics_check_button. open_lyrics_hbox = gtk.HBox() self.open_lyrics_check_button = CheckButton(_("Show lyrics")) open_lyrics_hbox.pack_start(self.open_lyrics_check_button, False, False) # startup_check_button. self.auto_play_check_button = CheckButton(_("Start playback automatically")) auto_play_hbox = gtk.HBox() auto_play_hbox.pack_start(self.auto_play_check_button, False, False) auto_play_hbox.pack_start(create_right_align(), True, True) # resume last check_button. self.resume_last_check_button = CheckButton(_("Resume playback")) resume_hbox = gtk.HBox() resume_hbox.pack_start(self.resume_last_check_button, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, gtk.FILL) #main_table.attach(splash_hbox, 0, 1, 2, 3) main_table.attach(open_lyrics_hbox, 0, 1, 2, 3) main_table.attach(auto_play_hbox, 1, 2, 2, 3, yoptions=gtk.EXPAND) main_table.attach(resume_hbox, 0, 1, 3, 4) return main_table
def create_download_dir_table(self): main_table = gtk.Table(4, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Download settings")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) download_number_label = Label(_('Maximum number of download tasks: ')) self.download_number_comobox = ComboBox( items = [(str(i+1), i+1) for i in range(10)], select_index = int(get_download_number())-1, ) self.download_number_comobox.connect("item-selected", self.download_number_comobox_changed) download_number_hbox = gtk.HBox(spacing=5) download_number_hbox.pack_start(download_number_label, False, False) download_number_hbox.pack_start(self.download_number_comobox, False, False) change_download_dir_label = Label(_("Download directory: ")) self.dir_entry = InputEntry() self.dir_entry.set_text(get_software_download_dir()) self.dir_entry.set_editable(False) self.dir_entry.set_size(200, 25) modify_button = Button(_("Change")) modify_button.connect("clicked", self.change_download_save_dir) download_dir_hbox = gtk.HBox(spacing=5) download_dir_hbox.pack_start(change_download_dir_label, False, False) download_dir_hbox.pack_start(self.dir_entry, False, False) download_dir_hbox.pack_start(modify_button, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(download_number_hbox, 0, 2, 2, 3, xoptions=gtk.FILL) main_table.attach(download_dir_hbox, 0, 2, 3, 4, xoptions=gtk.FILL) return main_table
def create_hotkey_box(self): hotkey_title_label = Label(_("Hotkeys")) hotkey_title_label.set_size_request(350, 12) label_align = gtk.Alignment() label_align.set_padding(20, 0, 0, 0) label_align.add(hotkey_title_label) self.main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) self.main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) # using check button. using_hbox = gtk.HBox() self.using_check_button = CheckButton(_("Enable hotkeys")) using_hbox.pack_start(self.using_check_button, False, False) using_hbox.pack_start(create_right_align(), False, True) self.main_table.attach(using_hbox, 0, 2, 2, 3, yoptions=gtk.FILL) self.toggle_window_entry = self.create_combo_entry(3, 4, _("Minimize/Show window"), config.get("globalkey", "toggle_window")) self.toggle_lyrics_status_entry = self.create_combo_entry(4, 5, _("Show/Hide lyrics"), config.get("globalkey", "toggle_lyrics_status")) self.toggle_lyrics_lock_entry = self.create_combo_entry(5, 6, _("Lock/Unlock lyrics"), config.get("globalkey", "toggle_lyrics_lock")) self.playpause_entry = self.create_combo_entry(6, 7, _("Play/Pause"), config.get("globalkey", "playpause")) self.previous_entry = self.create_combo_entry(7, 8, _("Previous"), config.get("globalkey", "previous")) self.next_entry = self.create_combo_entry(8, 9, _("Next"), config.get("globalkey", "next")) self.increase_vol_entry = self.create_combo_entry(9, 10, _("Volume Up"), config.get("globalkey", "increase_vol")) self.decrease_vol_entry = self.create_combo_entry(10, 11, _("Volume Down"), config.get("globalkey", "decrease_vol")) # Button. default_button = Button(_("Reset")) default_button.connect("clicked", self.restore_to_default) button_hbox = gtk.HBox() button_hbox.pack_start(create_right_align(), True, True) button_hbox.pack_start(default_button, False, False) self.main_table.attach(button_hbox, 0, 2, 11, 12, xpadding=10)
class JobsManager(gtk.HBox): __jobs = [] __id_updater = None def __init__(self): super(JobsManager,self).__init__(spacing=6) self.connect("expose-event", self.draw_bg_mask) self.jobs_label = Label("0 " + _("jobs waiting!"), app_theme.get_color("labelText"), 8) self.jobs_label.set_size_request(150, 12) label_align = gtk.Alignment() label_align.set(0.5, 0.5, 0, 0) label_align.set_padding(0, 0, 10, 0) label_align.add(self.jobs_label) self.progress_label = Label("", app_theme.get_color("labelText"), 8) self.progress_label.set_size_request(500, 10) self.__paused = False btn_cancel = self.__create_simple_button("stop", self.stop) self.__btn_pause = self.__create_begin_button(self.pause) btn_pause_align = gtk.Alignment() btn_pause_align.set(0.5, 0.5, 0, 0) btn_pause_align.add(self.__btn_pause) btn_cancel_align = gtk.Alignment() btn_cancel_align.set(0.5, 0.5, 0, 0) btn_cancel_align.set_padding(0, 0, 0, 10) btn_cancel_align.add(btn_cancel) self.pack_start(label_align, False, False) # self.pack_start(self.throbber, False, False) self.pack_start(self.progress_label,True,True) self.pack_start(btn_pause_align,False,False) self.pack_start(btn_cancel_align,False,False) self.show_all() self.set_no_show_all(True) self.hide() self.jobs_label.hide_all() def draw_bg_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x, rect.y, rect.width, rect.height, "frameLight") def __create_simple_button(self, name, callback): button = ImageButton( app_theme.get_pixbuf("jobs/%s_normal.png" % name), app_theme.get_pixbuf("jobs/%s_hover.png" % name), app_theme.get_pixbuf("jobs/%s_hover.png" % name), ) if callback: button.connect("clicked", callback) return button def __create_begin_button(self, callback): toggle_button = ToggleButton( app_theme.get_pixbuf("jobs/pause_normal.png"), app_theme.get_pixbuf("jobs/begin_normal.png"), app_theme.get_pixbuf("jobs/pause_hover.png"), app_theme.get_pixbuf("jobs/begin_hover.png") ) if callback: toggle_button.connect("toggled", callback) return toggle_button def add(self, job): job_id = job.connect("end",self.__job_end) self.__jobs.append((job, job_id)) if len(self.__jobs) == 1: try: gobject.source_remove(self.__id_updater) except: pass self.__id_updater = gobject.timeout_add(250,self.__update) self.__jobs[0][0].start() if self.__paused: self.pause(self.__btn_pause) self.__update() def __job_end(self, ajob): gobject.idle_add(self.__job_end_cb, ajob) def __job_end_cb(self, ajob): job, job_id = self.__jobs.pop(0) job.disconnect(job_id) if self.__paused: self.pause(self.__btn_pause) if self.__jobs: jobs = [ (job[0].priority, job) for job in self.__jobs ] jobs.sort() self.__jobs = [ job[1] for job in jobs ] self.__jobs[0][0].start() self.__update() else: try: gobject.source_remove(self.__id_updater) except:pass self.__update() del job def pause(self, btn): if self.__jobs: if not self.__paused: self.__jobs[0][0].pause() self.__paused = True else: self.__jobs[0][0].unpause() self.__paused = False def stop(self,*args): if self.__jobs: if self.__paused: self.pause(self.__btn_pause) self.__jobs[0][0].stop() def __update(self): if len(self.__jobs)-1 > 0 : self.jobs_label.set_text("%d "% (len(self.__jobs)-1) + _("jobs waiting!")) self.jobs_label.show_all() else: self.jobs_label.hide_all() if self.__jobs: Dispatcher.show_jobs() message = self.__jobs[0][0].get_info() self.progress_label.set_text(message) self.show() return True else: Dispatcher.hide_jobs() self.hide() self.__id_updater = None return False
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 JobsManager(gtk.HBox): __jobs = [] __id_updater = None def __init__(self): super(JobsManager, self).__init__(spacing=6) self.connect("expose-event", self.draw_bg_mask) self.jobs_label = Label("0 " + _("jobs waiting!"), app_theme.get_color("labelText"), 8) self.jobs_label.set_size_request(150, 12) label_align = gtk.Alignment() label_align.set(0.5, 0.5, 0, 0) label_align.set_padding(0, 0, 10, 0) label_align.add(self.jobs_label) self.progress_label = Label("", app_theme.get_color("labelText"), 8) self.progress_label.set_size_request(500, 10) self.__paused = False btn_cancel = self.__create_simple_button("stop", self.stop) self.__btn_pause = self.__create_begin_button(self.pause) btn_pause_align = gtk.Alignment() btn_pause_align.set(0.5, 0.5, 0, 0) btn_pause_align.add(self.__btn_pause) btn_cancel_align = gtk.Alignment() btn_cancel_align.set(0.5, 0.5, 0, 0) btn_cancel_align.set_padding(0, 0, 0, 10) btn_cancel_align.add(btn_cancel) self.pack_start(label_align, False, False) # self.pack_start(self.throbber, False, False) self.pack_start(self.progress_label, True, True) self.pack_start(btn_pause_align, False, False) self.pack_start(btn_cancel_align, False, False) self.show_all() self.set_no_show_all(True) self.hide() self.jobs_label.hide_all() def draw_bg_mask(self, widget, event): cr = widget.window.cairo_create() rect = widget.allocation draw_alpha_mask(cr, rect.x, rect.y, rect.width, rect.height, "frameLight") def __create_simple_button(self, name, callback): button = ImageButton( app_theme.get_pixbuf("jobs/%s_normal.png" % name), app_theme.get_pixbuf("jobs/%s_hover.png" % name), app_theme.get_pixbuf("jobs/%s_hover.png" % name), ) if callback: button.connect("clicked", callback) return button def __create_begin_button(self, callback): toggle_button = ToggleButton( app_theme.get_pixbuf("jobs/pause_normal.png"), app_theme.get_pixbuf("jobs/begin_normal.png"), app_theme.get_pixbuf("jobs/pause_hover.png"), app_theme.get_pixbuf("jobs/begin_hover.png")) if callback: toggle_button.connect("toggled", callback) return toggle_button def add(self, job): job_id = job.connect("end", self.__job_end) self.__jobs.append((job, job_id)) if len(self.__jobs) == 1: try: gobject.source_remove(self.__id_updater) except: pass self.__id_updater = gobject.timeout_add(250, self.__update) self.__jobs[0][0].start() if self.__paused: self.pause(self.__btn_pause) self.__update() def __job_end(self, ajob): gobject.idle_add(self.__job_end_cb, ajob) def __job_end_cb(self, ajob): job, job_id = self.__jobs.pop(0) job.disconnect(job_id) if self.__paused: self.pause(self.__btn_pause) if self.__jobs: jobs = [(job[0].priority, job) for job in self.__jobs] jobs.sort() self.__jobs = [job[1] for job in jobs] self.__jobs[0][0].start() self.__update() else: try: gobject.source_remove(self.__id_updater) except: pass self.__update() del job def pause(self, btn): if self.__jobs: if not self.__paused: self.__jobs[0][0].pause() self.__paused = True else: self.__jobs[0][0].unpause() self.__paused = False def stop(self, *args): if self.__jobs: if self.__paused: self.pause(self.__btn_pause) self.__jobs[0][0].stop() def __update(self): if len(self.__jobs) - 1 > 0: self.jobs_label.set_text("%d " % (len(self.__jobs) - 1) + _("jobs waiting!")) self.jobs_label.show_all() else: self.jobs_label.hide_all() if self.__jobs: Dispatcher.show_jobs() message = self.__jobs[0][0].get_info() self.progress_label.set_text(message) self.show() return True else: Dispatcher.hide_jobs() self.hide() self.__id_updater = None return False
def create_simple_label(self, content, text_size): label = Label(content, app_theme.get_color("labelText"), text_size=text_size, enable_gaussian=True, label_width=self.default_width) width, height = get_content_size(content, text_size) label.set_size_request(110, height) return label
volume_frame.add(volume_button) tab_1_box.pack_start(volume_frame, False, False) # Add entry widget. entry_button = ImageButton( app_theme.get_pixbuf("entry/search_normal.png"), app_theme.get_pixbuf("entry/search_hover.png"), app_theme.get_pixbuf("entry/search_press.png"), ) # entry = TextEntry("Linux Deepin") entry = InputEntry("Linux Deepin") entry.connect("action-active", print_entry_action) entry.set_size(150, 24) entry_label = Label("标签测试, 内容非常长") entry_label.set_text("标签的内容") entry_label.set_size_request(100, 30) entry_box = gtk.HBox(spacing=10) entry_box.pack_start(entry_label, False, False) entry_box.pack_start(entry, True, True) shortcust_entry = ShortcutKeyEntry("Ctrl + Alt + Q") shortcust_entry.set_size(150, 24) entry_box.pack_start(shortcust_entry, False, False) test_button = Button("测试") test_button.connect("clicked", clicked_test) entry_box.pack_start(test_button, False, False) color_button = ColorButton() entry_box.pack_start(color_button, False, False)
class DscPreferenceDialog(PreferenceDialog): def __init__(self): PreferenceDialog.__init__(self, 566, 488) self.current_mirror_item = None self.normal_settings = gtk.VBox() self.normal_settings.set_spacing(TABLE_ROW_SPACING) self.normal_settings.pack_start(self.create_uninstall_box(), False, True) self.normal_settings.pack_start(self.create_download_dir_table(), False, True) self.normal_settings_align = gtk.Alignment(0, 0, 1, 1) self.normal_settings_align.set_padding(padding_left=5, padding_right=5, padding_top=25, padding_bottom=10) self.normal_settings_align.add(self.normal_settings) self.mirror_settings = gtk.VBox() self.mirror_settings.set_app_paintable(True) self.mirror_settings.connect("expose-event", self.mirror_settings_align_expose) self.mirror_settings.set_spacing(TABLE_ROW_SPACING) self.mirror_settings.pack_start(self.create_mirror_select_table(), False, True) self.mirror_settings.pack_start(self.create_source_update_frequency_table(), False, True) self.mirror_settings_inner_align = gtk.Alignment(0.5, 0.5, 1, 1) self.mirror_settings_inner_align.set_padding(padding_top=25, padding_bottom=10, padding_left=0, padding_right=0) self.mirror_settings_inner_align.add(self.mirror_settings) self.mirror_settings_scrolled_win = ScrolledWindow() self.mirror_settings_scrolled_win.add_child(self.mirror_settings_inner_align) self.mirror_settings_align = gtk.Alignment(0, 0, 1, 1) self.mirror_settings_align.set_padding(padding_left=0, padding_right=0, padding_top=0, padding_bottom=3) self.mirror_settings_align.add(self.mirror_settings_scrolled_win) self.set_preference_items([ (_("General"), self.normal_settings_align), (_("Mirrors"), self.mirror_settings_align), (_("About"), AboutBox()), ]) def mirror_settings_align_expose(self, widget, event=None): cr = widget.window.cairo_create() rect = widget.allocation # draw backgound cr.rectangle(*rect) #cr.set_source_rgb(*color_hex_to_cairo("#ff0000")) cr.set_source_rgba(1, 1, 1, 0) cr.fill() def mirror_select_action(self, repo_urls): self.data_manager.change_source_list(repo_urls, reply_handler=handle_dbus_reply, error_handler=handle_dbus_error) def create_mirror_select_table(self): vbox = gtk.VBox() vbox.set_size_request(423, -1) main_table = gtk.Table(2, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Select mirror")) dir_title_label.set_size_request(423, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 10, 0) label_align.add(dir_title_label) self.mirrors_dir = os.path.join(get_parent_dir(__file__, 2), 'mirrors') self.current_mirror_hostname = utils.get_current_mirror_hostname() self.mirror_items = self.get_mirror_items() self.mirror_view = TreeView(self.mirror_items, enable_drag_drop=False, enable_multiple_select=False, #mask_bound_height=0, ) self.mirror_view.set_expand_column(1) self.mirror_view.set_size_request(-1, len(self.mirror_view.visible_items) * self.mirror_view.visible_items[0].get_height()) self.mirror_view.draw_mask = self.mirror_treeview_draw_mask #self.display_current_mirror() self.mirror_test_progressbar = ProgressBar() main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) title = _("Select best mirror") info_message = _("Please wait. The process will take 30 seconds or more depending on your network connection") self.select_best_mirror_dialog = WaitingDialog(title, info_message, self.cancel_mirror_test) global_event.register_event("mirror-changed", self.mirror_changed_handler) global_event.register_event("update-list-finish", self.update_list_finish_handler) vbox.pack_start(main_table, False, False) vbox.pack_start(self.mirror_view, False, False) return vbox def cancel_mirror_test(self, widget): try: self.mirror_test.terminated = True gobject.source_remove(self.update_status_id) except: pass self.select_best_mirror_dialog.hide_all() def update_list_finish_handler(self): self.select_best_mirror_dialog.hide_all() def mirror_changed_handler(self, item): for i in self.mirror_items: if i != item and i.radio_button.active == True: i.radio_button.active = False elif i == item: i.radio_button.active = True self.mirror_view.queue_draw() def test_mirror_action(self, widget): self.select_best_mirror_dialog.set_transient_for(self) self.select_best_mirror_dialog.set_position(gtk.WIN_POS_CENTER_ON_PARENT) self.select_best_mirror_dialog.show_all() distro = aptsources.distro.get_distro() #distro.get_sources(SourcesList()) pipe = os.popen("dpkg --print-architecture") arch = pipe.read().strip() test_file = "dists/%s/Contents-%s.gz" % \ ( distro.codename, #"quantal", arch, ) self.mirror_test = MirrorTest(self.mirrors_list, test_file) self.mirror_test.start() # now run the tests in a background thread, and update the UI on each event self.update_status_id = gtk.timeout_add(100, self.update_progress) def update_progress(self): if self.mirror_test.running: return True else: time.sleep(1) if self.mirror_test.best != None: for item in self.mirror_items: if item.mirror == self.mirror_test.best[1]: print item.mirror.get_repo_urls() self.mirror_clicked_callback(item) else: self.select_best_mirror_dialog.loading_widget.hide_all() self.select_best_mirror_dialog.info_message_label.set_text(_("Test for downloading mirror failed. Please check your network connection.")) self.select_best_mirror_dialog.close_button.set_label(_("Close")) return False def mirror_treeview_draw_mask(self, cr, x, y, w, h): cr.set_source_rgba(1, 1, 1, 0.9) cr.rectangle(x, y, w, h) cr.fill() def get_mirror_items(self): items = [] self.mirrors_list = [] for ini_file in os.listdir(self.mirrors_dir): m = Mirror(os.path.join(self.mirrors_dir, ini_file)) item = MirrorItem(m, self.mirror_clicked_callback) if m.hostname == self.current_mirror_hostname: item.radio_button.active = True self.current_mirror_item = item self.mirrors_list.append(m) items.append(item) items.sort(key=lambda x:x.mirror.priority) return items def mirror_clicked_callback(self, item): if item != self.current_mirror_item: self.current_mirror_item = item global_event.emit('change-mirror', item) self.hide_all() def create_source_update_frequency_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Update applications lists")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) self.is_auto_update_button = CheckButton(label_text=_('Update automatically')) self.is_auto_update_button.connect('toggled', self.change_auto_update) self.update_label = Label(_("Time interval: ")) self.update_spin = SpinBox(int(get_update_interval()), 0, 168, 1) self.update_spin.connect("value-changed", lambda w, v: set_update_interval(v)) self.hour_lablel = Label(_(" hour")) self.hour_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(self.update_label, False, False) spin_hbox.pack_start(self.update_spin, False, False) spin_hbox.pack_start(self.hour_lablel, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.is_auto_update_button, 0, 1, 2, 3, xpadding=10, xoptions=gtk.FILL) main_table.attach(spin_hbox, 1, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) if is_auto_update(): self.is_auto_update_button.set_active(True) else: self.is_auto_update_button.toggled() return main_table def create_download_dir_table(self): main_table = gtk.Table(4, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Download settings")) dir_title_label.set_size_request(200, 12) label_align = gtk.Alignment() label_align.set_padding(0, 0, 0, 0) label_align.add(dir_title_label) download_number_label = Label(_('Max download task number: ')) self.download_number_comobox = ComboBox( items = [(str(i+1), i+1) for i in range(10)], select_index = int(get_download_number())-1, ) self.download_number_comobox.connect("item-selected", self.download_number_comobox_changed) download_number_hbox = gtk.HBox(spacing=5) download_number_hbox.pack_start(download_number_label, False, False) download_number_hbox.pack_start(self.download_number_comobox, False, False) change_download_dir_label = Label(_("Download directory: ")) self.dir_entry = InputEntry() self.dir_entry.set_text(get_software_download_dir()) self.dir_entry.set_editable(False) self.dir_entry.set_size(200, 25) modify_button = Button(_("Change")) modify_button.connect("clicked", self.change_download_save_dir) download_dir_hbox = gtk.HBox(spacing=5) download_dir_hbox.pack_start(change_download_dir_label, False, False) download_dir_hbox.pack_start(self.dir_entry, False, False) download_dir_hbox.pack_start(modify_button, False, False) main_table.attach(label_align, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(download_number_hbox, 0, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) main_table.attach(download_dir_hbox, 0, 2, 3, 4, xpadding=10, xoptions=gtk.FILL) return main_table def create_uninstall_box(self): main_table = gtk.Table(2, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) uninstall_title_label = Label(_("On uninstall software")) uninstall_title_label.set_size_request(350, 12) # mini_check_button self.delete_check_button = CheckButton(_("Delete configuration files")) self.delete_check_button.set_active(get_purg_flag()) self.delete_check_button.connect("toggled", lambda w: set_purge_flag(self.delete_check_button.get_active())) main_table.attach(uninstall_title_label, 0, 2, 0, 1, yoptions=gtk.FILL, xpadding=8) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.delete_check_button, 0, 1, 2, 3, yoptions=gtk.FILL) return main_table def change_download_save_dir(self, widget): local_dir = WinDir(False).run() if local_dir: local_dir = os.path.expanduser(local_dir) if local_dir != get_software_download_dir(): self.dir_entry.set_editable(True) self.dir_entry.set_text(local_dir) self.dir_entry.set_editable(False) set_software_download_dir(local_dir) global_event.emit('download-directory-changed') def download_number_comobox_changed(self, widget, name, value, index): set_download_number(value) global_event.emit('max-download-number-changed', value) def change_auto_update(self, widget, data=None): self.update_spin.set_sensitive(widget.get_active()) set_auto_update(widget.get_active()) self.update_label.set_sensitive(widget.get_active()) self.hour_lablel.set_sensitive(widget.get_active()) dsc_daemon_path = os.path.join(get_parent_dir(__file__, 2), 'update_data/apt/dsc-daemon.py') if widget.get_active(): subprocess.Popen(['python', dsc_daemon_path], stderr=subprocess.STDOUT, shell=False)
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)
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 MirrorsBox(BaseBox): def __init__(self): BaseBox.__init__(self) self.current_mirror_item = None self.select_best_mirror_button_texts = { "normal": _("Select the best mirror"), "wait": _("Waiting"), "success": _("Successfully") } self.main_box.pack_start(self.create_mirror_select_table(), True, True) self.main_box.pack_start(self.create_source_update_frequency_table(), False, True) self.mirror_test_obj = None global_event.register_event("mirror-test-finished", self.finish_mirror_test) global_event.register_event("cancel-mirror-test", self.cancel_mirror_test) global_event.register_event("mirror-backend-changed", self.mirror_changed_handler) def create_source_update_frequency_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Refresh package lists")) # auto update check button self.is_auto_update_button = CheckButton(label_text=_('Upgrade automatically')) self.is_auto_update_button.connect('released', self.change_auto_update) self.is_auto_update_button.set_active(utils.is_auto_update()) self.update_label = Label(_("Time interval: ")) self.update_spin = SpinBox(int(get_update_interval()), 0, 168, 1) self.update_spin.connect("value-changed", lambda w, v: set_update_interval(v)) self.hour_lablel = Label(_(" hour")) self.hour_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(self.update_label, False, False) spin_hbox.pack_start(self.update_spin, False, False) spin_hbox.pack_start(self.hour_lablel, False, False) main_table.attach(dir_title_label, 0, 2, 0, 1, yoptions=gtk.FILL) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.is_auto_update_button, 0, 1, 2, 3, xoptions=gtk.FILL) main_table.attach(spin_hbox, 1, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) return main_table def change_auto_update(self, widget, data=None): widget_active = widget.get_active() self.update_spin.set_sensitive(widget_active) self.update_label.set_sensitive(widget_active) self.hour_lablel.set_sensitive(widget_active) utils.set_auto_update(widget_active) daemon_running = is_dbus_name_exists(DSC_UPDATE_DAEMON_NAME) if widget_active and not daemon_running: dsc_daemon_path = os.path.join(get_parent_dir(__file__, 2), 'update_data/apt/dsc-daemon.py') subprocess.Popen(['python', dsc_daemon_path], stderr=subprocess.STDOUT, shell=False) elif not widget_active and daemon_running: session = dbus.SessionBus() dbus_obj = session.get_object(DSC_UPDATE_DAEMON_NAME, DSC_UPDATE_DAEMON_PATH) iface = dbus.Interface(dbus_obj, DSC_UPDATE_DAEMON_NAME) iface.quit() def select_best_mirror(self, widget): widget.set_label(self.select_best_mirror_button_texts["wait"]) widget.set_sensitive(False) global_event.emit("toggle-waiting-dialog", True) utils.ThreadMethod(self.change_to_nearest_mirror_thread, (widget, )).start() def cancel_mirror_test(self): if self.mirror_test_obj: self.mirror_test_obj.cancel() self.mirror_test_obj = None self.finish_mirror_test("") def change_to_nearest_mirror_thread(self, widget): best_mirror = get_best_mirror() global_event.emit("mirror-test-finished", best_mirror) def finish_mirror_test(self, mirror): for item in self.mirror_view.visible_items: if item.mirror == mirror: self.mirror_view.visible_item(item) self.select_best_mirror_button.set_sensitive(True) self.select_best_mirror_button.set_label(self.select_best_mirror_button_texts["normal"]) def create_mirror_select_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) mirror_select_title = Label(_("Select mirror")) self.select_best_mirror_button = Button(self.select_best_mirror_button_texts["normal"]) self.select_best_mirror_button.connect("clicked", self.select_best_mirror) self.mirrors_dir = os.path.join(get_parent_dir(__file__, 2), 'mirrors') self.current_mirror_hostname = utils.get_current_mirror_hostname() self.mirror_items = self.get_mirror_items() self.mirror_view = TreeView(self.mirror_items, enable_drag_drop=False, enable_multiple_select=False, mask_bound_height=0, ) self.mirror_view.set_expand_column(1) self.mirror_view.set_size_request(-1, 280) self.mirror_view.draw_mask = self.mirror_treeview_draw_mask main_table.attach(mirror_select_title, 0, 1, 0, 1, yoptions=gtk.FILL) main_table.attach(self.select_best_mirror_button, 1, 2, 0, 1, xoptions=gtk.FILL) main_table.attach(create_separator_box(), 0, 2, 1, 2, xoptions=gtk.FILL) main_table.attach(self.mirror_view, 0, 2, 2, 3, xoptions=gtk.FILL) return main_table def mirror_changed_handler(self, mirror): item = None for i in self.mirror_view.visible_items: if i.mirror == mirror: item = i break if item: self.current_mirror_item = item for i in self.mirror_items: if i != item and i.radio_button.active == True: i.radio_button.active = False elif i == item: i.radio_button.active = True self.mirror_view.queue_draw() self.mirror_view.visible_item(item) def mirror_treeview_draw_mask(self, cr, x, y, w, h): cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(x, y, w, h) cr.fill() def get_mirror_items(self): items = [] for m in all_mirrors: item = MirrorItem(m, self.mirror_clicked_callback) if m.hostname == self.current_mirror_hostname: item.radio_button.active = True self.current_mirror_item = item items.append(item) return items def mirror_clicked_callback(self, item): if item != self.current_mirror_item: global_event.emit('start-change-mirror', item.mirror)
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)
class MirrorsBox(BaseBox): def __init__(self): BaseBox.__init__(self) self.current_mirror_item = None self.select_best_mirror_button_texts = { "normal": _("Select the best mirror"), "wait": _("Waiting"), "success": _("Successfully") } self.main_box.pack_start(self.create_mirror_select_table(), True, True) self.main_box.pack_start(self.create_source_update_frequency_table(), False, True) self.mirror_test_obj = None global_event.register_event("mirror-test-finished", self.finish_mirror_test) global_event.register_event("cancel-mirror-test", self.cancel_mirror_test) global_event.register_event("mirror-backend-changed", self.mirror_changed_handler) def create_source_update_frequency_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) dir_title_label = Label(_("Refresh package lists")) # auto update check button self.is_auto_update_button = CheckButton(label_text=_('Upgrade automatically')) self.is_auto_update_button.connect('released', self.change_auto_update) self.is_auto_update_button.set_active(utils.is_auto_update()) self.update_label = Label(_("Time interval: ")) self.update_spin = SpinBox(int(get_update_interval()), 0, 168, 1) self.update_spin.connect("value-changed", lambda w, v: set_update_interval(v)) self.hour_lablel = Label(_(" hour")) self.hour_lablel.set_size_request(50, 12) spin_hbox = gtk.HBox(spacing=3) spin_hbox.pack_start(self.update_label, False, False) spin_hbox.pack_start(self.update_spin, False, False) spin_hbox.pack_start(self.hour_lablel, False, False) main_table.attach(dir_title_label, 0, 2, 0, 1, yoptions=gtk.FILL) main_table.attach(create_separator_box(), 0, 2, 1, 2, yoptions=gtk.FILL) main_table.attach(self.is_auto_update_button, 0, 1, 2, 3, xoptions=gtk.FILL) main_table.attach(spin_hbox, 1, 2, 2, 3, xpadding=10, xoptions=gtk.FILL) return main_table def change_auto_update(self, widget, data=None): widget_active = widget.get_active() self.update_spin.set_sensitive(widget_active) self.update_label.set_sensitive(widget_active) self.hour_lablel.set_sensitive(widget_active) utils.set_auto_update(widget_active) daemon_running = is_dbus_name_exists(DSC_UPDATE_DAEMON_NAME) if widget_active and not daemon_running: dsc_daemon_path = os.path.join(get_parent_dir(__file__, 2), 'update_data/apt/dsc-daemon.py') subprocess.Popen(['python', dsc_daemon_path], stderr=subprocess.STDOUT, shell=False) elif not widget_active and daemon_running: session = dbus.SessionBus() dbus_obj = session.get_object(DSC_UPDATE_DAEMON_NAME, DSC_UPDATE_DAEMON_PATH) iface = dbus.Interface(dbus_obj, DSC_UPDATE_DAEMON_NAME) iface.quit() def select_best_mirror(self, widget): widget.set_label(self.select_best_mirror_button_texts["wait"]) widget.set_sensitive(False) global_event.emit("toggle-waiting-dialog", True) utils.ThreadMethod(self.change_to_nearest_mirror_thread, (widget, )).start() def cancel_mirror_test(self): if self.mirror_test_obj: self.mirror_test_obj.cancel() self.mirror_test_obj = None self.finish_mirror_test("") def change_to_nearest_mirror_thread(self, widget): from mirror_speed.ip_detect import get_nearest_mirrors hostnames = get_nearest_mirrors() self.mirror_test_obj = MirrorTest(hostnames) hostname = self.mirror_test_obj.run() for mirror in self.mirrors_list: if mirror.hostname == hostname: global_event.emit("mirror-test-finished", mirror) break def finish_mirror_test(self, mirror): for item in self.mirror_view.visible_items: if item.mirror == mirror: self.mirror_view.visible_item(item) self.select_best_mirror_button.set_sensitive(True) self.select_best_mirror_button.set_label(self.select_best_mirror_button_texts["normal"]) def create_mirror_select_table(self): main_table = gtk.Table(3, 2) main_table.set_row_spacings(CONTENT_ROW_SPACING) mirror_select_title = Label(_("Select mirror")) self.select_best_mirror_button = Button(self.select_best_mirror_button_texts["normal"]) self.select_best_mirror_button.connect("clicked", self.select_best_mirror) self.mirrors_dir = os.path.join(get_parent_dir(__file__, 2), 'mirrors') self.current_mirror_hostname = utils.get_current_mirror_hostname() self.mirror_items = self.get_mirror_items() self.mirror_view = TreeView(self.mirror_items, enable_drag_drop=False, enable_multiple_select=False, mask_bound_height=0, ) self.mirror_view.set_expand_column(1) self.mirror_view.set_size_request(-1, 280) self.mirror_view.draw_mask = self.mirror_treeview_draw_mask main_table.attach(mirror_select_title, 0, 1, 0, 1, yoptions=gtk.FILL) main_table.attach(self.select_best_mirror_button, 1, 2, 0, 1, xoptions=gtk.FILL) main_table.attach(create_separator_box(), 0, 2, 1, 2, xoptions=gtk.FILL) main_table.attach(self.mirror_view, 0, 2, 2, 3, xoptions=gtk.FILL) return main_table def mirror_changed_handler(self, mirror): item = None for i in self.mirror_view.visible_items: if i.mirror == mirror: item = i break if item: self.current_mirror_item = item for i in self.mirror_items: if i != item and i.radio_button.active == True: i.radio_button.active = False elif i == item: i.radio_button.active = True self.mirror_view.queue_draw() self.mirror_view.visible_item(item) def mirror_treeview_draw_mask(self, cr, x, y, w, h): cr.set_source_rgba(1, 1, 1, 0.5) cr.rectangle(x, y, w, h) cr.fill() def get_mirror_items(self): items = [] self.mirrors_list = get_mirrors() for m in self.mirrors_list: item = MirrorItem(m, self.mirror_clicked_callback) if m.hostname == self.current_mirror_hostname: item.radio_button.active = True self.current_mirror_item = item items.append(item) items.sort(key=lambda item:item.mirror.priority) return items def mirror_clicked_callback(self, item): if item != self.current_mirror_item: global_event.emit('start-change-mirror', item.mirror)