From ca7f1277f385859460a867be53e05dc40aaf79e7 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: Fri, 1 Feb 2013 16:50:26 +0400 Subject: [PATCH] Add confirm, choice, pre feature --- consolegui/application/Box.py | 2 +- consolegui/application/MainClass.py | 2 +- consolegui/application/MainFrameResult.py | 185 +++++++++++++++++++-- consolegui/application/ShortFrameResult.py | 106 ++++++++++-- consolegui/application/mainframe.py | 6 +- consolegui/application/more.py | 29 +++- 6 files changed, 292 insertions(+), 38 deletions(-) diff --git a/consolegui/application/Box.py b/consolegui/application/Box.py index 7664552..1e0ec41 100755 --- a/consolegui/application/Box.py +++ b/consolegui/application/Box.py @@ -351,7 +351,7 @@ class MainWgt(QtGui.QMainWindow): pass def setScrollBarVal(self): - self.main_frame.verticalScrollBar().setValue \ + self.main_frame.verticalScrollBar().setSliderPosition \ (self.main_frame.verticalScrollBar().maximum()) def signaling_slot(self, sid, reply): diff --git a/consolegui/application/MainClass.py b/consolegui/application/MainClass.py index 7cd2d7d..0af362c 100755 --- a/consolegui/application/MainClass.py +++ b/consolegui/application/MainClass.py @@ -110,7 +110,7 @@ class ApiClient(QtGui.QWidget): self.lang = gettext.locale.getdefaultlocale()[0][:2] lang = gettext.translation('cl_consolegui3', \ languages=[self.lang]) - except IOError: + except (TypeError,IOError) as e: self.lang = 'en' lang = gettext.translation('cl_consolegui3',fallback=True) diff --git a/consolegui/application/MainFrameResult.py b/consolegui/application/MainFrameResult.py index 75aa94c..3f8b315 100755 --- a/consolegui/application/MainFrameResult.py +++ b/consolegui/application/MainFrameResult.py @@ -26,8 +26,8 @@ from more import LabelWordWrap as Label from SelectTable import SelectedTableWidget class LabelWordWrap(Label): - def __init__(self, name, parent = None): - Label.__init__(self, name, parent) + def __init__(self, name, parent = None, mono=False): + Label.__init__(self, name, parent,mono) # set text selectable self.setTextInteractionFlags(self.textInteractionFlags() | \ QtCore.Qt.TextSelectableByMouse) @@ -106,9 +106,11 @@ class MainFrameRes(QtGui.QWidget): "{background-color: #E4E1E0;}") self.setObjectName('Frame_Res') self.setStyleSheet("#Frame_Res {background-color: transparent;}") + #self.setStyleSheet("#Frame_Res {background-color: green;}") # "QWidget {border: 1px solid red;}") def initUI(self): + #self.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum) self.updateGeometry() ################# API FUNCTION ############################### @@ -263,16 +265,19 @@ class MainFrameRes(QtGui.QWidget): change_offset = True) return wrapper - def show_normal(self, item): + def show_normal(self, item, mono=False): if not hasattr (item, 'message'): return if item.message: # add normal message label - lbl_temp = LabelWordWrap(item.message, self) + lbl_temp = LabelWordWrap(item.message, self, mono=mono) - lbl_temp.setMinimumHeight(lbl_temp.sizeHint().height()) + lbl_temp.setMinimumHeight(lbl_temp.minimumSizeHint().height()) + lbl_temp.setMaximumHeight(lbl_temp.minimumSizeHint().height()) self.work_layout._addWidget(lbl_temp) self.initUI() + #self._parent.main_frame.verticalScrollBar().setSliderPosition \ + # (self._parent.main_frame.verticalScrollBar().maximum()) def show_error(self, message): # add error message label @@ -282,7 +287,9 @@ class MainFrameRes(QtGui.QWidget): if message: lbl_temp = ErrorWgt(message, self) lbl_temp.set_error() - lbl_temp.setMinimumHeight(lbl_temp.sizeHint().height()) + lbl_temp.setMinimumHeight(lbl_temp.minimumSizeHint().height()) + lbl_temp.setMaximumHeight(lbl_temp.minimumSizeHint().height()) + #lbl_temp.setMinimumHeight(lbl_temp.sizeHint().height()) self.work_layout._addWidget(lbl_temp) self.initUI() @@ -292,6 +299,8 @@ class MainFrameRes(QtGui.QWidget): if item.message: lbl_temp = ErrorWgt(item.message, self) lbl_temp.set_warning() + lbl_temp.setMinimumHeight(lbl_temp.minimumSizeHint().height()) + lbl_temp.setMaximumHeight(lbl_temp.minimumSizeHint().height()) self.work_layout._addWidget(lbl_temp) self.initUI() @@ -417,6 +426,7 @@ class MainFrameRes(QtGui.QWidget): # for mess in meth_result: self.ClientObj.app.processEvents() mess = meth_result + print mess.type if mess.type == 'pid': self.get_messages(self.ClientObj.sid, mess.message) if mess.type == 'error': @@ -437,16 +447,21 @@ class MainFrameRes(QtGui.QWidget): except: return 1 """ get one message by its type """ + if not hasattr(item,"type"): + return 1 for case in switch(item.type): if case('normal'): - self.show_normal(item) - return 1 + self.show_normal(item) + return 1 + if case('pre'): + self.show_normal(item,mono=True) + return 1 if case('plain'): - self.show_normal(item) - return 1 + self.show_normal(item) + return 1 if case('progress'): - self.get_Progress(sid, pid, item.id) - return 1 + self.get_Progress(sid, pid, item.id) + return 1 if case('error'): # for i in range(20): self.show_error(item.message) @@ -466,6 +481,12 @@ class MainFrameRes(QtGui.QWidget): if case('question'): self.send_Message(sid, pid, item) return 1 + if case('confirm'): + self.send_Confirm(sid, pid, item) + return 1 + if case('choice'): + self.send_Choice(sid, pid, item) + return 1 if case('password'): self.send_Password(sid, pid, item) return 1 @@ -498,8 +519,9 @@ class MainFrameRes(QtGui.QWidget): def get_messages(self, sid, pid): """ get frame in a separate thread """ - #thread_messages = threading.Thread(target=get_Frame,\ - #args = (client, sid, pid)) + #import threading + #thread_messages = threading.Thread(target=self.get_Frame,\ + # args = (sid, pid)) #thread_messages.start() self.get_Frame(sid, pid) @@ -540,7 +562,7 @@ class MainFrameRes(QtGui.QWidget): self.get_Frame_thread.wait() self.get_Frame_thread = ClientServiceThread(self.ClientObj,\ 'get_frame', sid, pid, return_except = True, \ - sleeptime = int(self.ClientObj.client.frame_period),\ + sleeptime = 0, #int(self.ClientObj.client.frame_period),\ through_object = (sid, pid)) self.get_Frame_thread.signal_extended.connect(self.get_Frame_cycle) self.get_Frame_thread.start() @@ -581,7 +603,6 @@ class MainFrameRes(QtGui.QWidget): return 0 pid = list_pid[0][0] - # Call server method if hasattr (self, 'get_Frame_thread'): if self.get_Frame_thread.isRunning(): @@ -731,6 +752,16 @@ class MainFrameRes(QtGui.QWidget): h += self.mytable.rowHeight(row_in_table) self.mytable.setFixedHeight(h) + def send_Confirm(self, sid, pid, item): + """ send answer to the question """ + self.message = ConfirmDialog(self, item, sid, pid) + self.message.show() + + def send_Choice(self, sid, pid, item): + """ send answer to the question """ + self.message = ChoiceDialog(self, item, sid, pid) + self.message.show() + def send_Message(self, sid, pid, item): """ send answer to the question """ self.message = MessageDialog(self, item, sid, pid) @@ -762,6 +793,10 @@ class MainFrameRes(QtGui.QWidget): self.close_all_thread() self._parent.methodname_wgt._hide() self._parent.control_button._hide() + if hasattr(self,"message") and self.message: + self.message.close() + if hasattr(self,"passwd") and self.passwd: + self.passwd.close() event.accept() class MessageDialog(QtGui.QWidget): @@ -840,3 +875,121 @@ class MessageDialog(QtGui.QWidget): self.send_button.setDisabled(True) else: self.send_button.setEnabled(True) + +class ConfirmDialog(QtGui.QWidget): + # answer to the server question + def __init__(self, parent, item, sid, pid): + super(ConfirmDialog, self).__init__() + self._parent = parent +# self.item = item + self.sid = sid + self.pid = pid + self.layout = QtGui.QGridLayout(self) + + self.label = LabelWordWrap(item.message, self) + + self.layout.addWidget(self.label,0,0,1,2) + + self.yes_button = QtGui.QPushButton(_('Yes'), self) + self.yes_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return)) + self.yes_button.clicked.connect(self.sendYes) + + self.layout.addWidget(self.yes_button,1,0) + + self.no_button = QtGui.QPushButton(_('No'), self) + self.no_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Escape)) + self.no_button.clicked.connect(self.sendNo) + + self.layout.addWidget(self.no_button,1,1) + + self.move(parent.ClientObj._parent.geometry().x() + \ + parent.ClientObj._parent.geometry().width() / 2 \ + - self.sizeHint().width() / 2, \ + parent.ClientObj._parent.geometry().y() + \ + parent.ClientObj._parent.geometry().height() / 2 \ + - self.sizeHint().height() / 2) + self.setWindowFlags (QtCore.Qt.WindowMinimizeButtonHint) +# self.setAttribute(QtCore.Qt.WA_ShowModal) + + def send(self,answer): + # Call server method + if hasattr (self, 'send_password_thread'): + if self.send_password_thread.isRunning(): + return 1 + self.send_password_thread = ClientServiceThread(\ + self._parent.ClientObj, 'send_message', self.sid, \ + self.pid, answer, return_except = True) + self.send_password_thread.signal.connect(self.send_after) + self.send_password_thread.start() + + def sendYes(self): + self.send("yes") + + def sendNo(self): + self.send("no") + + def send_after(self, result): + if type(result) == Exception: + show_msg(_('Failed to send the message (password) to the server')) + self.close() + return 1 + self._parent.show_result(result) + self.close() + +class ChoiceDialog(QtGui.QWidget): + # answer to the server question + def __init__(self, parent, item, sid, pid): + super(ChoiceDialog, self).__init__() + self._parent = parent +# self.item = item + self.sid = sid + self.pid = pid + self.layout = QtGui.QGridLayout(self) + self.message,self.answers = item.message.split('|') + self.answers = map(lambda x:(x[0],x[1].strip(')')), + map(lambda x:x.split('('), + self.answers.split(','))) + + self.label = LabelWordWrap(self.message, self) + + self.layout.addWidget(self.label,0,0,1,len(self.answers)) + + self.buttons = [] + for i,answer in enumerate(self.answers): + button = QtGui.QPushButton(answer[1], self) + self.buttons.append(button) + button.answer = answer + button.parentDialog = self + button.clickFunc = (lambda self:self.parentDialog.send(self.answer[0])).__get__(button) + button.clicked.connect(button.clickFunc) + #self.yes_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return)) + #self.no_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Escape)) + self.layout.addWidget(button,1,i) + + self.move(parent.ClientObj._parent.geometry().x() + \ + parent.ClientObj._parent.geometry().width() / 2 \ + - self.sizeHint().width() / 2, \ + parent.ClientObj._parent.geometry().y() + \ + parent.ClientObj._parent.geometry().height() / 2 \ + - self.sizeHint().height() / 2) + self.setWindowFlags (QtCore.Qt.WindowMinimizeButtonHint) +# self.setAttribute(QtCore.Qt.WA_ShowModal) + + def send(self,answer): + # Call server method + if hasattr (self, 'send_password_thread'): + if self.send_password_thread.isRunning(): + return 1 + self.send_password_thread = ClientServiceThread(\ + self._parent.ClientObj, 'send_message', self.sid, \ + self.pid, answer, return_except = True) + self.send_password_thread.signal.connect(self.send_after) + self.send_password_thread.start() + + def send_after(self, result): + if type(result) == Exception: + show_msg(_('Failed to send the message (password) to the server')) + self.close() + return 1 + self._parent.show_result(result) + self.close() diff --git a/consolegui/application/ShortFrameResult.py b/consolegui/application/ShortFrameResult.py index d3d2905..ab34863 100644 --- a/consolegui/application/ShortFrameResult.py +++ b/consolegui/application/ShortFrameResult.py @@ -22,13 +22,7 @@ from calculate.core.client.function import switch from more import get_sid, ClientServiceThread, show_msg, ErrorWgt, ResultLayout from more import LabelWordWrap as Label - -class LabelWordWrap(Label): - def __init__(self, name, parent = None): - Label.__init__(self, name, parent) - # set text selectable - self.setTextInteractionFlags(self.textInteractionFlags() | \ - QtCore.Qt.TextSelectableByMouse) +from MainFrameResult import LabelWordWrap,ChoiceDialog class TaskWidget(QtGui.QWidget): def __init__(self, taskNumber = 1, parent = None): @@ -143,15 +137,16 @@ class ShortFrameRes(QtGui.QWidget): def show_view(self, view): pass - def show_normal(self, message): + def show_normal(self, message, mono=False): # add normal message label - if hasattr (self, 'taskWidget'): + if hasattr (self, 'taskWidget') and not mono: self.taskWidget.setText(message) else: if message: # add normal message label - lbl_temp = LabelWordWrap(message, self) + lbl_temp = LabelWordWrap(message, self, mono=mono) lbl_temp.setMinimumHeight(lbl_temp.sizeHint().height()) + lbl_temp.setMaximumHeight(lbl_temp.sizeHint().height()) self.work_layout._addWidget(lbl_temp) self.initUI() @@ -162,6 +157,7 @@ class ShortFrameRes(QtGui.QWidget): lbl_temp = ErrorWgt(message, self) lbl_temp.set_error() lbl_temp.setMinimumHeight(lbl_temp.sizeHint().height()) + lbl_temp.setMaximumHeight(lbl_temp.sizeHint().height()) self.work_layout._addWidget(lbl_temp) if hasattr (self, 'taskWidget'): self.taskWidget.set_error() @@ -171,6 +167,8 @@ class ShortFrameRes(QtGui.QWidget): # add warning message label lbl_temp = ErrorWgt(item.message, self) lbl_temp.set_warning() + lbl_temp.setMinimumHeight(lbl_temp.sizeHint().height()) + lbl_temp.setMaximumHeight(lbl_temp.sizeHint().height()) self.work_layout._addWidget(lbl_temp) self.initUI() @@ -295,10 +293,18 @@ class ShortFrameRes(QtGui.QWidget): except: return 1 """ get one message by its type """ + if not hasattr(item,"type"): + return 1 for case in switch(item.type): if case('normal'): self.show_normal(item.message) return 1 + if case('plain'): + self.show_normal(item.message) + return 1 + if case('pre'): + self.show_normal(item.message,mono=True) + return 1 if case('progress'): self.get_Progress(sid, pid, item.id) return 1 @@ -320,6 +326,12 @@ class ShortFrameRes(QtGui.QWidget): if case('question'): self.send_Message(sid, pid, item) return 1 + if case('confirm'): + self.send_Confirm(sid, pid, item) + return 1 + if case('choice'): + self.send_Choice(sid, pid, item) + return 1 if case('password'): self.send_Password(sid, pid, item) return 1 @@ -536,6 +548,16 @@ class ShortFrameRes(QtGui.QWidget): self.ClientObj.app.processEvents() self.initUI() + def send_Confirm(self, sid, pid, item): + """ send answer to the question """ + self.message = ConfirmDialog(self, item, sid, pid) + self.message.show() + + def send_Choice(self, sid, pid, item): + """ send answer to the question """ + self.message = ChoiceDialog(self, item, sid, pid) + self.message.show() + def send_Message(self, sid, pid, item): """ send answer to the question """ self.message = MessageDialog(self, item, sid, pid) @@ -567,6 +589,10 @@ class ShortFrameRes(QtGui.QWidget): self.close_all_thread() self._parent.methodname_wgt._hide() self._parent.control_button._hide() + if hasattr(self,"message") and self.message: + self.message.close() + if hasattr(self,"passwd") and self.passwd: + self.passwd.close() event.accept() class MessageDialog(QtGui.QWidget): @@ -643,3 +669,63 @@ class MessageDialog(QtGui.QWidget): self.send_button.setDisabled(True) else: self.send_button.setEnabled(True) + +class ConfirmDialog(QtGui.QWidget): + # answer to the server question + def __init__(self, parent, item, sid, pid): + super(ConfirmDialog, self).__init__() + self._parent = parent +# self.item = item + self.sid = sid + self.pid = pid + self.layout = QtGui.QGridLayout(self) + + self.label = LabelWordWrap(item.message, self) + + self.layout.addWidget(self.label,0,0,1,2) + + self.yes_button = QtGui.QPushButton(_('Yes'), self) + self.yes_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return)) + self.yes_button.clicked.connect(self.sendYes) + + self.layout.addWidget(self.yes_button,1,0) + + self.no_button = QtGui.QPushButton(_('No'), self) + self.no_button.setShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Escape)) + self.no_button.clicked.connect(self.sendNo) + + self.layout.addWidget(self.no_button,1,1) + + self.move(parent.ClientObj._parent.geometry().x() + \ + parent.ClientObj._parent.geometry().width() / 2 \ + - self.sizeHint().width() / 2, \ + parent.ClientObj._parent.geometry().y() + \ + parent.ClientObj._parent.geometry().height() / 2 \ + - self.sizeHint().height() / 2) + self.setWindowFlags (QtCore.Qt.WindowMinimizeButtonHint) +# self.setAttribute(QtCore.Qt.WA_ShowModal) + + def send(self,answer): + # Call server method + if hasattr (self, 'send_password_thread'): + if self.send_password_thread.isRunning(): + return 1 + self.send_password_thread = ClientServiceThread(\ + self._parent.ClientObj, 'send_message', self.sid, \ + self.pid, answer, return_except = True) + self.send_password_thread.signal.connect(self.send_after) + self.send_password_thread.start() + + def sendYes(self): + self.send("yes") + + def sendNo(self): + self.send("no") + + def send_after(self, result): + if type(result) == Exception: + show_msg(_('Failed to send the message (password) to the server')) + self.close() + return 1 + self._parent.show_result(result) + self.close() diff --git a/consolegui/application/mainframe.py b/consolegui/application/mainframe.py index bc0ede4..cccd7e3 100755 --- a/consolegui/application/mainframe.py +++ b/consolegui/application/mainframe.py @@ -272,7 +272,7 @@ class MainFrame(QtGui.QWidget): # call_button = QtGui.QPushButton(self) if c == 1: self.group_name_label.hide() - self.call_server_method() + self.call_server_method(change_offset = True) return # Show Control Buttons widget @@ -381,14 +381,14 @@ class MainFrame(QtGui.QWidget): self.ClientObj.MainWidget.main_frame_view(view, \ self.method_name, step_change = True) - def call_server_method(self, collect_flag = True): + def call_server_method(self, collect_flag = True, change_offset=False): call_method = CallMethod(self) if collect_flag: call_method.collect_sig.connect(self.collect_object(False)) else: self.param_object = None call_method.call_meth_sig.connect(self.calling(True, \ - change_offset = True)) + change_offset = change_offset)) call_method.start() def add_image(self): diff --git a/consolegui/application/more.py b/consolegui/application/more.py index c353998..72e1564 100755 --- a/consolegui/application/more.py +++ b/consolegui/application/more.py @@ -338,6 +338,8 @@ class ErrorLabel (QtGui.QWidget): self._parent.ClientObj.MainWidget.bugWidget.set_message_text\ (self.text_lbl.text()) +ERROR_ICON_SIZE=16 + class ErrorWgt(QtGui.QWidget): def __init__(self, text = '', parent = None): QtGui.QWidget.__init__(self) @@ -346,7 +348,7 @@ class ErrorWgt(QtGui.QWidget): self.image_but = QtGui.QPushButton(self) self.image_but.setFlat(True) - self.image_but.setFixedSize(32,32) + self.image_but.setFixedSize(ERROR_ICON_SIZE,ERROR_ICON_SIZE) self.image_but.setStyleSheet('''QPushButton:pressed {border: none;} QPushButton::hover {border: none;}''') layout.addWidget(self.image_but, 0, QtCore.Qt.AlignmentFlag.AlignTop) @@ -366,15 +368,15 @@ class ErrorWgt(QtGui.QWidget): def set_warning(self): icon = QtGui.QIcon.fromTheme('dialog-warning') - icon.actualSize(QtCore.QSize(32,32)) + icon.actualSize(QtCore.QSize(ERROR_ICON_SIZE,ERROR_ICON_SIZE)) self.image_but.setIcon(icon) - self.image_but.setIconSize(QtCore.QSize(32,32)) + self.image_but.setIconSize(QtCore.QSize(ERROR_ICON_SIZE,ERROR_ICON_SIZE)) def set_error(self): icon = QtGui.QIcon.fromTheme('dialog-error') - icon.actualSize(QtCore.QSize(32,32)) + icon.actualSize(QtCore.QSize(ERROR_ICON_SIZE,ERROR_ICON_SIZE)) self.image_but.setIcon(icon) - self.image_but.setIconSize(QtCore.QSize(32,32)) + self.image_but.setIconSize(QtCore.QSize(ERROR_ICON_SIZE,ERROR_ICON_SIZE)) def add_menu(self): if not hasattr(self, 'menu'): @@ -414,14 +416,23 @@ class ErrorWgt(QtGui.QWidget): # self.setFixedHeight(self.text.height() + 24) class LabelWordWrap(QtGui.QLabel): - def __init__(self, name, parent = None): + def __init__(self, name, parent = None, mono=False): if not name: name = '' try: - name = name.decode('utf-8') + name = name.decode('utf-8').replace(" "," ") + leftMargin = len(name)-len(name.lstrip(' ')) + name = name[leftMargin:] except (UnicodeDecodeError, UnicodeEncodeError): pass QtGui.QLabel.__init__(self, name, parent) + if mono: + self.setStyleSheet('font-family: Droid Sans Mono;' + 'background-color:white;' + 'margin:3px;') + else: + self.setStyleSheet('margin-left:%dpx;'%(leftMargin*5)) + minimum = QtGui.QSizePolicy.Policy.Minimum exp = QtGui.QSizePolicy.Policy.Expanding self.setSizePolicy(exp, minimum) @@ -2223,6 +2234,10 @@ class ResultLayout(QtGui.QVBoxLayout): self.kill_process_button = QtGui.QPushButton(_('Break the process')) self.kill_process_button.setFixedWidth(144) self.kill_process_button.setContentsMargins(0,10,0,0) + self.kill_process_button.setMinimumHeight( + self.kill_process_button.minimumSizeHint().height()) + self.kill_process_button.setMaximumHeight( + self.kill_process_button.minimumSizeHint().height()) self.addWidget(self.kill_process_button) def _addWidget(self, widget):