diff --git a/modules/gfx/pymod/export_color_ops.cc b/modules/gfx/pymod/export_color_ops.cc index 3999960e9365ce05dbe8012a866baf3d52ddd33b..efce2b6db91adb7a0141875fef8e10f12cff8345 100644 --- a/modules/gfx/pymod/export_color_ops.cc +++ b/modules/gfx/pymod/export_color_ops.cc @@ -46,6 +46,8 @@ void export_ColorOps() .def("CanApplyTo",&ColorOp::CanApplyTo) .def("SetSelection",&ColorOp::SetSelection) .def("GetSelection",&ColorOp::GetSelection) + .def("SetSelectionFlags",&ColorOp::SetSelectionFlags) + .def("GetSelectionFlags",&ColorOp::GetSelectionFlags) .def("SetMask",&ColorOp::SetMask) .def("GetMask",&ColorOp::GetMask) .def("ToInfo",&ColorOp::ToInfo) diff --git a/modules/gfx/src/color_ops/by_chain_color_op.cc b/modules/gfx/src/color_ops/by_chain_color_op.cc index 67279f893f3edd905627d5772bd026ffcccecb1b..a0fd3b12da3212e3bea3f749692648e4f5d20297 100644 --- a/modules/gfx/src/color_ops/by_chain_color_op.cc +++ b/modules/gfx/src/color_ops/by_chain_color_op.cc @@ -65,9 +65,9 @@ void ByChainColorOp::SetChainCount(int chain_count) gfx::ByChainColorOp ByChainColorOp::FromInfo(info::InfoGroup& group){ gfx::ColorOp op = ColorOp::FromInfo(group); - String selection = op.GetSelection(); + mol::QueryViewWrapper wrapper(op.GetSelection(),op.GetSelectionFlags()); int mask = op.GetMask(); - return gfx::ByChainColorOp(selection, mask); + return gfx::ByChainColorOp(wrapper, mask); } gfx::Color ByChainColorOp::GenerateColor(String& ident) const{ diff --git a/modules/gfx/src/color_ops/by_element_color_op.cc b/modules/gfx/src/color_ops/by_element_color_op.cc index e2bac71b0bd02e88c333b8b55a3f4ca858358eb5..b27669d797a5522d1752c3ea3aa648536fce42da 100644 --- a/modules/gfx/src/color_ops/by_element_color_op.cc +++ b/modules/gfx/src/color_ops/by_element_color_op.cc @@ -46,9 +46,9 @@ void ByElementColorOp::ApplyTo(GfxObjP& objP) const{ gfx::ByElementColorOp ByElementColorOp::FromInfo(info::InfoGroup& group){ gfx::ColorOp op = ColorOp::FromInfo(group); - String selection = op.GetSelection(); + mol::QueryViewWrapper wrapper(op.GetSelection(),op.GetSelectionFlags()); int mask = op.GetMask(); - return gfx::ByElementColorOp(selection, mask); + return gfx::ByElementColorOp(wrapper, mask); } }} diff --git a/modules/gfx/src/color_ops/color_op.cc b/modules/gfx/src/color_ops/color_op.cc index bca45b744617f8140fb4cf4c5038c35e2a89c621..f9fa131dbd7feed87d2c493c75e4659bf6235d7f 100644 --- a/modules/gfx/src/color_ops/color_op.cc +++ b/modules/gfx/src/color_ops/color_op.cc @@ -53,6 +53,16 @@ String ColorOp::GetSelection() const return query_view_.GetQuery().GetQueryString(); } +void ColorOp::SetSelectionFlags(mol::QueryFlags flags) +{ + query_view_.SetFlags(flags); +} + +mol::QueryFlags ColorOp::GetSelectionFlags() const +{ + return query_view_.GetFlags(); +} + bool ColorOp::IsSelectionOnly() const { return !query_view_.IsDataValid(); @@ -71,7 +81,7 @@ void ColorOp::SetView(const mol::EntityView& view) void ColorOp::ToInfo(info::InfoGroup& group) const { std::ostringstream ss; - ss << (int)mask_ << "\t" << query_view_.GetQuery().GetQueryString(); + ss << (int)mask_ << "\t" << query_view_.GetFlags() << "\t" << query_view_.GetQuery().GetQueryString(); group.SetTextData(ss.str()); } @@ -80,7 +90,8 @@ gfx::ColorOp ColorOp::FromInfo(ost::info::InfoGroup& group) ColorOp op; std::istringstream ss(group.GetTextData()); int mask; - ss >> mask; + mol::QueryFlags flags; + ss >> mask >> flags; op.SetMask(mask); String selection; String part; @@ -91,6 +102,7 @@ gfx::ColorOp ColorOp::FromInfo(ost::info::InfoGroup& group) part.clear(); } op.SetSelection(selection); + op.SetSelectionFlags(flags); return op; } diff --git a/modules/gfx/src/color_ops/color_op.hh b/modules/gfx/src/color_ops/color_op.hh index d1a98d88eaed0f71cd6e9bb4567dde1915be8c77..92950141193f6def5cf085574574393949010059 100644 --- a/modules/gfx/src/color_ops/color_op.hh +++ b/modules/gfx/src/color_ops/color_op.hh @@ -58,6 +58,9 @@ public: virtual void SetSelection(const String& selection); virtual String GetSelection() const; + virtual void SetSelectionFlags(mol::QueryFlags flags); + virtual mol::QueryFlags GetSelectionFlags() const; + virtual bool IsSelectionOnly() const; virtual void SetView(const mol::EntityView& view); virtual mol::EntityView GetView() const; diff --git a/modules/gfx/src/color_ops/entity_view_color_op.cc b/modules/gfx/src/color_ops/entity_view_color_op.cc index 6cdbd75a127617e4a95979c9f60b5dc42f7aac49..de21ceab38be7ffea3acaccc9eae052bd0d427d8 100644 --- a/modules/gfx/src/color_ops/entity_view_color_op.cc +++ b/modules/gfx/src/color_ops/entity_view_color_op.cc @@ -84,7 +84,6 @@ gfx::EntityViewColorOp EntityViewColorOp::FromInfo(info::InfoGroup& group){ info::InfoGroup super_group = group.GetGroup("GradientColorOp"); gfx::GradientColorOp gop = GradientColorOp::FromInfo(super_group); std::istringstream ss(group.GetTextData()); - String selection = gop.GetSelection(); gfx::Gradient gradient = gop.GetGradient(); int mask = gop.GetMask(); String property = gop.GetProperty(); diff --git a/modules/gfx/src/color_ops/gradient_color_op.cc b/modules/gfx/src/color_ops/gradient_color_op.cc index 82c06e144871ce127a2080c385d676ba6b2659ad..83205dc172041e4067b2563ffc4adba1d9c93704 100644 --- a/modules/gfx/src/color_ops/gradient_color_op.cc +++ b/modules/gfx/src/color_ops/gradient_color_op.cc @@ -150,12 +150,12 @@ gfx::GradientColorOp GradientColorOp::FromInfo(info::InfoGroup& group) if(ss.good())property.append(" "); part.clear(); } - String selection = op.GetSelection(); + mol::QueryViewWrapper wrapper(op.GetSelection(),op.GetSelectionFlags()); if(calculate) { - return gfx::GradientColorOp(selection,mask,property,gradient); + return gfx::GradientColorOp(wrapper,mask,property,gradient); } else { - return gfx::GradientColorOp(selection,mask,property,gradient, minv, maxv); + return gfx::GradientColorOp(wrapper,mask,property,gradient, minv, maxv); } } diff --git a/modules/gfx/src/color_ops/gradient_level_color_op.cc b/modules/gfx/src/color_ops/gradient_level_color_op.cc index e1e0f2940e94227de57752d7667c7d02ab2acf84..bd9400a2351149c984ea5ed05ceeeb00b9dbac75 100644 --- a/modules/gfx/src/color_ops/gradient_level_color_op.cc +++ b/modules/gfx/src/color_ops/gradient_level_color_op.cc @@ -143,17 +143,17 @@ gfx::GradientLevelColorOp GradientLevelColorOp::FromInfo(info::InfoGroup& group) int l; ss >> l; mol::Prop::Level level = mol::Prop::Level(l); - String selection = gop.GetSelection(); + mol::QueryViewWrapper wrapper(gop.GetSelection(),gop.GetSelectionFlags()); String property = gop.GetProperty(); int mask = gop.GetMask(); gfx::Gradient gradient = gop.GetGradient(); float minv = gop.GetMinV(); float maxv = gop.GetMaxV(); if(gop.GetCalculateMinMax()){ - return gfx::GradientLevelColorOp(selection, mask, property, gradient, level); + return gfx::GradientLevelColorOp(wrapper, mask, property, gradient, level); } else{ - return gfx::GradientLevelColorOp(selection, mask, property, gradient, minv, maxv, level); + return gfx::GradientLevelColorOp(wrapper, mask, property, gradient, minv, maxv, level); } } diff --git a/modules/gfx/src/color_ops/map_handle_color_op.cc b/modules/gfx/src/color_ops/map_handle_color_op.cc index c8cf2ebb7a9895187140f314f50c038a13b5eb6d..3c45f77fc4283b2dc021ee012c1e766cee816414 100644 --- a/modules/gfx/src/color_ops/map_handle_color_op.cc +++ b/modules/gfx/src/color_ops/map_handle_color_op.cc @@ -82,14 +82,14 @@ gfx::MapHandleColorOp MapHandleColorOp::FromInfo(info::InfoGroup& group){ info::InfoGroup super_group = group.GetGroup("GradientColorOp"); gfx::GradientColorOp gop = GradientColorOp::FromInfo(super_group); std::istringstream ss(group.GetTextData()); - String selection = gop.GetSelection(); + mol::QueryViewWrapper wrapper(gop.GetSelection(),gop.GetSelectionFlags()); gfx::Gradient gradient = gop.GetGradient(); int mask = gop.GetMask(); String property = gop.GetProperty(); float minv = gop.GetMinV(); float maxv = gop.GetMaxV(); //TODO load map handle - return gfx::MapHandleColorOp(selection, mask, property, gradient, minv, maxv, img::MapHandle()); + return gfx::MapHandleColorOp(wrapper, mask, property, gradient, minv, maxv, img::MapHandle()); } }} diff --git a/modules/gfx/src/color_ops/uniform_color_op.cc b/modules/gfx/src/color_ops/uniform_color_op.cc index 8247fb0d2e3bd6a41a246139f7c26472aad26be0..3b7fa9e2c699bb3093d212a579ae2df51b88d239 100644 --- a/modules/gfx/src/color_ops/uniform_color_op.cc +++ b/modules/gfx/src/color_ops/uniform_color_op.cc @@ -97,9 +97,9 @@ gfx::UniformColorOp UniformColorOp::FromInfo(info::InfoGroup& group) float r, g, b, a; ss >> r >> g >> b >> a; Color c = Color(r,g,b,a); - String selection = op.GetSelection(); + mol::QueryViewWrapper wrapper(op.GetSelection(),op.GetSelectionFlags()); int mask = op.GetMask(); - return gfx::UniformColorOp(selection,mask,c); + return gfx::UniformColorOp(wrapper,mask,c); } }} diff --git a/modules/gfx/src/impl/connect_renderer_base.cc b/modules/gfx/src/impl/connect_renderer_base.cc index bc1dab565c98ebee107ca2787c7b841247d763e8..e54763a161b656d1fab6252bd7e9494c6dcb135b 100644 --- a/modules/gfx/src/impl/connect_renderer_base.cc +++ b/modules/gfx/src/impl/connect_renderer_base.cc @@ -137,21 +137,16 @@ inline void apply_color_op(ConnectRendererBase* rend, GfxView* v, T1 get_col, co return; } rend->UpdateViews(); + mol::EntityView view; if(op.IsSelectionOnly()){ - mol::Query q(op.GetSelection()); - for (AtomEntryMap::iterator it=v->atom_map.begin(); - it!=v->atom_map.end();++it) { - if (q.IsAtomSelected(it->second.atom)) { - it->second.color=get_col.ColorOfAtom(it->second.atom); - } - } + view = rend->GetEffectiveView().Select(op.GetSelection(),op.GetSelectionFlags()); } else{ - mol::EntityView view = op.GetView(); - for(AtomEntryMap::iterator it=v->atom_map.begin();it!=v->atom_map.end();++it){ - if(view.FindAtom(it->second.atom)){ - it->second.color=get_col.ColorOfAtom(it->second.atom); - } + view = op.GetView(); + } + for(AtomEntryMap::iterator it=v->atom_map.begin();it!=v->atom_map.end();++it){ + if(view.FindAtom(it->second.atom)){ + it->second.color=get_col.ColorOfAtom(it->second.atom); } } }; diff --git a/modules/gfx/src/impl/trace_renderer_base.cc b/modules/gfx/src/impl/trace_renderer_base.cc index 6a49d7c1660b0863c84fb0caf82a38272006bd87..51c9c35d361abfd97021b550a7403b77ad3c725a 100644 --- a/modules/gfx/src/impl/trace_renderer_base.cc +++ b/modules/gfx/src/impl/trace_renderer_base.cc @@ -40,27 +40,19 @@ inline void apply_color_op(TraceRendererBase* rend, { rend->UpdateViews(); ColorMask mask = op.GetMask(); + mol::EntityView view; if(op.IsSelectionOnly()){ - mol::Query q(op.GetSelection()); - for (int node_list=0; node_list<trace_subset.GetSize(); ++node_list) { - NodeListSubset& nl=trace_subset[node_list]; - for (int i=0; i<nl.GetSize();++i) { - if (q.IsAtomSelected(nl[i].atom)) { - Color clr =get_col.ColorOfAtom(nl[i].atom); - set_node_entry_color(nl[i],mask,clr); - } - } - } + view = rend->GetEffectiveView().Select(op.GetSelection(),op.GetSelectionFlags()); } else{ - mol::EntityView view = op.GetView(); - for (int node_list=0; node_list<trace_subset.GetSize(); ++node_list) { - NodeListSubset& nl=trace_subset[node_list]; - for (int i=0; i<nl.GetSize();++i) { - if(view.FindAtom(nl[i].atom)){ - Color clr =get_col.ColorOfAtom(nl[i].atom); - set_node_entry_color(nl[i],mask,clr); - } + view = op.GetView(); + } + for (int node_list=0; node_list<trace_subset.GetSize(); ++node_list) { + NodeListSubset& nl=trace_subset[node_list]; + for (int i=0; i<nl.GetSize();++i) { + if(view.FindAtom(nl[i].atom)){ + Color clr =get_col.ColorOfAtom(nl[i].atom); + set_node_entry_color(nl[i],mask,clr); } } } diff --git a/modules/gui/pymod/CMakeLists.txt b/modules/gui/pymod/CMakeLists.txt index 61a4faa0be1d7ac09cd09ea7eaba608458ccb2e9..a9b6470837777f5691e75bc7b4b075a660f9557d 100644 --- a/modules/gui/pymod/CMakeLists.txt +++ b/modules/gui/pymod/CMakeLists.txt @@ -62,6 +62,7 @@ loader_manager_widget.py immutable_loader_info_handler.py line_trace_widget.py wireframe_widget.py +query_editor.py ) if (ENABLE_IMG) list(APPEND OST_GUI_PYMOD_SOURCES diff --git a/modules/gui/pymod/scene/preset_editor_widget.py b/modules/gui/pymod/scene/preset_editor_widget.py index 513040bfc2bb08bdcb2998736209ae3231754ba9..65ff8947c7c9b4d2c3cc1c258b17696005b85467 100644 --- a/modules/gui/pymod/scene/preset_editor_widget.py +++ b/modules/gui/pymod/scene/preset_editor_widget.py @@ -20,6 +20,7 @@ from ost import gui from ost import gfx +from ost import mol from datetime import datetime from datetime import datetime from PyQt4 import QtCore, QtGui @@ -29,6 +30,7 @@ from gradient_editor_widget import GradientPreview from gradient_editor_widget import GradientEdit from preset_editor_list_model import PresetEditorListModel from immutable_gradient_info_handler import ImmutableGradientInfoHandler +from query_editor import QueryEditor from ost.mol import Prop from ost.gfx import ByElementColorOp from ost.gfx import ByChainColorOp @@ -181,8 +183,7 @@ class PresetEditor(QtGui.QDialog): class UniformColorOpWidget(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - selection_label = QtGui.QLabel("Selection") - self.selection_edit_ = QtGui.QLineEdit() + self.query_editor_ = QueryEditor(self) detail_label = QtGui.QLabel("Parts") self.detail_selection_cb_ = QtGui.QComboBox() @@ -203,8 +204,7 @@ class UniformColorOpWidget(QtGui.QDialog): grid = QtGui.QGridLayout() grid.setContentsMargins(0,5,0,0) - grid.addWidget(selection_label, 0, 0, 1, 1) - grid.addWidget(self.selection_edit_, 0, 1, 1, 1) + grid.addWidget(self.query_editor_, 0, 0, 1, 2) grid.addWidget(detail_label, 1, 0, 1, 1) grid.addWidget(self.detail_selection_cb_, 1, 1, 1, 1) grid.addWidget(color_label, 2, 0, 1, 1) @@ -217,18 +217,19 @@ class UniformColorOpWidget(QtGui.QDialog): QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel) def GetOp(self): - ufco = UniformColorOp("",gfx.Color(1,1,1,1)) + qv=mol.QueryViewWrapper(self.query_editor_.GetQuery(),self.query_editor_.GetQueryFlags()) + ufco = UniformColorOp(qv,gfx.Color(1,1,1,1)) detail = self.detail_selection_cb_.itemData(self.detail_selection_cb_.currentIndex()).toPyObject() ufco.SetMask(detail) qcolor = self.color_select_widget_.GetColor() color=gfx.Color(qcolor.red()/255.0,qcolor.green()/255.0,qcolor.blue()/255.0,qcolor.alpha()/255.0) ufco.SetColor(color) - ufco.SetSelection(str(self.selection_edit_.text())) return ufco def SetOp(self, ufco): - self.selection_edit_.setText(ufco.GetSelection()) + self.query_editor_.SetQuery(ufco.GetSelection()) + self.query_editor_.SetQueryFlags(ufco.GetSelectionFlags()) found=False for i in range(0,self.detail_selection_cb_.count()): mask = self.detail_selection_cb_.itemData(i).toPyObject() @@ -253,8 +254,7 @@ class GradientLevelColorOpWidget(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - selection_label = QtGui.QLabel("Selection") - self.selection_edit_ = QtGui.QLineEdit() + self.query_editor_ = QueryEditor(self) detail_label = QtGui.QLabel("Parts") self.detail_selection_cb_ = QtGui.QComboBox() @@ -313,8 +313,7 @@ class GradientLevelColorOpWidget(QtGui.QDialog): grid = QtGui.QGridLayout() grid.setContentsMargins(0,5,0,0) - grid.addWidget(selection_label, 0, 0, 1, 1) - grid.addWidget(self.selection_edit_, 0, 1, 1, 1) + grid.addWidget(self.query_editor_, 0, 0, 1, 2) grid.addWidget(detail_label, 1, 0, 1, 1) grid.addWidget(self.detail_selection_cb_, 1, 1, 1, 1) grid.addWidget(property_label, 2, 0, 1, 1) @@ -347,7 +346,7 @@ class GradientLevelColorOpWidget(QtGui.QDialog): gradient = self.gradient_edit_.GetGfxGradient() detail = self.detail_selection_cb_.itemData(self.detail_selection_cb_.currentIndex()).toPyObject() - selection = str(self.selection_edit_.text()) + qv=mol.QueryViewWrapper(self.query_editor_.GetQuery(),self.query_editor_.GetQueryFlags()) prop = str() level = Prop.Level() if(self.property_edit_.isEnabled()): @@ -357,15 +356,16 @@ class GradientLevelColorOpWidget(QtGui.QDialog): prop = str(self.prop_combo_box_.itemData(self.prop_combo_box_.currentIndex()).toPyObject()) if(self.auto_calc_.isChecked()): - return GradientLevelColorOp(selection, detail, prop, gradient, level) + return GradientLevelColorOp(qv, detail, prop, gradient, level) else: minv = self.minv_.value() maxv = self.maxv_.value() - return GradientLevelColorOp(selection, detail, prop, gradient, minv, maxv, level) + return GradientLevelColorOp(qv, detail, prop, gradient, minv, maxv, level) def SetOp(self, glco): - self.selection_edit_.setText(glco.GetSelection()) + self.query_editor_.SetQuery(glco.GetSelection()) + self.query_editor_.SetQueryFlags(glco.GetSelectionFlags()) found=False for i in range(0,self.detail_selection_cb_.count()): mask = self.detail_selection_cb_.itemData(i).toPyObject() @@ -422,8 +422,7 @@ class GradientLevelColorOpWidget(QtGui.QDialog): class ByElementColorOpWidget(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - selection_label = QtGui.QLabel("Selection") - self.selection_edit_ = QtGui.QLineEdit() + self.query_editor_ = QueryEditor(self) detail_label = QtGui.QLabel("Parts") self.detail_selection_cb_ = QtGui.QComboBox() @@ -440,8 +439,7 @@ class ByElementColorOpWidget(QtGui.QDialog): grid = QtGui.QGridLayout() grid.setContentsMargins(0,5,0,0) - grid.addWidget(selection_label, 0, 0, 1, 1) - grid.addWidget(self.selection_edit_, 0, 1, 1, 1) + grid.addWidget(self.query_editor_, 0, 0, 1, 2) grid.addWidget(detail_label, 1, 0, 1, 1) grid.addWidget(self.detail_selection_cb_, 1, 1, 1, 1) grid.addLayout(self.hbox_,2,0,1,2) @@ -453,12 +451,13 @@ class ByElementColorOpWidget(QtGui.QDialog): def GetOp(self): detail = self.detail_selection_cb_.itemData(self.detail_selection_cb_.currentIndex()).toPyObject() - selection = str(self.selection_edit_.text()) - beco = ByElementColorOp(selection, detail) + qv=mol.QueryViewWrapper(self.query_editor_.GetQuery(),self.query_editor_.GetQueryFlags()) + beco = ByElementColorOp(qv, detail) return beco def SetOp(self, beco): - self.selection_edit_.setText(beco.GetSelection()) + self.query_editor_.SetQuery(beco.GetSelection()) + self.query_editor_.SetQueryFlags(beco.GetSelectionFlags()) found=False for i in range(0,self.detail_selection_cb_.count()): mask = self.detail_selection_cb_.itemData(i).toPyObject() @@ -479,8 +478,7 @@ class ByElementColorOpWidget(QtGui.QDialog): class ByChainColorOpWidget(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - selection_label = QtGui.QLabel("Selection") - self.selection_edit_ = QtGui.QLineEdit() + self.query_editor_ = QueryEditor(self) detail_label = QtGui.QLabel("Parts") self.detail_selection_cb_ = QtGui.QComboBox() @@ -497,8 +495,7 @@ class ByChainColorOpWidget(QtGui.QDialog): grid = QtGui.QGridLayout() grid.setContentsMargins(0,5,0,0) - grid.addWidget(selection_label, 0, 0, 1, 1) - grid.addWidget(self.selection_edit_, 0, 1, 1, 1) + grid.addWidget(self.query_editor_, 0, 0, 1, 2) grid.addWidget(detail_label, 1, 0, 1, 1) grid.addWidget(self.detail_selection_cb_, 1, 1, 1, 1) grid.addLayout(self.hbox_,2,0,1,2) @@ -510,12 +507,13 @@ class ByChainColorOpWidget(QtGui.QDialog): def GetOp(self): detail = self.detail_selection_cb_.itemData(self.detail_selection_cb_.currentIndex()).toPyObject() - selection = str(self.selection_edit_.text()) - bcco = ByChainColorOp(selection, detail) + qv=mol.QueryViewWrapper(self.query_editor_.GetQuery(),self.query_editor_.GetQueryFlags()) + bcco = ByChainColorOp(qv, detail) return bcco def SetOp(self, bcco): - self.selection_edit_.setText(bcco.GetSelection()) + self.query_editor_.SetQuery(bcco.GetSelection()) + self.query_editor_.SetQueryFlags(bcco.GetSelectionFlags()) found=False for i in range(0,self.detail_selection_cb_.count()): mask = self.detail_selection_cb_.itemData(i).toPyObject() @@ -536,8 +534,7 @@ class ByChainColorOpWidget(QtGui.QDialog): class RenderOpWidget(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - selection_label = QtGui.QLabel("Selection") - self.selection_edit_ = QtGui.QLineEdit() + self.query_editor_ = QueryEditor(self) self.keep_ = QtGui.QCheckBox("Keep") self.keep_.setChecked(False) @@ -571,8 +568,7 @@ class RenderOpWidget(QtGui.QDialog): grid = QtGui.QGridLayout() grid.setContentsMargins(0,5,0,0) - grid.addWidget(selection_label, 0, 0, 1, 1) - grid.addWidget(self.selection_edit_, 0, 1, 1, 1) + grid.addWidget(self.query_editor_, 0, 0, 1, 2) grid.addWidget(self.keep_, 1, 1, 1, 1) grid.addWidget(render_label,2,0,1,1) grid.addWidget(self.render_modes_,2,1,1,1) @@ -584,13 +580,15 @@ class RenderOpWidget(QtGui.QDialog): QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel) def GetOp(self): - selection = str(self.selection_edit_.text()) + selection = self.query_editor_.GetQueryText() + flags = self.query_editor_.GetQueryFlags() render_mode = self.render_modes_list_[self.render_modes_.currentIndex()] - ro = RenderOp(render_mode, selection, self.keep_.isChecked()) + ro = RenderOp(render_mode, selection, flags, self.keep_.isChecked()) return ro def SetOp(self, ro): - self.selection_edit_.setText(ro.GetSelection()) + self.query_editor_.SetQuery(ro.GetSelection()) + self.query_editor_.SetQueryFlags(ro.GetSelectionFlags()) found=False for i in range(0,self.render_modes_.count()): render_mode = self.render_modes_list_[i] @@ -611,8 +609,7 @@ class RenderOpWidget(QtGui.QDialog): class VisibilityOpWidget(QtGui.QDialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - selection_label = QtGui.QLabel("Selection") - self.selection_edit_ = QtGui.QLineEdit() + self.query_editor_ = QueryEditor(self) self.visible_ = QtGui.QCheckBox("Visible") self.visible_.setChecked(True) @@ -626,8 +623,7 @@ class VisibilityOpWidget(QtGui.QDialog): grid = QtGui.QGridLayout() grid.setContentsMargins(0,5,0,0) - grid.addWidget(selection_label, 0, 0, 1, 1) - grid.addWidget(self.selection_edit_, 0, 1, 1, 1) + grid.addWidget(self.query_editor_, 0, 0, 1, 2) grid.addWidget(self.visible_, 1, 1, 1, 1) grid.addLayout(self.hbox_,2,0,1,2) grid.setRowStretch(1, 1) @@ -637,13 +633,15 @@ class VisibilityOpWidget(QtGui.QDialog): QtCore.QObject.connect(self.cancel_button_, QtCore.SIGNAL("clicked()"), self.Cancel) def GetOp(self): - selection = str(self.selection_edit_.text()) - vo = VisibilityOp(selection, self.visible_.isChecked()) + selection = self.query_editor_.GetQueryText() + flags = self.query_editor_.GetQueryFlags() + vo = VisibilityOp(selection, flags, self.visible_.isChecked()) return vo - def SetOp(self, ro): - self.selection_edit_.setText(ro.GetSelection()) - self.visible_.setChecked(ro.IsVisible()) + def SetOp(self, vo): + self.query_editor_.SetQuery(vo.GetSelection()) + self.query_editor_.SetQueryFlags(vo.GetSelectionFlags()) + self.visible_.setChecked(vo.IsVisible()) def Ok(self): self.accept() diff --git a/modules/gui/pymod/scene/presets.xml b/modules/gui/pymod/scene/presets.xml index f73dbd879951224b5d7e1d75b5f03878a68618b4..4a1f8d21431675e77d3835f6820fe96de31a469d 100644 --- a/modules/gui/pymod/scene/presets.xml +++ b/modules/gui/pymod/scene/presets.xml @@ -2,28 +2,28 @@ <EMDataInfo> <Presets> <Preset Name="Secondary Structure" > - <Op ClassName="VisibilityOp" Index="0" Visible="1" /> + <Op ClassName="VisibilityOp" Index="0" Visible="1" Flags="0"/> <Op ClassName="UniformColorOp" Index="1"> - <ColorOp>2 rtype=helix</ColorOp>0 1 0 1</Op> + <ColorOp>2 0 rtype=helix</ColorOp>0 1 0 1</Op> <Op ClassName="UniformColorOp" Index="2"> - <ColorOp>2 rtype=ext</ColorOp>1 0 0 1</Op> + <ColorOp>2 0 rtype=ext</ColorOp>1 0 0 1</Op> <Op ClassName="UniformColorOp" Index="3"> - <ColorOp>2 rtype!=ext,helix</ColorOp>0.5 0.5 0.5 1</Op> + <ColorOp>2 0 rtype!=ext,helix</ColorOp>0.5 0.5 0.5 1</Op> <Op ClassName="UniformColorOp" Index="4"> - <ColorOp>1 rtype=helix</ColorOp>0.7 1.0 0.8 1</Op> + <ColorOp>1 0 rtype=helix</ColorOp>0.7 1.0 0.8 1</Op> <Op ClassName="UniformColorOp" Index="5"> - <ColorOp>1 rtype!=ext,helix</ColorOp>1.0 0.8 0.2 1</Op> + <ColorOp>1 0 rtype!=ext,helix</ColorOp>1.0 0.8 0.2 1</Op> </Preset> <Preset Name="Highlight Ligand (Carbon)" > - <Op Keep="0" RenderMode="HSC" ClassName="RenderOp" Index="0" ></Op> - <Op Keep="0" RenderMode="CUSTOM" ClassName="RenderOp" Index="1" >ishetatm=1 and not rname==HOH</Op> - <Op ClassName="ByElementColorOp" Index="2" >3 </Op> + <Op Keep="0" RenderMode="HSC" ClassName="RenderOp" Index="0" Flags="0"></Op> + <Op Keep="0" RenderMode="CUSTOM" ClassName="RenderOp" Index="1" Flags="0">ishetatm=1 and not rname==HOH</Op> + <Op ClassName="ByElementColorOp" Index="2" >3 0</Op> <Op ClassName="UniformColorOp" Index="3"> - <ColorOp>2 ishetatm=1 and ele=C</ColorOp>0 1 0 1</Op> + <ColorOp>2 0 ishetatm=1 and ele=C</ColorOp>0 1 0 1</Op> </Preset> <Preset Name="Hydrophobic" > <Op ClassName="UniformColorOp" Index="0" > - <ColorOp>3 rname=GLY,ALA,VAL,LEU,ILE,PHE,TYR,TRP,LYS,HIS,CYS,THR</ColorOp>0 0.666667 1 1</Op> + <ColorOp>3 0 rname=GLY,ALA,VAL,LEU,ILE,PHE,TYR,TRP,LYS,HIS,CYS,THR</ColorOp>0 0.666667 1 1</Op> </Preset> </Presets> </EMDataInfo> diff --git a/modules/gui/pymod/scene/query_editor.py b/modules/gui/pymod/scene/query_editor.py new file mode 100644 index 0000000000000000000000000000000000000000..7bd05a89d3dc32c677460b5ba05fbe8572952a8b --- /dev/null +++ b/modules/gui/pymod/scene/query_editor.py @@ -0,0 +1,54 @@ +from ost import mol +from PyQt4 import QtCore, QtGui + +class QueryEditor(QtGui.QWidget): + + def __init__(self, parent=None): + QtGui.QWidget.__init__(self, parent) + self.selection_edit_ = QtGui.QLineEdit() + selection_label = QtGui.QLabel("Selection") + + self.checkboxes_ = dict() + for k,v in mol.QueryFlag.__dict__["values"].iteritems(): + checkbox = QtGui.QCheckBox(str(v),self) + self.checkboxes_[checkbox]=k + + v_checkbox_layout = QtGui.QVBoxLayout() + v_checkbox_layout.setMargin(0) + v_checkbox_layout.setSpacing(0) + for k,v in self.checkboxes_.iteritems(): + v_checkbox_layout.addWidget(k) + + 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(self.selection_edit_,0,1,1,1) + grid.addWidget(flag_label,1,0,1,1) + grid.addLayout(v_checkbox_layout,1,1,1,1) + grid.setRowStretch(1, 1) + #group_box = QtGui.QGroupBox("Selection",self) + #group_box.setLayout(h_layout) + + def GetQueryFlags(self): + flag = 0 + for k,v in self.checkboxes_.iteritems(): + if k.isChecked(): + flag += v + return flag + + def GetQuery(self): + return mol.Query(str(self.selection_edit_.text())) + + def GetQueryText(self): + return str(self.selection_edit_.text()) + + def SetQueryFlags(self,flags): + for k,v in self.checkboxes_.iteritems(): + if (flags & v)>0: + k.setChecked(True) + else: + k.setChecked(False) + + def SetQuery(self,query): + self.selection_edit_.setText(query) \ No newline at end of file diff --git a/modules/gui/pymod/scene/render_op.py b/modules/gui/pymod/scene/render_op.py index 722bf7bc853cdcc9ddc7c009da2b420ad2d80fea..feab4451a256041a41205597c6f7a2538b128e7b 100644 --- a/modules/gui/pymod/scene/render_op.py +++ b/modules/gui/pymod/scene/render_op.py @@ -25,11 +25,13 @@ from PyQt4 import QtGui class RenderOp(): RENDERMODE_ATTRIBUTE_NAME = "RenderMode" KEEP_ATTRIBUTE_NAME = "Keep" + FLAGS_ATTRIBUTE_NAME = "Flags" - def __init__(self, render_mode, selection, keep=False): + def __init__(self, render_mode, selection, flags, keep=False): self.render_mode_ = render_mode self.selection_ = selection self.keep_ = keep + self.flags_ = flags def SetRenderMode(self, render_mode): self.render_mode_ = render_mode @@ -43,6 +45,12 @@ class RenderOp(): def GetSelection(self): return self.selection_ + def SetSelectionFlags(self, flags): + self.flags_ = flags + + def GetSelectionFlags(self): + return self.flags_ + def SetKeep(self, keep): self.keep_ = keep @@ -51,11 +59,12 @@ class RenderOp(): def ApplyOn(self, entity): if (entity is not None) and isinstance(entity, gfx.Entity): - entity.SetRenderMode(self.GetRenderMode(),entity.view.Select(self.GetSelection()),self.IsKept()) + entity.SetRenderMode(self.GetRenderMode(),entity.view.Select(self.GetSelection(),self.GetSelectionFlags()),self.IsKept()) def ToInfo(self,group): group.SetAttribute(RenderOp.RENDERMODE_ATTRIBUTE_NAME, str(self.GetRenderMode().name)) group.SetAttribute(RenderOp.KEEP_ATTRIBUTE_NAME, str(int(self.IsKept()))) + group.SetAttribute(RenderOp.FLAGS_ATTRIBUTE_NAME, str(self.GetSelectionFlags())) group.SetTextData(str(self.GetSelection())) @staticmethod @@ -65,6 +74,7 @@ class RenderOp(): and group.HasAttribute(RenderOp.KEEP_ATTRIBUTE_NAME)): render_mode = getattr(gfx.RenderMode, group.GetAttribute(RenderOp.RENDERMODE_ATTRIBUTE_NAME)) keep = bool(int(group.GetAttribute(RenderOp.KEEP_ATTRIBUTE_NAME))) + flags = int(group.GetAttribute(RenderOp.FLAGS_ATTRIBUTE_NAME)) selection = group.GetTextData() - render_op = RenderOp(render_mode,selection,keep) + render_op = RenderOp(render_mode,selection,flags,keep) return render_op diff --git a/modules/gui/pymod/scene/visibility_op.py b/modules/gui/pymod/scene/visibility_op.py index cb6ec07d68c2ff6a00ad47c29841ca2b66941e80..5eeb3bffdebd5f88dfc86c5a9a5249dff9903adf 100644 --- a/modules/gui/pymod/scene/visibility_op.py +++ b/modules/gui/pymod/scene/visibility_op.py @@ -24,10 +24,12 @@ from PyQt4 import QtGui class VisibilityOp(): VISIBLE_ATTRIBUTE_NAME = "Visible" + FLAGS_ATTRIBUTE_NAME = "Flags" - def __init__(self, selection, visible=False): + def __init__(self, selection, flags, visible=False): self.selection_ = selection self.visible_ = visible + self.flags_ = flags def SetSelection(self, selection): self.selection_ = selection @@ -38,15 +40,22 @@ class VisibilityOp(): def SetVisible(self, visible): self.visible_ = visible + def SetSelectionFlags(self, flags): + self.flags_ = flags + + def GetSelectionFlags(self): + return self.flags_ + def IsVisible(self): return self.visible_ def ApplyOn(self, entity): if (entity is not None) and isinstance(entity, gfx.Entity): - entity.SetVisible(entity.view.Select(self.GetSelection()),self.IsVisible()) + entity.SetVisible(entity.view.Select(self.GetSelection(),self.GetSelectionFlags()),self.IsVisible()) def ToInfo(self,group): group.SetAttribute(VisibilityOp.VISIBLE_ATTRIBUTE_NAME, str(int(self.IsVisible()))) + group.SetAttribute(VisibilityOp.FLAGS_ATTRIBUTE_NAME, str(self.GetSelectionFlags())) group.SetTextData(str(self.GetSelection())) @staticmethod @@ -54,6 +63,7 @@ class VisibilityOp(): visible_op = None if group.HasAttribute(VisibilityOp.VISIBLE_ATTRIBUTE_NAME): visible = bool(int(group.GetAttribute(VisibilityOp.VISIBLE_ATTRIBUTE_NAME))) + flags = int(group.GetAttribute(VisibilityOp.FLAGS_ATTRIBUTE_NAME)) selection = group.GetTextData() - visible_op = VisibilityOp(selection,visible) + visible_op = VisibilityOp(selection,flags,visible) return visible_op diff --git a/modules/gui/src/scene_win/entity_node.cc b/modules/gui/src/scene_win/entity_node.cc index 62c646ed85a13146749f3fa7143a6c7a26e4c9a8..0b618ea1e785aabfb80de8f0c8d69423a99b6ac8 100644 --- a/modules/gui/src/scene_win/entity_node.cc +++ b/modules/gui/src/scene_win/entity_node.cc @@ -60,13 +60,13 @@ EntityNode::EntityNode(gfx::EntityP& entity, SceneNode* parent): SceneNode* quick_selection = new LabelNode("Quick Selection",this); model->AddNode(this, quick_selection); - SceneNode* node = new EntityPartNode("Backbone", entity, mol::QueryViewWrapper(entity->GetView().Select("aname=CA,C,N,O and peptide=true")), quick_selection); + SceneNode* node = new EntityPartNode("Backbone", entity, mol::QueryViewWrapper(mol::Query("aname=CA,C,N,O and peptide=true"),entity->GetView()), quick_selection); model->AddNode(quick_selection, node); - node = new EntityPartNode("Sidechains", entity, mol::QueryViewWrapper(entity->GetView().Select("aname!=CA,C,N,O and peptide=true",mol::QueryFlag::EXCLUSIVE_BONDS)), quick_selection); + node = new EntityPartNode("Sidechains", entity, mol::QueryViewWrapper(mol::Query("aname!=CA,C,N,O and peptide=true"),mol::QueryFlag::EXCLUSIVE_BONDS,entity->GetView()), quick_selection); model->AddNode(quick_selection, node); - node = new EntityPartNode("Ligands", entity, mol::QueryViewWrapper(entity->GetView().Select("ishetatm=1 and rname!=HOH,WAT")), quick_selection); + node = new EntityPartNode("Ligands", entity, mol::QueryViewWrapper(mol::Query("ishetatm=1 and rname!=HOH,WAT"),entity->GetView()), quick_selection); model->AddNode(quick_selection, node); - node = new EntityPartNode("Water", entity, mol::QueryViewWrapper(entity->GetView().Select("rname=HOH,WAT")), quick_selection); + node = new EntityPartNode("Water", entity, mol::QueryViewWrapper(mol::Query("rname=HOH,WAT"),entity->GetView()), quick_selection); model->AddNode(quick_selection, node); diff --git a/modules/mol/base/pymod/export_query_view_wrapper.cc b/modules/mol/base/pymod/export_query_view_wrapper.cc index 4af480ff1a151f17e113136bd60f734059724fcb..9bc933069cca864eb3e5c0d7837e3b2becb7f2ef 100644 --- a/modules/mol/base/pymod/export_query_view_wrapper.cc +++ b/modules/mol/base/pymod/export_query_view_wrapper.cc @@ -33,13 +33,17 @@ void export_QueryViewWrapper() .def(init<const EntityHandle&>()) .def(init<const EntityView&>()) .def(init<const Query&, const EntityHandle&>()) - .def(init<const Query&, const EntityView&>()) + .def(init<const Query&, optional<const EntityView&> >()) + .def(init<const Query&, QueryFlags, const EntityHandle&>()) + .def(init<const Query&, QueryFlags, optional<const EntityView&> >()) .def("GetEntityView",&QueryViewWrapper::GetEntityView) .def("DependsOnQuery",&QueryViewWrapper::DependsOnQuery) .def("IsDataValid", &QueryViewWrapper::IsDataValid) .def("SetQuery", &QueryViewWrapper::SetQuery) .def("GetQuery", &QueryViewWrapper::GetQuery ,return_value_policy<copy_const_reference>()) + .def("GetFlags", &QueryViewWrapper::GetFlags) + .def("SetFlags", &QueryViewWrapper::SetFlags) .add_property("entity_view", &QueryViewWrapper::GetEntityView) .add_property("query", make_function(&QueryViewWrapper::GetQuery ,return_value_policy<copy_const_reference>())) diff --git a/modules/mol/base/src/query_view_wrapper.cc b/modules/mol/base/src/query_view_wrapper.cc index fc755f6e0f162e53158b904ec8892532fd18b09a..5774b1cfb501b62f6870653805fcfe6975a0a718 100644 --- a/modules/mol/base/src/query_view_wrapper.cc +++ b/modules/mol/base/src/query_view_wrapper.cc @@ -26,43 +26,62 @@ QueryViewWrapper::QueryViewWrapper(): view_set_(false), entity_handle_(), entity_view_(), - query_(){} + query_(), + flags_(0){} QueryViewWrapper::QueryViewWrapper(const EntityHandle& entity_handle): view_set_(false), entity_handle_(entity_handle), entity_view_(), - query_(){} + query_(), + flags_(0){} QueryViewWrapper::QueryViewWrapper(const EntityView& entity_view): view_set_(true), entity_handle_(), entity_view_(entity_view), - query_(){} + query_(), + flags_(0){} QueryViewWrapper::QueryViewWrapper(const Query& query, const EntityHandle& entity_handle): view_set_(false), entity_handle_(entity_handle), entity_view_(), - query_(query) -{ } + query_(query), + flags_(0){} QueryViewWrapper::QueryViewWrapper(const Query& query, const EntityView& view): view_set_(true), entity_handle_(), entity_view_(view), - query_(query) -{ } + query_(query), + flags_(0){} + +QueryViewWrapper::QueryViewWrapper(const Query& query, QueryFlags flags, + const EntityHandle& entity_handle): + view_set_(false), + entity_handle_(entity_handle), + entity_view_(), + query_(query), + flags_(flags){} + +QueryViewWrapper::QueryViewWrapper(const Query& query, QueryFlags flags, + const EntityView& view): + view_set_(true), + entity_handle_(), + entity_view_(view), + query_(query), + flags_(flags){} EntityView QueryViewWrapper::GetEntityView() const { if(view_set_) { - return query_.MatchAll() ? entity_view_ : entity_view_.Select(query_); + return query_.MatchAll() ? entity_view_ : entity_view_.Select(query_,flags_); } else { if(entity_handle_.IsValid()){ - return entity_handle_.Select(query_); + return entity_handle_.Select(query_,flags_); } return entity_view_; } @@ -76,6 +95,13 @@ void QueryViewWrapper::SetQuery(const Query& query){ query_ = query; } +void QueryViewWrapper::SetFlags(QueryFlags flags){ + flags_ = flags; +} +QueryFlags QueryViewWrapper::GetFlags() const{ + return flags_; +} + bool QueryViewWrapper::IsDataValid() const{ if(view_set_){ return entity_view_.IsValid(); diff --git a/modules/mol/base/src/query_view_wrapper.hh b/modules/mol/base/src/query_view_wrapper.hh index 596b5cbf12aa464ee01e7a9ebba0f734da387328..44ec53d3b81ea525e2072a7f2dbf9fa86aecec83 100644 --- a/modules/mol/base/src/query_view_wrapper.hh +++ b/modules/mol/base/src/query_view_wrapper.hh @@ -33,7 +33,9 @@ public: explicit QueryViewWrapper(const EntityView& entity_view); QueryViewWrapper(); QueryViewWrapper(const Query& query, const EntityHandle& handle); - QueryViewWrapper(const Query& query, const EntityView& view); + QueryViewWrapper(const Query& query, const EntityView& view = mol::EntityView()); + QueryViewWrapper(const Query& query, QueryFlags flags, const EntityHandle& handle); + QueryViewWrapper(const Query& query, QueryFlags flags, const EntityView& view = mol::EntityView()); EntityView GetEntityView() const; bool DependsOnQuery() const; bool IsDataValid() const; @@ -41,11 +43,15 @@ public: void SetQuery(const Query& query); const Query& GetQuery() const; + void SetFlags(QueryFlags flags); + QueryFlags GetFlags() const; + private: bool view_set_; EntityHandle entity_handle_; EntityView entity_view_; Query query_; + QueryFlags flags_; }; } } // ns