-
Notifications
You must be signed in to change notification settings - Fork 0
/
views.py
166 lines (142 loc) · 6.89 KB
/
views.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
# encoding=utf-8
import random
from PyQt4.QtGui import (QMainWindow,
QTableView,
QStatusBar,
QLabel,
QPushButton,
QSystemTrayIcon,
QDesktopServices,
QAbstractItemView,
QFileDialog,
QAction,
QIcon,
QMenu,
qApp)
from PyQt4.QtCore import QTimer, QUrl, QThreadPool
from PyQt4.QtSql import QSqlQuery
from env import DataStore, Configuration
from models import *
from delegates import FileTransferDelegate
from utils import *
class MyWindow(QMainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setWindowTitle(unicode_str('文件传输详情'))
self.setCentralWidget(FileTransferTable())
self.setWindowIcon(QIcon('s.png'))
self.__init_statusBar()
# 界面调试按钮
self.__debug_buttons()
def __init_statusBar(self):
self.setStatusBar(FileTransferStatusBar())
timer = QTimer(self)
model = self.centralWidget().model()
status_bar = self.statusBar()
timer.timeout.connect(lambda param = model.global_speed : status_bar.set_global_speed(param()))
timer.timeout.connect(lambda param = model.global_time_left : status_bar.set_time_left(param()))
timer.timeout.connect(lambda param = model.transfer_count : status_bar.set_transfer_count(param()))
timer.start(640)
# 以下均为调试方法
def __debug_buttons(self):
self.worker = Worker()
status_bar = self.statusBar()
status_bar.progress_button = QPushButton(unicode_str('进度'))
status_bar.speed_button = QPushButton(unicode_str('速度'))
status_bar.scan_button = QPushButton(unicode_str('扫描目录'))
status_bar.cleandb_button = QPushButton(unicode_str('清空文件列表'))
status_bar.addWidget(status_bar.scan_button)
status_bar.addWidget(status_bar.progress_button)
status_bar.addWidget(status_bar.speed_button)
status_bar.addWidget(status_bar.cleandb_button)
status_bar.progress_button.clicked.connect(self.__random_progress)
status_bar.speed_button.clicked.connect(self.__random_speed)
status_bar.scan_button.clicked.connect(self.__scan_files)
status_bar.cleandb_button.clicked.connect(self.__cleandb)
def __random_progress(self):
model = self.centralWidget().model()
for row in range(model.rowCount()):
model.set_calculated_column('progress', row, random.randint(0, 100))
def __random_speed(self):
model = self.centralWidget().model()
for row in range(model.rowCount()):
model.set_calculated_column('speed', row, random.randint(0, 2000))
def __scan_files(self):
self.centralWidget().model().scan_files()
def __cleandb(self):
model = self.centralWidget().model().sourceModel()
model.query.exec_('DELETE FROM file_list')
model.select()
class FileTransferTable(QTableView):
def __init__(self, parent=None):
super(FileTransferTable, self).__init__(parent)
self.resizeColumnsToContents()
self.setModel(FileTransferSortProxyModel())
self.setItemDelegate(FileTransferDelegate())
self.setEditTriggers(self.NoEditTriggers)
self.verticalHeader().hide()
self.horizontalHeader().setStretchLastSection(True)
self.setSortingEnabled(True)
self.setColumnHidden(0, True)
self.setColumnHidden(7, True)
self.setSelectionBehavior(QAbstractItemView.SelectRows)
class FileTransferStatusBar(QStatusBar):
def __init__(self, parent=None):
super(FileTransferStatusBar, self).__init__(parent)
self.set_transfer_count()
self.set_time_left()
self.set_global_speed()
self.init_config_button()
self.init_config_dialog()
def set_transfer_count(self, count=0):
self.__init_widget('file_transfer_count', QLabel())
self.file_transfer_count.setText(unicode_str('同步%d个文件' % (from_qvariant(count) or 0)))
def set_time_left(self, seconds_left=-1):
text = 0 > seconds_left and '无法估计' or format_time(seconds_left)
self.__init_widget('time_left', QLabel())
self.time_left.setText(unicode_str('剩余时间: %s' % text))
def set_global_speed(self, byte_per_second=0.0):
self.__init_widget('global_speed', QLabel())
self.global_speed.setText(unicode_str('全局速度: %s' % convert_byte_size(byte_per_second) + '/s'))
def init_config_button(self):
self.__init_widget('config_button', QPushButton())
self.config_button.setText(unicode_str('设置同步目录'))
self.config_button.clicked.connect(self.show_config_dialog)
def init_config_dialog(self):
self.config_dialog = QFileDialog()
self.config_dialog.setFileMode(QFileDialog.Directory)
self.config_dialog.setViewMode(QFileDialog.List)
def show_config_dialog(self):
self.config_dialog.show()
if self.config_dialog.exec_():
Configuration.set_directory(self.config_dialog.selectedFiles()[0])
print('当前同步目录: %s' % from_qvariant(Configuration.get_directory()))
def __init_widget(self, attr_name, widget):
if not hasattr(self, attr_name):
self.__dict__[attr_name] = widget
self.addWidget(self.__dict__[attr_name])
class TrayIcon(QSystemTrayIcon):
def __init__(self, app, parent=None):
super(TrayIcon, self).__init__(parent)
self.setIcon(QIcon('s.png'))
self.setContextMenu(TrayMenu(app))
class TrayMenu(QMenu):
def __init__(self, app, parent=None):
super(TrayMenu, self).__init__(parent)
self.app = app
self.__setup_actions()
def __setup_actions(self):
self.open_directory_action = QAction(unicode_str('&打开同步目录 '), self.app)
self.open_directory_action.triggered.connect(self.open_directory)
Configuration.have_updated.connect(self.__toggle_open_directory_action)
self.open_directory_action.setDisabled(not Configuration.get_directory())
self.addAction(self.open_directory_action)
self.recent_transfers = self.addMenu(unicode_str('&最近同步的文件 '))
self.addSeparator()
self.addAction(QAction(unicode_str('&退出 '), self.app, triggered=qApp.quit))
self.recent_transfers.addAction(QAction(unicode_str('&larmageddon.jpg '), self.app))
def open_directory(self):
directory = Configuration.get_directory()
QDesktopServices.openUrl(QUrl('file:///%s' % from_qvariant(directory), QUrl.TolerantMode))
def __toggle_open_directory_action(self):
self.open_directory_action.setDisabled(not Configuration.get_directory())