complaints by pylint are mainly related to - remove object from base list in class definitions - unnecessary else/elif after return/raise Change-Id: I13d15449149cc8bba0562338d0c9c42e97163bdf Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/21325 Tested-by: JenkinsCodeReview <bjoern_pedersen@frm2.tum.de> Reviewed-by: Markus Zolliker <markus.zolliker@psi.ch>
227 lines
8.2 KiB
Python
227 lines
8.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# *****************************************************************************
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it under
|
|
# the terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
# Module authors:
|
|
# Sandra Seger <sandra.seger@frm2.tum.de>
|
|
#
|
|
# *****************************************************************************
|
|
|
|
import os
|
|
from secop.gui.qt import QMainWindow, QMessageBox
|
|
from secop.gui.cfg_editor.node_display import NodeDisplay
|
|
from secop.gui.cfg_editor.utils import loadUi, get_file_paths
|
|
from secop.gui.cfg_editor.widgets import TabBar
|
|
|
|
|
|
# TODO move secop mainwinodw to gui/client and all specific stuff
|
|
NODE = 'node'
|
|
MODULE = 'module'
|
|
INTERFACE = 'interface'
|
|
PARAMETER = 'parameter'
|
|
PROPERTY = 'property'
|
|
COMMENT = 'comment'
|
|
|
|
|
|
class MainWindow(QMainWindow):
|
|
|
|
def __init__(self, file_path=None, parent=None):
|
|
QMainWindow.__init__(self, parent)
|
|
loadUi(self, 'mainwindow.ui')
|
|
self.tabWidget.currentChanged.connect(self.tab_relevant_btns_disable)
|
|
if file_path is None:
|
|
self.tab_relevant_btns_disable(-1)
|
|
else:
|
|
self.duplicate_btn.setEnabled(False)
|
|
self.delete_btn.setEnabled(False)
|
|
self.tabWidget.setTabBar(TabBar())
|
|
self.tabWidget.tabBar().tabCloseRequested.connect(self.close_tab)
|
|
self.open_file(file_path)
|
|
self.new_files = 0
|
|
|
|
def on_actionNew(self):
|
|
name = 'unnamed_%i.cfg' % self.new_files if self.new_files else \
|
|
'unnamed.cfg'
|
|
self.new_node(name)
|
|
self.new_files += 1
|
|
|
|
def on_actionOpen(self):
|
|
file_paths = get_file_paths(self)
|
|
for file_path in file_paths:
|
|
self.open_file(file_path)
|
|
|
|
def on_actionSave(self):
|
|
self.save_tab(self.tabWidget.currentIndex())
|
|
|
|
def on_actionSave_as(self):
|
|
self.save_tab(self.tabWidget.currentIndex(), True)
|
|
|
|
def on_action_Close(self):
|
|
self.close_tab(self.tabWidget.currentIndex())
|
|
|
|
def on_actionQuit(self):
|
|
self.close()
|
|
|
|
def on_actionAbout(self):
|
|
QMessageBox.about(
|
|
self, 'About cfg-editor',
|
|
'''
|
|
<h2>About cfg-editor</h2>
|
|
<p style="font-style: italic">
|
|
(C) 2019 MLZ instrument control
|
|
</p>
|
|
<p>
|
|
cfg-editor is a graphical interface for editing
|
|
FRAPPY-configuration-files.
|
|
</p>
|
|
<h3>Author:</h3>
|
|
<ul>
|
|
<li>Copyright (C) 2019
|
|
<a href="mailto:sandra.seger@frm2.tum.de">Sandra Seger</a>
|
|
</li>
|
|
</ul>
|
|
<p>
|
|
cfg-editor is published under the
|
|
<a href="http://www.gnu.org/licenses/gpl.html">GPL
|
|
(GNU General Public License)</a>
|
|
</p>
|
|
''')
|
|
|
|
def on_add_module(self):
|
|
self.tabWidget.currentWidget().tree_widget.add_module()
|
|
|
|
def on_add_interface(self):
|
|
self.tabWidget.currentWidget().tree_widget.add_interface()
|
|
|
|
def on_add_parameter(self):
|
|
self.tabWidget.currentWidget().tree_widget.add_parameter()
|
|
|
|
def on_add_property(self):
|
|
self.tabWidget.currentWidget().tree_widget.add_property()
|
|
|
|
def on_add_comment(self):
|
|
self.tabWidget.currentWidget().tree_widget.add_comment()
|
|
|
|
def on_duplicate(self):
|
|
self.tabWidget.currentWidget().tree_widget.duplicate()
|
|
|
|
def on_delete(self):
|
|
self.tabWidget.currentWidget().tree_widget.delete()
|
|
|
|
def open_file(self, file_path):
|
|
for i in range(0, self.tabWidget.count()):
|
|
if self.tabWidget.widget(i).tree_widget.file_path == file_path:
|
|
self.tabWidget.setCurrentIndex(i)
|
|
return
|
|
if file_path:
|
|
self.new_node(os.path.basename(file_path), file_path)
|
|
|
|
def close_tab(self, index):
|
|
if self.tabWidget.widget(index).saved:
|
|
reply = QMessageBox.Close
|
|
else:
|
|
reply = self.show_save_message(self.tabWidget.tabText(index))
|
|
if reply == QMessageBox.Cancel:
|
|
return
|
|
if reply == QMessageBox.Save:
|
|
self.save_tab(index)
|
|
self.tabWidget.removeTab(index)
|
|
|
|
def save_tab(self, index, save_as=False):
|
|
widget = self.tabWidget.widget(index)
|
|
if widget.tree_widget.save(save_as):
|
|
self.tabWidget.setTabText(index, os.path.basename(
|
|
widget.tree_widget.file_path))
|
|
|
|
def closeEvent(self, event):
|
|
if self.tabWidget.count():
|
|
reply = None
|
|
for i in range(0, self.tabWidget.count()):
|
|
if not self.tabWidget.widget(i).saved:
|
|
reply = self.show_save_message()
|
|
break
|
|
if not reply:
|
|
reply = QMessageBox.Close
|
|
if reply == QMessageBox.Cancel:
|
|
event.ignore()
|
|
return
|
|
if reply == QMessageBox.Save:
|
|
for i in range(0, self.tabWidget.count()):
|
|
self.save_tab(i)
|
|
event.accept()
|
|
|
|
def show_save_message(self, file_name=''):
|
|
if file_name:
|
|
file_name = ' in "%s"' % file_name
|
|
return QMessageBox.question(self, 'Save file?', '''
|
|
<h2>Do you want to save changes%s?</h2>
|
|
<p>
|
|
Your changes will be lost if you don't save them!
|
|
</p>
|
|
''' % file_name,
|
|
QMessageBox.Cancel | QMessageBox.Close |
|
|
QMessageBox.Save, QMessageBox.Save)
|
|
|
|
def new_node(self, name, file_path=None):
|
|
node = NodeDisplay(file_path)
|
|
if node.created:
|
|
node.tree_widget.currentItemChanged.connect(self.disable_btns)
|
|
self.tabWidget.setCurrentIndex(self.tabWidget.addTab(node, name))
|
|
|
|
def disable_btns(self, current, previous):
|
|
cur_kind = current.kind if current else None
|
|
self.add_parameter_btn.setEnabled(True)
|
|
self.add_property_btn.setEnabled(True)
|
|
self.add_comment_btn.setEnabled(True)
|
|
self.duplicate_btn.setEnabled(True)
|
|
self.delete_btn.setEnabled(True)
|
|
if cur_kind is None:
|
|
self.add_parameter_btn.setEnabled(False)
|
|
self.add_property_btn.setEnabled(False)
|
|
self.add_comment_btn.setEnabled(False)
|
|
self.duplicate_btn.setEnabled(False)
|
|
self.delete_btn.setEnabled(False)
|
|
elif cur_kind not in [MODULE, INTERFACE]:
|
|
self.duplicate_btn.setEnabled(False)
|
|
if cur_kind == NODE:
|
|
self.duplicate_btn.setEnabled(False)
|
|
self.delete_btn.setEnabled(False)
|
|
elif cur_kind == INTERFACE:
|
|
self.add_parameter_btn.setEnabled(False)
|
|
elif cur_kind == PARAMETER:
|
|
self.add_parameter_btn.setEnabled(False)
|
|
elif cur_kind == PROPERTY:
|
|
self.add_parameter_btn.setEnabled(False)
|
|
self.add_property_btn.setEnabled(False)
|
|
elif cur_kind == COMMENT:
|
|
self.add_parameter_btn.setEnabled(False)
|
|
self.add_property_btn.setEnabled(False)
|
|
self.add_comment_btn.setEnabled(False)
|
|
|
|
def tab_relevant_btns_disable(self, index):
|
|
if index == -1:
|
|
enable = False
|
|
self.duplicate_btn.setEnabled(enable)
|
|
self.delete_btn.setEnabled(enable)
|
|
else:
|
|
enable = True
|
|
self.save_btn.setEnabled(enable)
|
|
self.add_module_btn.setEnabled(enable)
|
|
self.add_interface_btn.setEnabled(enable)
|
|
self.add_parameter_btn.setEnabled(enable)
|
|
self.add_property_btn.setEnabled(enable)
|
|
self.add_comment_btn.setEnabled(enable)
|