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
Пример #3
0
 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
Пример #5
0
 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
Пример #6
0
 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
Пример #11
0
    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
Пример #12
0
    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
Пример #13
0
    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
Пример #14
0
    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)
Пример #15
0
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)
Пример #17
0
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
Пример #18
0
 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
Пример #19
0
 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)
Пример #21
0
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)
Пример #22
0
    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)
Пример #23
0
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)
Пример #24
0
    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)
Пример #25
0
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)