From 40a806c3820ebc93fdf92946b12c751e253e851d Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Thu, 5 Aug 2010 14:16:09 +0000
Subject: [PATCH] Improvements for QueryEditorWidget (display error, highlight
 error)

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2631 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 .../pymod/scene/preset_editor_list_model.py   |  2 +-
 modules/gui/pymod/scene/query_editor.py       | 62 ++++++++++++-------
 modules/mol/base/pymod/export_query.cc        |  1 +
 3 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/modules/gui/pymod/scene/preset_editor_list_model.py b/modules/gui/pymod/scene/preset_editor_list_model.py
index e85a67c05..a30fc13c3 100644
--- a/modules/gui/pymod/scene/preset_editor_list_model.py
+++ b/modules/gui/pymod/scene/preset_editor_list_model.py
@@ -45,7 +45,7 @@ class PresetEditorListModel(QtCore.QAbstractListModel):
         name=data.GetName()
         selection=str(data.GetSelection())
         if(len(selection)>0):
-          return QtCore.QVariant(str("%s (%s)"%(name,selection)))
+          return QtCore.QVariant(str("%s (%s)"%(name,selection.replace(os.linesep, " "))))
         else:
           return QtCore.QVariant(str("%s (all)"%name))
     return QtCore.QVariant()
diff --git a/modules/gui/pymod/scene/query_editor.py b/modules/gui/pymod/scene/query_editor.py
index 07b433a27..186ab48dd 100644
--- a/modules/gui/pymod/scene/query_editor.py
+++ b/modules/gui/pymod/scene/query_editor.py
@@ -5,13 +5,22 @@ class QueryEditorWidget(QtGui.QWidget):
    
   def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent)
-    self.selection_edit_ = QtGui.QLineEdit()
-    selection_label = QtGui.QLabel("Selection",self)    
+    self.default_font_= QtGui.QTextCharFormat()
+    self.default_font_.setForeground(QtGui.QBrush(QtGui.QColor(0,0,0)))
+    self.error_font_= QtGui.QTextCharFormat()
+    self.error_font_.setForeground(QtGui.QBrush(QtGui.QColor(255,0,0))) 
+    self.selection_edit_ = QtGui.QTextEdit(self)
+    self.selection_edit_.setMinimumHeight(50)
+    self.selection_edit_.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.MinimumExpanding))
+    self.selection_edit_.updateGeometry()
+    selection_label = QtGui.QLabel("Selection",self)
+        
     self.status_=QtGui.QLabel("",self);
     self.status_.setWordWrap(True)
     self.status_.setMargin(0)
     self.status_.setHidden(True)
-    
+    self.status_.setAlignment(QtCore.Qt.AlignRight)
+    self.status_.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding))
     self.checkboxes_ = dict()
     for k,v in mol.QueryFlag.__dict__["values"].iteritems():
       checkbox = QtGui.QCheckBox(str(v),self)
@@ -26,17 +35,14 @@ class QueryEditorWidget(QtGui.QWidget):
     flag_label = QtGui.QLabel("Query flags")       
     grid = QtGui.QGridLayout(self)
     grid.setContentsMargins(0,5,0,0)
-    grid.addWidget(selection_label,0,0,1,1)
+    grid.addWidget(selection_label,0,0,1,1,QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft)
     grid.addWidget(self.selection_edit_,0,1,1,1)
-    grid.setRowMinimumHeight(1,0)
-    grid.addWidget(self.status_,1,0,1,2)
-    grid.addWidget(flag_label,2,0,1,1)
-    grid.addLayout(v_checkbox_layout,2,1,1,1)
-    grid.setRowStretch(2, 1)
-    #group_box = QtGui.QGroupBox("Selection",self)
-    #group_box.setLayout(h_layout)
-        
-    self.connect(self.selection_edit_,QtCore.SIGNAL("textChanged(const QString& )"),self.UpdateMessage)
+    grid.addWidget(self.status_,1,0,1,2,QtCore.Qt.AlignRight)
+    grid.addWidget(flag_label,2,0,3,1,QtCore.Qt.AlignTop|QtCore.Qt.AlignLeft)
+    grid.addLayout(v_checkbox_layout,2,1,3,1)
+    grid.setRowStretch(0,1)
+    self.changing_text_=False;
+    self.connect(self.selection_edit_,QtCore.SIGNAL("textChanged()"),self.UpdateMessage)
     
   def GetQueryFlags(self):
     flag = 0
@@ -46,10 +52,10 @@ class QueryEditorWidget(QtGui.QWidget):
     return flag
   
   def GetQuery(self):
-    return mol.Query(str(self.selection_edit_.text()))
+    return mol.Query(str(self.selection_edit_.toPlainText()))
 
   def GetQueryText(self):
-    return str(self.selection_edit_.text())
+    return str(self.selection_edit_.toPlainText())
   
   def SetQueryFlags(self,flags):
     for k,v in self.checkboxes_.iteritems():
@@ -62,12 +68,26 @@ class QueryEditorWidget(QtGui.QWidget):
     self.selection_edit_.setText(query)
     
   def UpdateMessage(self):
-    q=self.GetQuery()
-    if q.IsValid():
+    if self.changing_text_:
+      return
+    self.changing_text_ = True
+    query=self.GetQuery()
+    
+    cursor=self.selection_edit_.textCursor()
+    cursor.select(QtGui.QTextCursor.Document)
+    cursor.setCharFormat(self.default_font_)  
+    
+    if query.IsValid():
       self.status_.setText("")
       self.status_.setHidden(True)
-      
-    else:
-      d=q.GetErrorDescription()
+    else:      
+      d=query.GetErrorDescription()
       self.status_.setText("<font color='red'>%s</font>"%d.msg)
-      self.status_.setVisible(True)
\ No newline at end of file
+      self.status_.setVisible(True)
+      self.status_.setFixedSize(self.width(),self.status_.height())
+      
+      cursor.movePosition(QtGui.QTextCursor.Start)
+      cursor.movePosition(QtGui.QTextCursor.NextCharacter, QtGui.QTextCursor.MoveAnchor, d.range.Loc)
+      cursor.movePosition(QtGui.QTextCursor.NextCharacter, QtGui.QTextCursor.KeepAnchor, d.range.Length)
+      cursor.setCharFormat(self.error_font_)
+    self.changing_text_ = False
\ No newline at end of file
diff --git a/modules/mol/base/pymod/export_query.cc b/modules/mol/base/pymod/export_query.cc
index 40c729672..4b54cb186 100644
--- a/modules/mol/base/pymod/export_query.cc
+++ b/modules/mol/base/pymod/export_query.cc
@@ -42,6 +42,7 @@ void export_Query()
   
   class_<QueryErrorDesc>("QueryErrorDesc", no_init)
     .def_readonly("msg", &QueryErrorDesc::msg)
+    .def_readonly("range", &QueryErrorDesc::range)
   ;
   
   enum_<QueryFlag::Flag>("QueryFlag")
-- 
GitLab