From 2e398cb2127c8d5d2adc0ae0a00ee9e6e05bc69e Mon Sep 17 00:00:00 2001 From: Marcos Pinto Date: Sun, 30 Sep 2007 22:27:08 +0000 Subject: [PATCH] fix scheduler plugin --- ChangeLog | 1 + plugins/Scheduler/plugin.py | 396 +++++++++++++++++++----------------- 2 files changed, 207 insertions(+), 190 deletions(-) diff --git a/ChangeLog b/ChangeLog index 71f1aa03b..2922d2983 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ Deluge 0.5.6 (xx October 2007) * Tray lock password is no longer stored in plain text + * Update the Scheduler plugin and fix a bunch of bugs on it * Web Interface Plugin * Double-clicking on a torrent opens up its containing folder * Fix SpeedLimiter plugin when setting upload limits diff --git a/plugins/Scheduler/plugin.py b/plugins/Scheduler/plugin.py index 029b23fda..06ee0d15f 100644 --- a/plugins/Scheduler/plugin.py +++ b/plugins/Scheduler/plugin.py @@ -1,242 +1,258 @@ import deluge.common, deluge.pref, gtk, copy, pickle, time class plugin_Scheduler: - def __init__(self, path, deluge_core, deluge_interface): - self.path = path - self.core = deluge_core - self.interface = deluge_interface + def __init__(self, path, deluge_core, deluge_interface): + self.path = path + self.core = deluge_core + self.interface = deluge_interface - self.days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] - self.conf_file = deluge.common.CONFIG_DIR + "/scheduler.conf" - self.config = self.config = deluge.pref.Preferences() - self.button_state_temp = [[0] * 7 for dummy in xrange(24)] - self.status = -1 + self.days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + self.conf_file = deluge.common.CONFIG_DIR + "/scheduler.conf" + self.config = deluge.pref.Preferences() + self.button_state_temp = [[0] * 7 for dummy in xrange(24)] + self.status = -1 + self.globalactivetor = self.config.get("max_active_torrents") + self.globaldlmax = self.config.get("max_download_speed") + self.globalulmax = self.config.get("max_upload_speed") - #Load config - try: - reader = open(self.conf_file, "rb") - data = pickle.load(reader) - self.button_state = data[0] - self.dllimit = float(data[1][0]) - self.ullimit = float(data[1][1]) - reader.close() - except: - self.button_state = [[0] * 7 for dummy in xrange(24)] - self.dllimit = float(-1) - self.ullimit = float(-1) + #Load config + try: + reader = open(self.conf_file, "rb") + data = pickle.load(reader) + self.button_state = data[0] + self.dllimit = float(data[1][0]) + self.ullimit = float(data[1][1]) + reader.close() + except: + self.button_state = [[0] * 7 for dummy in xrange(24)] + self.dllimit = float(self.globaldlmax) + self.ullimit = float(self.globalulmax) - def unload(self): - self.resume() - self.unlimit() + def unload(self): + self.resume() + self.unlimit() - def update(self): - time_now = time.localtime(time.time()) - if self.status is not self.button_state[time_now[3]][time_now[6]]: - self.status = self.button_state[time_now[3]][time_now[6]] + def update(self): + time_now = time.localtime(time.time()) + if self.status is not self.button_state[time_now[3]][time_now[6]]: + self.status = self.button_state[time_now[3]][time_now[6]] - if self.status == 0: - self.resume() - self.unlimit() - elif self.status == 1: - self.resume() - elif self.status == 2: - self.pause() + if self.status == 0: + self.resume() + self.unlimit() + elif self.status == 1: + self.resume() + elif self.status == 2: + self.pause() - if self.status == 1: - self.limit() + if self.status == 1: + self.limit() - def pause(self): - self.config.set("max_active_torrents", 0) - self.core.apply_queue() + def pause(self): + self.config.set("max_active_torrents", 0) + self.core.apply_queue() - def resume(self): - self.config.set("max_active_torrents", -1) - self.core.apply_queue() + def resume(self): + self.config.set("max_active_torrents", self.globalactivetor) + self.core.apply_queue() - def limit(self): - self.config.set("max_download_speed", float(self.dllimit)) - self.config.set("max_upload_speed", float(self.ullimit)) + def limit(self): + self.config.set("max_download_speed", float(self.dllimit)) + self.config.set("max_upload_speed", float(self.ullimit)) - def unlimit(self): - self.interface.apply_prefs() + def unlimit(self): + self.config.set("max_download_speed", float(self.globaldlmax)) + self.config.set("max_upload_speed", float(self.globalulmax)) + self.interface.apply_prefs() - #Configuration dialog - def configure(self, window): - global scheduler_select + #Configuration dialog + def configure(self, window): + global scheduler_select - self.button_state_temp = copy.deepcopy(self.button_state) + self.button_state_temp = copy.deepcopy(self.button_state) - #dialog - dialog = gtk.Dialog("Scheduler Settings") - dialog.set_default_size(600, 270) + #dialog + dialog = gtk.Dialog("Scheduler Settings") + dialog.set_default_size(600, 270) - #buttons - cancel_button = dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) - ok_button = dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) - - #text - hover_text = gtk.Label() + #buttons + cancel_button = dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) + ok_button = dialog.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK) + + #text + hover_text = gtk.Label() - dllimit_label = gtk.Label("Limit download to:") - ullimit_label = gtk.Label("Limit upload to:") + dllimit_label = gtk.Label("Limit download to:") + ullimit_label = gtk.Label("Limit upload to:") - #Select Widget - drawing = scheduler_select(self.button_state_temp, hover_text, self.days) + #Select Widget + drawing = scheduler_select(self.button_state_temp, hover_text, self.days) - #boxes - vbox_main = gtk.VBox() - hbox_main = gtk.HBox() - vbox_sub = gtk.VBox() - hbox_limit = gtk.HBox() + #boxes + vbox_main = gtk.VBox() + hbox_main = gtk.HBox() + vbox_sub = gtk.VBox() + hbox_limit = gtk.HBox() - #seperator - sep = gtk.HSeparator() + #seperator + sep = gtk.HSeparator() - #spinbuttons + #spinbuttons - dlinput = gtk.SpinButton() - dlinput.set_numeric(True) - dlinput.set_range(-1, 2048) - dlinput.set_increments(1, 10) - dlinput.set_value(float(self.dllimit)) + dlinput = gtk.SpinButton() + dlinput.set_numeric(True) + dlinput.set_range(-1, 2048) + dlinput.set_increments(1, 10) + if self.dllimit != -1: + dlinput.set_value(float(self.dllimit)) + else: + dlinput.set_value(float(-1)) + ulinput = gtk.SpinButton() + ulinput.set_numeric(True) + ulinput.set_range(-1, 1024) + ulinput.set_increments(1, 10) + if self.ullimit != -1: + ulinput.set_value(float(self.ullimit)) + else: + ulinput.set_value(float(-1)) - ulinput = gtk.SpinButton() - ulinput.set_numeric(True) - ulinput.set_range(-1, 1024) - ulinput.set_increments(1, 10) - ulinput.set_value(float(self.ullimit)) + #pack + dialog.vbox.pack_start(vbox_main) - #pack - dialog.vbox.pack_start(vbox_main) + vbox_main.pack_start(hbox_main) + vbox_main.pack_start(hover_text, False, True, 5) + vbox_main.pack_start(sep, False, True) + vbox_main.pack_start(hbox_limit, False, True, 5) - vbox_main.pack_start(hbox_main) - vbox_main.pack_start(hover_text, False, True, 5) - vbox_main.pack_start(sep, False, True) - vbox_main.pack_start(hbox_limit, False, True, 5) + hbox_main.pack_start(vbox_sub, False, True, 5) + hbox_main.pack_start(drawing) - hbox_main.pack_start(vbox_sub, False, True, 5) - hbox_main.pack_start(drawing) + hbox_limit.pack_start(dllimit_label, True, False) + hbox_limit.pack_start(dlinput, True, False) + hbox_limit.pack_start(ullimit_label, True, False) + hbox_limit.pack_start(ulinput, True, False) - hbox_limit.pack_start(dllimit_label, True, False) - hbox_limit.pack_start(dlinput, True, False) - hbox_limit.pack_start(ullimit_label, True, False) - hbox_limit.pack_start(ulinput, True, False) + for index in xrange(len(self.days)): + vbox_sub.pack_start(gtk.Label(self.days[index])) - for index in xrange(len(self.days)): - vbox_sub.pack_start(gtk.Label(self.days[index])) + #show + dialog.show_all() - #show - dialog.show_all() + #Save config + if dialog.run() == -5: + self.status = -1 + self.button_state = copy.deepcopy(drawing.button_state) + if dlinput.get_value() != -1: + self.dllimit = float(dlinput.get_value()) + else: + self.dllimit = float(dlinput.get_value()) + if ulinput.get_value() != -1: + self.ullimit = float(ulinput.get_value()) + else: + self.ullimit = float(ulinput.get_value()) + self.interface.apply_prefs() - #Save config - if dialog.run() == -5: - self.status = -1 - self.button_state = copy.deepcopy(drawing.button_state) - self.dllimit = float(dlinput.get_value()) - self.ullimit = float(ulinput.get_value()) - self.interface.apply_prefs() + writer = open(self.conf_file, "wb") + pickle.dump([drawing.button_state,[self.dllimit, self.ullimit]], writer) + writer.close() - writer = open(self.conf_file, "wb") - pickle.dump([drawing.button_state,[self.dllimit,self.ullimit]], writer) - writer.close() - - dialog.destroy() + dialog.destroy() class scheduler_select(gtk.DrawingArea): - #connect signals - varaibles - def __init__(self, data, label, days): - gtk.DrawingArea.__init__(self) - self.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.LEAVE_NOTIFY_MASK) + #connect signals - varaibles + def __init__(self, data, label, days): + gtk.DrawingArea.__init__(self) + self.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.LEAVE_NOTIFY_MASK) - self.connect("expose_event", self.expose) - self.connect("button_press_event", self.mouse_down) - self.connect("button_release_event", self.mouse_up) - self.connect("motion_notify_event", self.mouse_hover) - self.connect("leave_notify_event", self.mouse_leave) + self.connect("expose_event", self.expose) + self.connect("button_press_event", self.mouse_down) + self.connect("button_release_event", self.mouse_up) + self.connect("motion_notify_event", self.mouse_hover) + self.connect("leave_notify_event", self.mouse_leave) - self.colors = [[115.0/255, 210.0/255, 22.0/255], [237.0/255, 212.0/255, 0.0/255], [204.0/255, 0.0/255, 0.0/255]] - self.button_state = data - self.button_state_temp = [[0] * 7 for dummy in xrange(24)] - self.start_point = [0,0] - self.hover_point = [-1,-1] - self.hover_label = label - self.hover_days = days - self.mouse_press = False + self.colors = [[115.0/255, 210.0/255, 22.0/255], [237.0/255, 212.0/255, 0.0/255], [204.0/255, 0.0/255, 0.0/255]] + self.button_state = data + self.button_state_temp = [[0] * 7 for dummy in xrange(24)] + self.start_point = [0,0] + self.hover_point = [-1,-1] + self.hover_label = label + self.hover_days = days + self.mouse_press = False - #redraw the whole thing - def expose(self, widget, event): - self.context = self.window.cairo_create() - self.context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height) - self.context.clip() + #redraw the whole thing + def expose(self, widget, event): + self.context = self.window.cairo_create() + self.context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height) + self.context.clip() - width = self.window.get_size()[0] - height = self.window.get_size()[1] + width = self.window.get_size()[0] + height = self.window.get_size()[1] - for y in xrange(7): - for x in xrange(24): - self.context.set_source_rgba(self.colors[self.button_state[x][y]][0], self.colors[self.button_state[x][y]][1], self.colors[self.button_state[x][y]][2], 0.7) - self.context.rectangle(width*(6*x/145.0+1/145.0), height*(6*y/43.0+1/43.0), 5*width/145.0, 5*height/43.0) - self.context.fill_preserve() - self.context.set_source_rgba(0.5, 0.5, 0.5, 0.5) - self.context.stroke() + for y in xrange(7): + for x in xrange(24): + self.context.set_source_rgba(self.colors[self.button_state[x][y]][0], self.colors[self.button_state[x][y]][1], self.colors[self.button_state[x][y]][2], 0.7) + self.context.rectangle(width*(6*x/145.0+1/145.0), height*(6*y/43.0+1/43.0), 5*width/145.0, 5*height/43.0) + self.context.fill_preserve() + self.context.set_source_rgba(0.5, 0.5, 0.5, 0.5) + self.context.stroke() - #coordinates --> which box - def get_point(self, event): - size = self.window.get_size() - x = int((event.x-size[0]*0.5/145.0)/(6*size[0]/145.0)) - y = int((event.y-size[1]*0.5/43.0)/(6*size[1]/43.0)) + #coordinates --> which box + def get_point(self, event): + size = self.window.get_size() + x = int((event.x-size[0]*0.5/145.0)/(6*size[0]/145.0)) + y = int((event.y-size[1]*0.5/43.0)/(6*size[1]/43.0)) - if x > 23: x = 23 - elif x < 0: x = 0 - if y > 6: y = 6 - elif y < 0: y = 0 + if x > 23: x = 23 + elif x < 0: x = 0 + if y > 6: y = 6 + elif y < 0: y = 0 - return [x,y] + return [x,y] - #mouse down - def mouse_down(self, widget, event): - self.mouse_press = True - self.start_point = self.get_point(event) - self.button_state_temp = copy.deepcopy(self.button_state) + #mouse down + def mouse_down(self, widget, event): + self.mouse_press = True + self.start_point = self.get_point(event) + self.button_state_temp = copy.deepcopy(self.button_state) - #if the same box -> change it - def mouse_up(self, widget, event): - self.mouse_press = False - end_point = self.get_point(event) + #if the same box -> change it + def mouse_up(self, widget, event): + self.mouse_press = False + end_point = self.get_point(event) - #change color on mouseclick depending on the button - if end_point[0] is self.start_point[0] and end_point[1] is self.start_point[1]: - if event.button == 1: - self.button_state[end_point[0]][end_point[1]] += 1 - if self.button_state[end_point[0]][end_point[1]] > 2: - self.button_state[end_point[0]][end_point[1]] = 0 - elif event.button == 3: - self.button_state[end_point[0]][end_point[1]] -= 1 - if self.button_state[end_point[0]][end_point[1]] < 0: - self.button_state[end_point[0]][end_point[1]] = 2 - self.queue_draw() - - #if box changed and mouse is pressed draw all boxes from start point to end point - #set hover text etc.. - def mouse_hover(self, widget, event): - if self.get_point(event) != self.hover_point: - self.hover_point = self.get_point(event) + #change color on mouseclick depending on the button + if end_point[0] is self.start_point[0] and end_point[1] is self.start_point[1]: + if event.button == 1: + self.button_state[end_point[0]][end_point[1]] += 1 + if self.button_state[end_point[0]][end_point[1]] > 2: + self.button_state[end_point[0]][end_point[1]] = 0 + elif event.button == 3: + self.button_state[end_point[0]][end_point[1]] -= 1 + if self.button_state[end_point[0]][end_point[1]] < 0: + self.button_state[end_point[0]][end_point[1]] = 2 + self.queue_draw() + + #if box changed and mouse is pressed draw all boxes from start point to end point + #set hover text etc.. + def mouse_hover(self, widget, event): + if self.get_point(event) != self.hover_point: + self.hover_point = self.get_point(event) - self.hover_label.set_text(self.hover_days[self.hover_point[1]] + " " + str(self.hover_point[0]) + ":00 - " + str(self.hover_point[0]) + ":59") + self.hover_label.set_text(self.hover_days[self.hover_point[1]] + " " + str(self.hover_point[0]) + ":00 - " + str(self.hover_point[0]) + ":59") - if self.mouse_press == True: - self.button_state = copy.deepcopy(self.button_state_temp) + if self.mouse_press == True: + self.button_state = copy.deepcopy(self.button_state_temp) - points = [[self.hover_point[0], self.start_point[0]], [self.hover_point[1], self.start_point[1]]] + points = [[self.hover_point[0], self.start_point[0]], [self.hover_point[1], self.start_point[1]]] - for x in xrange(min(points[0]), max(points[0])+1): - for y in xrange(min(points[1]), max(points[1])+1): - self.button_state[x][y] = self.button_state[self.start_point[0]][self.start_point[1]] + for x in xrange(min(points[0]), max(points[0])+1): + for y in xrange(min(points[1]), max(points[1])+1): + self.button_state[x][y] = self.button_state[self.start_point[0]][self.start_point[1]] - self.queue_draw() + self.queue_draw() - #clear hover text on mouse leave - def mouse_leave(self, widget, event): - self.hover_label.set_text("") - self.hover_point = [-1,-1] + #clear hover text on mouse leave + def mouse_leave(self, widget, event): + self.hover_label.set_text("") + self.hover_point = [-1,-1]