From ed1b2a50fadb542420a53e0f3d9949ae23be2d30 Mon Sep 17 00:00:00 2001 From: kbdserver Date: Thu, 11 Oct 2018 15:58:30 +0100 Subject: [PATCH] [Scheduler] Migrate plugin code to GTK3 - Added new svg icons for cleaner look. - Use widget get_allocated_width and get_allocated_height instead of window size. - Tweaked margins to fix spacing issues. - Removed yellow background from 'slow settings' and applied only to label. Co-authored-by: Calum Lind --- .../deluge/plugins/scheduler/data/green.png | Bin 792 -> 0 bytes .../deluge/plugins/scheduler/data/green.svg | 1 + .../deluge/plugins/scheduler/data/red.png | Bin 759 -> 0 bytes .../deluge/plugins/scheduler/data/red.svg | 1 + .../deluge/plugins/scheduler/data/yellow.png | Bin 770 -> 0 bytes .../deluge/plugins/scheduler/data/yellow.svg | 1 + .../deluge/plugins/scheduler/gtkui.py | 128 +++++++++--------- 7 files changed, 68 insertions(+), 63 deletions(-) delete mode 100644 deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.png create mode 100644 deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.svg delete mode 100644 deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.png create mode 100644 deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.svg delete mode 100644 deluge/plugins/Scheduler/deluge/plugins/scheduler/data/yellow.png create mode 100644 deluge/plugins/Scheduler/deluge/plugins/scheduler/data/yellow.svg diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.png b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.png deleted file mode 100644 index 3118c7430b770f32baf670fcde22328290acead1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 792 zcmV+z1LypSP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXPz z6bLy&>U=H$000kkMObu0Z*6U5Zgc=?WFTyBXK#kacewxn0)0tDK~y-)t&_`3RB;r? zKXd0c<2+z|T^Sul8`KyiN~zFICPbmDpjEU83319@i*{}6F9=eJaM7j~ZZZlhuz?~W z$sP!zHu;#;acsPH=g#Zi->*d}X1nUF4u|tS2fhyn`>KDavmNLKx`4>9aRQhCMuubY z$-VoIec(GTuX-gCZluOvkKbJZfKkYhGL}dzFHkhC!Qoi^>K_OChdQ5x4hFlA)OC{1 zCed>nY?tJ67~L z0D7XAS>683Z0aoq%cQZol^4^a6iur`0eU0hM$*|Ns^a2k?J4^D`tZBTiE1aP^wd)2 zt)r=`jY#ET1cG!nNhI6|(5nDlHU4_^+y-@lpX5Dy@QfSRZtjvR5va}sG*q^r`9kQq z4Ql-L09^_Y@w+R?TPEcmZ5J^1@HzKK?=e0;jx8*tlz3D>;qoYX%iK{YqU@DXaX66( zEW3m)ERYhU%{MBLFbbJynd)Ub{|zB+6bIPC;?}@j91aI^Kq3*? zvV>XOrcCu>6fyt_1(-+~O9VU`EBY*YZj+K-!j>h3w6R2Sw+C3!=LmQ-QpOU%gaV8t zmKUh@g(zBi-mktSWh`M7bc%KXTL^3+u!P0T`Xm{1jcQ+r#PR~bh;wReG1=N34(6Pj z$D6e_*1s>ZZY+|wviMv90MgkNX4YSm)aPlaY~j=DE4DVa2Zv+vp?|jW{|nRK#`y;c WIY(}I?utJE0000RZ diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.svg b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.svg new file mode 100644 index 000000000..ff3f5d6f3 --- /dev/null +++ b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/green.svg @@ -0,0 +1 @@ + diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.png b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.png deleted file mode 100644 index 90f532609384bd206181d546b89e053edf5c4fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 759 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXPz z6bK!D>6rfj000kkMObu0Z*6U5Zgc=?WFTyBXK#kacewxn0$fQ%K~y-)t&_h?TX7V{ zKkwz4M0tjU2)@B+j2)aFL`2OX#zj(BLE1?Nht_|fUHS*OxH#0};$ProX$FyyF0BNV zAekhINea;fBQYf8{rJ8PsiE4f?S%`M%Q^SLJ?Bb1i?dK@9@qrpz~rxX0Z0LdbLH~) z-|^Bj@<&yc-}rPLcO-&5G6I08*D>;Wn%OKZA@=9W<+pzfI17coXyfCFp+o|!Sj4JU z5v>*gvZ|tJ8cH}!JDH?fDkbO2<(B}i$IaUK_^ZL?WxAOR2!SgY#G~sdqoX*T4))z0 zR;7YB7Q@?Uym$@TL9_YUbruTEtFpZBUtg!2$>0hEP}kP5>vg&p7udJA__w!l`Tf{8 zH&~?-gYh`#`T6XI&zF>eO`on~6^lq74?~Fr@3*#a1%nJOE~1Q$p^S~;U0A>qje-zZ z#Uegk2iTN>xH}TTs#bANPctwz#cnFahn=1NaUI7&@_6vh%rG!9(Zfa}0C5?Zlt)Go ztrm)=^$EM_G++1j_;!2@mIXo}4G-hibwsQ6sL-VR!~}{0Lf~|}IHuWezgt=&xw_g{ zexqa!3qV#RSl2rvxnMgv(@5%oGiK?YJrK98bl7?+n= zx3@UmE*J(_){`2*$mM$2d>$Yr1BcCQ79|`;wA-|kNz6h4yV1bubZ~6Dm!?TOoyMwE zP{LuF*(|`J>!8{EvElP+o?30z8;fCHU145bAs!xZ1p-KtgmryQ=kydKm%|f{(m6Td p?*4v%u3Y}~&sP3_&-AzN{1ZduJY(EgK^_1A002ovPDHLkV1h<{RBZqN diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.svg b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.svg new file mode 100644 index 000000000..ccb082221 --- /dev/null +++ b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/red.svg @@ -0,0 +1 @@ + diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/yellow.png b/deluge/plugins/Scheduler/deluge/plugins/scheduler/data/yellow.png deleted file mode 100644 index 11146b996f51c4197f6c019bdce64c49e5c09fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770 zcmV+d1O5DoP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXPz z6bT;w`}hO^000kkMObu0Z*6U5Zgc=?WFTyBXK#kacewxn0%u7?K~y-)t&`776mb~F zKQlYCv+j=O=2k9?=g80bPY039!!v+i)m#L;>Ds% zkU_NVD(JHQ+C-goXLe@4-!3Xzx9T~)yu9!8zP!)-DEx-W;ie8?0O$eYd+7yW1{g`E zvL6rEE59{AHG}HCSVIejnLsll0C>&@j+G&|l*ZZ>L&;S3{vQOB!%eT7DjyW~2*KUv2KYWYmvMY)&eZ!%ZD#Q2lVG^(Mu_9Gd?)$70tg7Ur~wpgl7?|>*V|AQLJ5YQ3VEK4K0+5izuo=bu`KCJ9qK<>j<6bMh`Zi2Tv2K z>m(R%2Pr5Q7l}2r01T)=k6|Wo?L2{+^B87=(eW7`JbZlUyaGiv2!`A6hZ=G1JcgM7 z=uv^VW<(I4g#8e>cycTs=_aFf?Gnb2iSYnu%wxA!P*xkht^@z5rDE2gM$-OQpPts+oAs2Ec*} z%s5sCJrJd|^##vfIoLqT%8?kr-kL`bL~*PPz>Erv diff --git a/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py b/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py index 8aa68b345..b802aa666 100644 --- a/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py +++ b/deluge/plugins/Scheduler/deluge/plugins/scheduler/gtkui.py @@ -15,7 +15,7 @@ from __future__ import division, unicode_literals import logging -import gtk +from gi.repository import Gdk, Gtk import deluge.component as component from deluge.plugins.pluginbase import Gtk3PluginBase @@ -28,17 +28,17 @@ log = logging.getLogger(__name__) DAYS = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] -class SchedulerSelectWidget(gtk.DrawingArea): +class SchedulerSelectWidget(Gtk.DrawingArea): def __init__(self, hover): super(SchedulerSelectWidget, self).__init__() self.set_events( - gtk.gdk.BUTTON_PRESS_MASK - | gtk.gdk.BUTTON_RELEASE_MASK - | gtk.gdk.POINTER_MOTION_MASK - | gtk.gdk.LEAVE_NOTIFY_MASK + Gdk.EventMask.BUTTON_PRESS_MASK + | Gdk.EventMask.BUTTON_RELEASE_MASK + | Gdk.EventMask.POINTER_MOTION_MASK + | Gdk.EventMask.LEAVE_NOTIFY_MASK ) - self.connect('expose_event', self.expose) + self.connect('draw', self.draw) self.connect('button_press_event', self.mouse_down) self.connect('button_release_event', self.mouse_up) self.connect('motion_notify_event', self.mouse_hover) @@ -65,39 +65,37 @@ class SchedulerSelectWidget(gtk.DrawingArea): log.debug(self.button_state) # redraw the whole thing - def expose(self, widget, event): - context = self.window.cairo_create() - context.rectangle( - event.area.x, event.area.y, event.area.width, event.area.height - ) + def draw(self, widget, context): + width = widget.get_allocated_width() + height = widget.get_allocated_height() + context.rectangle(0, 0, width, height) context.clip() - width = self.window.get_size()[0] - height = self.window.get_size()[1] - for y in range(7): for x in range(24): 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, + 0.5, ) context.rectangle( width * (6 * x / 145 + 1 / 145), height * (6 * y / 43 + 1 / 43), - 5 * width / 145, + 6 * width / 145, 5 * height / 43, ) context.fill_preserve() - context.set_source_rgba(0.5, 0.5, 0.5, 0.5) + context.set_source_rgba(0, 0, 0, 0.7) + context.set_line_width(1) context.stroke() # coordinates --> which box def get_point(self, event): - size = self.window.get_size() - x = int((event.x - size[0] * 0.5 / 145) / (6 * size[0] / 145)) - y = int((event.y - size[1] * 0.5 / 43) / (6 * size[1] / 43)) + width = self.get_allocated_width() + height = self.get_allocated_height() + x = int((event.x - width * 0.5 / 145) / (6 * width / 145)) + y = int((event.y - height * 0.5 / 43) / (6 * height / 43)) if x > 23: x = 23 @@ -179,7 +177,7 @@ class GtkUI(Gtk3PluginBase): ) self.statusbar = component.get('StatusBar') self.status_item = self.statusbar.add_item( - image=get_resource('green.png'), + image=get_resource('green.svg'), text='', callback=self.on_status_item_clicked, tooltip='Scheduler', @@ -189,6 +187,8 @@ class GtkUI(Gtk3PluginBase): self.state = state self.on_scheduler_event(state) + self.on_show_prefs() + client.scheduler.get_state().addCallback(on_state_deferred) client.register_event_handler('SchedulerEvent', self.on_scheduler_event) @@ -237,7 +237,7 @@ class GtkUI(Gtk3PluginBase): def on_scheduler_event(self, state): self.state = state - self.status_item.set_image_from_file(get_resource(self.state.lower() + '.png')) + self.status_item.set_image_from_file(get_resource(self.state.lower() + '.svg')) if self.state == 'Yellow': # Prevent func calls in Statusbar if the config changes. self.statusbar.config_value_changed_dict.pop('max_download_speed', None) @@ -274,84 +274,86 @@ class GtkUI(Gtk3PluginBase): # Configuration dialog def create_prefs_page(self): # Select Widget - hover = gtk.Label() + hover = Gtk.Label() self.scheduler_select = SchedulerSelectWidget(hover) - vbox = gtk.VBox(False, 5) - hbox = gtk.HBox(False, 5) - vbox_days = gtk.VBox() + vbox = Gtk.VBox(False, 5) + hbox = Gtk.HBox(False, 5) + vbox_days = Gtk.VBox() for day in DAYS: - vbox_days.pack_start(gtk.Label(day)) - hbox.pack_start(vbox_days, False, False) - hbox.pack_start(self.scheduler_select, True, True) - frame = gtk.Frame() - label = gtk.Label() - label.set_markup('Schedule') + vbox_days.pack_start(Gtk.Label(day, xalign=0), True, False, 0) + hbox.pack_start(vbox_days, False, False, 15) + hbox.pack_start(self.scheduler_select, True, True, 0) + frame = Gtk.Frame() + label = Gtk.Label() + label.set_markup(_('Schedule')) frame.set_label_widget(label) - frame.set_shadow_type(gtk.SHADOW_NONE) + frame.set_shadow_type(Gtk.ShadowType.NONE) + frame.set_margin_left(15) frame.add(hbox) - vbox.pack_start(frame, True, True) - vbox.pack_start(hover) + vbox.pack_start(frame, False, False, 0) + vbox.pack_start(hover, False, False, 0) - table = gtk.Table(3, 4) + table = Gtk.Table(5, 2) + table.set_margin_left(15) - label = gtk.Label(_('Download Limit:')) + label = Gtk.Label(_('Download Limit:')) label.set_alignment(0.0, 0.6) - table.attach(label, 0, 1, 0, 1, gtk.FILL) - self.spin_download = gtk.SpinButton() + table.attach_defaults(label, 0, 1, 0, 1) + self.spin_download = Gtk.SpinButton() self.spin_download.set_numeric(True) self.spin_download.set_range(-1.0, 99999.0) self.spin_download.set_increments(1, 10) - table.attach(self.spin_download, 1, 2, 0, 1, gtk.FILL) + table.attach_defaults(self.spin_download, 1, 2, 0, 1) - label = gtk.Label(_('Upload Limit:')) + label = Gtk.Label(_('Upload Limit:')) label.set_alignment(0.0, 0.6) - table.attach(label, 0, 1, 1, 2, gtk.FILL) - self.spin_upload = gtk.SpinButton() + table.attach_defaults(label, 0, 1, 1, 2) + self.spin_upload = Gtk.SpinButton() self.spin_upload.set_numeric(True) self.spin_upload.set_range(-1.0, 99999.0) self.spin_upload.set_increments(1, 10) - table.attach(self.spin_upload, 1, 2, 1, 2, gtk.FILL) + table.attach_defaults(self.spin_upload, 1, 2, 1, 2) - label = gtk.Label(_('Active Torrents:')) + label = Gtk.Label(_('Active Torrents:')) label.set_alignment(0.0, 0.6) - table.attach(label, 2, 3, 0, 1, gtk.FILL) - self.spin_active = gtk.SpinButton() + table.attach_defaults(label, 0, 1, 2, 3) + self.spin_active = Gtk.SpinButton() self.spin_active.set_numeric(True) self.spin_active.set_range(-1, 9999) self.spin_active.set_increments(1, 10) - table.attach(self.spin_active, 3, 4, 0, 1, gtk.FILL) + table.attach_defaults(self.spin_active, 1, 2, 2, 3) - label = gtk.Label(_('Active Downloading:')) + label = Gtk.Label(_('Active Downloading:')) label.set_alignment(0.0, 0.6) - table.attach(label, 2, 3, 1, 2, gtk.FILL) - self.spin_active_down = gtk.SpinButton() + table.attach_defaults(label, 0, 1, 3, 4) + self.spin_active_down = Gtk.SpinButton() self.spin_active_down.set_numeric(True) self.spin_active_down.set_range(-1, 9999) self.spin_active_down.set_increments(1, 10) - table.attach(self.spin_active_down, 3, 4, 1, 2, gtk.FILL) + table.attach_defaults(self.spin_active_down, 1, 2, 3, 4) - label = gtk.Label(_('Active Seeding:')) + label = Gtk.Label(_('Active Seeding:')) label.set_alignment(0.0, 0.6) - table.attach(label, 2, 3, 2, 3, gtk.FILL) - self.spin_active_up = gtk.SpinButton() + table.attach_defaults(label, 0, 1, 4, 5) + self.spin_active_up = Gtk.SpinButton() self.spin_active_up.set_numeric(True) self.spin_active_up.set_range(-1, 9999) self.spin_active_up.set_increments(1, 10) - table.attach(self.spin_active_up, 3, 4, 2, 3, gtk.FILL) + table.attach_defaults(self.spin_active_up, 1, 2, 4, 5) - eventbox = gtk.EventBox() - eventbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#EDD400')) + eventbox = Gtk.EventBox() eventbox.add(table) - frame = gtk.Frame() - label = gtk.Label() + frame = Gtk.Frame() + label = Gtk.Label() label.set_markup(_('Slow Settings')) + label.modify_bg(Gtk.StateFlags.NORMAL, Gdk.color_parse('#EDD400')) frame.set_label_widget(label) - frame.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#CDB400')) + frame.set_margin_left(15) frame.set_border_width(2) frame.add(eventbox) - vbox.pack_start(frame, False, False) + vbox.pack_start(frame, False, False, 0) vbox.show_all() component.get('Preferences').add_page(_('Scheduler'), vbox)