Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions internal/player/glade/player.glade
Original file line number Diff line number Diff line change
Expand Up @@ -1291,6 +1291,21 @@
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToggleToolButton" id="SingleButton">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text" translatable="yes">Single mode</property>
<property name="action-name">app.player.toggle.single</property>
<property name="label" translatable="yes">Single</property>
<property name="use-underline">True</property>
<property name="icon-name">ymuse-repeat-1-symbolic</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToggleToolButton" id="ConsumeButton">
<property name="visible">True</property>
Expand Down
36 changes: 25 additions & 11 deletions internal/player/main-window.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ type MainWindow struct {
PlayPauseButton *gtk.ToolButton
RandomButton *gtk.ToggleToolButton
RepeatButton *gtk.ToggleToolButton
SingleButton *gtk.ToggleToolButton
ConsumeButton *gtk.ToggleToolButton
VolumeButton *gtk.VolumeButton
VolumeAdjustment *gtk.Adjustment
Expand Down Expand Up @@ -153,6 +154,7 @@ type MainWindow struct {
aPlayerSeekForward *glib.SimpleAction
aPlayerRandom *glib.SimpleAction
aPlayerRepeat *glib.SimpleAction
aPlayerSingle *glib.SimpleAction
aPlayerConsume *glib.SimpleAction

// Colours
Expand Down Expand Up @@ -1066,6 +1068,7 @@ func (w *MainWindow) initPlayerWidgets() {
// NB convert to stateful actions once Gotk3 supporting GVariant is released
w.aPlayerRandom = w.addAction("player.toggle.random", "<Ctrl>U", w.playerToggleRandom)
w.aPlayerRepeat = w.addAction("player.toggle.repeat", "<Ctrl>R", w.playerToggleRepeat)
w.aPlayerSingle = w.addAction("player.toggle.single", "", w.playerToggleSingle)
w.aPlayerConsume = w.addAction("player.toggle.consume", "<Ctrl>N", w.playerToggleConsume)
}

Expand Down Expand Up @@ -1382,26 +1385,40 @@ func (w *MainWindow) playerToggleRandom() {
w.errCheckDialog(err, glib.Local("Failed to toggle random mode"))
}

// playerToggleRepeat toggles player's repeat/single modes
// playerToggleRepeat toggles player's repeat mode
func (w *MainWindow) playerToggleRepeat() {
// Ignore if the state of the button is being updated programmatically
if w.optionsUpdating {
return
}

// Toggle Repeat and Single in the following pattern: No repeat → Repeat all → Repeat single
var err error
w.connector.IfConnected(func(client *mpd.Client) {
status := w.connector.Status()
repeat := status["repeat"] != "0"
err = client.Repeat(!repeat)
})

// Check for error
w.errCheckDialog(err, glib.Local("Failed to toggle repeat mode"))
}

// playerToggleSingle toggles player's single mode
func (w *MainWindow) playerToggleSingle() {
// Ignore if the state of the button is being updated programmatically
if w.optionsUpdating {
return
}

var err error
w.connector.IfConnected(func(client *mpd.Client) {
status := w.connector.Status()
single := status["single"] != "0"
if err = client.Repeat(!repeat || !single); err == nil {
err = client.Single(repeat && !single)
}
err = client.Single(!single)
})

// Check for error
w.errCheckDialog(err, glib.Local("Failed to toggle repeat/single mode"))
w.errCheckDialog(err, glib.Local("Failed to toggle single mode"))
}

// queueClear empties MPD's play queue
Expand Down Expand Up @@ -2228,11 +2245,7 @@ func (w *MainWindow) updateOptions() {
repeat, single := status["repeat"] == "1", status["single"] == "1"
w.RandomButton.SetActive(status["random"] == "1")
w.RepeatButton.SetActive(repeat)
if repeat && single {
w.RepeatButton.SetIconName("ymuse-repeat-1-symbolic")
} else {
w.RepeatButton.SetIconName("ymuse-repeat-symbolic")
}
w.SingleButton.SetActive(single)
w.ConsumeButton.SetActive(status["consume"] == "1")
w.optionsUpdating = false
}
Expand Down Expand Up @@ -2321,6 +2334,7 @@ func (w *MainWindow) updatePlayer() {
w.aPlayerSeekForward.SetEnabled(playing)
w.aPlayerRandom.SetEnabled(connected)
w.aPlayerRepeat.SetEnabled(connected)
w.aPlayerSingle.SetEnabled(connected)
w.aPlayerConsume.SetEnabled(connected)

// Update the seek bar
Expand Down