Skip to content

Commit 771202e

Browse files
committed
fixed new setting
1 parent 684dd2a commit 771202e

File tree

10 files changed

+121
-40
lines changed

10 files changed

+121
-40
lines changed

CHANGELOG.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1-
Clid's Changelog
2-
================
1+
CHANGELOG
2+
=========
3+
4+
v0.5.4
5+
------
6+
7+
- [ ] Add preferences option for custom preview in main view
8+
9+
10+
v0.5.3
11+
------
12+
13+
- [x] Add HOME and END keys to text boxes
14+
- [x] Fix: Error thrown if date is not of the format YYYY-MM-DD
15+
316

417
v0.5.2
518
------

clid/_genres.py renamed to clid/_const.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import re
44

5-
6-
#Tuple having genres as items and numerical value used by id3v2 as index
5+
# Tuple having genres as items and numerical value used by id3v2 as index
76
GENRES = (
87
u"Blues",
98
u"Classic Rock",
@@ -201,3 +200,16 @@
201200

202201
GENRE_PAT = re.compile(r'\(([0-9]+)\)')
203202

203+
# dict containing format specifiers to be used to display preview
204+
FORMAT = {
205+
'%y': 'date',
206+
'%l': 'album',
207+
'%t': 'title',
208+
'%n': 'track',
209+
'%a': 'artist',
210+
'%c': 'comment',
211+
# '%g': 'genre',
212+
'%A': 'album_artist'
213+
}
214+
215+
FORMAT_PAT = re.compile(r'%.')

clid/base.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,32 @@
22

33
"""Base classes to be used by clid"""
44

5+
import curses
6+
57
import npyscreen as npy
68

79
class ClidCommandLine(npy.ActionControllerSimple):
810
"""Base class for the command line at the bootom of the screen"""
911

1012
def create(self):
11-
self.add_action('^:q', self.exit_app, live=False) # quit with ':q'
13+
self.add_action('^:q$', self.exit_app, live=False) # quit with ':q'
1214

1315
def exit_app(self, command_line, widget_proxy, live):
1416
"""Exit the app with ':q'"""
1517
exit() # args are used internally by npyscreen
1618

19+
20+
class ClidTextfield(npy.wgtextbox.Textfield):
21+
def set_up_handlers(self):
22+
super().set_up_handlers()
23+
self.handlers[curses.KEY_END] = self.h_end
24+
self.handlers[curses.KEY_HOME] = self.h_home
25+
26+
def h_home(self, char):
27+
self.cursor_position = 0
28+
29+
def h_end(self, char):
30+
self.cursor_position = len(self.value)
31+
32+
class ClidTitleText(npy.TitleText):
33+
_entry_type = ClidTextfield

clid/config.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
music_dir = ~/Music
2+
preview_format = %a - %l - %n. %t

clid/database.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,23 @@ class SettingsDataBase(object):
8282
"""Class to manage the settings/config file.
8383
8484
Attributes:
85-
_settings(configobj.ConfigObj): `ConfigObj` object for the clid.ini file
85+
_settings(configobj.ConfigObj):
86+
`ConfigObj` object for the clid.ini file
87+
parent(pref.PreferencesView):
88+
used to refer to parent form(pref.PreferencesView)
8689
disp_strings(list):
8790
list of formatted strings which will be used to display settings in the window
91+
when_changed(dict):
92+
dict of str:function; str is a setting; function to be executed when corresponding
93+
setting is changed
8894
"""
8995
def __init__(self):
96+
self.parent = None # set by parent; see docstring
97+
self.when_changed = {
98+
'music_dir': self.music_dir,
99+
'preview_format': self.preview_format
100+
}
101+
90102
self._settings = configobj.ConfigObj(CONFIG)
91103
self.make_strings()
92104

@@ -101,3 +113,12 @@ def change_setting(self, key, new):
101113
if key in self._settings:
102114
self._settings[key] = new
103115
self._settings.write()
116+
self.when_changed[key]()
117+
118+
def music_dir(self):
119+
main_form = self.parent.parentApp.getForm("MAIN")
120+
main_form.value.load_files_and_set_values()
121+
main_form.load_files()
122+
123+
def preview_format(self):
124+
pass

clid/editmeta.py

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
"""Form class for editing the metadata of a track"""
44

55
import os
6+
import curses
67

78
import stagger
89
import npyscreen as npy
910

10-
from . import _genres
11+
from . import _const
12+
from .base import ClidTitleText
1113

1214

1315
class EditMeta(npy.ActionFormV2):
@@ -25,23 +27,23 @@ def create(self):
2527
self.meta.album = '' # revert what was just done
2628
self.meta.write()
2729

28-
self.tit = self.add(npy.TitleText, name='Title', value=self.meta.title)
30+
self.tit = self.add(ClidTitleText, name='Title', value=self.meta.title)
2931
self.nextrely += 1
30-
self.alb = self.add(npy.TitleText, name='Album', value=self.meta.album)
32+
self.alb = self.add(ClidTitleText, name='Album', value=self.meta.album)
3133
self.nextrely += 1
32-
self.art = self.add(npy.TitleText, name='Artist', value=self.meta.artist)
34+
self.art = self.add(ClidTitleText, name='Artist', value=self.meta.artist)
3335
self.nextrely += 1
34-
self.ala = self.add(npy.TitleText, name='Album Artist', value=self.meta.album_artist)
36+
self.ala = self.add(ClidTitleText, name='Album Artist', value=self.meta.album_artist)
3537
self.nextrely += 2
3638

37-
self.gen = self.add(npy.TitleText, name='Genre', value=self.resolve_genre(self.meta.genre))
39+
self.gen = self.add(ClidTitleText, name='Genre', value=self.resolve_genre(self.meta.genre))
3840
self.nextrely += 1
39-
self.dat = self.add(npy.TitleText, name='Date/Year', value=self.meta.date)
41+
self.dat = self.add(ClidTitleText, name='Date/Year', value=self.meta.date)
4042
self.nextrely += 1
41-
self.tno = self.add(npy.TitleText, name='Track Number',
43+
self.tno = self.add(ClidTitleText, name='Track Number',
4244
value=str(self.meta.track if self.meta.track != 0 else ''))
4345
self.nextrely += 2
44-
self.com = self.add(npy.TitleText, name='Comment', value=self.meta.comment)
46+
self.com = self.add(ClidTitleText, name='Comment', value=self.meta.comment)
4547

4648
def set_up_handlers(self):
4749
super().set_up_handlers()
@@ -59,11 +61,11 @@ def resolve_genre(self, num_gen):
5961
str: Name of the genre (Electronic, Blues, etc). Returns
6062
num_gen itself if it doesn't match the format.
6163
"""
62-
match = _genres.GENRE_PAT.findall(num_gen)
64+
match = _const.GENRE_PAT.findall(num_gen)
6365

6466
if match:
6567
try:
66-
return _genres.GENRES[int(match[0])]
68+
return _const.GENRES[int(match[0])]
6769
except IndexError:
6870
return ''
6971
else:
@@ -84,27 +86,31 @@ def on_cancel(self): # char is for handlers
8486

8587
def on_ok(self): # char is for handlers
8688
"""Save and switch to standard view"""
87-
self.meta.date = self.dat.value
88-
# FIXME: error thrown when date is not in the format YYYY-MM-DD
89-
90-
self.meta.title = self.tit.value
91-
self.meta.album = self.alb.value
92-
self.meta.genre = self.gen.value
93-
self.meta.artist = self.art.value
94-
self.meta.comment = self.com.value
95-
self.meta.album_artist = self.ala.value
89+
try:
90+
self.meta.date = self.dat.value
91+
except ValueError:
92+
npy.notify_confirm(message='Date should be of the form YYYY-MM-DD',
93+
title='Invalid Date Format', editw=1)
94+
return None
9695

9796
track = self.tno.value if self.tno.value != '' else '0' # automatically converted to int by stagger
9897
try:
9998
int(track)
10099
except ValueError:
101-
npy.notify_confirm(message='Track Number can only take integer values',
102-
title='Track Number not an integer', editw=0)
100+
npy.notify_confirm(message='Track number can only take integer values',
101+
title='Invalid Track Number', editw=1)
103102
return None
104103
else:
105104
self.meta.track = track
106105
# FIXME: values of tags are reset to initial when ok is pressed(no prob with ^S)
107106

107+
self.meta.title = self.tit.value
108+
self.meta.album = self.alb.value
109+
self.meta.genre = self.gen.value
110+
self.meta.artist = self.art.value
111+
self.meta.comment = self.com.value
112+
self.meta.album_artist = self.ala.value
113+
108114
self.meta.write()
109115

110116
status_meta = '{art} - {alb} - {tno}. {title} '.format(

clid/main.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env python3
22

3-
__version__ = '0.5.2'
3+
__version__ = '0.5.3'
44

55
import curses
66
import npyscreen as npy
@@ -109,8 +109,6 @@ def h_cursor_page_up(self, char):
109109
self.set_status(self.get_selected())
110110
self.parent.display()
111111

112-
# TODO: make the cursor go to top/bottom if key is pressed at top/bottom ?
113-
114112
def h_select(self, char):
115113
self.parent.parentApp.current_file = self.parent.value.file_dict[self.values[self.cursor_line]]
116114
self.parent.parentApp.switchForm("EDIT")

clid/pref.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ def create(self):
1616
def change_setting(self, command_line, widget_proxy, live):
1717
setting = command_line[5:].split(sep='=')
1818
self.parent.value.change_setting(setting[0], setting[1]) # writes to the ini file
19-
20-
# TODO: might wanna change this to something else after more choices for pref
21-
main_form = self.parent.parentApp.getForm("MAIN")
22-
main_form.value.load_files_and_set_values()
23-
main_form.load_files()
19+
self.parent.value.when_changed[setting[0]]()
2420

2521
self.parent.load_pref()
2622
self.parent.wMain.display()
@@ -29,28 +25,34 @@ def change_setting(self, command_line, widget_proxy, live):
2925
class PrefMultiline(npy.MultiLine):
3026
def set_up_handlers(self):
3127
super().set_up_handlers()
28+
3229
self.handlers['1'] = self.switch_to_main
3330

3431
def switch_to_main(self, char):
3532
self.parent.parentApp.switchForm("MAIN")
3633

3734
def h_select(self, char):
35+
with open('sdf', 'a') as f:
36+
f.write('multiline: ' + repr(self.parent.value) + '\n')
3837
current_setting = self.values[self.cursor_line].split(maxsplit=1)
3938
self.parent.wCommand.value = ':set ' + current_setting[0] + '=' + current_setting[1]
4039

4140

4241
class PreferencesView(npy.FormMuttActiveTraditional):
4342
"""View for editing preferences/settings"""
4443
MAIN_WIDGET_CLASS = PrefMultiline
45-
DATA_CONTROLER = database.SettingsDataBase
4644
ACTION_CONTROLLER = PrefCommandLine
4745

46+
def __init__(self, *args, **kwargs):
47+
super().__init__(*args, **kwargs)
48+
self.set_value(database.SettingsDataBase())
49+
self.value.parent = self
50+
self.load_pref()
51+
52+
4853
def create(self):
4954
super().create()
50-
self.set_value(self.DATA_CONTROLER())
51-
5255
self.wStatus1.value = 'Preferences '
53-
self.load_pref()
5456

5557
def load_pref(self):
5658
self.value.make_strings()

sdf

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
multiline: <clid.database.SettingsDataBase object at 0xb6b117cc>
2+
multiline: <clid.database.SettingsDataBase object at 0xb6ba17ec>
3+
PrefCommandLine
4+
<clid.pref.PreferencesView object at 0xb6b9760c>
5+
<clid.database.SettingsDataBase object at 0xb6ba17ec>
6+
multiline: <clid.database.SettingsDataBase object at 0xb6b1978c>
7+
PrefCommandLine
8+
<weakproxy at 0xb6af8fcc to PreferencesView at 0xb6b025cc>
9+
<clid.database.SettingsDataBase object at 0xb6b1978c>

sfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<clid.pref.PreferencesView object at 0xb6ae6e4c>
2+
<clid.database.SettingsDataBase object at 0xb6af096c>

0 commit comments

Comments
 (0)