-
Notifications
You must be signed in to change notification settings - Fork 2
/
app.py
204 lines (174 loc) · 7.58 KB
/
app.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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# -*- coding: utf-8 -*-
# Falcon app GUI implementation
# Copyright (C) 2019 Yukio Nozawa <[email protected]>
# Note: All comments except these top lines will be written in Japanese.
import os
import proxyUtil
import wx
import threading
import sys
import AppBase
import constants
import globalVars
import misc
import update
import UserCommandManager
import workerThreads
from falconSoundPlayer import pybass
from simpleDialog import *
class falconAppMain(AppBase.MainBase):
def __init__(self):
super().__init__()
def initialize(self):
"""アプリを初期化する。"""
self.initUpdater()
# プロキシの設定を適用
self.proxyEnviron = proxyUtil.virtualProxyEnviron()
self.setProxyEnviron()
# スレッドで例外が起きてもsys.exceptHookが呼ばれるようにする
self.installThreadExcepthook()
# アップデートを実行
if self.config.getboolean("general", "update"):
globalVars.update.update(True)
t = misc.Timer()
wx.DisableAsserts()
self.error_sound_handle = None
self.InitSound()
self.LoadUserCommandSettings()
self.LoadUserExtentionSettings()
self.InitCaches()
workerThreads.Start()
# 起動サウンドの再生
self.PlaySound(self.config["sounds"]["startup"])
self.log.debug(
"finished environment setup (%f seconds from start)" %
t.elapsed)
# メインビューを表示
from views import main
self.hMainView = main.View("mainView")
self.hMainView.Initialize()
misc.InitContextMenu(self.hMainView.hFrame.GetHandle())
self.log.debug(
"Finished mainView setup (%f seconds from start)" %
t.elapsed)
return True
def installThreadExcepthook(self):
_init = threading.Thread.__init__
def init(self, *args, **kwargs):
_init(self, *args, **kwargs)
_run = self.run
def run(*args, **kwargs):
try:
_run(*args, **kwargs)
except BaseException:
sys.excepthook(*sys.exc_info())
self.run = run
threading.Thread.__init__ = init
def LoadUserCommandSettings(self):
"""お気に入りフォルダと「ここで開く」の設定を読み込む"""
self.favoriteDirectory = UserCommandManager.UserCommandManager(
self.config.items("favorite_directories"),
self.config.items("favorite_directories_shortcut"),
"MOVE_FAVORITE_FOLDER_")
if self.favoriteDirectory.errors:
tmp = _("お気に入りフォルダの設定が不正です。以下の設定を確認してください。\n\n")
for v in self.favoriteDirectory.errors:
tmp += v + "\n"
dialog(_("エラー"), tmp)
self.openHereCommand = UserCommandManager.UserCommandManager(self.config.items(
"open_here"), self.config.items("open_here_shortcut"), "MOVE_OPEN_HERE_")
if self.openHereCommand.errors:
tmp = _("「ここで開く」の設定が不正です。以下の設定を確認してください。\n\n")
for v in self.openHereCommand.errors:
tmp += v + "\n"
dialog(_("エラー"), tmp)
self.userCommandManagers = {
self.favoriteDirectory: _("お気に入りディレクトリ"),
self.openHereCommand: _("ここで開く")
}
def LoadUserExtentionSettings(self):
# サポートするドキュメント形式の追加設定
self.documentFormats = set()
documentFormats = self.config["extentions"]["document"].split("/")
err_audio = []
err_format = []
for ext in documentFormats:
ext = ext.lower()
if ext in constants.SUPPORTED_AUDIO_FORMATS:
err_audio.append(ext)
if "." in ext:
err_format.append(ext)
else:
self.documentFormats.add(ext)
if err_format:
dialog(
_("エラー"),
_("以下の拡張子は、利用できない文字を含んでいるため登録できません。\n\n") +
str(err_format))
if err_audio:
dialog(
_("エラー"),
_("以下の拡張子は、既に音声データの拡張子として登録されているため、テキスト形式として登録できません。\n\n") +
str(err_audio))
def InitSound(self):
"""サウンド再生機能を初期化する。"""
ret = pybass.BASS_Init(-1, 44100, 0, 0, 0)
if ret != 1:
self.log.error("BASS sound system could not be initialized.")
def initUpdater(self):
globalVars.update = update.update()
return
def setProxyEnviron(self):
if self.config.getboolean("proxy", "usemanualsetting", False):
self.proxyEnviron.set_environ(self.config["proxy"]["server"], self.config.getint("proxy", "port", 8080, 0, 65535))
else:
self.proxyEnviron.set_environ()
def InitCaches(self):
"""起動中に使用するキャッシュデータを初期化する。"""
self.filetypes_cach = {} # これほんとに使うかどうか検討中
def PlaySound(self, path, custom_location=False, volume=-1):
"""サウンドファイルを再生する。"""
if not custom_location:
path = "fx/" + path
if not os.path.isfile(path):
if path != "":
self.log.error("Sound file '" + path + "' not found.")
return -1
handle = pybass.BASS_StreamCreateFile(
False, path, 0, 0, pybass.BASS_STREAM_AUTOFREE | pybass.BASS_UNICODE)
if handle == 0:
self.log.error(
"Cannot load sound file %s. Error code: %d" %
(path, pybass.BASS_ErrorGetCode()))
return -1
# end error
if volume == -1:
volume = self.config.getint("speech", "fx_volume", 100, 0, 300)
pybass.BASS_ChannelSetAttribute(
handle, pybass.BASS_ATTRIB_VOL, volume / 100)
pybass.BASS_ChannelPlay(handle, True)
return handle
def StopSound(self, handle):
pybass.BASS_ChannelStop(handle)
def OnExit(self):
workerThreads.Stop()
# UserCommandManagerの内容をconfigに反映し、この後の保存処理に備える
del self.config["favorite_directories"]
self.config["favorite_directories"] = self.favoriteDirectory.paramMap
self.config["favorite_directories_shortcut"] = self.favoriteDirectory.keyMap
del self.config["open_here"]
self.config["open_here"] = self.openHereCommand.paramMap
self.config["open_here_shortcut"] = self.openHereCommand.keyMap
globalVars.update.runUpdate()
return wx.App.OnExit(self)
def PlayErrorSound(self):
"""例外が発生したときに音を鳴らす。"""
if not self.error_sound_handle:
self.error_sound_handle = pybass.BASS_StreamCreateFile(
False,
"fx\\internal_error.ogg",
0,
0,
pybass.BASS_STREAM_AUTOFREE | pybass.BASS_UNICODE)
# end load
pybass.BASS_ChannelPlay(self.error_sound_handle, True)