You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-3-console-gui/pym/consolegui/application/tools.py

504 lines
19 KiB

#-*- coding: utf-8 -*-
# Copyright 2012-2016 Mir Calculate. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from .. import qt
from .more import LabelWordWrap, FileOpenWgt, show_msg, show_question, \
client_list_methods, get_icon, dpivalue
class ToolsWidget (qt.QWidget):
def __init__(self, parent, ClientObj, window):
super().__init__()
self.vlayout = qt.QVBoxLayout(self)
self.vlayout.setAlignment(qt.Qt.AlignTop)
self.vlayout.setAlignment(qt.Qt.AlignRight)
# self.move(100+parent.frameGeometry().x(), \
# 100+parent.frameGeometry().y())
self.setFixedSize(dpivalue(450), 100 + dpivalue(120))
self.setWindowTitle(_('Preferences'))
self.setWindowIcon(get_icon("preferences-other"))
# for clear memory after closed this window
self.setWindowModality(qt.Qt.WindowModal)
self.setAttribute(qt.Qt.WA_DeleteOnClose)
self.create(parent, ClientObj)
self.move(window.geometry().x() + window.geometry().width() / 2 \
- self.size().width() / 2, \
window.geometry().y() + window.geometry().height() / 2 \
- self.size().height() / 2)
gui_signal = qt.Signal()
other_signal = qt.Signal()
def create(self, parent, ClientObj):
if self.layout():
for i in range(self.layout().count()):
child = self.layout().takeAt(0)
child.widget().hide()
child.widget().destroy()
del (child)
# Add clear config button
clear_button = qt.QPushButton(get_icon("edit-delete-page"),
_('Clear the configuration file'),self)
clear_button.clicked.connect(self.clear_config(parent, ClientObj))
self.vlayout.addWidget(clear_button)
tab = ToolTabWidget(self, ClientObj)
tab.resize(tab.sizeHint())
self.vlayout.addWidget(tab)
# add ok, apply and cancel button
botton_wgt = qt.QWidget(self)
self.botton_layout = qt.QHBoxLayout(botton_wgt)
self.botton_layout.setContentsMargins(0,0,0,0)
self.botton_layout.setAlignment(qt.Qt.AlignRight)
toolOk = qt.QPushButton(_('Ok'), self)
toolOk.setShortcut(qt.QKeySequence(qt.Qt.Key_Return))
toolOk.clicked.connect(self.save_changes(ClientObj, tab))
toolOk.clicked.connect(self.close)
self.botton_layout.addWidget(toolOk)
toolApply = qt.QPushButton(_('Apply'), self)
toolApply.clicked.connect(self.save_changes(ClientObj, tab))
self.botton_layout.addWidget(toolApply)
toolQuit = qt.QPushButton(_('Cancel'), self)
toolQuit.clicked.connect(self.close)
toolQuit.setShortcut(qt.QKeySequence(qt.Qt.Key_Escape))
self.botton_layout.addWidget(toolQuit)
self.gui_signal.connect(tab.GuiWidget.save_changes(ClientObj))
self.other_signal.connect(tab.OtherWidget.save_changes(ClientObj))
# self.grid.addWidget(botton_wgt, 6, 1)
self.vlayout.addWidget(botton_wgt)
# clear_button.setMaximumWidth(self.sizeHint().width() / 2)
clear_button.setMaximumWidth(dpivalue(220))
def save_changes(self, ClientObj, tab):
def wrapper():
if type (tab.currentWidget()) == ToolGui:
self.gui_signal.emit()
else:
self.other_signal.emit()
return wrapper
def clear_config(self, parent, ClientObj):
def wrapper():
try:
# fc = open (ClientObj.user_config, 'w')
# fc.close()
os.remove(ClientObj.user_config)
ClientObj.create_user_config()
ClientObj.read_user_config(ClientObj.user_config)
except Exception as e:
show_msg (e, 'Clear Config Error')
finally:
self.create(parent, ClientObj)
return wrapper
class ToolTabWidget(qt.QTabWidget):
def __init__(self, parent, ClientObj):
super().__init__(parent)
self.ClientObj = ClientObj
self.GuiWidget = ToolGui(self, ClientObj)
self.OtherWidget = ToolOther(self, ClientObj)
self.gui_icon = get_icon("video-display")
self.other_icon = get_icon("preferences-other", "preferences-desktop")
self.addTab(self.GuiWidget, self.gui_icon ,_('GUI'))
self.addTab(self.OtherWidget, self.other_icon, _('Other'))
# message about save
self.cur_tab_num = 0
self.changed_flag = False
self.currentChanged.connect(self.save_mess)
self.setAttribute(qt.Qt.WA_DeleteOnClose)
gui_signal = qt.Signal()
other_signal = qt.Signal()
def save_mess(self, tab_num):
# change tab with unsaved changes
tab_list = [_('GUI'),_('Other')]
if self.changed_flag:
text = _('There are unsaved changes in tab %s') \
%tab_list[self.cur_tab_num]
informative_text = _('<center>Apply them?</center>')
reply = show_question(self.parent(), text, informative_text,
title = _('Saving changes'))
if reply == qt.QMessageBox.Yes:
if self.cur_tab_num == 0:
self.gui_signal.connect \
(self.GuiWidget.save_changes(self.ClientObj))
self.gui_signal.emit()
elif self.cur_tab_num == 1:
self.other_signal.connect \
(self.OtherWidget.save_changes(self.ClientObj))
self.other_signal.emit()
self.changed_flag = False
self.removeTab(self.cur_tab_num)
if self.cur_tab_num == 0:
self.GuiWidget = ToolGui(self, self.ClientObj)
self.insertTab(self.cur_tab_num, self.GuiWidget, \
self.gui_icon, _('GUI'))
elif self.cur_tab_num == 1:
self.OtherWidget = ToolOther(self, self.ClientObj)
self.insertTab(self.cur_tab_num, self.OtherWidget, \
self.other_icon, _('Other'))
self.cur_tab_num = tab_num
self.changed_flag = False
# Gui tools in ToolTabWidget
class ToolGui(qt.QWidget):
def __init__(self, parent, ClientObj):
super().__init__(parent)
self.user_config = ClientObj.user_config
self._parent = parent
self.grid = qt.QGridLayout(self)
self.grid.setContentsMargins(2,2,2,2)
self.grid.setSpacing(2)
self.grid.setColumnStretch(0,3)
self.grid.setColumnStretch(1,5)
# self.grid.setAlignment(qt.Qt.AlignLeft)
# add height image in grid
self.h_image_lbl = LabelWordWrap(_('Image height'), self)
self.h_image_lbl.setMaximumWidth(self.h_image_lbl.sizeHint().width())
self.h_image_lineedit = qt.QLineEdit(self)
self.h_image_lineedit.setToolTip(_('Set a fixed height image for '
'actions')+' '+_('0: hide images'))
self.h_image_lineedit.setText(str(ClientObj.height_image))
self.grid.addWidget(self.h_image_lbl, 0, 0)
self.grid.addWidget(self.h_image_lineedit, 0, 1)
# add count item in result table in grid
self.count_row_lbl = LabelWordWrap(_('Rows in Table'),self)
self.count_row_lbl.setMaximumWidth \
(self.count_row_lbl.sizeHint().width())
self.count_row_lineedit = qt.QLineEdit(self)
self.count_row_lineedit.setText(str(ClientObj.count_row_res_table))
self.grid.addWidget(self.count_row_lbl, 2, 0)
self.grid.addWidget(self.count_row_lineedit, 2, 1)
# add spacer
self.grid.addItem(qt.QSpacerItem(0,0, qt.QSizePolicy.Expanding, \
qt.QSizePolicy.Expanding ), 3, 0, 1, 2)
# connect all with change value slot
self.h_image_lineedit.textChanged.connect(self.changed_val)
self.count_row_lineedit.textChanged.connect(self.changed_val)
def changed_val(self):
self._parent.changed_flag = True
def set_opacity_lbl(self, val):
self.opacity_lbl.setText(self.opacity_lbl_text + str(val))
def check_cfg (self, flag, config, part, param, value):
# if param not exists in config
if not flag:
part_flag = False
temp_cfg = []
for line in config:
temp_cfg.append(line)
#add new line in config
if line.startswith(part):
temp_cfg.append('%s = %s\n' %(param, value))
part_flag = True
config = temp_cfg
# if part not exists
if not part_flag:
config.append('\n')
config.append('%s\n' %part)
config.append('%s = %s\n' %(param, value))
return config
def save_changes(self, ClientObj):
def wrapper():
if not os.path.isfile (self.user_config):
f = open (self.user_config, 'w')
f.close()
fc = open (self.user_config, 'r')
config = fc.readlines()
fc.close()
new_config = []
# bg_color_flag = False
count_row_flag = False
count_row_flag = False
h_image_flag = False
for line in config:
if line.startswith('height_image '):
h_image_flag = True
try:
height_image = int(self.h_image_lineedit.text())
except ValueError:
height_image = ClientObj.height_image
if height_image < 0 or height_image > 512:
height_image = ClientObj.height_image
new_config.append('height_image = %d\n' %height_image)
elif line.startswith('count_row '):
count_row_flag = True
try:
count_row = int(self.count_row_lineedit.text())
if count_row < 2:
count_row = 2
except ValueError:
count_row = ClientObj.count_row_res_table
new_config.append('count_row = %d\n' %count_row)
else:
new_config.append(line)
try:
count_row = int(self.count_row_lineedit.text())
if count_row < 2:
count_row = 2
except ValueError:
count_row = ClientObj.count_row_res_table
new_config = self.check_cfg (count_row_flag, new_config, \
'[gui]', 'count_row', count_row)
try:
height_image = int(self.h_image_lineedit.text())
except ValueError:
height_image = ClientObj.height_image
if height_image < 0 or height_image > 512:
height_image = ClientObj.height_image
new_config = self.check_cfg (h_image_flag, new_config, \
'[gui]', 'height_image', height_image)
fnc = open(self.user_config, 'w')
for line in new_config:
fnc.write(line)
fnc.close()
# read config for changed parameters
ClientObj.create_user_config()
ClientObj.read_user_config(ClientObj.user_config)
# reset unsaved changes flag
self._parent.changed_flag = False
return wrapper
# Other tools in ToolTabWidget
class ToolOther(qt.QWidget):
def __init__(self, parent, ClientObj):
super().__init__(parent)
self.user_config = ClientObj.user_config
self._parent = parent
self.grid = qt.QGridLayout(self)
self.grid.setContentsMargins(2,2,2,2)
self.grid.setSpacing(2)
self.grid.setColumnStretch(0,3)
self.grid.setColumnStretch(1,5)
# lang settings
self.lang_lbl = LabelWordWrap(_('Select Language'), self)
self.lang_lbl.setMaximumWidth(self.lang_lbl.sizeHint().width())
self.lang_ComboBox = qt.QComboBox(self)
lang_dict = {'en': _('English'),'ru': _('Russian'),'fr':_('French'),
'uk':_('Ukrainian')}
for lang in lang_dict:
self.lang_ComboBox.addItem(lang_dict[lang])
self.lang_ComboBox.setItemData(self.lang_ComboBox.count()-1,lang)
if ClientObj.lang == lang:
self.lang_ComboBox.setCurrentIndex \
(self.lang_ComboBox.count()-1)
#add lang settings in grid
self.grid.addWidget(self.lang_lbl,0,0)
self.grid.addWidget(self.lang_ComboBox,0,1)
# add open file in grid
self.cert_path_lbl = LabelWordWrap(_('Path to Certificates'), self)
self.cert_path_lbl.setMaximumWidth \
(self.cert_path_lbl.sizeHint().width())
self.fd_cert = FileOpenWgt(self, 'dir', _('Certificate Directory'), \
'~/.calculate')
self.fd_cert.setToolTip(_('Empty to default path'))
self.fd_cert.setText(ClientObj.path_to_cert)
self.grid.addWidget(self.cert_path_lbl, 1, 0)
self.grid.addWidget(self.fd_cert, 1, 1)
# # add timeout in grid
# self.timeout_lbl = LabelWordWrap(_('Timeout'), self)
# self.timeout_lbl.setMaximumWidth(self.timeout_lbl.sizeHint().width())
#
# self.timeout_lineedit = qt.QLineEdit(self)
#
# self.timeout_lineedit.setText(str(ClientObj.timeout))
#
# self.grid.addWidget(self.timeout_lbl, 2, 0)
# self.grid.addWidget(self.timeout_lineedit, 2, 1)
# add spacer
self.grid.addItem(qt.QSpacerItem(0,0, qt.QSizePolicy.Expanding, \
qt.QSizePolicy.Expanding ), 5, 0, 1, 2)
# connect all with change value slot
self.lang_ComboBox.currentIndexChanged.connect(self.changed_val)
self.fd_cert.textChanged.connect(self.changed_val)
# self.timeout_lineedit.editTextChanged.connect(self.changed_val)
self.setAttribute(qt.Qt.WA_DeleteOnClose)
def changed_val(self):
self._parent.changed_flag = True
def check_cfg (self, flag, config, part, param, value):
# if param not exists in config
if not flag:
part_flag = False
temp_cfg = []
for line in config:
temp_cfg.append(line)
#add new line in config
if line.startswith(part):
temp_cfg.append('%s = %s\n' %(param, value))
part_flag = True
config = temp_cfg
# if part not exists
if not part_flag:
config.append('\n')
config.append('%s\n' %part)
config.append('%s = %s\n' %(param, value))
return config
def save_changes(self, ClientObj):
def wrapper():
if not os.path.isfile (self.user_config):
f = open (self.user_config, 'w')
f.close()
fc = open (self.user_config, 'r')
config = fc.readlines()
fc.close()
new_config = []
lang_flag = False
cert_flag = False
# timeout_flag = False
for line in config:
if line.startswith('lang '):
lang_flag = True
new_config.append('lang = %s\n' \
%self.lang_ComboBox.itemData \
(self.lang_ComboBox.currentIndex()))
elif line.startswith('path_to_cert '):
cert_flag = True
if os.path.isdir(self.fd_cert.text()):
new_config.append('path_to_cert = %s\n' \
%self.fd_cert.text())
elif not self.fd_cert.text():
new_config.append('path_to_cert = no\n')
else:
new_config.append(line)
# elif line.startswith('timeout '):
# timeout_flag = True
# try:
# timeout = int(self.timeout_lineedit.text())
# except ValueError:
# timeout = ClientObj.timeout
# new_config.append('timeout = %d\n' %timeout)
else:
new_config.append(line)
new_config = self.check_cfg (lang_flag, new_config, \
'[other]', 'lang', self.lang_ComboBox.itemData \
(self.lang_ComboBox.currentIndex()))
if not self.fd_cert.text().lower():
new_config = self.check_cfg (cert_flag, new_config, \
'[other]', 'path_to_cert', 'no')
elif os.path.isdir(self.fd_cert.text()):
new_config = self.check_cfg (cert_flag, new_config, \
'[other]', 'path_to_cert', self.fd_cert.text())
# try:
# timeout = int(self.timeout_lineedit.text())
# except ValueError:
# timeout = ClientObj.timeout
# new_config = self.check_cfg (timeout_flag, new_config, \
# '[other]', 'timeout', timeout)
fnc = open(self.user_config, 'w')
for line in new_config:
fnc.write(line)
fnc.close()
# read config for changed parameters
ClientObj.create_user_config()
ClientObj.read_user_config(ClientObj.user_config)
# reset unsaved changes flag
self._parent.changed_flag = False
if ClientObj.client:
from .session_function import client_post_cert
ClientObj.lang = self.lang_ComboBox.itemData \
(self.lang_ComboBox.currentIndex())
if ClientObj.client:
try:
client_post_cert(ClientObj.client, ClientObj.lang)
except:
return
ClientObj.methods_list = client_list_methods \
(ClientObj.sid, ClientObj.client)
from .DisplayMethod import DisplayMethod
if type (ClientObj.MainWidget.MainFrameWgt) \
== DisplayMethod:
ClientObj.MainWidget.display_methods()
return wrapper