OpenStructure
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
__init__.py
Go to the documentation of this file.
1 #------------------------------------------------------------------------------
2 # This file is part of the OpenStructure project <www.openstructure.org>
3 #
4 # Copyright (C) 2008-2011 by the OpenStructure authors
5 #
6 # This library is free software; you can redistribute it and/or modify it under
7 # the terms of the GNU Lesser General Public License as published by the Free
8 # Software Foundation; either version 3.0 of the License, or (at your option)
9 # any later version.
10 # This library is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13 # details.
14 #
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with this library; if not, write to the Free Software Foundation, Inc.,
17 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #------------------------------------------------------------------------------
19 from _ost_gui import *
20 import sip
21 
22 
23 ## \brief Opens a DataViewer
24 # \sa \ref fft_li.py "View Fourier Transform Example" \sa \ref modulate_image.py "Modulate Image Example"
25 def _close_event_override_(event):
26  print "close event"
27 def _set_data_override_(data):
28  print "set data"
29 
30 def CreateDataViewer(ih,flag=False):
31  viewer=GostyApp.Instance().CreateDataViewer(ih)
32  if flag:
33  viewer.image_=ih
34  sip_viewer=viewer.qobject
35  sip_viewer.closeEvent=_close_event_override_
36  sip_viewer.setData=_set_data_override_
37  return viewer
38 
40  gosty=GostyApp.Instance()
41  gosty.message_widget.Clear()
42 
43 
44 from PyQt4.QtGui import *
45 from PyQt4.QtCore import *
46 from ost import gfx
47 
48 def PickColor(default=gfx.WHITE):
49  """
50  Pops up a color chooser that lets' the user pick a color and returns the
51  selected color. If the user cancels the color chooser, None is returned.
52 
53  :rtype: :class:`~ost.gfx.Color`
54  """
55  dialog=QColorDialog()
56  qt_color=QColor(int(min(255,default.Red()*256)),
57  int(min(255,default.Green()*256)),
58  int(min(255,default.Blue()*256)))
59  qt_color=dialog.getColor(qt_color)
60  if not qt_color.isValid():
61  return None
62  return gfx.RGBb(qt_color.red(), qt_color.green(),qt_color.blue())
63 
64 def GetMenu(menu_name, create=False):
65  persp=GostyApp.Instance().perspective
66  if isinstance(menu_name[0], QAction):
67  return menu_name[0]
68  else:
69  node=persp.GetMenu(menu_name[0])
70  for name in menu_name[1:]:
71  found=False
72  for action in node.actions():
73  if str(action.text())==str(name):
74  found=True
75  node=action
76  break
77  if not found:
78  if create:
79  node=node.addMenu(name)
80  else:
81  raise ValueError("Menu '%s' doesn't exist" % ', '.join(menu_name))
82  return node
83 
84 
85 
86 def AddMenuAction(*args, **kwargs):
87  """
88  Add menu action to main menu.
89 
90  This function lets you conveniently add actions to the main menu. To add a new
91  new action "Background Color" to the "Scene" menu, simply use
92 
93  .. code-block:: python
94 
95  def SetBackgroundColor():
96  scene.bg=gfx.PickColor(scene.bg)
97 
98  AddMenuAction('Scene', "Background Color", SetBackgroundColor)
99 
100  This will add the menu "Scene" if it does not exist yet, register the action
101  "Background Color" and execute the function SetBackgroundColor whenever the
102  action is triggered.
103 
104  To assign a keyboard shortcut to the action, you can use the shortcut
105  argument:
106 
107  .. code-block:: python
108 
109  AddMenuAction('Scene', 'Background Color', SetBackgroundColor,
110  shortcut='Ctrl+B')
111 
112  Whenever you press Ctrl+B (Cmd+B on MacOS X), the action will be executed.
113 
114  Very often menu actions are coupled to the current selected objects in the
115  scene menu. These menu actions are either enabled or disabled depending on the
116  type of the selected objects. To easily support this scenario, the "enable"
117  state of the menu action can be tightly coupled to the scene menu by providing
118  a callable to the enabled argument. As an example, the following menu action
119  is only enabled when exactly one gfx.Entity is selected.
120 
121  .. code-block:: python
122 
123  AddMenuAction('Scene', 'PrintAtomCount', PrintAtomCount,
124  enabled=OneOf(gfx.Entity))
125 
126  OneOf is a simple function object that takes any number of classes and returns
127  true when the selected object is an instance. Alterantively, you might want to
128  use ManyOf or supply a custom function that evaluates the state of the menu
129  action to suit your needs.
130  """
131  class MenuActionEnabler(QObject):
132  def __init__(self, predicate, action):
133  QObject.__init__(self, action)
134  self.predicate=predicate
135  self.action=action
136  app=GostyApp.Instance()
137  QObject.connect(app.scene_win.qobject, SIGNAL('ActiveNodesChanged()'),
138  self.TestEnable)
139  self.TestEnable()
140 
141  def TestEnable(self):
142  self.action.setEnabled(self.predicate())
143  persp=GostyApp.Instance().perspective
144  menu_name=args[:-1]
145  function=args[-1]
146  if isinstance(menu_name[0], QMenu):
147  node=menu_name[0]
148  else:
149  node=persp.GetMenu(args[0])
150  for name in menu_name[1:-1]:
151  found=False
152  for action in node.actions():
153  if str(action.text())==str(name):
154  node=action
155  break
156  if not found:
157  node=node.addMenu(name)
158  action=node.addAction(str(menu_name[-1]))
159  if 'shortcut' in kwargs:
160  action.setShortcut(QKeySequence(kwargs['shortcut']))
161  if 'checkable' in kwargs:
162  action.setCheckable(kwargs['checkable'])
163  if 'checked' in kwargs:
164  action.setChecked(kwargs['checked'])
165  if 'enabled' in kwargs:
166  if callable(kwargs['enabled']):
167  enabler=MenuActionEnabler(kwargs['enabled'], action)
168  else:
169  action.setEnabled(kwargs['enabled'])
170  QObject.connect(action, SIGNAL('triggered()'), function)
171  return action
172 
173 
174 class OneOf:
175  def __init__(self, *classes):
176  self.classes=classes
177  def __call__(self):
178  sel=SceneSelection.Instance()
179  if sel.GetActiveNodeCount()!=1:
180  return False
181  node=sel.GetActiveNode(0)
182  for cl in self.classes:
183  if isinstance(node, cl):
184  return True
185  return False
186 
187 class TwoOf:
188  def __init__(self, *classes):
189  self.classes=classes
190  def __call__(self):
191  sel=SceneSelection.Instance()
192  act_count=sel.GetActiveNodeCount()
193  if act_count<2:
194  return False
195  found=0
196  for i in range(0, act_count):
197  node=sel.GetActiveNode(i)
198  for cl in self.classes:
199  if isinstance(node, cl):
200  found += 1
201  if found > 2:
202  return False
203  if found == 2:
204  return True
205  return False
206 
207 class ManyOf:
208  def __init__(self, *classes):
209  self.classes=classes
210  def __call__(self):
211  sel=SceneSelection.Instance()
212  if sel.GetActiveNodeCount()==0:
213  return False
214  for i in range(sel.GetActiveNodeCount()):
215  node=sel.GetActiveNode(i)
216  found=False
217  for cl in self.classes:
218  if isinstance(node, cl):
219  found=True
220  break
221  if not found:
222  return False
223  return True
224 
225 from ost import PushVerbosityLevel as _PushVerbosityLevel
226 from ost import PopVerbosityLevel as _PopVerbosityLevel
227 from ost import GetVerbosityLevel as _GetVerbosityLevel
228 
229 
231  GostyApp.Instance().perspective.ChangeVerbositySlider(value)
232 
234  _PopVerbosityLevel()
235  GostyApp.Instance().perspective.ChangeVerbositySlider(_GetVerbosityLevel())
236  _PopVerbosityLevel() # the slider change pushes a new level :-(