Ejemplo n.º 1
0
class MainWindow(QMainWindow):

    def __init__(self, shampoo):
        super().__init__()
        self.setWindowTitle("Shampoo")
        self.resize(800, 400)
        #self.showMaximized()
        self.shampoo = shampoo
        self._create_central_widget()
        self._create_main_menu()

        self.case = None
        self.tree = None

    def set_case(self, case):
        self.case = case

        self.case.rebuild_scene.connect(self.rebuild_scene)

        self.tree = case.make_tree(self)
        self.tree.rebuild_scene.connect(self.rebuild_scene)
        self.treeview.setModel(self.tree)
        self.treeview.expandAll()
        self.treeview.selectionModel().currentChanged.connect(self._select_node)
        self.rebuild_scene()
        self.focus_on_node(self.tree)
        self.update_title()

    def select_node(self, node):
        layout = self.editwidget.layout()
        ui.qtutils.clean_layout(layout)
        node.make_editor(layout)
        layout.addSpacerItem(
                QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding))

    def focus_on_node(self, node):
        items = []
        node.collect_render_items(items)
        bounding_box = BoundingBox()
        for item in items:
            bounding_box.add_box(item.bounding_box)
        if bounding_box.is_valid():
            self.glwidget.focus_on_bounding_box(bounding_box)

    def rebuild_scene(self):
        items = []
        self.tree.collect_render_items(items)
        self.glwidget.render_items = items
        self.glwidget.update()

    def update_title(self):
        if not self.case or not self.case.path:
            self.setWindowTitle("Shampoo")
        else:
            self.setWindowTitle("Shampoo - " + self.case.path)

    def _select_node(self, current, old):
        node = current.internalPointer()
        if node is None:
            return
        self.select_node(node)

    def _create_main_menu(self):
        menu = self.menuBar().addMenu("&Case")
        a = menu.addAction("&New")

        a = menu.addAction("&Open")
        a.triggered.connect(self.shampoo.open)

        a = menu.addAction("&Save")
        a.triggered.connect(self.shampoo.save)

        a = menu.addAction("Save &as")
        a.triggered.connect(self.shampoo.save_as)

        menu.addSeparator()
        a = menu.addAction("&Quit")
        a.triggered.connect(self.shampoo.app.quit)

        menu = self.menuBar().addMenu("&Options")
        a = menu.addAction("&Configure Shampoo")
        a.triggered.connect(self.shampoo.configure)

    def _create_central_widget(self):

        tabs = QTabWidget()

        splitter = QSplitter()
        self.treeview = QTreeView()
        self.treeview.header().hide()
        self.treeview.resize(500, 0)
        splitter.addWidget(self.treeview)

        self.editwidget = QWidget()
        self.editwidget.setLayout(QVBoxLayout())
        self.editwidget.resize(300, 300)
        self.editwidget.setMinimumSize(300, 100)
        splitter.addWidget(self.editwidget)

        self.glwidget = GLWidget()
        splitter.addWidget(self.glwidget)

        splitter.setStretchFactor(0, 2)
        splitter.setStretchFactor(1, 2)
        splitter.setStretchFactor(2, 4)

        tabs.addTab(splitter, "Mesh")

        tabs.addTab(self._create_run(), "Run")

        self.setCentralWidget(tabs)

    def _create_run(self):
        run = QSplitter()

        buttons = QWidget()
        layout = QVBoxLayout()
        buttons.setLayout(layout)

        button = QPushButton("Run blockMesh")
        button.clicked.connect(self.shampoo.run)
        layout.addWidget(button)

        button_terminate = QPushButton("Terminate")
        button_terminate.clicked.connect(self.shampoo.run)
        button_terminate.setEnabled(False)
        layout.addWidget(button_terminate)

        layout.addSpacerItem(
                QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding))
        run.addWidget(buttons)

        self.console = Console()
        run.addWidget(self.console)
        return run