4 from __future__ import with_statement
12 from PyQt4 import QtGui
13 from PyQt4 import QtCore
17 from util import qtpie
18 from util import misc as misc_utils
21 _moduleLogger = logging.getLogger(__name__)
27 class Dialcentral(object):
30 os.path.dirname(__file__),
31 os.path.join(os.path.dirname(__file__), "../data"),
32 os.path.join(os.path.dirname(__file__), "../lib"),
33 '/usr/share/%s' % constants.__app_name__,
34 '/usr/lib/%s' % constants.__app_name__,
37 def __init__(self, app):
40 self._hiddenCategories = set()
41 self._hiddenUnits = {}
42 self._clipboard = QtGui.QApplication.clipboard()
44 self._mainWindow = None
46 self._fullscreenAction = QtGui.QAction(None)
47 self._fullscreenAction.setText("Fullscreen")
48 self._fullscreenAction.setCheckable(True)
49 self._fullscreenAction.setShortcut(QtGui.QKeySequence("CTRL+Enter"))
50 self._fullscreenAction.toggled.connect(self._on_toggle_fullscreen)
52 self._logAction = QtGui.QAction(None)
53 self._logAction.setText("Log")
54 self._logAction.setShortcut(QtGui.QKeySequence("CTRL+l"))
55 self._logAction.triggered.connect(self._on_log)
57 self._quitAction = QtGui.QAction(None)
58 self._quitAction.setText("Quit")
59 self._quitAction.setShortcut(QtGui.QKeySequence("CTRL+q"))
60 self._quitAction.triggered.connect(self._on_quit)
62 self._app.lastWindowClosed.connect(self._on_app_quit)
65 self._mainWindow = MainWindow(None, self)
66 self._mainWindow.window.destroyed.connect(self._on_child_close)
68 def load_settings(self):
70 with open(constants._user_settings_, "r") as settingsFile:
71 settings = simplejson.load(settingsFile)
73 _moduleLogger.info("No settings")
76 _moduleLogger.info("Settings were corrupt")
79 self._fullscreenAction.setChecked(settings.get("isFullScreen", False))
81 def save_settings(self):
83 "isFullScreen": self._fullscreenAction.isChecked(),
85 with open(constants._user_settings_, "w") as settingsFile:
86 simplejson.dump(settings, settingsFile)
89 def fullscreenAction(self):
90 return self._fullscreenAction
94 return self._logAction
98 return self._quitAction
100 def _close_windows(self):
101 if self._mainWindow is not None:
102 self._mainWindow.window.destroyed.disconnect(self._on_child_close)
103 self._mainWindow.close()
104 self._mainWindow = None
106 @misc_utils.log_exception(_moduleLogger)
107 def _on_app_quit(self, checked = False):
110 @misc_utils.log_exception(_moduleLogger)
111 def _on_child_close(self, obj = None):
112 self._mainWindow = None
114 @misc_utils.log_exception(_moduleLogger)
115 def _on_toggle_fullscreen(self, checked = False):
116 for window in self._walk_children():
117 window.set_fullscreen(checked)
119 @misc_utils.log_exception(_moduleLogger)
120 def _on_log(self, checked = False):
121 with open(constants._user_logpath_, "r") as f:
122 logLines = f.xreadlines()
123 log = "".join(logLines)
124 self._clipboard.setText(log)
126 @misc_utils.log_exception(_moduleLogger)
127 def _on_quit(self, checked = False):
128 self._close_windows()
131 class QErrorDisplay(object):
136 errorIcon = maeqt.get_theme_icon(("dialog-error", "app_install_error", "gtk-dialog-error"))
137 self._severityIcon = errorIcon.pixmap(32, 32)
138 self._severityLabel = QtGui.QLabel()
139 self._severityLabel.setPixmap(self._severityIcon)
141 self._message = QtGui.QLabel()
142 self._message.setText("Boo")
144 closeIcon = maeqt.get_theme_icon(("window-close", "general_close", "gtk-close"))
145 self._closeLabel = QtGui.QPushButton(closeIcon, "")
146 self._closeLabel.clicked.connect(self._on_close)
148 self._controlLayout = QtGui.QHBoxLayout()
149 self._controlLayout.addWidget(self._severityLabel)
150 self._controlLayout.addWidget(self._message)
151 self._controlLayout.addWidget(self._closeLabel)
153 self._topLevelLayout = QtGui.QHBoxLayout()
154 self._topLevelLayout.addLayout(self._controlLayout)
155 self._widget = QtGui.QWidget()
156 self._widget.setLayout(self._topLevelLayout)
163 def push_message(self, message):
164 self._messages.append(message)
165 if 1 == len(self._messages):
166 self._show_message(message)
168 def push_exception(self):
169 userMessage = str(sys.exc_info()[1])
170 _moduleLogger.exception(userMessage)
171 self.push_message(userMessage)
173 def pop_message(self):
174 del self._messages[0]
175 if 0 == len(self._messages):
178 self._message.setText(self._messages[0])
180 def _on_close(self, *args):
183 def _show_message(self, message):
184 self._message.setText(message)
187 def _hide_message(self):
188 self._message.setText("")
192 class CredentialsDialog(object):
195 self._usernameField = QtGui.QLineEdit()
196 self._passwordField = QtGui.QLineEdit()
197 self._passwordField.setEchoMode(QtGui.QLineEdit.PasswordEchoOnEdit)
199 self._credLayout = QtGui.QGridLayout()
200 self._credLayout.addWidget(QtGui.QLabel("Username"), 0, 0)
201 self._credLayout.addWidget(self._usernameField, 0, 1)
202 self._credLayout.addWidget(QtGui.QLabel("Password"), 1, 0)
203 self._credLayout.addWidget(self._passwordField, 1, 1)
205 self._loginButton = QtGui.QPushButton("&Login")
206 self._buttonLayout = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel)
207 self._buttonLayout.addButton(self._loginButton, QtGui.QDialogButtonBox.AcceptRole)
209 self._layout = QtGui.QVBoxLayout()
210 self._layout.addLayout(self._credLayout)
211 self._layout.addLayout(self._buttonLayout)
213 centralWidget = QtGui.QWidget()
214 centralWidget.setLayout(self._layout)
216 self._dialog = QtGui.QDialog()
217 self._dialog.setWindowTitle("Login")
218 self._dialog.setCentralWidget(centralWidget)
219 maeqt.set_autorient(self._dialog, True)
220 self._buttonLayout.accepted.connect(self._dialog.accept)
221 self._buttonLayout.rejected.connect(self._dialog.reject)
223 def run(self, defaultUsername, defaultPassword, parent=None):
224 self._dialog.setParent(parent)
225 self._usernameField.setText(defaultUsername)
226 self._passwordField.setText(defaultPassword)
228 response = self._dialog.exec_()
229 if response == QtGui.QDialog.Accepted:
230 return str(self._usernameField.text()), str(self._passwordField.text())
231 elif response == QtGui.QDialog.Rejected:
232 raise RuntimeError("Login Cancelled")
235 class AccountDialog(object):
238 self._accountNumberLabel = QtGui.QLabel("NUMBER NOT SET")
239 self._clearButton = QtGui.QPushButton("Clear Account")
240 self._clearButton.clicked.connect(self._on_clear)
241 self._doClear = False
243 self._credLayout = QtGui.QGridLayout()
244 self._credLayout.addWidget(QtGui.QLabel("Account"), 0, 0)
245 self._credLayout.addWidget(self._accountNumberLabel, 0, 1)
246 self._credLayout.addWidget(QtGui.QLabel("Callback"), 1, 0)
247 self._credLayout.addWidget(self._clearButton, 2, 1)
249 self._loginButton = QtGui.QPushButton("&Login")
250 self._buttonLayout = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Cancel)
251 self._buttonLayout.addButton(self._loginButton, QtGui.QDialogButtonBox.AcceptRole)
253 self._layout = QtGui.QVBoxLayout()
254 self._layout.addLayout(self._credLayout)
255 self._layout.addLayout(self._buttonLayout)
257 centralWidget = QtGui.QWidget()
258 centralWidget.setLayout(self._layout)
260 self._dialog = QtGui.QDialog()
261 self._dialog.setWindowTitle("Login")
262 self._dialog.setCentralWidget(centralWidget)
263 maeqt.set_autorient(self._dialog, True)
264 self._buttonLayout.accepted.connect(self._dialog.accept)
265 self._buttonLayout.rejected.connect(self._dialog.reject)
271 accountNumber = property(
272 lambda self: str(self._accountNumberLabel.text()),
273 lambda self, num: self._accountNumberLabel.setText(num),
276 def run(self, defaultUsername, defaultPassword, parent=None):
277 self._doClear = False
278 self._dialog.setParent(parent)
279 self._usernameField.setText(defaultUsername)
280 self._passwordField.setText(defaultPassword)
282 response = self._dialog.exec_()
283 if response == QtGui.QDialog.Accepted:
284 return str(self._usernameField.text()), str(self._passwordField.text())
285 elif response == QtGui.QDialog.Rejected:
286 raise RuntimeError("Login Cancelled")
288 def _on_clear(self, checked = False):
290 self._dialog.accept()
293 class SMSEntryWindow(object):
295 def __init__(self, parent, app):
299 self._history = QtGui.QListView()
300 self._smsEntry = QtGui.QTextEdit()
301 self._smsEntry.textChanged.connect(self._on_letter_count_changed)
303 self._entryLayout = QtGui.QVBoxLayout()
304 self._entryLayout.addWidget(self._history)
305 self._entryLayout.addWidget(self._smsEntry)
306 self._entryWidget = QtGui.QWidget()
307 self._entryWidget.setLayout(self._entryLayout)
308 self._scrollEntry = QtGui.QScrollArea()
309 self._scrollEntry.setWidget(self._entryWidget)
310 self._scrollEntry.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignBottom)
311 self._scrollEntry.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
312 self._scrollEntry.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
314 self._characterCountLabel = QtGui.QLabel("Letters: %s" % 0)
315 self._numberSelector = None
316 self._smsButton = QtGui.QPushButton("SMS")
317 self._dialButton = QtGui.QPushButton("Dial")
319 self._buttonLayout = QtGui.QHBoxLayout()
320 self._buttonLayout.addWidget(self._characterCountLabel)
321 self._buttonLayout.addWidget(self._smsButton)
322 self._buttonLayout.addWidget(self._dialButton)
324 self._layout = QtGui.QVBoxLayout()
325 self._layout.addLayout(self._entryLayout)
326 self._layout.addLayout(self._buttonLayout)
328 centralWidget = QtGui.QWidget()
329 centralWidget.setLayout(self._layout)
331 self._window = QtGui.QMainWindow(parent)
332 self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, False)
333 maeqt.set_autorient(self._window, True)
334 maeqt.set_stackable(self._window, True)
335 self._window.setWindowTitle("Contact")
336 self._window.setCentralWidget(centralWidget)
338 def _update_letter_count(self):
339 count = self._smsEntry.toPlainText().size()
340 self._characterCountLabel.setText("Letters: %s" % count)
342 def _update_button_state(self):
343 if len(self._contacts) == 0:
344 self._dialButton.setEnabled(False)
345 self._smsButton.setEnabled(False)
346 elif len(self._contacts) == 1:
347 count = self._smsEntry.toPlainText().size()
349 self._dialButton.setEnabled(True)
350 self._smsButton.setEnabled(False)
352 self._dialButton.setEnabled(False)
353 self._smsButton.setEnabled(True)
355 self._dialButton.setEnabled(False)
356 self._smsButton.setEnabled(True)
358 def _on_letter_count_changed(self):
359 self._update_letter_count()
360 self._update_button_state()
363 class DelayedWidget(object):
365 def __init__(self, app):
366 self._layout = QtGui.QVBoxLayout()
367 self._widget = QtGui.QWidget()
368 self._widget.setLayout(self._layout)
371 self._isEnabled = True
378 return self._child is not None
380 def set_child(self, child):
381 if self._child is not None:
382 self._layout.removeWidget(self._child.toplevel)
384 if self._child is not None:
385 self._layout.addWidget(self._child.toplevel)
390 self._child.disable()
393 self._isEnabled = True
394 if self._child is not None:
398 self._isEnabled = False
399 if self._child is not None:
400 self._child.disable()
403 if self._child is not None:
404 self._child.refresh()
407 class Dialpad(object):
409 def __init__(self, app):
412 self._plus = self._generate_key_button("+", "")
413 self._entry = QtGui.QLineEdit()
415 backAction = QtGui.QAction(None)
416 backAction.setText("Back")
417 backAction.triggered.connect(self._on_backspace)
418 backPieItem = qtpie.QActionPieItem(backAction)
419 clearAction = QtGui.QAction(None)
420 clearAction.setText("Clear")
421 clearAction.triggered.connect(self._on_clear_text)
422 clearPieItem = qtpie.QActionPieItem(clearAction)
423 self._back = qtpie.QPieButton(backPieItem)
424 self._back.set_center(backPieItem)
425 self._back.insertItem(qtpie.PieFiling.NULL_CENTER)
426 self._back.insertItem(clearPieItem)
427 self._back.insertItem(qtpie.PieFiling.NULL_CENTER)
428 self._back.insertItem(qtpie.PieFiling.NULL_CENTER)
430 self._entryLayout = QtGui.QHBoxLayout()
431 self._entryLayout.addWidget(self._plus, 0, QtCore.Qt.AlignCenter)
432 self._entryLayout.addWidget(self._entry, 10)
433 self._entryLayout.addWidget(self._back, 0, QtCore.Qt.AlignCenter)
435 self._smsButton = QtGui.QPushButton("SMS")
436 self._smsButton.clicked.connect(self._on_sms_clicked)
437 self._callButton = QtGui.QPushButton("Call")
438 self._callButton.clicked.connect(self._on_call_clicked)
440 self._padLayout = QtGui.QGridLayout()
441 rows = [0, 0, 0, 1, 1, 1, 2, 2, 2]
442 columns = [0, 1, 2] * 3
454 for (num, letters), (row, column) in zip(keys, zip(rows, columns)):
455 self._padLayout.addWidget(
456 self._generate_key_button(num, letters), row, column, QtCore.Qt.AlignCenter
458 self._padLayout.addWidget(self._smsButton, 3, 0)
459 self._padLayout.addWidget(
460 self._generate_key_button("0", ""), 3, 1, QtCore.Qt.AlignCenter
462 self._padLayout.addWidget(self._callButton, 3, 2)
464 self._layout = QtGui.QVBoxLayout()
465 self._layout.addLayout(self._entryLayout)
466 self._layout.addLayout(self._padLayout)
467 self._widget = QtGui.QWidget()
468 self._widget.setLayout(self._layout)
475 self._smsButton.setEnabled(True)
476 self._callButton.setEnabled(True)
479 self._smsButton.setEnabled(False)
480 self._callButton.setEnabled(False)
485 def _generate_key_button(self, center, letters):
486 centerPieItem = self._generate_button_slice(center)
487 button = qtpie.QPieButton(centerPieItem)
488 button.set_center(centerPieItem)
490 if len(letters) == 0:
492 pieItem = qtpie.PieFiling.NULL_CENTER
493 button.insertItem(pieItem)
494 elif len(letters) in [3, 4]:
495 for i in xrange(6 - len(letters)):
496 pieItem = qtpie.PieFiling.NULL_CENTER
497 button.insertItem(pieItem)
499 for letter in letters:
500 pieItem = self._generate_button_slice(letter)
501 button.insertItem(pieItem)
504 pieItem = qtpie.PieFiling.NULL_CENTER
505 button.insertItem(pieItem)
507 raise NotImplementedError("Cannot handle %r" % letters)
510 def _generate_button_slice(self, letter):
511 action = QtGui.QAction(None)
512 action.setText(letter)
513 action.triggered.connect(lambda: self._on_keypress(letter))
514 pieItem = qtpie.QActionPieItem(action)
517 @misc_utils.log_exception(_moduleLogger)
518 def _on_keypress(self, key):
519 self._entry.insert(key)
521 @misc_utils.log_exception(_moduleLogger)
522 def _on_backspace(self, toggled = False):
523 self._entry.backspace()
525 @misc_utils.log_exception(_moduleLogger)
526 def _on_clear_text(self, toggled = False):
529 @misc_utils.log_exception(_moduleLogger)
530 def _on_sms_clicked(self, checked = False):
531 number = str(self._entry.text())
535 @misc_utils.log_exception(_moduleLogger)
536 def _on_call_clicked(self, checked = False):
537 number = str(self._entry.text())
542 class History(object):
550 HISTORY_ITEM_TYPES = ["All", "Received", "Missed", "Placed"]
551 HISTORY_COLUMNS = ["When", "What", "Number", "From"]
552 assert len(HISTORY_COLUMNS) == MAX_IDX
554 def __init__(self, app):
555 self._selectedFilter = self.HISTORY_ITEM_TYPES[0]
558 self._listSelection = QtGui.QComboBox()
559 self._listSelection.addItems(self.HISTORY_ITEM_TYPES)
560 self._listSelection.setCurrentIndex(self.HISTORY_ITEM_TYPES.index(self._selectedFilter))
561 self._listSelection.currentIndexChanged.connect(self._on_filter_changed)
563 self._itemStore = QtGui.QStandardItemModel()
564 self._itemStore.setHorizontalHeaderLabels(self.HISTORY_COLUMNS)
566 self._itemView = QtGui.QTreeView()
567 self._itemView.setModel(self._itemStore)
568 self._itemView.setUniformRowHeights(True)
569 self._itemView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
570 self._itemView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
571 self._itemView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
572 self._itemView.setHeaderHidden(True)
573 self._itemView.activated.connect(self._on_row_activated)
575 self._layout = QtGui.QVBoxLayout()
576 self._layout.addWidget(self._listSelection)
577 self._layout.addWidget(self._itemView)
578 self._widget = QtGui.QWidget()
579 self._widget.setLayout(self._layout)
594 @misc_utils.log_exception(_moduleLogger)
595 def _on_filter_changed(self, newItem):
596 self._selectedFilter = str(newItem)
598 @misc_utils.log_exception(_moduleLogger)
599 def _on_row_activated(self, index):
600 rowIndex = index.row()
603 class Messages(object):
605 def __init__(self, app):
608 self._itemStore = QtGui.QStandardItemModel()
609 self._itemStore.setHorizontalHeaderLabels(["Messages"])
611 self._itemView = QtGui.QTreeView()
612 self._itemView.setModel(self._itemStore)
613 self._itemView.setUniformRowHeights(True)
614 self._itemView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
615 self._itemView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
616 self._itemView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
617 self._itemView.setHeaderHidden(True)
618 self._itemView.activated.connect(self._on_row_activated)
620 self._layout = QtGui.QVBoxLayout()
621 self._layout.addWidget(self._itemView)
622 self._widget = QtGui.QWidget()
623 self._widget.setLayout(self._layout)
638 @misc_utils.log_exception(_moduleLogger)
639 def _on_row_activated(self, index):
640 rowIndex = index.row()
643 class Contacts(object):
645 def __init__(self, app):
646 self._selectedFilter = ""
649 self._listSelection = QtGui.QComboBox()
650 self._listSelection.addItems([])
651 #self._listSelection.setCurrentIndex(self.HISTORY_ITEM_TYPES.index(self._selectedFilter))
652 self._listSelection.currentIndexChanged.connect(self._on_filter_changed)
654 self._itemStore = QtGui.QStandardItemModel()
655 self._itemStore.setHorizontalHeaderLabels(["Contacts"])
657 self._itemView = QtGui.QTreeView()
658 self._itemView.setModel(self._itemStore)
659 self._itemView.setUniformRowHeights(True)
660 self._itemView.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
661 self._itemView.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
662 self._itemView.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
663 self._itemView.setHeaderHidden(True)
664 self._itemView.activated.connect(self._on_row_activated)
666 self._layout = QtGui.QVBoxLayout()
667 self._layout.addWidget(self._listSelection)
668 self._layout.addWidget(self._itemView)
669 self._widget = QtGui.QWidget()
670 self._widget.setLayout(self._layout)
685 @misc_utils.log_exception(_moduleLogger)
686 def _on_filter_changed(self, newItem):
687 self._selectedFilter = str(newItem)
689 @misc_utils.log_exception(_moduleLogger)
690 def _on_row_activated(self, index):
691 rowIndex = index.row()
694 class MainWindow(object):
708 assert len(_TAB_TITLES) == MAX_TABS
716 assert len(_TAB_CLASS) == MAX_TABS
718 def __init__(self, parent, app):
719 self._fsContactsPath = os.path.join(constants._data_path_, "contacts")
722 self._errorDisplay = QErrorDisplay()
724 self._tabsContents = [
725 DelayedWidget(self._app)
726 for i in xrange(self.MAX_TABS)
729 self._tabWidget = QtGui.QTabWidget()
730 if maeqt.screen_orientation() == QtCore.Qt.Vertical:
731 self._tabWidget.setTabPosition(QtGui.QTabWidget.South)
733 self._tabWidget.setTabPosition(QtGui.QTabWidget.West)
734 for tabIndex, tabTitle in enumerate(self._TAB_TITLES):
735 self._tabWidget.addTab(self._tabsContents[tabIndex].toplevel, tabTitle)
736 self._tabWidget.currentChanged.connect(self._on_tab_changed)
738 self._layout = QtGui.QVBoxLayout()
739 self._layout.addWidget(self._errorDisplay.toplevel)
740 self._layout.addWidget(self._tabWidget)
742 centralWidget = QtGui.QWidget()
743 centralWidget.setLayout(self._layout)
745 self._window = QtGui.QMainWindow(parent)
746 self._window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
747 maeqt.set_autorient(self._window, True)
748 maeqt.set_stackable(self._window, True)
749 self._window.setWindowTitle("%s" % constants.__pretty_app_name__)
750 self._window.setCentralWidget(centralWidget)
752 self._loginTabAction = QtGui.QAction(None)
753 self._loginTabAction.setText("Login")
754 self._loginTabAction.triggered.connect(self._on_login)
756 self._importTabAction = QtGui.QAction(None)
757 self._importTabAction.setText("Import")
758 self._importTabAction.triggered.connect(self._on_import)
760 self._refreshTabAction = QtGui.QAction(None)
761 self._refreshTabAction.setText("Refresh")
762 self._refreshTabAction.setShortcut(QtGui.QKeySequence("CTRL+r"))
763 self._refreshTabAction.triggered.connect(self._on_refresh)
765 self._closeWindowAction = QtGui.QAction(None)
766 self._closeWindowAction.setText("Close")
767 self._closeWindowAction.setShortcut(QtGui.QKeySequence("CTRL+w"))
768 self._closeWindowAction.triggered.connect(self._on_close_window)
771 fileMenu = self._window.menuBar().addMenu("&File")
772 fileMenu.addAction(self._loginTabAction)
773 fileMenu.addAction(self._refreshTabAction)
775 toolsMenu = self._window.menuBar().addMenu("&Tools")
776 toolsMenu.addAction(self._importTabAction)
778 self._window.addAction(self._closeWindowAction)
779 self._window.addAction(self._app.quitAction)
780 self._window.addAction(self._app.fullscreenAction)
782 fileMenu = self._window.menuBar().addMenu("&File")
783 fileMenu.addAction(self._loginTabAction)
784 fileMenu.addAction(self._refreshTabAction)
785 fileMenu.addAction(self._closeWindowAction)
786 fileMenu.addAction(self._app.quitAction)
788 viewMenu = self._window.menuBar().addMenu("&View")
789 viewMenu.addAction(self._app.fullscreenAction)
791 toolsMenu = self._window.menuBar().addMenu("&Tools")
792 toolsMenu.addAction(self._importTabAction)
794 self._window.addAction(self._app.logAction)
796 self._initialize_tab(self._tabWidget.currentIndex())
797 self.set_fullscreen(self._app.fullscreenAction.isChecked())
804 def walk_children(self):
809 for child in self.walk_children():
813 for child in self.walk_children():
818 for child in self.walk_children():
819 child.window.destroyed.disconnect(self._on_child_close)
823 def set_fullscreen(self, isFullscreen):
825 self._window.showFullScreen()
827 self._window.showNormal()
828 for child in self.walk_children():
829 child.set_fullscreen(isFullscreen)
831 def _initialize_tab(self, index):
832 assert index < self.MAX_TABS
833 if not self._tabsContents[index].has_child():
834 self._tabsContents[index].set_child(self._TAB_CLASS[index](self._app))
836 @misc_utils.log_exception(_moduleLogger)
837 def _on_login(self, checked = True):
840 @misc_utils.log_exception(_moduleLogger)
841 def _on_tab_changed(self, index):
842 self._initialize_tab(index)
844 @misc_utils.log_exception(_moduleLogger)
845 def _on_refresh(self, checked = True):
846 index = self._tabWidget.currentIndex()
847 self._tabsContents[index].refresh()
849 @misc_utils.log_exception(_moduleLogger)
850 def _on_import(self, checked = True):
851 csvName = QtGui.QFileDialog.getOpenFileName(self._window, caption="Import", filter="CSV Files (*.csv)")
854 shutil.copy2(csvName, self._fsContactsPath)
856 @misc_utils.log_exception(_moduleLogger)
857 def _on_close_window(self, checked = True):
862 app = QtGui.QApplication([])
863 handle = Dialcentral(app)
868 if __name__ == "__main__":
869 logging.basicConfig(level = logging.DEBUG)
871 os.makedirs(constants._data_path_)