def make_menu_item_with_picture(name, imagePath): """makes a menu entry with an image and a label in it""" image = gtk.Image() pixbuf = Images.make_icon(imagePath, 24) image.set_from_pixbuf(pixbuf) image.set_size_request(35, 24) image.set_alignment(0, .5) label = gtk.Label() label.set_alignment(0, .5) label.set_markup("<span weight='bold'>%s</span>" % (name)) box = gtk.HBox(spacing=0) box.pack_start(image, False, False, 0) box.pack_start(label, False, False, 0) header = gtk.MenuItem() header.add(box) header.show_all() return header
def __init__(self, btApp, maggicPadding): """a button row that controls the bit torrent client and also gives the user some anon info, etc buttons trigger events to get to the parent window instead of slef passing""" GeneratorMixin.GeneratorMixin.__init__(self) gtk.Alignment.__init__(self, 0, 0, 1, 1) self._add_events("add_file", "remove_file", "pause_torrent", "toggle_anonymity") self.catch_event("settings_changed") self.btApp = btApp self.pausePixbuf = Images.make_icon("pause.png", 16) self.resumePixbuf = Images.make_icon("resume.png", 16) self.relayOnPixbuf = Images.STOP_RELAY_PIXBUF self.relayOnLabel = '<span size="large">Stop Relay</span>' self.relayOffPixbuf = Images.START_RELAY_PIXBUF self.relayOffLabel = '<span size="large">Start Relay</span>' #top row of buttons self.searchEntry = gtk.Entry(35) self.searchEntry.connect("activate", self._search_cb) self.searchEntry.set_text("Find a torrent...") self.searchEntry.grab_focus() # row- note the padding hack buttonRow = gtk.HBox(spacing=0) buttonRow.pack_start(self.searchEntry, False, False, 0) # search self.searchButton = GTKUtils.make_image_button("Search", self._search_cb, "search.png") buttonRow.pack_start(self.searchButton, False, False, 0) # add self.addButton = GTKUtils.make_image_button('Add', self._connect_to_trigger("add_file"), "add.png") buttonRow.pack_start(self.addButton, False, False, maggicPadding + 1) #remove self.removeButton = GTKUtils.make_image_button('Remove', self._connect_to_trigger("remove_file"), "delete.png") buttonRow.pack_start(self.removeButton, False, False, 0) # pause/resume self.pauseButton = GTKUtils.make_image_button('Pause', self._connect_to_trigger("pause_torrent"), "pause.png") buttonRow.pack_start(self.pauseButton, False, False, maggicPadding + 1) # relay toggle self.relayToggleButton = GTKUtils.make_image_button('relay toggle', self._toggle_relay_cb, "warning.png") buttonRow.pack_end(self.relayToggleButton, False, False, 0) # anon toggle self.anonButton = GTKUtils.make_image_button('Anonymity', self._connect_to_trigger("toggle_anonymity"), "warning.png") #Normalize button sizes #add padding to anon button label width = self.anonButton.label.size_request()[0] self.anonButton.label.set_size_request(width + maggicPadding, -1) buttonRow.pack_end(self.anonButton, False, False, maggicPadding + 1) #normalize other button sizes buttonList = [self.pauseButton, self.removeButton, self.addButton, self.searchButton] buttonWidth = maggicPadding + max([button.size_request()[0] for button in buttonList]) [button.set_size_request(buttonWidth, -1) for button in buttonList] self.set_padding(maggicPadding + 3, 0, maggicPadding + 3, maggicPadding + 3) self.add(buttonRow) #fix relay toggle button width testLabel = self.relayToggleButton.label widths = [] for text in [self.relayOffLabel, self.relayOnLabel]: testLabel.set_markup(text) widths.append(self.relayToggleButton.size_request()[0]) maxWidth = max(widths) self.relayToggleButton.set_size_request(maxWidth + maggicPadding, -1) #initialize the buttons/labels to the correct state (since settings change does a pull :)) self.on_settings_changed()
def get_path_length_image(pathLen, size=24): pixbuf = Images.make_icon(Images.pathLengthToImageName[pathLen], size) return pixbuf
from common.events import GlobalEvents from common.events import GeneratorMixin from core import ClientUtil from gui.gtk.widget import OptionalToggleFrame from gui.gtk.window import TopWindow from gui.gtk.utils import GTKUtils from gui.gtk.utils import WrapLabel from gui.gtk.utils import Images from gui.gtk.dialog import BaseDialog from gui.gtk.display import SettingsDisplay from Applications import Tor PADDING = 10 ICON_SIZE = 48 QUESTION_PIXBUF = Images.make_icon("question.png", ICON_SIZE) WARNING_PIXBUF = Images.make_icon("warning.png", ICON_SIZE) SUCCESS_PIXBUF = Images.make_icon("apply.png", ICON_SIZE) STATUS_MARKUP = "<span size='large'>%s</span>" UNKNOWN_MARKUP = STATUS_MARKUP % ("Unknown") BUTTON_MARKUP = "<span>%s</span>" TITLE_MARKUP = "<span size='x-large' weight='bold'>%s</span>" TITLE_TESTING = TITLE_MARKUP % ("Testing reachability of port %s") TITLE_SUCCESS = TITLE_MARKUP % ("Relay port (%s) is reachable!") TITLE_FAILURE = TITLE_MARKUP % ("Forward the relay port (%s)") TITLE_UNTESTED = TITLE_MARKUP % ("Rerun the test with port %s")
from common.events import GlobalEvents from common.events import GeneratorMixin from core import ClientUtil from gui.gtk.widget import OptionalToggleFrame from gui.gtk.window import TopWindow from gui.gtk.utils import GTKUtils from gui.gtk.utils import WrapLabel from gui.gtk.utils import Images from gui.gtk.dialog import BaseDialog from gui.gtk.display import SettingsDisplay from Applications import Tor PADDING = 10 ICON_SIZE = 48 QUESTION_PIXBUF = Images.make_icon("question.png", ICON_SIZE) WARNING_PIXBUF = Images.make_icon("warning.png", ICON_SIZE) SUCCESS_PIXBUF = Images.make_icon("apply.png", ICON_SIZE) STATUS_MARKUP = "<span size='large'>%s</span>" UNKNOWN_MARKUP = STATUS_MARKUP % ("Unknown") BUTTON_MARKUP = "<span>%s</span>" TITLE_MARKUP = "<span size='x-large' weight='bold'>%s</span>" TITLE_TESTING = TITLE_MARKUP % ("Testing reachability of port %s") TITLE_SUCCESS = TITLE_MARKUP % ("Relay port (%s) is reachable!") TITLE_FAILURE = TITLE_MARKUP % ("Forward the relay port (%s)") TITLE_UNTESTED = TITLE_MARKUP % ("Rerun the test with port %s") def _unify_widget_widths(widgets):
def __init__(self, controller): self.window = gtk.Window() self.window.set_title("Out of credits!") self.controller = controller self.catch_event("settings_changed") self.window.connect("destroy", self._destroy_cb) #tell the user what happened headerLabel = gtk.Label() headerLabel.set_markup("<span size='x-large' weight='bold'>You have spent all your credits.\n</span>") headerImage = gtk.Image() headerImage.set_from_pixbuf(Images.make_icon("warning.png", 32)) headerBox = gtk.HBox(spacing=PADDING) headerBox.pack_start(headerImage, False, False, 0) headerBox.pack_start(headerLabel, False, False, 0) descriptionLabel = WrapLabel.WrapLabel("You must get more credits before you can keep sending traffic through BitBlinder. All users are given a small number of new credits each hour.\n\nYou can keep downloading with BitTorrent by disabling anonymity (upper right of the BitTorrent interface), but you will obviously not be anonymous!") descriptionBox = gtk.VBox(spacing=PADDING) descriptionBox.pack_start(headerBox, False, False, 0) descriptionBox.pack_start(descriptionLabel, False, False, 0) descriptionBox.show_all() #make some help text to explain what credits are creditLabel = WrapLabel.WrapLabel(CREDITS_HELP_TEXT) creditLabel = GTKUtils.add_padding(creditLabel, PADDING) creditLabel.show() creditExplanation = OptionalToggleFrame.OptionalToggleFrame(creditLabel, "What are credits?") creditExplanation = GTKUtils.add_padding(creditExplanation, PADDING) creditExplanation.show() #only appears if the user is still not configured as a relay relayButton = GTKUtils.make_image_button('<span size="large">Start Relay</span>', self._start_relay_cb, "power_off.png") relayLabel = WrapLabel.WrapLabel() relayLabel.set_markup('<span size="large" weight="bold">You should set up a relay! </span><span size="large">You will earn credits MUCH more quickly by being a relay and sending traffic for other users.</span>') self.relayRow = gtk.HBox(spacing=PADDING) spacingBox = gtk.VBox() spacingBox.pack_start(relayButton, True, False, 0) self.relayRow.pack_start(spacingBox, False, False, 0) self.relayRow.pack_start(relayLabel, True, True, 0) self.relayRow = GTKUtils.add_frame(self.relayRow, width=PADDING, name="Relay Setup") self.relayRow.show_all() #if we should always check self.alwaysShow = gtk.CheckButton("Always tell you when your credits run out.") self.alwaysShow.set_active(True) self.alwaysShow.show() #make the bottom button row waitButton = GTKUtils.make_image_button('<span size="large">Wait for Credits</span>', self._wait_cb, "time.png") purchaseButton = GTKUtils.make_image_button('<span size="large">Purchase Credits</span>', self._purchase_cb, "money.png") buttonRow = gtk.HBox(spacing=PADDING) buttonRow.pack_end(waitButton, False, False, 0) buttonRow.pack_end(purchaseButton, False, False, 0) buttonRow = GTKUtils.add_padding(buttonRow, PADDING) buttonRow.show_all() #pack everything together topBox = gtk.VBox(spacing=PADDING) topBox.pack_start(descriptionBox, False, False, 0) topBox.pack_start(creditExplanation, False, False, 0) topBox.pack_start(self.relayRow, False, False, 0) topBox.pack_start(self.alwaysShow, False, False, 0) topBox.show() topBox = GTKUtils.add_padding(topBox, PADDING) topBox.show() vbox = gtk.VBox() vbox.pack_start(topBox, False, False, 0) sep = gtk.HSeparator() sep.show() vbox.pack_end(buttonRow, False, False, 0) vbox.pack_end(sep, False, False, 0) vbox.show() #and add it into our dialog self.window.add(vbox) self.window.show()
#!/usr/bin/python #Copyright 2008-2009 InnomiNet """Window for selecting exit traffic types""" import gtk from common.utils.Basic import log_msg, log_ex, _ # pylint: disable-msg=W0611 from common.events import GeneratorMixin from gui.gtk.utils import GTKUtils from gui.gtk.utils import Images from gui.gtk.display import SettingsDisplay from Applications import Tor PADDING = 10 SUCCESS_PIXBUF = Images.make_icon("apply.png", 48) class ExitTrafficDisplay(GeneratorMixin.GeneratorMixin): def __init__(self): GeneratorMixin.GeneratorMixin.__init__(self) self.torApp = Tor.get() self._add_events("done") #make the components for this GUI headerBox = self._make_header_box() exitTrafficBox = self._make_exit_traffic_box() buttonBox = self._make_button_box() #pack them into our window: box = gtk.VBox(spacing=PADDING) box.pack_start(headerBox, False, False, 0)
#!/usr/bin/python #Copyright 2008-2009 InnomiNet """Window for selecting exit traffic types""" import gtk from common.utils.Basic import log_msg, log_ex, _ # pylint: disable-msg=W0611 from common.events import GeneratorMixin from gui.gtk.utils import GTKUtils from gui.gtk.utils import Images from gui.gtk.display import SettingsDisplay from Applications import Tor PADDING = 10 SUCCESS_PIXBUF = Images.make_icon("apply.png", 48) class ExitTrafficDisplay(GeneratorMixin.GeneratorMixin): def __init__(self): GeneratorMixin.GeneratorMixin.__init__(self) self.torApp = Tor.get() self._add_events("done") #make the components for this GUI headerBox = self._make_header_box() exitTrafficBox = self._make_exit_traffic_box() buttonBox = self._make_button_box() #pack them into our window: box = gtk.VBox(spacing=PADDING) box.pack_start(headerBox, False, False, 0) box.pack_start(exitTrafficBox, False, False, 0)
def __init__(self, btApp, maggicPadding): """a button row that controls the bit torrent client and also gives the user some anon info, etc buttons trigger events to get to the parent window instead of slef passing""" GeneratorMixin.GeneratorMixin.__init__(self) gtk.Alignment.__init__(self, 0, 0, 1, 1) self._add_events("add_file", "remove_file", "pause_torrent", "toggle_anonymity") self.catch_event("settings_changed") self.btApp = btApp self.pausePixbuf = Images.make_icon("pause.png", 16) self.resumePixbuf = Images.make_icon("resume.png", 16) self.relayOnPixbuf = Images.STOP_RELAY_PIXBUF self.relayOnLabel = '<span size="large">Stop Relay</span>' self.relayOffPixbuf = Images.START_RELAY_PIXBUF self.relayOffLabel = '<span size="large">Start Relay</span>' #top row of buttons self.searchEntry = gtk.Entry(35) self.searchEntry.connect("activate", self._search_cb) self.searchEntry.set_text("Find a torrent...") self.searchEntry.grab_focus() # row- note the padding hack buttonRow = gtk.HBox(spacing=0) buttonRow.pack_start(self.searchEntry, False, False, 0) # search self.searchButton = GTKUtils.make_image_button("Search", self._search_cb, "search.png") buttonRow.pack_start(self.searchButton, False, False, 0) # add self.addButton = GTKUtils.make_image_button( 'Add', self._connect_to_trigger("add_file"), "add.png") buttonRow.pack_start(self.addButton, False, False, maggicPadding + 1) #remove self.removeButton = GTKUtils.make_image_button( 'Remove', self._connect_to_trigger("remove_file"), "delete.png") buttonRow.pack_start(self.removeButton, False, False, 0) # pause/resume self.pauseButton = GTKUtils.make_image_button( 'Pause', self._connect_to_trigger("pause_torrent"), "pause.png") buttonRow.pack_start(self.pauseButton, False, False, maggicPadding + 1) # relay toggle self.relayToggleButton = GTKUtils.make_image_button( 'relay toggle', self._toggle_relay_cb, "warning.png") buttonRow.pack_end(self.relayToggleButton, False, False, 0) # anon toggle self.anonButton = GTKUtils.make_image_button( 'Anonymity', self._connect_to_trigger("toggle_anonymity"), "warning.png") #Normalize button sizes #add padding to anon button label width = self.anonButton.label.size_request()[0] self.anonButton.label.set_size_request(width + maggicPadding, -1) buttonRow.pack_end(self.anonButton, False, False, maggicPadding + 1) #normalize other button sizes buttonList = [ self.pauseButton, self.removeButton, self.addButton, self.searchButton ] buttonWidth = maggicPadding + max( [button.size_request()[0] for button in buttonList]) [button.set_size_request(buttonWidth, -1) for button in buttonList] self.set_padding(maggicPadding + 3, 0, maggicPadding + 3, maggicPadding + 3) self.add(buttonRow) #fix relay toggle button width testLabel = self.relayToggleButton.label widths = [] for text in [self.relayOffLabel, self.relayOnLabel]: testLabel.set_markup(text) widths.append(self.relayToggleButton.size_request()[0]) maxWidth = max(widths) self.relayToggleButton.set_size_request(maxWidth + maggicPadding, -1) #initialize the buttons/labels to the correct state (since settings change does a pull :)) self.on_settings_changed()