ektoplayer 0.1.6 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +26 -12
- data/lib/ektoplayer/application.rb +6 -5
- data/lib/ektoplayer/bindings.rb +61 -55
- data/lib/ektoplayer/common.rb +19 -6
- data/lib/ektoplayer/compat.rb +3 -3
- data/lib/ektoplayer/config.rb +1 -11
- data/lib/ektoplayer/controllers/browser.rb +7 -5
- data/lib/ektoplayer/controllers/help.rb +1 -1
- data/lib/ektoplayer/controllers/info.rb +1 -1
- data/lib/ektoplayer/controllers/playlist.rb +24 -12
- data/lib/ektoplayer/icurses.rb +21 -0
- data/lib/ektoplayer/icurses/curses.rb +53 -0
- data/lib/ektoplayer/icurses/ffi_ncurses.rb +69 -0
- data/lib/ektoplayer/icurses/ncurses.rb +79 -0
- data/lib/ektoplayer/icurses/ncursesw.rb +1 -0
- data/lib/ektoplayer/icurses/sugar.rb +65 -0
- data/lib/ektoplayer/icurses/test.rb +99 -0
- data/lib/ektoplayer/models/player.rb +2 -2
- data/lib/ektoplayer/{mp3player.rb → players/mpg_portaudio_player.rb} +3 -3
- data/lib/ektoplayer/players/mpg_wrapper_player.rb +107 -0
- data/lib/ektoplayer/theme.rb +1 -6
- data/lib/ektoplayer/ui.rb +100 -129
- data/lib/ektoplayer/ui/colors.rb +14 -14
- data/lib/ektoplayer/ui/widgets.rb +4 -4
- data/lib/ektoplayer/ui/widgets/labelwidget.rb +1 -1
- data/lib/ektoplayer/ui/widgets/listwidget.rb +115 -46
- data/lib/ektoplayer/views/help.rb +7 -10
- data/lib/ektoplayer/views/info.rb +29 -38
- data/lib/ektoplayer/views/mainwindow.rb +2 -5
- data/lib/ektoplayer/views/playinginfo.rb +15 -20
- data/lib/ektoplayer/views/progressbar.rb +30 -10
- data/lib/ektoplayer/views/splash.rb +24 -25
- data/lib/ektoplayer/views/tabbar.rb +6 -5
- data/lib/ektoplayer/views/trackrenderer.rb +20 -14
- metadata +15 -47
- data/lib/ektoplayer/views/volumemeter.rb +0 -76
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54b54fea7b6eb4691e5c49ddddd3b9d46df9a591
|
4
|
+
data.tar.gz: 82b7a0d329781ac90e61671a7e89c5b3cf7002c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2015220c85d70a99d0c1c1fddc255781e19c1eba905a185371e1c465d08d4c31f1c300de772bd9cbf2ffc61683443a4cad3eda426ed6de91acc83ffc0b930806
|
7
|
+
data.tar.gz: a35820777f4373bd8587bd61fa56d66ed2b02483c49ee3ab2f671b4448cadb700ab7a8da4683d1f4874f101d18da58e1bc4dc9ec78d7dcd5ffb8e7a8282ebcd3
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@ It allows you to
|
|
6
6
|
* Search for tracks by tags (artist, album, style, ...)
|
7
7
|
* Play tracks located at ektoplazm.com
|
8
8
|
* Display information about albums
|
9
|
-
* Download
|
9
|
+
* Download whole albums as mp3
|
10
10
|
|
11
11
|
## Features
|
12
12
|
|
@@ -26,29 +26,44 @@ It allows you to
|
|
26
26
|
## Requirements
|
27
27
|
|
28
28
|
* Ruby (1.9)
|
29
|
-
* Portaudio (19)
|
30
29
|
* Mpg123 (1.14)
|
31
|
-
* LibZip
|
32
30
|
* Sqlite3
|
31
|
+
* One of the following ncurses gems: curses, ffi-ncurses, ncurses, ncuresw
|
33
32
|
|
34
|
-
##
|
33
|
+
## Optional Requirements
|
34
|
+
|
35
|
+
* For extracting album archives either `unzip`, `7z` or the Gem `RubyZip` is needed
|
35
36
|
|
36
|
-
|
37
|
-
library to compile the native extensions.
|
37
|
+
## Installation
|
38
38
|
|
39
39
|
### Arch Linux
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
* Using yaourt:
|
42
|
+
`yaourt -S ektoplayer`
|
43
|
+
|
44
|
+
* Using pacman:
|
45
|
+
`pacman -S ruby mpg123 sqlite3 ncurses --needed`
|
46
|
+
`gem install ektoplayer`
|
43
47
|
|
44
48
|
### Debian / Ubuntu (not yet tested)
|
45
49
|
|
46
|
-
apt-get install ruby ruby-
|
47
|
-
gem install ektoplayer
|
50
|
+
`apt-get install ruby ruby-ncurses ruby-nokogiri ruby-sqlite3 mpg123 sqlite3 libncurses5`
|
51
|
+
`gem install ektoplayer`
|
48
52
|
|
49
53
|
## Configuration
|
50
54
|
|
51
|
-
|
55
|
+
Ektplayer keeps it's default configuration file under `~/.config/ektoplayer/ektoplayer.rc`.
|
56
|
+
|
57
|
+
Available configuration commands:
|
58
|
+
* `set <option> <value>`
|
59
|
+
* `bind <window> <key> <command>`
|
60
|
+
* `undbind <window> <key>`
|
61
|
+
* `unbind_all`
|
62
|
+
* `color <name> <fg> [<bg> [<attribute> ...]]`
|
63
|
+
* `color_mono <name> <fg> [<bg> [<attribute> ...]]`
|
64
|
+
* `color_256 <name> <fg> [<bg> [<attribute> ...]]`
|
65
|
+
|
66
|
+
See [ektoplayer.rc](https://github.com/braph/ektoplayer/blob/master/doc/ektoplayer.rc) for a configuration file with the default values.
|
52
67
|
|
53
68
|
## Authors
|
54
69
|
|
@@ -57,4 +72,3 @@ Have a look at the default [ektoplayer.rc](https://github.com/braph/ektoplayer/b
|
|
57
72
|
## See also
|
58
73
|
|
59
74
|
* Ektoplayer was inspired by [Soundcloud2000](https://github.com/grobie/soundcloud2000) and [ncmpcpp](https://github.com/arybczak/ncmpcpp)
|
60
|
-
* It uses [Audite](https://github.com/georgi/audite) as playback engine and [Nokogiri](http://www.nokogiri.org/) for parsing HTML
|
@@ -10,7 +10,7 @@ require 'date'
|
|
10
10
|
|
11
11
|
module Ektoplayer
|
12
12
|
class Application
|
13
|
-
VERSION = '0.1.
|
13
|
+
VERSION = '0.1.11'.freeze
|
14
14
|
GITHUB_URL = 'https://github.com/braph/ektoplayer'.freeze
|
15
15
|
EKTOPLAZM_URL = 'http://www.ektoplazm.com'.freeze
|
16
16
|
|
@@ -35,7 +35,7 @@ module Ektoplayer
|
|
35
35
|
|
36
36
|
def run
|
37
37
|
#Thread.abort_on_exception=(true)
|
38
|
-
Thread.report_on_exception=(true) if Thread.
|
38
|
+
Thread.report_on_exception=(true) if Thread.respond_to? :report_on_exception
|
39
39
|
|
40
40
|
# make each configuration object globally accessible as a singleton
|
41
41
|
[Config, Bindings, Theme].each { |c| Common::mksingleton(c) }
|
@@ -69,8 +69,10 @@ module Ektoplayer
|
|
69
69
|
end
|
70
70
|
|
71
71
|
UI::Canvas.run do
|
72
|
+
Application.log(self, 'running with ncurses interface:', $USING_CURSES)
|
73
|
+
|
72
74
|
if Config[:use_colors] == :auto
|
73
|
-
Theme.use_colors(
|
75
|
+
Theme.use_colors(ICurses.colors >= 256 ? 256 : 8)
|
74
76
|
else
|
75
77
|
Theme.use_colors(Config[:use_colors])
|
76
78
|
end
|
@@ -89,7 +91,7 @@ module Ektoplayer
|
|
89
91
|
operations.register(:quit, &method(:exit))
|
90
92
|
operations.register(:reload, &browser.method(:reload))
|
91
93
|
operations.register(:update, &database.method(:update))
|
92
|
-
operations.register(:refresh) { UI::Canvas.
|
94
|
+
operations.register(:refresh) { UI::Canvas.update_screen(true, true) }
|
93
95
|
Operations::Player.new(operations, player)
|
94
96
|
Operations::Browser.new(operations, browser, playlist)
|
95
97
|
Operations::Playlist.new(operations, playlist, player, trackloader)
|
@@ -110,7 +112,6 @@ module Ektoplayer
|
|
110
112
|
Controllers::Help.new(main_w.help, view_ops)
|
111
113
|
Controllers::Info.new(main_w.info, player, playlist, trackloader, database, view_ops)
|
112
114
|
main_w.progressbar.attach(player)
|
113
|
-
main_w.volumemeter.attach(player)
|
114
115
|
main_w.playinginfo.attach(playlist, player)
|
115
116
|
|
116
117
|
# ... events ...
|
data/lib/ektoplayer/bindings.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'set'
|
2
|
-
|
2
|
+
require_relative 'icurses'
|
3
3
|
|
4
4
|
module Ektoplayer
|
5
5
|
# Keybinding storage.
|
@@ -21,10 +21,10 @@ module Ektoplayer
|
|
21
21
|
def initialize
|
22
22
|
@commands = {}
|
23
23
|
|
24
|
-
reg 'quit',
|
25
|
-
reg 'refresh',
|
26
|
-
reg 'reload',
|
27
|
-
reg 'update',
|
24
|
+
reg 'quit', 'Quit the program'
|
25
|
+
reg 'refresh', 'Refresh the screen'
|
26
|
+
reg 'reload', 'Apply database changes to browser'
|
27
|
+
reg 'update', 'Start a database update'
|
28
28
|
|
29
29
|
reg 'player.stop', 'Stop playing'
|
30
30
|
reg 'player.toggle', 'Toggle play/pause'
|
@@ -40,7 +40,6 @@ module Ektoplayer
|
|
40
40
|
|
41
41
|
reg 'playinginfo.toggle', 'Toggle playinginfo visibility'
|
42
42
|
reg 'progressbar.toggle', 'Toggle progressbar visibility'
|
43
|
-
reg 'volumemeter.toggle', 'Toggle volumemeter visibility'
|
44
43
|
reg 'tabbar.toggle', 'Toggle tabbar visibility'
|
45
44
|
|
46
45
|
reg 'playlist.goto_current', 'Go to current playing track'
|
@@ -64,7 +63,8 @@ module Ektoplayer
|
|
64
63
|
end
|
65
64
|
|
66
65
|
{ search_up: 'Start search upwards', search_next: 'Goto next search result',
|
67
|
-
search_down: 'Start search downwards', search_prev: 'Goto previous search result'
|
66
|
+
search_down: 'Start search downwards', search_prev: 'Goto previous search result',
|
67
|
+
toggle_selection: 'Toggle multi line selection',
|
68
68
|
}.each do |cmd, desc|
|
69
69
|
%w(browser playlist).each { |w| reg("#{w}.#{cmd}", desc) }
|
70
70
|
end
|
@@ -75,22 +75,21 @@ module Ektoplayer
|
|
75
75
|
:'playlist.show' => [?1 ],
|
76
76
|
:'browser.show' => [?2 ],
|
77
77
|
:'info.show' => [?3 ],
|
78
|
-
:'help.show' => [?4,
|
78
|
+
:'help.show' => [?4, ICurses::KEY_F1 ],
|
79
79
|
|
80
|
-
:'playinginfo.toggle' => [?!,
|
81
|
-
:'progressbar.toggle' => [?%,
|
82
|
-
:'tabbar.toggle' => [?=,
|
83
|
-
:'volumemeter.toggle' => [?~, Curses::KEY_F5 ],
|
80
|
+
:'playinginfo.toggle' => [?!, ICurses::KEY_F2 ],
|
81
|
+
:'progressbar.toggle' => [?%, ICurses::KEY_F3 ],
|
82
|
+
:'tabbar.toggle' => [?=, ICurses::KEY_F4 ],
|
84
83
|
|
85
|
-
:'player.forward' => [?f,
|
86
|
-
:'player.backward' => [?b,
|
84
|
+
:'player.forward' => [?f, ICurses::KEY_RIGHT ],
|
85
|
+
:'player.backward' => [?b, ICurses::KEY_LEFT ],
|
87
86
|
:'player.stop' => [?s ],
|
88
87
|
:'player.toggle' => [?p ],
|
89
88
|
|
90
89
|
:'playlist.play_next' => [?> ],
|
91
90
|
:'playlist.play_prev' => [?< ],
|
92
91
|
|
93
|
-
:'tabs.next' => [?l, ?},
|
92
|
+
:'tabs.next' => [?l, ?}, '^i' ],
|
94
93
|
:'tabs.prev' => [?h, ?{, 353 ],
|
95
94
|
|
96
95
|
:quit => [?q ],
|
@@ -99,19 +98,21 @@ module Ektoplayer
|
|
99
98
|
:update => [?U ]},
|
100
99
|
playlist: {
|
101
100
|
# movement
|
102
|
-
:'playlist.top' => [?g,
|
103
|
-
:'playlist.bottom' => [?G,
|
104
|
-
:'playlist.up' => [?k,
|
105
|
-
:'playlist.down' => [?j,
|
106
|
-
:'playlist.page_down' => ['^d',
|
107
|
-
:'playlist.page_up' => ['^u',
|
101
|
+
:'playlist.top' => [?g, ICurses::KEY_HOME ],
|
102
|
+
:'playlist.bottom' => [?G, ICurses::KEY_END ],
|
103
|
+
:'playlist.up' => [?k, ICurses::KEY_UP ],
|
104
|
+
:'playlist.down' => [?j, ICurses::KEY_DOWN ],
|
105
|
+
:'playlist.page_down' => ['^d', ICurses::KEY_NPAGE ],
|
106
|
+
:'playlist.page_up' => ['^u', ICurses::KEY_PPAGE ],
|
107
|
+
# selection
|
108
|
+
:'playlist.toggle_selection' => ['^v' ],
|
108
109
|
# search
|
109
110
|
:'playlist.search_next' => [?n ],
|
110
111
|
:'playlist.search_prev' => [?N ],
|
111
112
|
:'playlist.search_up' => [?? ],
|
112
113
|
:'playlist.search_down' => [?/ ],
|
113
114
|
# playlist
|
114
|
-
:'playlist.play' => [
|
115
|
+
:'playlist.play' => [ ICurses::KEY_ENTER ],
|
115
116
|
:'playlist.download_album' => [?$ ],
|
116
117
|
:'playlist.reload' => [?r ],
|
117
118
|
:'playlist.goto_current' => [?o ],
|
@@ -121,12 +122,14 @@ module Ektoplayer
|
|
121
122
|
:'player.toggle' => [' ' ]},
|
122
123
|
browser: {
|
123
124
|
# movement
|
124
|
-
:'browser.top' => [?g,
|
125
|
-
:'browser.bottom' => [?G,
|
126
|
-
:'browser.up' => [?k,
|
127
|
-
:'browser.down' => [?j,
|
128
|
-
:'browser.page_up' => ['^u',
|
129
|
-
:'browser.page_down' => ['^d',
|
125
|
+
:'browser.top' => [?g, ICurses::KEY_HOME ],
|
126
|
+
:'browser.bottom' => [?G, ICurses::KEY_END ],
|
127
|
+
:'browser.up' => [?k, ICurses::KEY_UP ],
|
128
|
+
:'browser.down' => [?j, ICurses::KEY_DOWN ],
|
129
|
+
:'browser.page_up' => ['^u', ICurses::KEY_PPAGE ],
|
130
|
+
:'browser.page_down' => ['^d', ICurses::KEY_NPAGE ],
|
131
|
+
# selection
|
132
|
+
:'browser.toggle_selection' => ['^v' ],
|
130
133
|
# search
|
131
134
|
:'browser.search_next' => [?n ],
|
132
135
|
:'browser.search_prev' => [?N ],
|
@@ -134,22 +137,22 @@ module Ektoplayer
|
|
134
137
|
:'browser.search_down' => [?/ ],
|
135
138
|
# browser
|
136
139
|
:'browser.add_to_playlist' => [' ', ?a ],
|
137
|
-
:'browser.enter' => [
|
138
|
-
:'browser.back' => [?B,
|
140
|
+
:'browser.enter' => [ ICurses::KEY_ENTER ],
|
141
|
+
:'browser.back' => [?B, ICurses::KEY_BACKSPACE ]},
|
139
142
|
help: {
|
140
|
-
:'help.top' => [?g,
|
141
|
-
:'help.bottom' => [?G,
|
142
|
-
:'help.up' => [?k,
|
143
|
-
:'help.down' => [?j,
|
144
|
-
:'help.page_up' => ['^u',
|
145
|
-
:'help.page_down' => ['^d',
|
143
|
+
:'help.top' => [?g, ICurses::KEY_HOME ],
|
144
|
+
:'help.bottom' => [?G, ICurses::KEY_END ],
|
145
|
+
:'help.up' => [?k, ICurses::KEY_UP ],
|
146
|
+
:'help.down' => [?j, ICurses::KEY_DOWN ],
|
147
|
+
:'help.page_up' => ['^u', ICurses::KEY_PPAGE ],
|
148
|
+
:'help.page_down' => ['^d', ICurses::KEY_NPAGE ]},
|
146
149
|
info: {
|
147
|
-
:'info.top' => [?g,
|
148
|
-
:'info.bottom' => [?G,
|
149
|
-
:'info.up' => [?k,
|
150
|
-
:'info.down' => [?j,
|
151
|
-
:'info.page_up' => ['^u',
|
152
|
-
:'info.page_down' => ['^d',
|
150
|
+
:'info.top' => [?g, ICurses::KEY_HOME ],
|
151
|
+
:'info.bottom' => [?G, ICurses::KEY_END ],
|
152
|
+
:'info.up' => [?k, ICurses::KEY_UP ],
|
153
|
+
:'info.down' => [?j, ICurses::KEY_DOWN ],
|
154
|
+
:'info.page_up' => ['^u', ICurses::KEY_PPAGE ],
|
155
|
+
:'info.page_down' => ['^d', ICurses::KEY_NPAGE ]},
|
153
156
|
splash: {}
|
154
157
|
}
|
155
158
|
|
@@ -163,30 +166,33 @@ module Ektoplayer
|
|
163
166
|
end
|
164
167
|
|
165
168
|
def keyname(key)
|
166
|
-
return 'SPACE' if key
|
167
|
-
return key.to_s if key.is_a? Symbol
|
169
|
+
return 'SPACE' if (key == ' ' or key == 32)
|
168
170
|
|
169
|
-
name =
|
171
|
+
name = ICurses.keyname(key)
|
170
172
|
if name.start_with? 'KEY_'
|
171
|
-
name.sub('KEY_', '').
|
173
|
+
name.sub('KEY_', '').delete('()')
|
172
174
|
else
|
173
175
|
name
|
174
176
|
end
|
175
177
|
end
|
176
178
|
|
177
179
|
def parse_key(key)
|
178
|
-
if key.is_a? Integer
|
179
|
-
|
180
|
-
|
181
|
-
key.
|
182
|
-
elsif key.size == 2 and key
|
183
|
-
|
180
|
+
return key if key.is_a? Integer
|
181
|
+
|
182
|
+
if key.size == 1
|
183
|
+
return key.ord
|
184
|
+
elsif key.size == 2 and key[0] == ?^
|
185
|
+
return key[1].upcase.ord - 64
|
184
186
|
elsif key =~ /^(key_)?space$/i
|
185
|
-
|
186
|
-
|
187
|
+
return ' '.ord
|
188
|
+
end
|
189
|
+
|
190
|
+
begin
|
191
|
+
return Integer(key)
|
192
|
+
rescue
|
187
193
|
key = key.upcase.tr(?-, ?_)
|
188
194
|
key = "KEY_#{key}" unless key.start_with?('KEY_')
|
189
|
-
|
195
|
+
return ICurses.const_get(key)
|
190
196
|
end
|
191
197
|
rescue NameError
|
192
198
|
fail "Unknown key: #{key}"
|
data/lib/ektoplayer/common.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'zip'
|
2
1
|
require 'thread'
|
2
|
+
require 'open3'
|
3
3
|
|
4
4
|
class ConditionSignals
|
5
5
|
def initialize
|
@@ -39,10 +39,6 @@ class ConditionSignals
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
class Object
|
43
|
-
alias :frz :freeze
|
44
|
-
end
|
45
|
-
|
46
42
|
class Dir
|
47
43
|
def Dir.size(path)
|
48
44
|
Dir.glob(File.join(path, '**', ?*)).map { |f| File.size(f) }.sum
|
@@ -83,13 +79,30 @@ module Common
|
|
83
79
|
)
|
84
80
|
end
|
85
81
|
end
|
86
|
-
|
82
|
+
|
87
83
|
def self.extract_zip(zip_file, dest)
|
84
|
+
# try RubyZip gem
|
85
|
+
require 'zip'
|
86
|
+
|
88
87
|
Zip::File.open(zip_file) do |zip_obj|
|
89
88
|
zip_obj.each do |f|
|
90
89
|
f.extract(File.join(dest, f.name))
|
91
90
|
end
|
92
91
|
end
|
92
|
+
rescue LoadError
|
93
|
+
# try 'unzip'
|
94
|
+
out, err, status = Open3.capture3('unzip', ?x, zip_file, chdir: dest)
|
95
|
+
fail err unless status.exitcode == 0
|
96
|
+
rescue Error::ENOENT
|
97
|
+
# try '7zip'
|
98
|
+
out, err, status = Open3.capture3('7z', ?x, zip_file, chdir: dest)
|
99
|
+
fail err unless status.exitcode == 0
|
100
|
+
rescue Error::ENOENT
|
101
|
+
fail 'neither RubzZip gem nor /bin/unzip or /bin/7z found'
|
102
|
+
rescue
|
103
|
+
# something failed ...
|
104
|
+
Ektoplayer::Application.log(self, "error extracting zip", zip, dest, $!)
|
105
|
+
fail $!
|
93
106
|
end
|
94
107
|
|
95
108
|
def self.with_hash_zip(keys, values)
|
data/lib/ektoplayer/compat.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
unless Array.
|
1
|
+
unless Array.respond_to? :sum
|
2
2
|
class Array
|
3
3
|
def sum
|
4
4
|
result = 0
|
@@ -8,9 +8,9 @@ unless Array.public_method_defined? :sum
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
unless Integer.
|
11
|
+
unless Integer.respond_to? :clamp
|
12
12
|
class Integer
|
13
|
-
|
13
|
+
def clamp(min, max)
|
14
14
|
if self < min
|
15
15
|
min
|
16
16
|
elsif self > max
|
data/lib/ektoplayer/config.rb
CHANGED
@@ -159,16 +159,6 @@ module Ektoplayer
|
|
159
159
|
reg 'progressbar.rest_char',
|
160
160
|
'Character used for the rest of the line', ?~
|
161
161
|
|
162
|
-
# - Volumemeter
|
163
|
-
reg 'volumemeter.display',
|
164
|
-
'Enable/disable volumemeter', true
|
165
|
-
|
166
|
-
reg 'volumemeter.level_char',
|
167
|
-
'Character used for displaying volume level', ?~
|
168
|
-
|
169
|
-
reg 'volumemeter.rest_char',
|
170
|
-
'Character used for the rest of the line', ?~
|
171
|
-
|
172
162
|
# - Playinginfo
|
173
163
|
reg 'playinginfo.display',
|
174
164
|
'Enable/display playinginfo', true
|
@@ -190,7 +180,7 @@ module Ektoplayer
|
|
190
180
|
lambda { |v| v.split(/\s*,\s*/).map(&:to_sym) }
|
191
181
|
|
192
182
|
reg 'main.widgets', 'Specify widgets to show (up to down)',
|
193
|
-
'playinginfo,
|
183
|
+
'playinginfo,tabbar,windows,progressbar',
|
194
184
|
lambda { |v| v.split(/\s*,\s*/).map(&:to_sym) }
|
195
185
|
end
|
196
186
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '../icurses'
|
2
2
|
|
3
3
|
require_relative 'controller'
|
4
4
|
|
@@ -12,7 +12,7 @@ module Ektoplayer
|
|
12
12
|
register = view_operations.with_register('browser.')
|
13
13
|
|
14
14
|
%w(up down page_up page_down top bottom
|
15
|
-
search_up search_down search_next search_prev).
|
15
|
+
search_up search_down search_next search_prev toggle_selection).
|
16
16
|
each { |op| register.(op, &view.method(op)) }
|
17
17
|
|
18
18
|
register.(:enter) do
|
@@ -21,7 +21,9 @@ module Ektoplayer
|
|
21
21
|
|
22
22
|
register.(:add_to_playlist) do
|
23
23
|
#if tracks = browser.tracks(view.selected)
|
24
|
-
|
24
|
+
view.get_selection.each do |index|
|
25
|
+
operations.send(:'browser.add_to_playlist', index)
|
26
|
+
end
|
25
27
|
#end
|
26
28
|
end
|
27
29
|
|
@@ -29,14 +31,14 @@ module Ektoplayer
|
|
29
31
|
view.mouse.on(65536) do view.up(5) end
|
30
32
|
view.mouse.on(2097152) do view.down(5) end
|
31
33
|
|
32
|
-
[
|
34
|
+
[ICurses::BUTTON1_DOUBLE_CLICKED, ICurses::BUTTON3_CLICKED].each do |btn|
|
33
35
|
view.mouse.on(btn) do |mevent|
|
34
36
|
view.select_from_cursorpos(mevent.y)
|
35
37
|
view_operations.send(:'browser.enter')
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
39
|
-
[
|
41
|
+
[ICurses::BUTTON1_CLICKED, ICurses::BUTTON2_CLICKED].
|
40
42
|
each do |button|
|
41
43
|
view.mouse.on(button) do |mevent|
|
42
44
|
view.select_from_cursorpos(mevent.y)
|