class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setWindowIcon(QIcon(":/small_icons/cryotec_logo.png")) self.setWindowTitle(u"Криотек Клиент") self.resize(1024,768) from views import FixWithButtonsView, ReportWithButtonsView, \ MaintenanceWithButtonsView, CheckupWithButtonsView, MachinePanel from widgets import ServerResponceDock, ShowModelInfoDock, StatusBar from models import models self.machine_tree = MachinePanel() self.info_dock = ShowModelInfoDock(u"Информация", self) self.info_dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea |\ Qt.BottomDockWidgetArea) self.machine_tree.view.modelSelectionChanged.connect(self.info_dock.view.modelChanged) self.machine_tree.view.modelSelectionCleared.connect(self.info_dock.view.modelCleared) self.note_views = { u"Неисправности":ReportWithButtonsView(None), u"Ремонты":FixWithButtonsView(None), u"Техобслуживания":MaintenanceWithButtonsView(None), u"Контроли моточасов":CheckupWithButtonsView(None), } #self.machine_tree.setSelectionMode(QAbstractItemView.MultiSelection) self.notebook = CentralNotebook(self.machine_tree, self.info_dock, self.note_views) self.setCentralWidget(self.notebook) machineDockWidget = QDockWidget(u"Оборудование", self) machineDockWidget.setObjectName("machine_dock") machineDockWidget.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) machineDockWidget.setWidget(self.machine_tree) self.responce_dock = ServerResponceDock(u"Ответ от сервера", self) self.responce_dock.setAllowedAreas(Qt.RightDockWidgetArea|Qt.BottomDockWidgetArea) self.settings_dialog = SettingsDialog(models_manager=models) settingsAction = QAction(QIcon(":/icons/setting_tools.png"), u"Настройки", self) settingsAction.triggered.connect(self.settings_dialog.exec_) self.about_dialog = AboutDialog(self) aboutAction = QAction(QIcon(":/icons/information.png"), u"О программе...", self) aboutAction.triggered.connect(self.about_dialog.exec_) helpAction = QAction(u"Справка", self) helpAction.triggered.connect(lambda: QDesktopServices.openUrl(QUrl("doc/index.html"))) saveAction = QAction(QIcon(":/icons/save_as.png"), u"Сохранить", self) saveAction.triggered.connect(self.save_to_file) openAction = QAction(QIcon(":/icons/folder.png"), u"Открыть", self) openAction.triggered.connect(self.load_from_file) self.syncAction = QAction(QIcon(":/icons/update.png"), u"Синхронизировать", self) self.syncAction.triggered.connect(self.synchronize) syncButton = QToolButton() syncButton.setDefaultAction(self.syncAction) syncButton.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) # syncStatusBarButton = QToolButton() # syncStatusBarButton.setDefaultAction(self.syncAction) machinetreepanelAction = machineDockWidget.toggleViewAction() machinetreepanelAction.setIcon(QIcon(":/icons/application_side_tree.png")) responcedockAction = self.responce_dock.toggleViewAction() infodockAction = self.info_dock.toggleViewAction() # self.statusBar().addPermanentWidget(syncStatusBarButton) quitAction = QAction(u"Выход", self) quitAction.triggered.connect(self.close) self.status_bar = StatusBar(parent=self) self.setStatusBar(self.status_bar) self.mm = models self.mm.add_notify_dumped(self.synced) self.mm.add_notify_undumped(self.unsynced) self.mm.add_notify_dumped(self.status_bar.synced) self.mm.add_notify_undumped(self.status_bar.unsynced) self.mm.add_notify_dumped(self.responce_dock.show_responce) self.mm.add_notify_change_user(self.status_bar.userChanged) self.status_bar.userChanged(self.mm.get_current_user()) self.status_bar.clicked.connect(\ lambda: self.info_dock.view.modelChanged(self.mm.get_current_user())) self.addDockWidget(Qt.LeftDockWidgetArea, machineDockWidget) self.addDockWidget(Qt.BottomDockWidgetArea, self.info_dock) self.addDockWidget(Qt.BottomDockWidgetArea, self.responce_dock) self.setCorner(Qt.BottomLeftCorner, Qt.LeftDockWidgetArea) mainmenu = self.menuBar() filemenu = mainmenu.addMenu(u"Файл") viewmenu = mainmenu.addMenu(u"Вид") connmenu = mainmenu.addMenu(u"Соединение") helpmenu = mainmenu.addMenu(u"Справка") viewmenu.addAction(machinetreepanelAction) viewmenu.addAction(responcedockAction) viewmenu.addAction(infodockAction) connmenu.addAction(self.syncAction) filemenu.addAction(settingsAction) filemenu.addAction(saveAction) filemenu.addAction(openAction) filemenu.addAction(quitAction) helpmenu.addAction(aboutAction) helpmenu.addAction(helpAction) toolbar = self.addToolBar("main") toolbar.setObjectName("main_toolbar") toolbar.addAction(machinetreepanelAction) toolbar.addWidget(syncButton) toolbar.addAction(settingsAction) settings = QSettings() self.restoreGeometry(settings.value("geometry").toByteArray()); self.restoreState(settings.value("windowState").toByteArray()); for widget in self.note_views.values(): table_name = widget.view.__class__.__name__+"State" widget.view.horizontalHeader().restoreState(settings.value(table_name, "").toByteArray()) def synchronize(self): """Synchronizes ModelsManager""" self.statusBar().synchronize() if not self.mm.is_all_dumped(): self.mm.dump() else: self.mm.load_from_server() def synced(self, responces=None): self.syncAction.setIcon(QIcon(":/icons/update.png")) def unsynced(self): self.syncAction.setIcon(QIcon(":/icons/unupdated.png")) def closeEvent(self, event): settings = QSettings() settings.setValue("geometry", self.saveGeometry()) settings.setValue("windowState", self.saveState()) for widget in self.note_views.values(): table_name = widget.view.__class__.__name__+"State" settings.setValue(table_name, widget.view.horizontalHeader().saveState()) QMainWindow.closeEvent(self, event) def save_to_file(self): fileName = QFileDialog.getSaveFileName(self, u"Сохранить состояние как",\ filter=u"Файлы состояний (*.crs)") +".crs" f = open(fileName,'w') self.mm.save_to_file(f) def load_from_file(self): if self.mm.is_all_dumped(): confirm = False #FIXME else: confirm = True if confirm: fileName = QFileDialog.getOpenFileName(self, u"Открыть состояние",\ filter=u"Файлы состояний (*.crs)") if fileName: f = open(fileName,'r') self.mm.load_from_file(f) self.machine_tree.show_all()