From a79858efae05ed3538ee19832337207032c154cf Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 09:35:54 +0400 Subject: [PATCH 01/10] fix style, remove checkbox in brief --- consolegui/application/ConnectionTabs.py | 3 +-- consolegui/application/ControlButton.py | 6 +++--- consolegui/application/create_cert.py | 4 +++- consolegui/application/mainframe.py | 20 ++++++++++++++++---- consolegui/application/more.py | 24 +++++++++++++++++++----- 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/consolegui/application/ConnectionTabs.py b/consolegui/application/ConnectionTabs.py index 542da1f..15e859b 100644 --- a/consolegui/application/ConnectionTabs.py +++ b/consolegui/application/ConnectionTabs.py @@ -296,7 +296,7 @@ class ToolTabWidget(QtGui.QTabWidget): self.setCurrentIndex(0) self.removeTab(cur_num) exit_flag = 1 - if self.count() < 2 : + if self.count() < 2: self.add_tab() return exit_flag @@ -316,7 +316,6 @@ class ToolTabWidget(QtGui.QTabWidget): self.new_con_txt) self.setCurrentIndex(self.count() - 2) - def rename_tab(self, text = None, ind = None): if not text: text = self.new_con_txt diff --git a/consolegui/application/ControlButton.py b/consolegui/application/ControlButton.py index 8569b48..a5daa79 100644 --- a/consolegui/application/ControlButton.py +++ b/consolegui/application/ControlButton.py @@ -162,7 +162,7 @@ class ControlButtonWgt(QtGui.QWidget): if hasattr (self, 'next_button'): self.next_button.setStyleSheet("QPushButton {" "color: white; margin 0px;" - "padding-left: 3px; padding-right: 3px;" + "padding-left: 8px; padding-right: 8px;" "border-left: 1px solid black; border-right: 1px solid black;" "border-radius: 0px;" "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.95," @@ -171,7 +171,7 @@ class ControlButtonWgt(QtGui.QWidget): if hasattr (self, 'prev_button'): self.prev_button.setStyleSheet("QPushButton {" "color: white; margin 0px;" - "padding-left: 3px; padding-right: 3px;" + "padding-left: 8px; padding-right: 8px;" "border-left: 1px solid black;" "border-radius: 0px;" "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.95," @@ -198,7 +198,7 @@ class ControlButtonWgt(QtGui.QWidget): self.clear_proc_cache_button.setFixedHeight(38) self.clear_proc_cache_button.setStyleSheet("QPushButton {" "color: white; margin 0px;" - "padding-left: 3px; padding-right: 3px;" + "padding-left: 8px; padding-right: 8px;" "border-left: 1px solid black; border-right: 1px solid black;" "border-radius: 0px;" "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.95," diff --git a/consolegui/application/create_cert.py b/consolegui/application/create_cert.py index 6b5456f..ac1bef8 100755 --- a/consolegui/application/create_cert.py +++ b/consolegui/application/create_cert.py @@ -43,6 +43,8 @@ class RequestCreate (QtGui.QWidget): self.server_host_name = server_host_name self.mainlayout = QtGui.QGridLayout() + self.mainlayout.setColumnStretch(0,2) + self.mainlayout.setColumnStretch(1,5) # Add HostName field host_name = socket.getfqdn() list_host_name = host_name.split('.') @@ -107,7 +109,7 @@ class RequestCreate (QtGui.QWidget): self.setFocus() self.move(50+parent.frameGeometry().x(), \ 50+parent.frameGeometry().y()) -# self.resize(600,400) + self.setMinimumWidth(600) self.show() def create_req(self): diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index 4d1520e..e8bde52 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -1774,11 +1774,23 @@ class MainFrame(QtGui.QWidget): x += 1 elif field.element in ['check', 'check_tristate']: - self.add_element_check (field, x, y, brief = True) -# self.view_dict[field.name].setCheckable(False) - self.view_dict[field.name].disabled = True + label_name = LabelWordWrap(field.label, self) + self.brief_grid.addWidget(label_name, x, y) + + if field.value == 'on': + value = _('Yes') + elif field.value == 'off': + value = _('No') + elif field.value == 'auto': + value = _('Auto') + + label_value = LabelWordWrap(value, self) + self.brief_grid.addWidget(label_value, x, y + 1) + +# self.add_element_check (field, x, y, brief = True) +# self.view_dict[field.name].disabled = True +# self.view_dict.pop(field.name) x += 2 - self.view_dict.pop(field.name) elif field.element == 'table' and field.type != 'steps': field.type = None diff --git a/consolegui/application/more.py b/consolegui/application/more.py index f86f133..39720bb 100755 --- a/consolegui/application/more.py +++ b/consolegui/application/more.py @@ -1617,6 +1617,8 @@ class PlusRow (QtGui.QWidget): QtGui.QWidget.__init__(self) self.grid = QtGui.QGridLayout(self) + self.grid.setContentsMargins(24,8,24,8) + self.grid.setSpacing(16) self.field = field self.table = table self._parent = parent @@ -1633,7 +1635,9 @@ class PlusRow (QtGui.QWidget): # add element in frame if element == 'input': #add label - self.grid.addWidget(QtGui.QLabel(name, self), x, y) + lbl = QtGui.QLabel(name, self) + lbl.setAlignment(QtCore.Qt.AlignRight) + self.grid.addWidget(lbl, x, y) self.widget_dict[str(i)] = QtGui.QLineEdit(self) if field.value: @@ -1653,7 +1657,9 @@ class PlusRow (QtGui.QWidget): x += 1 elif element in ['check', 'check_tristate']: - self.grid.addWidget(QtGui.QLabel(name, self), x, y) + lbl = QtGui.QLabel(name, self) + lbl.setAlignment(QtCore.Qt.AlignRight) + self.grid.addWidget(lbl, x, y) if element == 'check_tristate': self.widget_dict[str(i)] = CentralCheckBox(self, True) else: @@ -1681,7 +1687,9 @@ class PlusRow (QtGui.QWidget): values = choice #add label - self.grid.addWidget(QtGui.QLabel(name, self), x, y) + lbl = QtGui.QLabel(name, self) + lbl.setAlignment(QtCore.Qt.AlignRight) + self.grid.addWidget(lbl, x, y) self.ComboBox = QtGui.QComboBox(self) text = '' if changed: @@ -1721,7 +1729,9 @@ class PlusRow (QtGui.QWidget): values = choice #add label - self.grid.addWidget(QtGui.QLabel(name, self), x, y) + lbl = QtGui.QLabel(name, self) + lbl.setAlignment(QtCore.Qt.AlignRight) + self.grid.addWidget(lbl, x, y) self.ComboBox = QtGui.QComboBox(self) self.ComboBox.setDuplicatesEnabled(False) self.ComboBox.setEditable(True) @@ -1776,7 +1786,9 @@ class PlusRow (QtGui.QWidget): self.widget_dict[str(i)] = \ MultipleChoice(self, choice, def_res, comments, add_ability) #add label - self.grid.addWidget(QtGui.QLabel(name, self), x, y) + lbl = QtGui.QLabel(name, self) + lbl.setAlignment(QtCore.Qt.AlignRight) + self.grid.addWidget(lbl, x, y) self.grid.addWidget(self.widget_dict[str(i)], x, y+1) x += 1 @@ -1784,7 +1796,9 @@ class PlusRow (QtGui.QWidget): if not name or name.lower() == 'password': name = _('Password') lbl1 = LabelWordWrap(name, self) + lbl1.setAlignment(QtCore.Qt.AlignRight) lbl2 = LabelWordWrap(_('Repeat'), self) + lbl2.setAlignment(QtCore.Qt.AlignRight) layout = QtGui.QVBoxLayout() layout.setContentsMargins(0,0,0,0) From d3d2b7da9d0fb13dcb24526d5276464ca44e6a13 Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 12:23:23 +0400 Subject: [PATCH 02/10] fix PsulRow widget, fix endframe event --- consolegui/application/LeftMenu.py | 6 ++--- consolegui/application/MainFrameResult.py | 14 +++++++--- consolegui/application/more.py | 31 ++++++++++++++--------- consolegui/variables/console.py | 1 - scripts/cl-console-gui | 3 ++- setup.py | 24 ------------------ 6 files changed, 34 insertions(+), 45 deletions(-) diff --git a/consolegui/application/LeftMenu.py b/consolegui/application/LeftMenu.py index 998cbf6..6ae76c2 100755 --- a/consolegui/application/LeftMenu.py +++ b/consolegui/application/LeftMenu.py @@ -313,7 +313,7 @@ class LeftMenu(QtGui.QScrollArea): def wrapper(): if hasattr (self, 'check_step_thread'): if self.check_step_thread.isRunning(): - _print ('check_step_thread is running') +# _print ('check_step_thread is running') return 1 change_step = set_step if set_step else 0 @@ -335,7 +335,7 @@ class LeftMenu(QtGui.QScrollArea): def wrapper(): if hasattr (self, 'check_step_thread'): if self.check_step_thread.isRunning(): - _print ('check_step_thread is running') +# _print ('check_step_thread is running') return 1 change_step = set_step if set_step else 0 @@ -356,7 +356,7 @@ class LeftMenu(QtGui.QScrollArea): # Call server method if hasattr (self, 'check_step_thread'): if self.check_step_thread.isRunning(): - _print ('check_step_thread is running') +# _print ('check_step_thread is running') return 1 self.step = set_step if set_step else 0 diff --git a/consolegui/application/MainFrameResult.py b/consolegui/application/MainFrameResult.py index c0af8cd..9916127 100755 --- a/consolegui/application/MainFrameResult.py +++ b/consolegui/application/MainFrameResult.py @@ -287,9 +287,10 @@ class MainFrameRes(QtGui.QWidget): self.task_list.append(task_widget) self.work_layout._addWidget(task_widget) self.initUI() - - def endTask(self, item): - self.set_result_task() + + def endTask(self, item, set_res = True): + if set_res: + self.set_result_task() message = item.message if item.message else '' lbl_temp = LabelWordWrap(message, self) @@ -309,6 +310,10 @@ class MainFrameRes(QtGui.QWidget): pass def endFrame(self, item): + if self.progress_list: + self.progress_list[len(self.progress_list)-1].hide() + self.endTask(item) + self.initUI() self.work_layout.hide_kill_button() self.close_all_thread() @@ -319,7 +324,7 @@ class MainFrameRes(QtGui.QWidget): self._parent.main_frame.setWidgetResizable(True) self._parent.control_button.show() self._parent.control_button.add_clear_cache_button(self.cur_pid) - return 0 + return 0 if hasattr (self, "mytable"): if not self.mytable.readonly: @@ -400,6 +405,7 @@ class MainFrameRes(QtGui.QWidget): return 1 except: return 1 + print 'item.type =', item.type """ get one message by its type """ for case in switch(item.type): if case('normal'): diff --git a/consolegui/application/more.py b/consolegui/application/more.py index 39720bb..ebd5f6e 100755 --- a/consolegui/application/more.py +++ b/consolegui/application/more.py @@ -20,6 +20,8 @@ import os, time, urllib2 from calculate.core.client.function import create_obj from calculate.lib.utils.files import readLinesFile import Image +import pwd +from calculate.lib.utils.files import listDirectory class TopMenu(QtGui.QPushButton): def __init__(self, label, images, parent = None): @@ -1618,7 +1620,7 @@ class PlusRow (QtGui.QWidget): self.grid = QtGui.QGridLayout(self) self.grid.setContentsMargins(24,8,24,8) - self.grid.setSpacing(16) + self.grid.setSpacing(6) self.field = field self.table = table self._parent = parent @@ -1668,7 +1670,8 @@ class PlusRow (QtGui.QWidget): text = self.table.item(num_row, col).text() self.widget_dict[str(i)].setState(text) - self.grid.addWidget(self.widget_dict[str(i)], x, y+1) + self.grid.addWidget(self.widget_dict[str(i)], x, y+1, \ + QtCore.Qt.AlignLeft) x += 1 elif element == 'combo': @@ -1855,15 +1858,23 @@ class PlusRow (QtGui.QWidget): (i, values, comments, index_comment, index_values)) # add OK button + self.button_layout = QtGui.QHBoxLayout() self.Ok_Button = QtGui.QPushButton('Ok', self) + self.Ok_Button.setFixedWidth(128) self.Ok_Button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return)) self.Ok_Button.clicked.connect(self.ok_pressed) - self.grid.addWidget(self.Ok_Button, x,y) + self.button_layout.addWidget(self.Ok_Button) # add Cancel button self.Cancel_Button = QtGui.QPushButton('Cancel', self) + self.Cancel_Button.setFixedWidth(128) self.Cancel_Button.clicked.connect(self.close) - self.grid.addWidget(self.Cancel_Button, x,y+1) + self.button_layout.addWidget(self.Cancel_Button) + self.button_layout.setAlignment(QtCore.Qt.AlignRight) + self.grid.addLayout(self.button_layout,x,y,1,2,QtCore.Qt.AlignRight) + + self.grid.setColumnStretch(0,0) + self.grid.setColumnStretch(1,5) self.resize(parent.width()-parent.width()/10, self.sizeHint().height()) self.setFixedHeight(self.sizeHint().height()) @@ -2129,7 +2140,9 @@ class TaskWidget(QtGui.QWidget): def __init__(self, text = '', parent = None): QtGui.QWidget.__init__(self) layout = QtGui.QHBoxLayout(self) - self.text = LabelWordWrap(text, self) +# lbl_text = text + ' ' + lbl_text = text + ' ' + self.text = LabelWordWrap(lbl_text, self) layout.addWidget(self.text) layout.setContentsMargins(0,0,0,0) layout.setSpacing(0) @@ -2465,9 +2478,6 @@ class ImageLabel(QtGui.QLabel): image_path, filename = image.rsplit('/',1) image_conf = os.path.join(image_path, 'conf') -# image_conf = filename.rsplit('.',1)[0] -# image_conf_path = '/'.join([image_path, image_conf]) - repeat_dict = {'no' : 'no-repeat', 'x' : 'repeat-x'} for line in readLinesFile(image_conf): @@ -2481,8 +2491,7 @@ class ImageLabel(QtGui.QLabel): break style = '' -# if repeat.lower() == 'no': - + if len(list_data) == 3: fix_image_path = os.path.join(image_path, list_data[2]) if os.path.isfile(fix_image_path): @@ -2514,8 +2523,6 @@ def get_view_params(client, method, step = None, expert = None, brief = None): view_params.brief = brief return view_params -import pwd -from calculate.lib.utils.files import listDirectory def owner(pid): UID = 1 for ln in open('/proc/%s/status' %pid): diff --git a/consolegui/variables/console.py b/consolegui/variables/console.py index 2f155df..a3cf2f1 100755 --- a/consolegui/variables/console.py +++ b/consolegui/variables/console.py @@ -20,7 +20,6 @@ from os import path from calculate.lib.cl_lang import setLocalTranslate setLocalTranslate('cl_gui',sys.modules[__name__]) - class VariableClGuiData(Variable): """ Variable store path to data files diff --git a/scripts/cl-console-gui b/scripts/cl-console-gui index eba73d5..7fc637d 100755 --- a/scripts/cl-console-gui +++ b/scripts/cl-console-gui @@ -8,9 +8,10 @@ from calculate.consolegui.application.ConnectionTabs import ToolTabWidget, \ DBusWidget, parse, SelectedMethodWgt from calculate.consolegui.application.more import getRunProc, owner, _print import __builtin__ - import dbus import dbus.mainloop.glib +reload(sys) +sys.setdefaultencoding("utf-8") def main(): __builtin__.__dict__['_print'] = _print diff --git a/setup.py b/setup.py index 0a241d1..ca511b1 100755 --- a/setup.py +++ b/setup.py @@ -79,30 +79,6 @@ class cl_console_data(install_data): class build(distutils.command.build.build): def run (self): distutils.command.build.build.run(self) -# data_file = []#("/usr/lib/python2.7/site-packages/calculate/api/images/tool.png",0755)] -# fileNames = map(lambda x: os.path.split(x[0])[1], data_file) -# listNames = map(lambda x: filter(lambda y: y, x[0].split("/")), -# data_file) -# data_find = {} -# for i in range(len(fileNames)): -# listNames[i].reverse() -# data_find[fileNames[i]] =[listNames[i],data_file[i][1]] - -# for path in self.get_outputs(): -# nameFile = os.path.split(path)[1] -# if nameFile in data_find.keys(): -# data = data_find[nameFile][0] -# mode = data_find[nameFile][1] -# flagFound = True -# iMax = len(data) -# pathFile = path -# for i in range(iMax): -# if data[i] != os.path.split(pathFile)[1]: -# flagFound = False -# break -# pathFile = os.path.split(pathFile)[0] -# if flagFound: -# os.chmod(path, mode) def has_po( self ) : return len(glob.glob("ru/*.po")) > 0 From 36f1613a44003b65759dca47525d087dade25aa8 Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 15:05:42 +0400 Subject: [PATCH 03/10] fix SelectList error display --- consolegui/application/mainframe.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index e8bde52..a38f324 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -857,9 +857,10 @@ class MainFrame(QtGui.QWidget): default = field.value.split(',') else: default = [] +# print "=>> field.default =", field.default comments = field.comments - if field.name in self.error_fields_name: - field.default = False +# if field.name in self.error_fields_name: +# field.default = False self.view_dict[field.name] = SelectList(self, field.label, choice, \ default, comments, add_ability, self.expert, field.default) From 7e7cfa436f289f48bb0f042fe4dbf62d65d11315 Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 15:29:17 +0400 Subject: [PATCH 04/10] fix TaskWidget style --- consolegui/application/MainFrameResult.py | 7 ++-- consolegui/application/more.py | 40 +++++++++++++++++++---- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/consolegui/application/MainFrameResult.py b/consolegui/application/MainFrameResult.py index 9916127..4a24b51 100755 --- a/consolegui/application/MainFrameResult.py +++ b/consolegui/application/MainFrameResult.py @@ -324,6 +324,7 @@ class MainFrameRes(QtGui.QWidget): self._parent.main_frame.setWidgetResizable(True) self._parent.control_button.show() self._parent.control_button.add_clear_cache_button(self.cur_pid) + self.initUI() return 0 if hasattr (self, "mytable"): @@ -398,18 +399,17 @@ class MainFrameRes(QtGui.QWidget): self.show_warning(self, mess) except: pass - + def get_message(self, item, sid, pid): try: if self.cur_pid != pid: return 1 except: return 1 - print 'item.type =', item.type """ get one message by its type """ for case in switch(item.type): if case('normal'): - + self.show_normal(item) return 1 if case('progress'): @@ -451,6 +451,7 @@ class MainFrameRes(QtGui.QWidget): return 1 if case('endFrame'): self.endFrame(item) + self.resize(self.sizeHint()) return 0 if case('startGroup'): self.startGroup(item) diff --git a/consolegui/application/more.py b/consolegui/application/more.py index ebd5f6e..edab779 100755 --- a/consolegui/application/more.py +++ b/consolegui/application/more.py @@ -2136,22 +2136,50 @@ class ResultLayout(QtGui.QVBoxLayout): self.removeWidget(self.kill_process_button) self.kill_process_button.close() +class LabelTaskWgt(QtGui.QLabel): + def __init__(self, name, parent = None): + QtGui.QLabel.__init__(self, name, parent) + self.setStyleSheet("color: #B3ABA7;") + + def sizeHint(self): + self.br_ = QtGui.QFontMetrics(self.font()).boundingRect('') + return self.br_.size() + + def paintEvent(self, e): + p = QtGui.QPainter(self) + fm = p.fontMetrics() + y = (self.sizeHint().height() - self.br_.height()) / 2 + fm.ascent() + + dot_w = fm.width('. ') + for x in xrange (0, self.width(), dot_w): + p.drawText(x, y, '. ') + class TaskWidget(QtGui.QWidget): def __init__(self, text = '', parent = None): QtGui.QWidget.__init__(self) layout = QtGui.QHBoxLayout(self) -# lbl_text = text + ' ' - lbl_text = text + ' ' - self.text = LabelWordWrap(lbl_text, self) + + self.text = QtGui.QLabel(text, self) + fm = QtGui.QFontMetrics(self.text.font()) + d_w = fm.width(text) + pref = QtGui.QSizePolicy.Policy.Preferred + self.text.setSizePolicy(pref, pref) + self.text.setMinimumHeight(self.text.sizeHint().height()) + self.text.setMinimumWidth(d_w) layout.addWidget(self.text) layout.setContentsMargins(0,0,0,0) - layout.setSpacing(0) - + layout.setSpacing(8) + + point_lbl = LabelTaskWgt('', self) + layout.addWidget(point_lbl) + self.image_lbl = QtGui.QLabel(self) self.image_lbl.setFixedSize(16,16) layout.addWidget(self.image_lbl) - + + layout.setStretch(0,0) + layout.setStretch(1,5) self.set_status = False def set_ok(self): From 557a51c331b025a8e196d74e0c31d707896bc586 Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 16:13:57 +0400 Subject: [PATCH 05/10] fix error in change step with error from left frame --- consolegui/application/LeftMenu.py | 16 +++++++++------- consolegui/application/helpwidget.py | 7 ++++--- consolegui/application/mainframe.py | 24 ++++++++++++++++++------ consolegui/application/more.py | 4 ++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/consolegui/application/LeftMenu.py b/consolegui/application/LeftMenu.py index 6ae76c2..0679a7d 100755 --- a/consolegui/application/LeftMenu.py +++ b/consolegui/application/LeftMenu.py @@ -265,8 +265,8 @@ class LeftMenu(QtGui.QScrollArea): # call function (or check parameters) self.button_list[num_step].clicked.connect(self.calling_method \ (method_name, num_step)) - self.button_list[num_step].clicked.connect \ - (self.check_step(method_name, num_step)) +# self.button_list[num_step].clicked.connect \ +# (self.check_step(method_name, num_step)) # calculate button width fmn = QtGui.QFontMetrics(QtGui.QFont('',-1,QtGui.QFont.Normal)) @@ -313,7 +313,7 @@ class LeftMenu(QtGui.QScrollArea): def wrapper(): if hasattr (self, 'check_step_thread'): if self.check_step_thread.isRunning(): -# _print ('check_step_thread is running') + _print ('check_step_thread is running') return 1 change_step = set_step if set_step else 0 @@ -335,12 +335,13 @@ class LeftMenu(QtGui.QScrollArea): def wrapper(): if hasattr (self, 'check_step_thread'): if self.check_step_thread.isRunning(): -# _print ('check_step_thread is running') + _print ('check_step_thread is running') return 1 change_step = set_step if set_step else 0 if self._parent.ClientObj.param_objects[method_name]['step'] > \ change_step: + self.check_step(method_name, set_step) return try: self.calling.disconnect() @@ -349,14 +350,15 @@ class LeftMenu(QtGui.QScrollArea): self.calling.connect(self._parent.ClientObj.MainWidget.\ MainFrameWgt.calling(True, from_left_frame = True)) self.calling.emit() + self.check_step(method_name, set_step) return wrapper def check_step(self, method_name, set_step = None): - def wrapper(): +# def wrapper(): # Call server method if hasattr (self, 'check_step_thread'): if self.check_step_thread.isRunning(): -# _print ('check_step_thread is running') + _print ('check_step_thread is running') return 1 self.step = set_step if set_step else 0 @@ -385,7 +387,7 @@ class LeftMenu(QtGui.QScrollArea): view_params) self.check_step_thread.signal.connect(self.check_step_after) self.check_step_thread.start() - return wrapper +# return wrapper def check_step_after(self, view = None): method_name = self._parent.ClientObj.method_name diff --git a/consolegui/application/helpwidget.py b/consolegui/application/helpwidget.py index 7d502a1..570177a 100755 --- a/consolegui/application/helpwidget.py +++ b/consolegui/application/helpwidget.py @@ -24,6 +24,7 @@ class HelpWgt(QtGui.QWidget): cur_year = str(datetime.date.today().year) copy_right = "©" + motto = 'Easy Linux from the Source.
' help_text = '%s v%s. \n' %(parent.ClientObj.Name, \ parent.ClientObj.Version) + \ _('Composed of Calculate Utilities 3.0.0.') + '
' + \ @@ -41,9 +42,9 @@ class HelpWgt(QtGui.QWidget): distr_name = _('Distributive website') distr_site = 'http://www.calculate-linux.ru' linkLabel = LabelWordWrap(company_name + \ - ": " + \ + ":
" + \ company_site + "

" + distr_name+ \ - ": " + \ + ":
" + \ distr_site + "", self) linkLabel.setContentsMargins(10,5,10,5) @@ -82,7 +83,7 @@ class HelpWgt(QtGui.QWidget): # self.setFixedSize(400 + x ,200) self.setFixedSize(self.sizeHint().width() + 50, \ - self.sizeHint().height() - 30) + self.sizeHint().height()) self.setWindowTitle (_('Calculate Utilities')) help_icon = QtGui.QIcon('/usr/share/pixmaps/cl-install-gui.png') if help_icon.isNull(): diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index a38f324..c7a6639 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -873,6 +873,10 @@ class MainFrame(QtGui.QWidget): self.expert_remove(field.name)) self.view_dict[field.name].recover_but.clicked.connect( \ self.expert_add(field.name)) +# self.view_dict[field.name].Changed.connect( \ +# self.selectList_changed(False, field)) +# self.view_dict[field.name].recover_but.clicked.connect( \ +# self.selectList_changed(True, field)) if field.uncompatible: self.view_dict[field.name].setToolTip(field.uncompatible) @@ -883,6 +887,13 @@ class MainFrame(QtGui.QWidget): self.error_label_dict[field.name] = ErrorLabel(self) self.grid.addWidget(self.error_label_dict[field.name], x, y, 1, 2) +# def selectList_changed(self, default, field): +# def wrapper(): +# print 'field.default =', field.default +# print 'default =', default +# field.default = default +# return wrapper + def add_element_openfile (self, field, x, y): self.label_dict[field.name] = QLabel(field.label,self) self.grid.addWidget(self.label_dict[field.name], x, y) @@ -2154,7 +2165,8 @@ class MainFrame(QtGui.QWidget): 'transmitted data is incorrect' return wrapper - left_call_view = QtCore.Signal() + left_check_step = QtCore.Signal(object, object) + left_check_step_after = QtCore.Signal() def error_display(self, from_left_frame = False): '''display error and warning in current view''' if not self.error_output: @@ -2208,14 +2220,14 @@ class MainFrame(QtGui.QWidget): left_frame = self.ClientObj.MainWidget.left_frame if from_left_frame and expert: if left_frame.step == step_num: - self.left_call_view.connect( \ + self.left_check_step_after.connect( \ left_frame.check_step_after) - self.left_call_view.emit() + self.left_check_step_after.emit() if from_left_frame and left_frame.step != step_num: - self.left_call_view.connect \ - (left_frame.check_step\ + self.left_check_step.connect \ + (left_frame.check_step \ (self.method_name, left_frame.step)) - self.left_call_view.emit() + self.left_check_step.emit() return if not self.error_fined: diff --git a/consolegui/application/more.py b/consolegui/application/more.py index edab779..4ebb443 100755 --- a/consolegui/application/more.py +++ b/consolegui/application/more.py @@ -2150,7 +2150,7 @@ class LabelTaskWgt(QtGui.QLabel): fm = p.fontMetrics() y = (self.sizeHint().height() - self.br_.height()) / 2 + fm.ascent() - dot_w = fm.width('. ') + dot_w = fm.width('. ') for x in xrange (0, self.width(), dot_w): p.drawText(x, y, '. ') @@ -2493,7 +2493,7 @@ class ClientServiceThread(QtCore.QThread): self.signal_extended.emit(result, self.through_object) else: self.signal.emit(result) - + def close(self): self.close_flag = True From a6bbd6335f64d46b8f443ea83a15d003e931ddec Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 16:41:18 +0400 Subject: [PATCH 06/10] fix print_brief_group --- consolegui/application/mainframe.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index c7a6639..933f2fc 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -1739,11 +1739,12 @@ class MainFrame(QtGui.QWidget): elif field.element in ['combo', 'comboEdit', 'radio', 'file']: if hasattr (field.comments, 'string') and field.value in \ field.choice.string: - value = map(lambda x: field.comments.string[x] \ + value = filter(None, \ + map(lambda x: field.comments.string[x] \ if len(field.comments.string) > x \ else field.choice.string[x], map(lambda x: field.choice.string.index(x), \ - [field.value])) + [field.value]))) value = ', '.join(value) else: value = field.value if field.value else '' From 4e85fb502570c205432c52c0b9fbf5cb673ae6cb Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 16:45:51 +0400 Subject: [PATCH 07/10] add translate --- ru/console_gui.po | 280 +++++++++++++++++++++++----------------------- 1 file changed, 142 insertions(+), 138 deletions(-) diff --git a/ru/console_gui.po b/ru/console_gui.po index fe5c3f5..d4fb798 100755 --- a/ru/console_gui.po +++ b/ru/console_gui.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: console_gui_translate\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-05-22 15:54+0300\n" -"PO-Revision-Date: 2012-05-22 15:54+0300\n" +"POT-Creation-Date: 2012-05-29 16:44+0300\n" +"PO-Revision-Date: 2012-05-29 16:45+0300\n" "Last-Translator: Denis \n" "Language-Team: \n" "Language: \n" @@ -48,21 +48,21 @@ msgstr "При закрытии сессии данные %d процессов #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/Box.py:406 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:125 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2166 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2249 msgid "Yes" msgstr "Да" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/Box.py:407 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:126 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2167 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2250 msgid "No" msgstr "Нет" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/Box.py:412 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:95 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1017 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1969 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:89 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:97 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1045 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2021 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:86 msgid "Cancel" msgstr "Отмена" @@ -105,11 +105,11 @@ msgstr "Просмотр информации о текущей сессии" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:69 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:151 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:152 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:153 msgid "Disconnect" msgstr "Отсоединиться" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:70 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:153 msgid "Disconnect from current server" msgstr "Отсоединиться от текущего сервера" @@ -119,7 +119,7 @@ msgstr "Отсоединиться от текущего сервера" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:156 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:157 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:158 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:82 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:79 msgid "Connect" msgstr "Соединиться" @@ -155,11 +155,6 @@ msgstr "Настройки приложения" msgid "Help" msgstr "Помощь" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:108 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainmenu.py:173 -msgid "About Application" -msgstr "О приложении" - #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/pid_information.py:57 msgid "Error get list pid from server" msgstr "Ошибка получения списка идентификаторов процессов с сервера" @@ -173,42 +168,42 @@ msgstr "Процесс id %d не найден" msgid "Permission denied" msgstr "Доступ запрещён" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:51 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:53 msgid "User@Server_HostName" msgstr "Пользователь@Имя_сервера" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:60 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:62 msgid "User Name" msgstr "Имя пользователя" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:65 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:67 msgid "Organization Name" msgstr "Название организации" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:70 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:72 msgid "Network address" msgstr "Сетевой адрес" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:75 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:77 msgid "State Name" msgstr "Город" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:80 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:82 msgid "Country (2 words)" msgstr "Страна (2 символа)" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:90 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:104 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:92 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:106 msgid "Create Request" msgstr "Создать Запрос на подпись сертификата" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:115 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:117 msgid "Field \"Country\" must be two-character" msgstr "Поле \"Страна\" должно состоять из двух символов" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:115 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/create_cert.py:117 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:133 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:219 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:220 msgid "Input Error" msgstr "Ошибка Ввода" @@ -267,8 +262,9 @@ msgid "It was not possible to kill process!" msgstr "Не удалось завершить процесс!" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:120 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:51 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:193 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:52 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:138 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:195 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/session_function.py:147 msgid "Close" msgstr "Закрыть" @@ -290,100 +286,95 @@ msgid "host destination" msgstr "хост назначения" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:274 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:344 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:343 msgid "New connection" msgstr "Новое соединение" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:358 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:357 msgid "At closing program all connects will be close!" msgstr "При закрытии программы все соединения будут закрыты!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:359 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ConnectionTabs.py:358 msgid "Are you sure want to close program?" msgstr "Вы точно хотите закрыть программу?" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/LeftMenu.py:384 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/LeftMenu.py:397 msgid "At current step has mistake." msgstr "На текущем шаге есть ошибка." -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/LeftMenu.py:385 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/LeftMenu.py:398 msgid "Do you want to continue?" msgstr "Вы хотите продолжить?" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:29 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:30 msgid "Composed of Calculate Utilities 3.0.0." msgstr "Входит в состав Calculate Utilities 3.0.0." -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:30 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:31 msgid "Company" msgstr "Компания" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:39 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:40 msgid "Company website" msgstr "Сайт Компании" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:41 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:42 msgid "Distributive website" msgstr "Сайт Дистрибутива" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:86 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:161 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:87 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:162 msgid "Calculate Utilities" msgstr "Calculate Utilities" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:115 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:116 msgid "Your name:" msgstr "Ваше имя:" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:119 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:120 msgid "Your email:" msgstr "Ваш email:" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:120 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:123 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:121 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:124 msgid "Please, enter valid email. " msgstr "Пожалуйста, введите существующий адрес электронной почты! " -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:121 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:124 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:122 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:125 msgid "If email does not exist, letter will not reach." msgstr "Если электронная почта не существует, то письмо не дойдет." -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:126 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:127 msgid "Subject:" msgstr "Тема:" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:129 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:130 msgid "Message:" msgstr "Сообщение:" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:132 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:133 msgid "Send Bug" msgstr "Отправить ошибку" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:137 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:61 -msgid "Quit" -msgstr "Выход" - -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:197 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:198 msgid "Enter valid email!" msgstr "Введите существующий адрес электронной почты!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:222 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:223 msgid "Email sent!" msgstr "Письмо отправлено!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:226 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/helpwidget.py:227 msgid "Error sending!" msgstr "Ошибка отправки" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:93 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:91 msgid "Previous" msgstr "Назад" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:116 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1963 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:115 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2015 msgid "Ok" msgstr "Ok" @@ -391,7 +382,7 @@ msgstr "Ok" msgid "Next" msgstr "Далее" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:214 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ControlButton.py:216 msgid "Error close process" msgstr "Ошибка закрытия процесса" @@ -450,11 +441,11 @@ msgstr "Время жизни сертификата истекает через #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/session_function.py:89 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:142 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:174 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:226 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:243 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:231 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:234 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:241 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:227 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:244 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:226 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:229 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:236 msgid "Not connected!" msgstr "Соединение отсутствует!" @@ -500,110 +491,114 @@ msgstr "Ошибка удаления кэша сессии" msgid "Session cache is cleared" msgstr "Кэш сессии удалён" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:125 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:146 msgid "About Program" msgstr "О программе" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:142 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:163 msgid "System Settings Handbook" msgstr "Руководство пользователя" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:160 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:311 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:370 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:181 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:333 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:395 msgid "Report Bug" msgstr "Сообщить об ошибке" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:459 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:571 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:487 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:599 msgid "Open" msgstr "Открыть" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:968 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:996 msgid "Clear Table" msgstr "Очистить таблицу" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1069 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1208 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1274 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1386 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1097 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1236 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1302 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1415 msgid "Add row" msgstr "Добавить строку" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1080 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1108 msgid "Recover Table" msgstr "Восстановить таблицу" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1124 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1152 msgid "Check all" msgstr "Отметить все" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1287 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1315 msgid "Reset changes" msgstr "Сбросить изменения" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1758 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1951 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1800 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2003 msgid "Password" msgstr "Пароль" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1760 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1957 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:1803 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2009 msgid "Repeat" msgstr "Повтор" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2074 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2126 msgid "Break process" msgstr "Прервать процесс" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2200 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2283 msgid "You do not have a certificate. Please, generate new request and get new certificate from server." msgstr "У Вас нет сертификата. Пожалуйста, сгенерируйте запрос на сертитфикат и получите сертификат с сервера." -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2265 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2348 msgid "No methods available!" msgstr "Нет доступных методов!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2293 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2376 msgid "No access to file!" msgstr "Нет доступа к файлу!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2296 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2379 msgid "Failed to obtain certificate data!" msgstr "Не удалось получить данные сертификата!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2299 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2382 #, python-format msgid "Permission denied %s" msgstr "Доступ запрещён %s" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2302 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2306 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2385 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2389 msgid "Sid Deleted!" msgstr "Сессия удалена!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2309 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/more.py:2392 msgid "Server delete sid error" msgstr "Ошибка удаления сессии на сервере" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:43 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:41 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:41 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:42 msgid "Host" msgstr "Хост" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:47 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:42 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:45 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:43 msgid "Port" msgstr "Порт" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:53 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:51 msgid "Send" msgstr "Отправить" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:57 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:56 msgid "Get" msgstr "Получить" +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:61 +msgid "Quit" +msgstr "Выход" + #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:67 msgid "Certificate signing request" msgstr "Запрос на подпись сертификата" @@ -611,7 +606,7 @@ msgstr "Запрос на подпись сертификата" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:92 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:133 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:198 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:218 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:219 msgid "Enter Hostname or IP adress" msgstr "Введите имя хоста или IP адрес" @@ -643,13 +638,6 @@ msgstr "Номер Вашего запроса = %s\n" msgid "Send new request?" msgstr "Отправить навый запрос на подпись сертификата?" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:126 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:129 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:215 -#, python-format -msgid "Error code: %s" -msgstr "Код ошибки: %s" - #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:127 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:130 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:215 @@ -669,7 +657,7 @@ msgid "This server can not sign certificate!" msgstr "Сервер не подписал сертификат!" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:183 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:257 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:258 #, python-format msgid "Your request id = %s" msgstr "Номер Вашего запроса = %s" @@ -679,73 +667,78 @@ msgstr "Номер Вашего запроса = %s" msgid "request was not sent or deleted file %s" msgstr "Запрос не был послан или удалён файл %s" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:230 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:215 +#, python-format +msgid "Error code: %s" +msgstr "Код ошибки: %s" + +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:231 #, python-format msgid "Request %s not found on client side" msgstr "Запрос %s не найден на стороне клиента" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:253 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:254 msgid "Request to sign is rejected!" msgstr "Запрос на подпись сертификата отвергнут!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:256 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:257 msgid "Request for the signing has not yet reviewed.\n" msgstr "Запрос на подписание сертификата ещё не рассмотрен.\n" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:260 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:261 msgid "Request on signature does not match sent earlier." msgstr "Запрос или подпись не соответствуют отправленным ранее." -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:266 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:267 #, python-format msgid "OK. Certificate save. Your certificate id = %s" msgstr "Сертификат сохранён! Номер Вашего сертификата = %s" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:316 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:317 msgid "Not found field \"CN\" in root certificate!" msgstr "Не найдено поле \"CN\" в корневом сертификате!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:328 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:329 msgid "filename = " msgstr "Имя файла =" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:329 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:330 msgid "Root Certificate Add" msgstr "Корневой сертификат добавлен" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:331 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/CertificateClass.py:332 msgid "file with ca certificates exists" msgstr "Файл с сертификатом удостоверяющего центра создан" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:129 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:124 msgid "You are connected to server!" msgstr "Вы подсоединены к серверу!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:130 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:125 msgid "Please break " msgstr "Пожалуйста разорвите " -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:130 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:125 msgid "previous connection!" msgstr "предыдущее соединение!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:131 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:126 msgid "Connection Error" msgstr "Ошибка соединения" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:195 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:190 msgid "Enter correctly port!" msgstr "Введите корректный порт!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:213 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:208 msgid "You already connected to localhost!" msgstr "Вы уже подсоединены к локальному серверу!" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:231 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:226 msgid "This server is not trusted" msgstr "Данный сервер не является доверенным" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:278 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/conf_connection.py:273 msgid "Verify Error" msgstr "Ошибка проверки сертификата сервера" @@ -754,36 +747,36 @@ msgid "Error clear process cache on server" msgstr "Ошибка удаления кэша процесса на сервере" #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:366 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:485 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:491 msgid "Error get frame from Server..." msgstr "Ошибка получения фрейма с сервера." #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:367 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:441 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:486 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:492 msgid "Error get frame from Server." msgstr "Ошибка получения фрейма с сервера." #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:368 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:442 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:484 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:487 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:493 msgid "Please, resfesh this Page later." msgstr "Пожалуйста, обновите эту страницу позже." #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:440 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:560 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:566 msgid "Error get entire frame from Server..." msgstr "Ошибка получения полного фрейма с сервера." #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:482 #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:483 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:609 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:615 msgid "Error get progress from Server." msgstr "Ошибка получения значения прогресса с сервера." #: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/ShortFrameResult.py:627 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:788 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/MainFrameResult.py:794 msgid "Error send password to Server" msgstr "Ошибка отправки сообщения (пароля) на сервер" @@ -1083,31 +1076,42 @@ msgstr "Сертификат Центра Авторизации удалён и msgid "CA certificate delete from system trusted certificate" msgstr "Сертификат Центра Авторизации удалён из системного списка доверенных сертификатов" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:983 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:996 msgid "Press for advanced settings." msgstr "Нажмите для дополнительных настроек" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1066 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1079 msgid "Clean expert parameters?" msgstr "Очистить экспертные параметры?" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1283 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1296 msgid "Delete selected rows" msgstr "Удалить выделенные строки" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1524 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1537 msgid "Delete row" msgstr "Удалить строку" -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:2125 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1674 +msgid "View options" +msgstr "Просмотреть параметры" + +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:1798 +msgid "Auto" +msgstr "Авто" + +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:2150 msgid " Step " msgstr " Шаг " -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:2128 -#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:2132 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:2153 +#: /var/calculate/mydir/source/spyder/cl-api-client/consolegui/application/mainframe.py:2157 msgid "Run" msgstr "Выполнение" +#~ msgid "About Application" +#~ msgstr "О приложении" + #~ msgid "Calculate Utilities developed company " #~ msgstr "Calculate Utilities Разрабатываются компанией " From 97cfb4ebb0d8fa75faf4bede60520be307e6d3ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B8=D1=80=D0=B5=D1=86=D0=BA=D0=B8=D0=B9=20=D0=9C?= =?UTF-8?q?=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Tue, 29 May 2012 16:57:55 +0400 Subject: [PATCH 08/10] Remove alpha in desktop files names --- data/cl-console-gui-install.desktop | 12 ++++++------ data/cl-console-gui.desktop | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/data/cl-console-gui-install.desktop b/data/cl-console-gui-install.desktop index 86e6a9b..f4d2a8c 100644 --- a/data/cl-console-gui-install.desktop +++ b/data/cl-console-gui-install.desktop @@ -1,10 +1,10 @@ [Desktop Entry] -Name=Calculate Linux Install (Alpha version) -Name[ru]=Установка Calculate Linux (Alpha version) -Name[fr]=Installer Calculate Linux (Alpha version) -Name[es]=Instalar Calculate Linux (Alpha version) -Name[de]=Calculate Linux installieren (Alpha version) -Name[ua]=Установка Calculate Linux (Alpha version) +Name=Calculate Linux Install +Name[ru]=Установка Calculate Linux +Name[fr]=Installer Calculate Linux +Name[es]=Instalar Calculate Linux +Name[de]=Calculate Linux installieren +Name[ua]=Установка Calculate Linux Comment=Calculate Linux installer Exec=cl-console-gui --method install Icon=cl-console-gui-install diff --git a/data/cl-console-gui.desktop b/data/cl-console-gui.desktop index 329b398..02de617 100644 --- a/data/cl-console-gui.desktop +++ b/data/cl-console-gui.desktop @@ -1,7 +1,7 @@ [Desktop Entry] -Name=Calculate Linux Console (Alpha version) -Name[ru]=Консоль Calculate Linux (Alpha version) -Comment=Calculate Linux console for calculate-core +Name=Calculate Utilities Console +Name[ru]=Консоль Calculate Utilities +Comment=Calculate Utilities console Exec=cl-console-gui Icon=calculate3 Terminal=false From e8af8a4ee5abcbe78394ca3da21a1034357119a9 Mon Sep 17 00:00:00 2001 From: Denis Spiridonov Date: Tue, 29 May 2012 17:44:46 +0400 Subject: [PATCH 09/10] add image in install method --- consolegui/application/CertificateClass.py | 2 +- consolegui/application/mainframe.py | 6 ++---- data/install/conf | 2 ++ data/install/finish.jpg | Bin 0 -> 38325 bytes data/install/welcome.jpg | Bin 0 -> 29651 bytes setup.py | 3 +++ 6 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 data/install/conf create mode 100644 data/install/finish.jpg create mode 100644 data/install/welcome.jpg diff --git a/consolegui/application/CertificateClass.py b/consolegui/application/CertificateClass.py index 6951e4c..7f302d0 100755 --- a/consolegui/application/CertificateClass.py +++ b/consolegui/application/CertificateClass.py @@ -326,7 +326,7 @@ class CertClass (QtGui.QWidget): fa = open(user_root_cert, 'a') fa.write(ca_root) fa.close() - _print (_("filename = ", filename)) + _print (_("filename = "), filename) show_msg (_("Root Certificate Add") + '\n' + filename) else: _print (_("file with ca certificates exists")) diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index 933f2fc..efd87ef 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -408,8 +408,6 @@ class MainFrame(QtGui.QWidget): if not image_name: return -# image_name = path.join(image_path, 'install.jpg') -# image_name = path.join(image_path, 'welcome.jpg') self.image_lbl = ImageLabel(image_name, self) self.common_layout.addWidget(self.image_lbl) @@ -1671,7 +1669,7 @@ class MainFrame(QtGui.QWidget): brief_sa.setSizePolicy(exp, exp) brief_sa.setWidgetResizable(True) - expert_brief = ExpertWidget('View options', self) + expert_brief = ExpertWidget(_('View options'), self) expert_brief.setFlat(True) expert_brief.set_close() expert_brief.clicked.connect(self.show_brief_widget \ @@ -2166,7 +2164,7 @@ class MainFrame(QtGui.QWidget): 'transmitted data is incorrect' return wrapper - left_check_step = QtCore.Signal(object, object) + left_check_step = QtCore.Signal(str, int) left_check_step_after = QtCore.Signal() def error_display(self, from_left_frame = False): '''display error and warning in current view''' diff --git a/data/install/conf b/data/install/conf new file mode 100644 index 0000000..437988c --- /dev/null +++ b/data/install/conf @@ -0,0 +1,2 @@ +welcome.jpg no #E4EAE6 #FDFFFE +finish.jpg x finish.jpg diff --git a/data/install/finish.jpg b/data/install/finish.jpg new file mode 100644 index 0000000000000000000000000000000000000000..52026f82336fd2305ad61d51721d68a1fef1e98d GIT binary patch literal 38325 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 L{KB(78;oB8V$hJ2 literal 0 HcmV?d00001 diff --git a/data/install/welcome.jpg b/data/install/welcome.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1bb2d196ef988194777515153ae1797736e6cbd5 GIT binary patch literal 29651 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 Date: Tue, 29 May 2012 17:56:59 +0400 Subject: [PATCH 10/10] fix SelectTable style --- consolegui/application/SelectTable.py | 14 ++++++++++---- consolegui/application/mainframe.py | 3 ++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/consolegui/application/SelectTable.py b/consolegui/application/SelectTable.py index 4249818..c17d346 100644 --- a/consolegui/application/SelectTable.py +++ b/consolegui/application/SelectTable.py @@ -34,9 +34,10 @@ class Delegate(QtGui.QStyledItemDelegate): QtGui.QStyledItemDelegate.paint(self, painter, o, index) class SelectedTableWidget(QtGui.QTableWidget): - def __init__(self, rows, columns, parent, readonly = False): + def __init__(self, rows, columns, parent, readonly = False, brief = False): QtGui.QTableWidget.__init__(self, rows, columns, parent) self.currHovered = -1 + self.brief = brief delegate = Delegate() delegate.setView(self) @@ -52,26 +53,31 @@ class SelectedTableWidget(QtGui.QTableWidget): self.setFrameStyle(QtGui.QFrame.NoFrame) self.verticalHeader().hide() + item_background = '#E4E1E0' if brief else 'rgba(255,255,255,255)' + self.horizontalHeader().setStyleSheet \ ("QHeaderView {background-color: transparent;" "border: none; }" - 'QHeaderView::section {background-color: #ffffff;' + 'QHeaderView::section {background-color: %s;' \ + %item_background + \ 'border: 1px solid #B3ABA7; border-radius: 1px;}') self.setStyleSheet("QTableWidget {" "border: none;" "background-color: #E4E1E0;}" "QTableWidget::item {padding: 0px;" "border-left: 1px solid #B3ABA7;" - "background-color: rgba(255,255,255,255);}") + "background-color: %s;}" %item_background) def setColor(self, row = -1): + if self.brief: + return if row == -1: for row in range (0, self.rowCount()): for col in range (0, self.columnCount()): item = self.item(row, col) if not item: continue - item.setBackground(QtGui.QBrush(QtGui.QColor("white"))) + item.setBackground(QtGui.QBrush(QtGui.QColor('white'))) def mousePressEvent(self, event): if self.readonly: diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index efd87ef..fac6b8e 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -1219,7 +1219,8 @@ class MainFrame(QtGui.QWidget): disabled_table = True if field.uncompatible or brief else False self.table_widget = SelectedTableWidget \ - (lenBody, len(table.head.string) + 1, self, disabled_table) + (lenBody, len(table.head.string) + 1, self, disabled_table,\ + brief = brief) if None in table.head.string: for num_item in range(len(table.head.string)):