reworked SeekBar

This commit is contained in:
Martin Wagner
2020-09-18 22:28:51 +02:00
parent dd5cb4f4fa
commit 96b6490855

View File

@@ -3154,7 +3154,6 @@ class SeekBar(Gtk.Box):
# adding vars # adding vars
self._client=client self._client=client
self._seek_time="10" # seek increment in seconds
self._update=True self._update=True
self._jumped=False self._jumped=False
@@ -3162,11 +3161,17 @@ class SeekBar(Gtk.Box):
self._elapsed=Gtk.Label(width_chars=5) self._elapsed=Gtk.Label(width_chars=5)
self._rest=Gtk.Label(width_chars=6) self._rest=Gtk.Label(width_chars=6)
# event boxes
self._elapsed_event_box=Gtk.EventBox()
self._rest_event_box=Gtk.EventBox()
# progress bar # progress bar
self.scale=Gtk.Scale.new_with_range(orientation=Gtk.Orientation.HORIZONTAL, min=0, max=100, step=0.001) self.scale=Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL)
self.scale.set_show_fill_level(True) self.scale.set_show_fill_level(True)
self.scale.set_restrict_to_fill_level(False) self.scale.set_restrict_to_fill_level(False)
self.scale.set_draw_value(False) self.scale.set_draw_value(False)
self.scale.set_increments(10, 60)
self._adjustment=self.scale.get_adjustment()
# css (scale) # css (scale)
style_context=self.scale.get_style_context() style_context=self.scale.get_style_context()
@@ -3175,19 +3180,16 @@ class SeekBar(Gtk.Box):
provider.load_from_data(css) provider.load_from_data(css)
style_context.add_provider(provider, 800) style_context.add_provider(provider, 800)
# event boxes
self._elapsed_event_box=Gtk.EventBox()
self._rest_event_box=Gtk.EventBox()
# connect # connect
self._elapsed_event_box.connect("button-press-event", self._on_elapsed_button_press_event) self._elapsed_event_box.connect("button-release-event", self._on_elapsed_button_release_event)
self._rest_event_box.connect("button-press-event", self._on_rest_button_press_event) self._elapsed_event_box.connect("button-press-event", lambda *args: self.scale.grab_focus())
self._rest_event_box.connect("button-release-event", self._on_rest_button_release_event)
self._rest_event_box.connect("button-press-event", lambda *args: self.scale.grab_focus())
self.scale.connect("change-value", self._on_change_value) self.scale.connect("change-value", self._on_change_value)
self.scale.connect("scroll-event", self._dummy) # disable mouse wheel self.scale.connect("scroll-event", lambda *args: True) # disable mouse wheel
self.scale.connect("button-press-event", self._on_scale_button_press_event) self.scale.connect("button-press-event", self._on_scale_button_press_event)
self.scale.connect("button-release-event", self._on_scale_button_release_event) self.scale.connect("button-release-event", self._on_scale_button_release_event)
self._client.emitter.connect("disconnected", self._on_disconnected) self._client.emitter.connect("disconnected", self._disable)
self._client.emitter.connect("reconnected", self._on_reconnected)
self._client.emitter.connect("state", self._on_state) self._client.emitter.connect("state", self._on_state)
self._client.emitter.connect("elapsed_changed", self._refresh) self._client.emitter.connect("elapsed_changed", self._refresh)
@@ -3198,35 +3200,23 @@ class SeekBar(Gtk.Box):
self.pack_start(self.scale, True, True, 0) self.pack_start(self.scale, True, True, 0)
self.pack_end(self._rest_event_box, False, False, 0) self.pack_end(self._rest_event_box, False, False, 0)
def _dummy(self, *args):
return True
def seek_forward(self):
self._client.wrapped_call("seekcur", "+"+self._seek_time)
def seek_backward(self):
self._client.wrapped_call("seekcur", "-"+self._seek_time)
def _refresh(self, emitter, elapsed, duration): def _refresh(self, emitter, elapsed, duration):
self.set_sensitive(True)
if elapsed > duration: # fix display error if elapsed > duration: # fix display error
elapsed=duration elapsed=duration
fraction=(elapsed/duration)*100 self._adjustment.set_upper(int(duration))
if self._update: if self._update:
self.scale.set_value(fraction) self.scale.set_value(elapsed)
self._elapsed.set_text(str(datetime.timedelta(seconds=int(elapsed))).lstrip("0").lstrip(":")) self._elapsed.set_text(str(datetime.timedelta(seconds=int(elapsed))).lstrip("0").lstrip(":"))
self._rest.set_text("-"+str(datetime.timedelta(seconds=int(duration-elapsed))).lstrip("0").lstrip(":")) self._rest.set_text("-"+str(datetime.timedelta(seconds=int(duration-elapsed))).lstrip("0").lstrip(":"))
self.scale.set_fill_level(fraction) self.scale.set_fill_level(elapsed)
def _enable(self, *args):
self.scale.set_range(0, 100)
self.set_sensitive(True)
def _disable(self, *args): def _disable(self, *args):
self.set_sensitive(False) self.set_sensitive(False)
self.scale.set_fill_level(0) self.scale.set_fill_level(0)
self.scale.set_range(0, 0) self.scale.set_range(0, 0)
self._elapsed.set_text("00:00") self._elapsed.set_text("--:--")
self._rest.set_text("-00:00") self._rest.set_text("--:--")
def _on_scale_button_press_event(self, widget, event): def _on_scale_button_press_event(self, widget, event):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS: if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS:
@@ -3239,55 +3229,42 @@ class SeekBar(Gtk.Box):
if event.button == 1: if event.button == 1:
self._update=True self._update=True
self.scale.set_has_origin(True) self.scale.set_has_origin(True)
status=self._client.wrapped_call("status")
if self._jumped: # actual seek if self._jumped: # actual seek
duration=float(status["duration"]) self._client.wrapped_call("seekcur", self.scale.get_value())
factor=(self.scale.get_value()/100)
pos=(duration*factor)
self._client.wrapped_call("seekcur", pos)
self._jumped=False self._jumped=False
else: else: # restore state
status=self._client.wrapped_call("status")
self._refresh(None, float(status["elapsed"]), float(status["duration"])) self._refresh(None, float(status["elapsed"]), float(status["duration"]))
def _on_change_value(self, range, scroll, value): # value is inaccurate def _on_change_value(self, range, scroll, value): # value is inaccurate (can be above upper limit)
if scroll == Gtk.ScrollType.STEP_BACKWARD: if (scroll == Gtk.ScrollType.STEP_BACKWARD or scroll == Gtk.ScrollType.STEP_FORWARD or
self.seek_backward() scroll == Gtk.ScrollType.PAGE_BACKWARD or scroll == Gtk.ScrollType.PAGE_FORWARD):
elif scroll == Gtk.ScrollType.STEP_FORWARD: self._client.wrapped_call("seekcur", value)
self.seek_forward()
elif scroll == Gtk.ScrollType.JUMP: elif scroll == Gtk.ScrollType.JUMP:
status=self._client.wrapped_call("status") duration=self._adjustment.get_upper()
duration=float(status["duration"]) if value > duration: # fix display error
factor=(value/100) elapsed=duration
if factor > 1: # fix display error else:
factor=1 elapsed=value
elapsed=(factor*duration)
self._elapsed.set_text(str(datetime.timedelta(seconds=int(elapsed))).lstrip("0").lstrip(":")) self._elapsed.set_text(str(datetime.timedelta(seconds=int(elapsed))).lstrip("0").lstrip(":"))
self._rest.set_text("-"+str(datetime.timedelta(seconds=int(duration-elapsed))).lstrip("0").lstrip(":")) self._rest.set_text("-"+str(datetime.timedelta(seconds=int(duration-elapsed))).lstrip("0").lstrip(":"))
self._jumped=True self._jumped=True
def _on_elapsed_button_press_event(self, widget, event): def _on_elapsed_button_release_event(self, widget, event):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS: if event.button == 1:
self.seek_backward() self._client.wrapped_call("seekcur", "-"+str(self._adjustment.get_property("step-increment")))
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS: elif event.button == 3:
self.seek_forward() self._client.wrapped_call("seekcur", "+"+str(self._adjustment.get_property("step-increment")))
def _on_rest_button_press_event(self, widget, event): def _on_rest_button_release_event(self, widget, event):
if event.button == 1 and event.type == Gdk.EventType.BUTTON_PRESS: if event.button == 1:
self.seek_forward() self._client.wrapped_call("seekcur", "+"+str(self._adjustment.get_property("step-increment")))
elif event.button == 3 and event.type == Gdk.EventType.BUTTON_PRESS: elif event.button == 3:
self.seek_backward() self._client.wrapped_call("seekcur", "-"+str(self._adjustment.get_property("step-increment")))
def _on_state(self, emitter, state): def _on_state(self, emitter, state):
if state == "stop": if state == "stop":
self._disable() self._disable()
else:
self._enable()
def _on_reconnected(self, *args):
self._enable()
def _on_disconnected(self, *args):
self._disable()
class PlaybackOptions(Gtk.Box): class PlaybackOptions(Gtk.Box):
def __init__(self, client, settings): def __init__(self, client, settings):
@@ -3733,11 +3710,11 @@ class MainWindow(Gtk.ApplicationWindow):
def _on_seek_forward(self, action, param): def _on_seek_forward(self, action, param):
self._seek_bar.scale.grab_focus() self._seek_bar.scale.grab_focus()
self._seek_bar.seek_forward() self._client.wrapped_call("seekcur", "+10")
def _on_seek_backward(self, action, param): def _on_seek_backward(self, action, param):
self._seek_bar.scale.grab_focus() self._seek_bar.scale.grab_focus()
self._seek_bar.seek_backward() self._client.wrapped_call("seekcur", "-10")
def _on_toggle_search(self, action, param): def _on_toggle_search(self, action, param):
self._browser.search_button.grab_focus() self._browser.search_button.grab_focus()