-
Notifications
You must be signed in to change notification settings - Fork 0
/
timerlist.py
158 lines (135 loc) · 5.5 KB
/
timerlist.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# -*- coding: utf-8 -*-
import datetime
import re
from timerfile import TimerFile
from logger import Logger
class TimerList(object):
"""タイマーのリスト
timer = {
'index': int or str,
# リストフレームで表示しているリストのインデックス。
# 未表示の場合は空文字列
'starttime': datetime,
# タイマーを開始した時間
'endtime': datetime,
# アラームの時間
'message': str,
# アラームで表示するメッセージ
'displayed': True or False
# 画面表示したか否か。
# リストフレームが表示されていない状態でコマンドラインからタイマーが追
# 加された場合にバルーンを表示をするので、その判断に使う。
}
"""
def __init__(self):
self.logger = Logger()
self.file = TimerFile()
self.list = self.file.get_list()
if not self.list:
self.maxindex = 0
return
self.maxindex = self._get_maxindex(self.list)
# 起動時に過ぎてしまっているアラームは削除
self._delete_timeout(self.list)
def add(self, inputtime, message, noneBaloon=False):
timer = self.get_timer(inputtime, message, noneBaloon)
if not timer:
raise Exception("有効な時間を与えてください。")
self.logger.timer("Add", timer)
self.maxindex = self.maxindex + 1
self.list[self.maxindex] = timer
self._save(self.list)
def delete_from_listbox(self, index):
# リストボックスのインデックスで削除するタイマーを指定
listindex = [k for k, t in self.list.items() if t["index"] == index]
self.delete(listindex[0]) # 一つだけのはずなので
def delete(self, index):
delete_listbox_index = self.list[index]["index"]
del self.list[index]
# 画面のリストのインデックスを更新
# 更新しないと画面の listbox とずれる
for key, timer in self.list.items():
if not isinstance(timer["index"], int):
continue
if timer["index"] > delete_listbox_index:
timer["index"] = timer["index"] - 1
self.list[key] = timer
self._save(self.list)
def _delete_timeout(self, timerlist):
deleteindexes = [
k
for k, t in timerlist.items()
if t is not None and t["endtime"] < datetime.datetime.now()
]
if len(deleteindexes):
for i in deleteindexes:
self.logger.timer("Delete timeout", self.list[i])
del self.list[i]
self._save(self.list)
def refresh_index(self, key, index):
self.list[key]["index"] = index
self._save(self.list)
def _get_maxindex(self, timerlist):
# タイマーインデックスの最大値を返す
try:
return 0 if max(timerlist.keys()) == "" else max(timerlist.keys())
except Exception:
return 0
def _get_timedelta_dict(self, inputtime):
"""文字列を単位毎に合計した数値の dict として返す
_get_timedelta_dict('10s 20h 30m') -> {'h': 10, 'm': 20, 's': 30}
"""
# ' ' を除いた 1 文字ずつのタプルへ
chars = (x for x in inputtime if x != " ")
# 連続した数字を結合して、単位毎に合計して dict へ
# ('1', 'm', '1', 's', '3', '2', 's') -> {'h': 0, 'm': 1, 's': 33}
tempnum = ""
delta = {"h": 0, "m": 0, "s": 0}
for char in chars:
if char.isdigit(): # 連続した数字を結合
tempnum = "".join((tempnum, char))
continue
delta[char] = delta[char] + int(tempnum)
tempnum = ""
return delta
def get_timer(self, inputtime, message, noneBaloon=False):
starttime = datetime.datetime.now()
inputtime = inputtime.strip()
if inputtime.isdigit():
# 数字だけなら分として扱う
sec = int(inputtime) * 60
endtime = starttime + datetime.timedelta(seconds=sec)
elif re.match("[0-9hms ]+$", inputtime):
# 1h, 1m, 1s などはそれぞれ時間、分、秒として扱う
hms = self._get_timedelta_dict(inputtime)
endtime = starttime + datetime.timedelta(
hours=hms["h"], minutes=hms["m"], seconds=hms["s"]
)
elif re.match("[0-9]+:[0-9]+$", inputtime):
# 23:36 などはその時間にアラーム
hm = [0 if x == "" else int(x) for x in inputtime.split(":", 1)]
endtime = starttime.replace(hour=hm[0], minute=hm[1], second=0)
if starttime > endtime:
endtime = endtime + datetime.timedelta(days=1)
else:
# todo? d で日数も扱えるように
# todo? yyyy-mm-dd も扱えるように
return None
return {
"index": "",
"starttime": starttime,
"endtime": endtime,
"message": message,
"displayed": noneBaloon,
}
def update(self):
self.list = self.file.get_list()
def items(self):
return self.list.items()
def keys(self):
return self.list.keys()
def displayed(self, key):
self.list[key]["displayed"] = True
self._save(self.list)
def _save(self, timerlist):
self.file.save(timerlist)