From 2ff9d671cff70a676e88be022488e1aaf8665256 Mon Sep 17 00:00:00 2001 From: gleb gladkiy Date: Tue, 18 Dec 2012 00:42:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20QuadrangleChanger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Реализует список всех возможных типов четырёхугольника. --- components/geometry/base/geom_modes.py | 60 ++++++++-- components/geometry/base/geom_objects.py | 7 +- components/geometry/base/geom_qw_list.py | 145 +++++++++++++++++++++++ 3 files changed, 198 insertions(+), 14 deletions(-) create mode 100644 components/geometry/base/geom_qw_list.py diff --git a/components/geometry/base/geom_modes.py b/components/geometry/base/geom_modes.py index bbab719..921fc3e 100644 --- a/components/geometry/base/geom_modes.py +++ b/components/geometry/base/geom_modes.py @@ -45,6 +45,8 @@ import suit.core.render.engine as render_engine import geom_controls +from Tkinter import * + class GeometryEditMode(BaseEditMode): # states @@ -53,9 +55,9 @@ class GeometryEditMode(BaseEditMode): ES_CircleCreate, \ ES_LengthChange, \ ES_SquareChange, \ - ES_PerimeterChange, \ + ES_PerimeterChange,\ ES_Count = range(BaseEditMode.ES_Count + 1, BaseEditMode.ES_Count + 8) - + def __init__(self, _logic): BaseEditMode.__init__(self, _logic, "Geometry edit") @@ -340,8 +342,8 @@ def _onKeyPressed(self, _evt): if isinstance(selected[0], selected[1].__class__): selected[0].setEqualTo(selected[1]) if self.objectInfoPanel.getObject() is selected[0] or self.objectInfoPanel.getObject() is selected[1]: - self.objectInfoPanel.update() - + self.objectInfoPanel.update() + if key == ois.KC_S: selected = self._logic._getSheet().getSelected() if len(selected) == 1: @@ -349,7 +351,7 @@ def _onKeyPressed(self, _evt): if isinstance(obj, (GeometryCircle, GeometryTriangle, GeometryQuadrangle)): self.state = GeometryEditMode.ES_SquareChange self.square_changer = TextInput(obj, self._square_change_callback, obj.getPropertyValue(GeometryAbstractObject.PropSquare)) - + if key == ois.KC_P: selected = self._logic._getSheet().getSelected() if len(selected) == 1: @@ -357,9 +359,16 @@ def _onKeyPressed(self, _evt): if isinstance(obj, (GeometryTriangle, GeometryQuadrangle)): self.state = GeometryEditMode.ES_PerimeterChange self.perimetr_changer = TextInput(obj, self._perimeter_change_callback, obj.getPropertyValue(GeometryAbstractObject.PropPerimeter)) - - return False - + + if key == ois.KC_K: + selected = self._logic._getSheet().getSelected() + if len(selected) == 1: + obj = selected[0] + if isinstance(obj, (GeometryQuadrangle)): + from components.geometry.base.geom_qw_list import QuadrangleChanger + self.dialog = QuadrangleChanger(obj,self._kind_change_callback,obj.getPropertyValue(GeometryAbstractObject.PropKind)) + + def _onKeyReleased(self, _evt): """Event key released """ @@ -437,7 +446,26 @@ def _perimeter_change_callback(self, _object, _value): if self.objectInfoPanel.getObject() is _object: self.objectInfoPanel.update() - + + def _kind_change_callback(self, _object, _value): + """Callback on kind change + """ + self.state = GeometryEditMode.ES_None + if _value is not None: + v = None + try: + v = str(_value) + except: + print "Non-numeric value found %s" % str(_value) + + if v is not None: + _object.setPropertyValue(GeometryAbstractObject.PropKind, v) + + #del self.kind_changer + + if self.objectInfoPanel.getObject() is _object: + self.objectInfoPanel.update() + def _updateLineSpirits(self): """Updates spirit objects used in line creation mode """ @@ -499,5 +527,15 @@ def _get_prev_from_mouse_object_list(self, _obj, _list): prev = _list[len(_list) - 1][1] return prev - - \ No newline at end of file + + """" + def _handlerQuadrangleChange(self): + #Handler for changing content + + sheet = self._logic._getSheet() + obj = sheet.getSelected() + from components.geometry.base.temp import QuadrangleChanger + + self.dialog = QuadrangleChanger(obj) + self.dialog.run() + """"" \ No newline at end of file diff --git a/components/geometry/base/geom_objects.py b/components/geometry/base/geom_objects.py index 1d81cef..2eb4d38 100644 --- a/components/geometry/base/geom_objects.py +++ b/components/geometry/base/geom_objects.py @@ -20,7 +20,6 @@ along with OSTIS. If not, see . ----------------------------------------------------------------------------- """ - ''' Created on 24.11.2009 @@ -41,14 +40,16 @@ suit.core.objects.Object.OS_NewInMemory: 'NewInMemory', suit.core.objects.Object.OS_Merged: 'Merged'} + class GeometryAbstractObject: groups = {} - + PropSquare = u"Площадь" PropPerimeter = u"Периметр" PropLength = u"Длина" - + PropKind = u"Тип" + def __init__(self): # list of child points (begin and end points are excluded) # that list contains tuples. Each tuple contains point and it position. diff --git a/components/geometry/base/geom_qw_list.py b/components/geometry/base/geom_qw_list.py new file mode 100644 index 0000000..5f84482 --- /dev/null +++ b/components/geometry/base/geom_qw_list.py @@ -0,0 +1,145 @@ +import suit.core.render.engine as render_engine +import suit.core.render.mygui as mygui +import suit.core.kernel + + +class QuadrangleChanger: + + def __init__(self, _obj, _callback, _default_value = None): + """Constructor + + @param _node: SCg-node to change content + @type _node: SCgNode + @param _callback_del: functions that calls on dialog deletion + @type _callback_del: function + """ + self.panel = None + self.types_list = None + self.object = _obj + self._callback = _callback + self.default_value = _default_value + self._formats = {} # map of formats, key: format name, value: (format sc_addr, edit support) + self.button_ok = None + self.button_cancel = None + self.sel_fmt = None # selected format title + + + self.width = 250 + self.height = 250 + + self.createPanel() + + self.build_list() + + def delete(self): + self.destroyPanel() + + + def createPanel(self): + """Create controls panel + """ + #assert self.panel is None + + self.panel = render_engine.Gui.createWidgetT("Window", "Panel", mygui.IntCoord(0, 0, self.width, self.height), + mygui.Align(), "Info", "") + self.types_list = self.panel.createWidgetT("List", "List", mygui.IntCoord(10, 10, self.width - 20, 165), mygui.Align()) + self.types_list.subscribeEventChangePosition(self, 'item_selected') + + self.button_ok = self.panel.createWidgetT("Button", "Button", mygui.IntCoord(10, self.height - 35, 50, 25), mygui.Align()) + self.button_cancel = self.panel.createWidgetT("Button", "Button", mygui.IntCoord(60, self.height - 35, 60, 25), mygui.Align()) + + self.button_ok.setCaption("Ok") + self.button_cancel.setCaption("Cancel") + self.button_ok.setEnabled(False) + self.button_ok.subscribeEventMouseButtonClick(self, '_onButtonOkClick') + self.button_cancel.subscribeEventMouseButtonClick(self, '_onButtonCancelClick') + + self.panel.setVisible(True) + + def destroyPanel(self): + """Destroys controls panel + """ + assert self.panel is not None + render_engine.Gui.destroyWidget(self.panel) + + self.panel = None + + def run(self): + + # build list of available components + self.build_list() + + # calculate panel position + pos = render_engine.pos3dTo2dWindow(self.object[0].getPosition() + self.object[0].getScale() / 2) + # sure that dialog isn't placed out of screen + x, y = pos + x2 = x + self.width + y2 = y + self.height + + if x2 >= render_engine.Window.width: + x = render_engine.Window.width - self.width + elif x < 0: + x = 0 + + if y2 >= render_engine.Window.height: + y = render_engine.Window.height - self.height + elif y < 0: + y = 0 + + self.panel.setPosition(x, y) + + # show panel + self.panel.setVisible(True) + + def build_list(self): + """Builds list of available viewers/editors components + """ + kernel = suit.core.kernel.Kernel.getSingleton() + session = kernel.session() + + # get available formats + fmt_view = kernel.getRegisteredViewerFormats() + fmt_edit = kernel.getRegisteredEditorFormats() + + # process formats to create map + for fmt in fmt_view: + title = session.get_idtf(fmt) + if self._formats.has_key(title): + continue + self._formats[title] = (fmt, False) + + # check for edit + for fmt in fmt_edit: + title = session.get_idtf(fmt) + self._formats[title] = (self._formats[title][0], True) + + # fill list with available information about formats + self.types_list.removeAllItems() + for title in ["Rectangle", "Square", "Rhombus", "Trapeze", "Parallelogram"]: + self.types_list.addItem(title) + + self.types_list.clearIndexSelected() + + def item_selected(self, _widget, _idx): + """Event handler for types list selection change + """ + self.sel_fmt = (_idx, str(self.types_list.getItemNameAt(_idx))) + + + # enable "ok" button if any item selected + self.button_ok.setEnabled(True) + + + def _onButtonOkClick(self, widget): + """Event handler for "Ok" button + """ + if self.sel_fmt is not None: + self._callback(self.object, self.sel_fmt) + print self.sel_fmt + self.delete() + + def _onButtonCancelClick(self, widget): + """Event handler for Cancel button + """ + self.delete() +