From 2d33935e977d0e5981ab0aa7cf94f36decf6bcfe Mon Sep 17 00:00:00 2001
From: Ansgar Philippsen <ansgar.philippsen@gmail.com>
Date: Tue, 19 Jul 2011 18:54:06 -0400
Subject: [PATCH] added default query flag to mol.entity

For selections that do not explicitely state a QueryFlag option, a default
query flag is used instead of 0. This is an extension to current behavior
and should have zero impact on existing code.
---
 modules/mol/base/pymod/export_entity.cc  | 21 ++++++++++++------
 modules/mol/base/src/entity_handle.cc    | 27 +++++++++++++++++++++++-
 modules/mol/base/src/entity_handle.hh    | 22 +++++++++++++++++--
 modules/mol/base/src/impl/entity_impl.cc |  8 ++++++-
 modules/mol/base/src/impl/entity_impl.hh |  8 +++++++
 5 files changed, 75 insertions(+), 11 deletions(-)

diff --git a/modules/mol/base/pymod/export_entity.cc b/modules/mol/base/pymod/export_entity.cc
index 6ae372703..c46f07284 100644
--- a/modules/mol/base/pymod/export_entity.cc
+++ b/modules/mol/base/pymod/export_entity.cc
@@ -45,11 +45,6 @@ typedef BondHandle (EntityHandle::*Connect2)(const AtomHandle&,
                                              Real, Real);
 
 typedef EntityView (EntityHandle::*QueryMethod)(const Query&, uint) const;
-QueryMethod select_query=&EntityHandle::Select;
-StringMethod select_string=&EntityHandle::Select;
-//Connect1 conn1=&EntityHandle::Connect;
-//Connect2 conn2=&EntityHandle::Connect;
-
 
 Real (EntityHandle::*get_angle1)(const AtomHandle&, const AtomHandle&, const AtomHandle&) const = &EntityHandle::GetAngle;
 Real (EntityHandle::*get_angle2)(const AtomView&, const AtomView&, const AtomView&) const = &EntityHandle::GetAngle;
@@ -127,10 +122,22 @@ void export_Entity()
     .add_property("valid", &EntityBase::IsValid)
   ;
   generic_prop_def<EntityBase>(ent_base);
+
+  EntityView (EntityHandle::*select1)(const Query&) const = &EntityHandle::Select;
+  EntityView (EntityHandle::*select2)(const Query&, QueryFlags) const = &EntityHandle::Select;
+  EntityView (EntityHandle::*select3)(const String&) const = &EntityHandle::Select;
+  EntityView (EntityHandle::*select4)(const String&, QueryFlags) const = &EntityHandle::Select;
   
   class_<EntityHandle, bases<EntityBase> >("EntityHandle", init<>())
-    .def("Select",select_query, (arg("query"), arg("flags")=0))
-    .def("Select",select_string, (arg("query"), arg("flags")=0))
+    .def("Select",select1)
+    .def("Select",select2)
+    .def("Select",select3)
+    .def("Select",select4)
+    .def("SetDefaultQueryFlags",&EntityHandle::SetDefaultQueryFlags)
+    .def("GetDefaultQueryFlags",&EntityHandle::GetDefaultQueryFlags)
+    .add_property("default_query_flags",
+                  &EntityHandle::GetDefaultQueryFlags,
+                  &EntityHandle::SetDefaultQueryFlags)
     .def("FindChain", &EntityHandle::FindChain)
     .def("FindResidue", &EntityHandle::FindResidue)
     .def("FindAtom", &EntityHandle::FindAtom)
diff --git a/modules/mol/base/src/entity_handle.cc b/modules/mol/base/src/entity_handle.cc
index b90c19161..e975132ea 100644
--- a/modules/mol/base/src/entity_handle.cc
+++ b/modules/mol/base/src/entity_handle.cc
@@ -115,13 +115,38 @@ AtomHandleList EntityHandle::FindWithin(const geom::Vec3& pos,
   return handles;
 }
 
+void EntityHandle::SetDefaultQueryFlags(QueryFlags flags)
+{
+  this->CheckValidity();
+  Impl()->SetDefaultQueryFlags(flags);
+}
+
+QueryFlags EntityHandle::GetDefaultQueryFlags() const
+{
+  this->CheckValidity();
+  return Impl()->GetDefaultQueryFlags();
+}
+
+EntityView EntityHandle::Select(const Query& q) const
+{
+  this->CheckValidity();
+  return Impl()->Select(*this, q);
+}
+
+EntityView EntityHandle::Select(const String& q) const
+{
+  this->CheckValidity();
+  return Impl()->Select(*this, Query(q));
+}
+
 EntityView EntityHandle::Select(const Query& q, QueryFlags flags) const
 {
   this->CheckValidity();
   return Impl()->Select(*this, q, flags);
 }
 
-EntityView EntityHandle::Select(const String& q, QueryFlags flags) const {
+EntityView EntityHandle::Select(const String& q, QueryFlags flags) const 
+{
   this->CheckValidity();
   return Impl()->Select(*this, Query(q), flags);
 }
diff --git a/modules/mol/base/src/entity_handle.hh b/modules/mol/base/src/entity_handle.hh
index fff9f6efc..0fcadee77 100644
--- a/modules/mol/base/src/entity_handle.hh
+++ b/modules/mol/base/src/entity_handle.hh
@@ -201,13 +201,31 @@ public:
   /// \brief use atom hash to perform fast within lookup
   AtomHandleList FindWithin(const geom::Vec3& pos, Real radius) const;
 
+  /// \brief set default query flags
+  /// these will be used if flags are not explicitely specified as
+  /// a second argument to a Select call
+  void SetDefaultQueryFlags(QueryFlags flags);
+
+  /// \brief return default query flags
+  QueryFlags GetDefaultQueryFlags() const;
+
   /// \brief return view based on a query object
   /// \sa Query
-  EntityView Select(const Query& q, QueryFlags flags=0) const;
+  /// The default query flags will be used for the selection
+  EntityView Select(const Query& q) const;
 
   /// \brief return view based on query String.
   /// \sa Query
-  EntityView Select(const String& query_string, QueryFlags flags=0) const;
+  /// The default query flags will be used for the selection
+  EntityView Select(const String& query_string) const;
+
+  /// \brief return view based on a query object, specifying behavior flags
+  /// \sa Query
+  EntityView Select(const Query& q, QueryFlags flags) const;
+
+  /// \brief return view based on query String, specifying behavior flags
+  /// \sa Query
+  EntityView Select(const String& query_string, QueryFlags flags) const;
 
   /// \brief return a (new) full view of this entity
   EntityView CreateFullView() const;
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index 1441af7cc..305e34230 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -77,7 +77,8 @@ EntityImpl::EntityImpl():
   ics_editor_count_(0),  
   dirty_flags_(DisableICS),
   name_(""),
-  next_index_(0L)
+  next_index_(0L),
+  default_query_flags_(0)
 {    
 }
 
@@ -986,6 +987,11 @@ EntityView EntityImpl::do_selection(const EntityHandle& eh,
   return view;
 }
 
+EntityView EntityImpl::Select(const EntityHandle& h, const Query& q) const
+{
+  return do_selection<false>(h, q, default_query_flags_);
+}
+
 EntityView EntityImpl::Select(const EntityHandle& h, const Query& q, 
                               QueryFlags flags) const
 {
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index 541aec54e..3c5000920 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -157,9 +157,15 @@ public:
   void UpdateOrganizer();
   
   AtomImplList FindWithin(const geom::Vec3& pos, Real radius) const;
+  // use query flag defaults
+  EntityView Select(const EntityHandle& h, const Query& q) const;
+  // override query flag defaults with given flags
   EntityView Select(const EntityHandle& h, const Query& q, 
                     QueryFlags flags) const;
   EntityView CreateFullView(const EntityHandle& h) const;
+  void SetDefaultQueryFlags(QueryFlags f) {default_query_flags_=f;}
+  QueryFlags GetDefaultQueryFlags() const {return default_query_flags_;}
+
 
   /// Get chain by name. Returns an invalid ChainImplPtr if no chain with the
   /// given name exists.
@@ -276,6 +282,8 @@ private:
 
   unsigned long next_index_;
 
+  QueryFlags default_query_flags_;
+
   template <bool always_true>
   EntityView do_selection(const EntityHandle&, const Query&, QueryFlags) const;
 };
-- 
GitLab