2 ** Project : Form Designer
3 ** File Purpose : Form Designer Controller
5 ** Author : Mahmoud Fayed <msfclipper@yahoo.com>
10 class FormDesignerController from WindowsControllerParent
12 oView = new FormDesignerView
13 oModel = new FormDesignerModel
14 oGeneral = new FormDesignerGeneral
15 oFile = new FormDesignerFileSystem
18 oView.SetParentObject(self)
19 oView.CreateMainWindow(oModel)
22 DisplayObjectProperties()
23 oView.WindowMoveResizeEvents()
27 DisplayObjectProperties()
29 func AddObjectsToCombo
30 oView.oObjectsCombo.blocksignals(True)
31 oView.oObjectsCombo.Clear()
32 aObjects = oModel.GetObjects()
33 for item in aObjects {
34 oView.oObjectsCombo.AddItem(item[1],0)
36 oView.oObjectsCombo.setcurrentindex(len(aObjects)-1)
37 oView.oObjectsCombo.blocksignals(False)
39 func AddObjectProperties
40 oView.oPropertiesTable {
43 this.oView.PreparePropertiesTable(self)
45 oModel.ActiveObject().AddObjectProperties(self)
47 func DisplayObjectProperties
48 oModel.ActiveObject().DisplayProperties(self)
50 func ToolBtnChangeAction
51 if oView.oToolBtn1.isChecked() { # Select Mode
52 oModel.FormObject().setCursor(new qCursor() { setShape(Qt_ArrowCursor) } )
53 EnableMouseEventsForControls()
55 oModel.FormObject().setCursor(new qCursor() { setShape(Qt_CrossCursor) } )
56 DisableMouseEventsForControls()
59 func DisableMouseEventsForControls
60 aObjects = oModel.GetObjects()
61 for x = 2 to len(aObjects) {
62 aObjects[x][2].setAttribute(Qt_WA_TransparentForMouseEvents,True)
65 func EnableMouseEventsForControls
66 aObjects = oModel.GetObjects()
67 for x = 2 to len(aObjects) {
68 aObjects[x][2].setAttribute(Qt_WA_TransparentForMouseEvents,False)
71 func SetToolboxModeToSelectAfterDraw
72 if not oView.oToolLock.isChecked() {
73 SetToolboxModeToSelect()
75 # To include the latest created control
76 DisableMouseEventsForControls()
79 func SetToolboxModeToSelect
80 oView.oToolBtn1.setChecked(2)
84 SetToolboxModeToSelect()
85 nRow = oView.oPropertiesTable.Currentrow()
86 nCol = oView.oPropertiesTable.Currentcolumn()
87 cValue = oView.oPropertiesTable.item(nRow,nCol).text()
88 oModel.ActiveObject().UpdateProperties(self,nRow,nCol,cValue)
90 func ResizeWindowAction
91 oView.oLabelSelect.Hide()
92 SetToolboxModeToSelect()
93 DisplayFormProperties()
94 oView.oFilter.seteventoutput(False)
97 oView.oLabelSelect.Hide()
98 SetToolboxModeToSelect()
99 DisplayFormProperties()
101 func DisplayFormProperties
102 if oModel.IsFormActive() {
103 oModel.FormObject().DisplayProperties(self)
106 func MousePressAction
107 oModel.FormObject().MousePressAction(self)
108 if oView.oToolBtn1.ischecked() { # Select Mode
109 oModel.RemoveCurrentParentCache()
110 # Activate the Window Object
111 ChangeObjectByCode(0)
113 oView.oFilter.seteventoutput(False)
115 func MouseReleaseAction
116 oModel.FormObject().MouseReleaseAction(self)
117 oView.oFilter.seteventoutput(False)
120 oModel.FormObject().MouseMoveAction(self)
121 oView.oFilter.seteventoutput(False)
123 func DialogButtonAction nRow
124 SetToolboxModeToSelect()
125 oModel.ActiveObject().DialogButtonAction(self,nRow)
127 func ComboItemAction nRow
128 SetToolboxModeToSelect()
129 oModel.ActiveObject().ComboItemAction(self,nRow)
131 func ShowPropertiesWidget
132 if oModel.IsManySelected() {
133 nWidth = oView.oPropertiesDock.width()
134 oView.oPropertiesDock.setWidget(oView.oProperties2)
135 oView.oPropertiesDock.setminimumwidth(nWidth)
137 oView.oPropertiesDock.setminimumwidth(10)
138 oView.oPropertiesDock.setWidget(oView.oProperties)
141 func SelectDrawAction aRect
142 if oView.oToolBtn1.ischecked() { # Select
143 oModel.ClearSelectedObjects()
145 ShowPropertiesWidget()
146 elseif oView.oToolBtn2.ischecked() # Create Label
148 UpdatePositionForParent(aRect)
149 oModel.AddLabel(new FormDesigner_QLabel(oModel.CurrentParent()) {
150 move(aRect[1],aRect[2])
151 resize(aRect[3],aRect[4])
152 setMouseTracking(True)
154 cParent = this.oModel.CurrentParentName()
157 oModel.ActiveObject().setCurrentParentName(cParent)
158 NewControlEvents("Label",oModel.LabelsCount())
159 SetToolboxModeToSelectAfterDraw()
160 elseif oView.oToolBtn3.ischecked() # Create QPushButton
162 UpdatePositionForParent(aRect)
163 oModel.AddPushButton(new FormDesigner_QPushButton(oModel.CurrentParent()) {
164 move(aRect[1],aRect[2])
165 resize(aRect[3],aRect[4])
166 setMouseTracking(True)
168 cParent = this.oModel.CurrentParentName()
171 oModel.ActiveObject().setCurrentParentName(cParent)
172 NewControlEvents("Button",oModel.PushButtonsCount())
173 SetToolboxModeToSelectAfterDraw()
174 elseif oView.oToolBtn4.ischecked() # Create QLineEdit
176 UpdatePositionForParent(aRect)
177 oModel.AddLineEdit(new FormDesigner_QLineEdit(oModel.CurrentParent()) {
178 move(aRect[1],aRect[2])
179 resize(aRect[3],aRect[4])
181 setMouseTracking(True)
182 cParent = this.oModel.CurrentParentName()
185 oModel.ActiveObject().setCurrentParentName(cParent)
186 NewControlEvents("LineEdit",oModel.LineEditsCount())
187 oModel.ActiveObject().updatestylesheets()
188 SetToolboxModeToSelectAfterDraw()
189 elseif oView.oToolBtn5.ischecked() # Create QTextEdit
191 UpdatePositionForParent(aRect)
192 oModel.AddTextEdit(new FormDesigner_QTextEdit(oModel.CurrentParent()) {
193 move(aRect[1],aRect[2])
194 resize(aRect[3],aRect[4])
196 setMouseTracking(True)
197 cParent = this.oModel.CurrentParentName()
200 oModel.ActiveObject().setCurrentParentName(cParent)
201 NewControlEvents("TextEdit",oModel.TextEditsCount())
202 oModel.ActiveObject().updatestylesheets()
203 SetToolboxModeToSelectAfterDraw()
204 elseif oView.oToolBtn6.ischecked() # Create QListWidget
206 UpdatePositionForParent(aRect)
207 oModel.AddListWidget(new FormDesigner_QListWidget(oModel.CurrentParent()) {
208 move(aRect[1],aRect[2])
209 resize(aRect[3],aRect[4])
211 setMouseTracking(True)
212 cParent = this.oModel.CurrentParentName()
215 oModel.ActiveObject().setCurrentParentName(cParent)
216 NewControlEvents("ListWidget",oModel.ListWidgetsCount())
217 oModel.ActiveObject().updatestylesheets()
218 SetToolboxModeToSelectAfterDraw()
219 elseif oView.oToolBtn7.ischecked() # Create QCheckBox
221 UpdatePositionForParent(aRect)
222 oModel.AddCheckBox(new FormDesigner_QCheckBox(oModel.CurrentParent()) {
223 move(aRect[1],aRect[2])
224 resize(aRect[3],aRect[4])
226 setMouseTracking(True)
227 cParent = this.oModel.CurrentParentName()
230 oModel.ActiveObject().setCurrentParentName(cParent)
231 NewControlEvents("CheckBox",oModel.CheckBoxesCount())
232 SetToolboxModeToSelectAfterDraw()
233 elseif oView.oToolBtn8.ischecked() # Create QImage
235 UpdatePositionForParent(aRect)
236 oModel.AddImage(new FormDesigner_QImage(oModel.CurrentParent()) {
237 move(aRect[1],aRect[2])
238 resize(aRect[3],aRect[4])
240 setMouseTracking(True)
241 cParent = this.oModel.CurrentParentName()
244 oModel.ActiveObject().setCurrentParentName(cParent)
245 NewControlEvents("Image",oModel.ImagesCount())
246 SetToolboxModeToSelectAfterDraw()
247 elseif oView.oToolBtn9.ischecked() # Create QSlider
249 UpdatePositionForParent(aRect)
250 oModel.AddSlider(new FormDesigner_QSlider(oModel.CurrentParent()) {
251 move(aRect[1],aRect[2])
252 resize(aRect[3],aRect[4])
254 setMouseTracking(True)
255 cParent = this.oModel.CurrentParentName()
258 oModel.ActiveObject().setCurrentParentName(cParent)
259 NewControlEvents("Slider",oModel.SlidersCount())
260 SetToolboxModeToSelectAfterDraw()
261 elseif oView.oToolBtn10.ischecked() # Create QProgressBar
263 UpdatePositionForParent(aRect)
264 oModel.AddProgressbar(new FormDesigner_QProgressbar(oModel.CurrentParent()) {
265 move(aRect[1],aRect[2])
266 resize(aRect[3],aRect[4])
268 setMouseTracking(True)
269 cParent = this.oModel.CurrentParentName()
272 oModel.ActiveObject().setCurrentParentName(cParent)
273 NewControlEvents("Progressbar",oModel.ProgressbarsCount())
274 SetToolboxModeToSelectAfterDraw()
275 elseif oView.oToolBtn11.ischecked() # Create QSpinBox
277 UpdatePositionForParent(aRect)
278 oModel.AddSpinBox(new FormDesigner_QSpinBox(oModel.CurrentParent()) {
279 move(aRect[1],aRect[2])
280 resize(aRect[3],aRect[4])
282 setMouseTracking(True)
283 cParent = this.oModel.CurrentParentName()
286 oModel.ActiveObject().setCurrentParentName(cParent)
287 NewControlEvents("SpinBox",oModel.SpinBoxesCount())
288 oModel.ActiveObject().updatestylesheets()
289 SetToolboxModeToSelectAfterDraw()
290 elseif oView.oToolBtn12.ischecked() # Create QComboBox
292 UpdatePositionForParent(aRect)
293 oModel.AddComboBox(new FormDesigner_QComboBox(oModel.CurrentParent()) {
294 move(aRect[1],aRect[2])
295 resize(aRect[3],aRect[4])
297 setMouseTracking(True)
298 cParent = this.oModel.CurrentParentName()
301 oModel.ActiveObject().setCurrentParentName(cParent)
302 NewControlEvents("ComboBox",oModel.ComboBoxesCount())
303 SetToolboxModeToSelectAfterDraw()
304 elseif oView.oToolBtn13.ischecked() # Create QDateTimeEdit
306 UpdatePositionForParent(aRect)
307 oModel.AddDateTimeEdit(new FormDesigner_QDateTimeEdit(oModel.CurrentParent()) {
308 move(aRect[1],aRect[2])
309 resize(aRect[3],aRect[4])
311 setMouseTracking(True)
312 cParent = this.oModel.CurrentParentName()
315 oModel.ActiveObject().setCurrentParentName(cParent)
316 NewControlEvents("DateTimeEdit",oModel.DateTimeEditsCount())
317 oModel.ActiveObject().updatestylesheets()
318 SetToolboxModeToSelectAfterDraw()
319 elseif oView.oToolBtn14.ischecked() # Create QTableWidget
321 UpdatePositionForParent(aRect)
322 oModel.AddTableWidget(new FormDesigner_QTableWidget(oModel.CurrentParent()) {
323 move(aRect[1],aRect[2])
324 resize(aRect[3],aRect[4])
326 setMouseTracking(True)
327 cParent = this.oModel.CurrentParentName()
330 oModel.ActiveObject().setCurrentParentName(cParent)
331 NewControlEvents("TableWidget",oModel.TableWidgetsCount())
332 SetToolboxModeToSelectAfterDraw()
333 elseif oView.oToolBtn15.ischecked() # Create QTreeWidget
335 UpdatePositionForParent(aRect)
336 oModel.AddTreeWidget(new FormDesigner_QTreeWidget(oModel.CurrentParent()) {
337 move(aRect[1],aRect[2])
338 resize(aRect[3],aRect[4])
340 setMouseTracking(True)
341 cParent = this.oModel.CurrentParentName()
344 oModel.ActiveObject().setCurrentParentName(cParent)
345 NewControlEvents("TreeWidget",oModel.TreeWidgetsCount())
346 oModel.ActiveObject().updatestylesheets()
347 SetToolboxModeToSelectAfterDraw()
348 elseif oView.oToolBtn16.ischecked() # Create QRadioButton
350 UpdatePositionForParent(aRect)
351 oModel.AddRadioButton(new FormDesigner_QRadioButton(oModel.CurrentParent()) {
352 move(aRect[1],aRect[2])
353 resize(aRect[3],aRect[4])
355 setMouseTracking(True)
356 cParent = this.oModel.CurrentParentName()
359 oModel.ActiveObject().setCurrentParentName(cParent)
360 NewControlEvents("RadioButton",oModel.RadioButtonsCount())
361 SetToolboxModeToSelectAfterDraw()
362 elseif oView.oToolBtn17.ischecked() # Create QWebView
364 UpdatePositionForParent(aRect)
365 oModel.AddWebView(new FormDesigner_QWebView(oModel.CurrentParent()) {
366 move(aRect[1],aRect[2])
367 resize(aRect[3],aRect[4])
369 setMouseTracking(True)
370 cParent = this.oModel.CurrentParentName()
373 oModel.ActiveObject().setCurrentParentName(cParent)
374 NewControlEvents("WebView",oModel.WebViewsCount())
375 SetToolboxModeToSelectAfterDraw()
376 elseif oView.oToolBtn18.ischecked() # Create QDial
378 UpdatePositionForParent(aRect)
379 oModel.AddDial(new FormDesigner_QDial(oModel.CurrentParent()) {
380 move(aRect[1],aRect[2])
381 resize(aRect[3],aRect[4])
383 setMouseTracking(True)
384 cParent = this.oModel.CurrentParentName()
387 oModel.ActiveObject().setCurrentParentName(cParent)
388 NewControlEvents("Dial",oModel.DialsCount())
389 SetToolboxModeToSelectAfterDraw()
390 elseif oView.oToolBtn19.ischecked() # Create QVideoWidget
392 UpdatePositionForParent(aRect)
393 oModel.AddVideoWidget(new FormDesigner_QVideoWidget(oModel.CurrentParent()) {
394 move(aRect[1],aRect[2])
395 resize(aRect[3],aRect[4])
397 setMouseTracking(True)
398 cParent = this.oModel.CurrentParentName()
401 oModel.ActiveObject().setCurrentParentName(cParent)
402 NewControlEvents("VideoWidget",oModel.VideoWidgetsCount())
403 SetToolboxModeToSelectAfterDraw()
404 elseif oView.oToolBtn20.ischecked() # Create QFrame
406 UpdatePositionForParent(aRect)
407 oModel.AddFrame(new FormDesigner_QFrame3(oModel.CurrentParent()) {
408 move(aRect[1],aRect[2])
409 resize(aRect[3],aRect[4])
411 setMouseTracking(True)
412 cParent = this.oModel.CurrentParentName()
415 oModel.ActiveObject().setCurrentParentName(cParent)
416 NewControlEvents("Frame",oModel.FramesCount())
417 SetToolboxModeToSelectAfterDraw()
418 elseif oView.oToolBtn21.ischecked() # Create QLCDNumber
420 UpdatePositionForParent(aRect)
421 oModel.AddLCDNumber(new FormDesigner_QLCDNumber(oModel.CurrentParent()) {
422 move(aRect[1],aRect[2])
423 resize(aRect[3],aRect[4])
425 setMouseTracking(True)
426 cParent = this.oModel.CurrentParentName()
429 oModel.ActiveObject().setCurrentParentName(cParent)
430 NewControlEvents("LCDNumber",oModel.LCDNumbersCount())
431 SetToolboxModeToSelectAfterDraw()
432 elseif oView.oToolBtn22.ischecked() # Create QHyperLink
434 UpdatePositionForParent(aRect)
435 oModel.AddHyperLink(new FormDesigner_QHyperLink(oModel.CurrentParent()) {
436 move(aRect[1],aRect[2])
437 resize(aRect[3],aRect[4])
439 setMouseTracking(True)
440 cParent = this.oModel.CurrentParentName()
443 oModel.ActiveObject().setCurrentParentName(cParent)
444 NewControlEvents("HyperLink",oModel.HyperLinksCount())
445 SetToolboxModeToSelectAfterDraw()
446 elseif oView.oToolBtn23.ischecked() # Create QTimer
448 UpdatePositionForParent(aRect)
449 oModel.AddTimer(new FormDesigner_QTimer(oModel.CurrentParent()) {
450 move(aRect[1],aRect[2])
451 resize(aRect[3],aRect[4])
453 setMouseTracking(True)
454 cParent = this.oModel.CurrentParentName()
457 oModel.ActiveObject().setCurrentParentName(cParent)
458 NewControlEvents("Timer",oModel.TimersCount())
459 SetToolboxModeToSelectAfterDraw()
460 elseif oView.oToolBtn24.ischecked() # Create QAllEvents
462 UpdatePositionForParent(aRect)
463 oModel.AddAllEvents(new FormDesigner_QAllEvents(oModel.CurrentParent()) {
464 move(aRect[1],aRect[2])
465 resize(aRect[3],aRect[4])
467 setMouseTracking(True)
468 cParent = this.oModel.CurrentParentName()
471 oModel.ActiveObject().setCurrentParentName(cParent)
472 NewControlEvents("AllEvents",oModel.AllEventsCount())
473 SetToolboxModeToSelectAfterDraw()
474 elseif oView.oToolBtn25.ischecked() # Create QLayout
476 UpdatePositionForParent(aRect)
477 oModel.AddLayout(new FormDesigner_QLayout(oModel.CurrentParent()) {
478 move(aRect[1],aRect[2])
479 resize(aRect[3],aRect[4])
481 setMouseTracking(True)
482 cParent = this.oModel.CurrentParentName()
485 oModel.ActiveObject().setCurrentParentName(cParent)
486 NewControlEvents("Layout",oModel.LayoutsCount())
487 SetToolboxModeToSelectAfterDraw()
488 elseif oView.oToolBtn26.ischecked() # Create QTab
490 UpdatePositionForParent(aRect)
491 oModel.AddTab(new FormDesigner_QTabWidget(oModel.CurrentParent()) {
492 move(aRect[1],aRect[2])
493 resize(aRect[3],aRect[4])
495 setMouseTracking(True)
496 cParent = this.oModel.CurrentParentName()
499 oModel.ActiveObject().setCurrentParentName(cParent)
500 NewControlEvents("Tab",oModel.TabsCount())
501 SetToolboxModeToSelectAfterDraw()
502 elseif oView.oToolBtn27.ischecked() # Create QStatusBar
504 UpdatePositionForParent(aRect)
505 oModel.AddStatusBar(new FormDesigner_QStatusBar(oModel.CurrentParent()) {
506 move(aRect[1],aRect[2])
507 resize(aRect[3],aRect[4])
509 setMouseTracking(True)
510 cParent = this.oModel.CurrentParentName()
513 oModel.ActiveObject().setCurrentParentName(cParent)
514 NewControlEvents("StatusBar",oModel.StatusBarsCount())
515 SetToolboxModeToSelectAfterDraw()
516 elseif oView.oToolBtn28.ischecked() # Create QToolbar
518 UpdatePositionForParent(aRect)
519 oModel.AddToolBar(new FormDesigner_QToolbar(oModel.CurrentParent()) {
520 move(aRect[1],aRect[2])
521 resize(aRect[3],aRect[4])
523 setMouseTracking(True)
524 cParent = this.oModel.CurrentParentName()
527 oModel.ActiveObject().setCurrentParentName(cParent)
528 NewControlEvents("ToolBar",oModel.ToolBarsCount())
529 SetToolboxModeToSelectAfterDraw()
532 func UpdatePositionForParent aRect
533 if classname(oModel.ActiveObject()) = "formdesigner_qtabwidget" {
534 aRect[1] -= oModel.ActiveObject().x()
535 # 28 for the tab title height
536 aRect[2] -= oModel.ActiveObject().y() + 28
537 elseif isObject(oModel.CurrentParentCache())
538 aRect[1] -= oModel.CurrentParentCache().x()
539 # 28 for the tab title height
540 aRect[2] -= oModel.CurrentParentCache().y() + 28
543 func NewControlEvents cName,nCount
544 CreateControlEvents(cName,nCount)
545 oModel.ActiveObject().CreateCorners()
549 func CreateControlEventsCornersNoInit cName,nCount
550 CreateControlEvents(cName,nCount)
551 oModel.ActiveObject().CreateCornersNoInit()
553 func CreateControlEvents cName,nCount
554 oFilter = new qAllevents(oModel.ActiveObject()) {
556 Here we uses This.Method() to access the
557 Method() method in the WindowsControllerParent class
558 Because we are inside braces { } to access qAllevents Methods
559 Using Method() without This.Method() will access
560 the Method() Function (Not the Method() Method)
561 The difference between Method() Function and Method() Method is that
562 the Method() Method define the event for the current object (This instance)
563 While Method() function define the event for the current active object
564 The current active object maybe changed by using
565 open_window() or open_windownoshow() functions.
566 This happened when we merged the Form Designer with Ring Notepad.
567 So to avoid defining the events for other objects, We uses This.Method() to
568 be sure that the event will be defined for the correct object that will be
569 created from this class.
571 setmousebuttonpressevent(This.Method(:ActiveObjectMousePress+"("+this.oModel.GetCurrentID()+")"))
572 setMouseButtonReleaseEvent(This.Method(:ActiveObjectMouseRelease+"("+this.oModel.GetCurrentID()+")"))
573 setMouseMoveEvent(This.Method(:ActiveObjectMouseMove+"("+this.oModel.GetCurrentID()+")"))
575 oModel.ActiveObject().installeventfilter(oFilter)
576 oModel.ActiveObject().oFilter = oFilter
577 if find([:formdesigner_qlabel,
578 :formdesigner_qpushbutton,
579 :formdesigner_qcheckbox,
580 :formdesigner_qradiobutton
581 ],classname(oModel.ActiveObject())) {
582 oModel.ActiveObject().setText(cName+nCount)
584 oModel.ActiveObject().Show()
587 func SelectObjects aRect
590 nSX2 = nSX + aRect[3]
591 nSY2 = nSY + aRect[4]
592 aObjects = oModel.GetObjects()
593 for x = 2 to len(aObjects) { # Start from 2 to avoid the Form Object
596 if not (oObject.CurrentParentName() = "win" or oObject.CurrentParentName() = "") {
601 nX2 = nX + oObject.Width()
602 nY2 = nY + oObject.Height()
603 if Intersection(nX,nY,nX2,nY2,nSX,nSY,nSX2,nSY2) {
604 oObject.oCorners.Show()
605 oModel.AddSelectedObject(x)
609 func Intersection nX,nY,nX2,nY2,nSX,nSY,nSX2,nSY2
610 if pointinbox(nX,nY,nSX,nSY,nSX2,nSY2) or
611 pointinbox(nX,nY2,nSX,nSY,nSX2,nSY2) or
612 pointinbox(nX2,nY,nSX,nSY,nSX2,nSY2) or
613 pointinbox(nX2,nY2,nSX,nSY,nSX2,nSY2) or
614 pointinbox(nSX,nSY,nX,nY,nX2,nY2) or
615 pointinbox(nSX,nSY2,nX,nY,nX2,nY2) or
616 pointinbox(nSX2,nSY,nX,nY,nX2,nY2) or
617 pointinbox(nSX2,nSY2,nX,nY,nX2,nY2) or
618 IntersectionLikePlusOperator(nX,nY,nX2,nY2,nSX,nSY,nSX2,nSY2 ) {
623 func pointinbox nX,nY,nSX,nSY,nSX2,nSY2
624 if nX >= nSX and nX <= nSX2 and nY >= nSY and nY <= nSY2 {
629 func intersectionlikeplusOperator nX,nY,nX2,nY2,nSX,nSY,nSX2,nSY2
630 if ( nY < nSY and nY2 > nSY2 and
631 nX > nSX and nX2 < nSX2 ) or
632 ( nSY < nY and nSY2 > nY2 and
633 nSX > nX and nSX2 < nX2 ) {
638 func CancelSelectedObjects
639 aObjects = oModel.getselectedObjects()
640 if len(aObjects) = 0 { return }
641 for item in aObjects {
643 oObject.oCorners.Hide()
645 oModel.clearSelectedObjects()
647 func ChangeObjectAction
648 if oView.oObjectsCombo.count() = 0 { return }
650 nIndex = oView.oObjectsCombo.currentindex()
651 oModel.nActiveObject = nIndex + 1
655 func ChangeObjectByCode nIndex
657 oView.oObjectsCombo.blocksignals(True)
658 oView.oObjectsCombo.setcurrentindex(nIndex)
659 oModel.nActiveObject = nIndex + 1
661 oView.oObjectsCombo.blocksignals(False)
665 CancelSelectedObjects()
666 if isattribute(oModel.activeObject(),"oCorners") {
667 oModel.activeObject().oCorners.Hide()
671 if isattribute(oModel.activeObject(),"oCorners") {
672 oModel.activeObject().oCorners.Show()
675 func ActiveObjectMousePress nObjectID
676 nObjectIndex = oModel.IDToIndex(nObjectID)
677 if oView.oToolBtn1.ischecked() { # Select Mode
678 if oModel.IsManySelected() {
679 if oModel.IsObjectSelected(nObjectID) {
680 if oFDApp.keyboardmodifiers() {
681 oModel.RemoveSelectedObject(nObjectIndex)
682 oModel.GetObjectByIndex(nObjectIndex).oCorners.Hide()
684 if classname(oModel.GetObjectByIndex(nObjectIndex)) != "formdesigner_qwidget" {
685 oModel.GetObjectByIndex(nObjectIndex).MousePressMany(self)
688 ShowPropertiesWidget()
691 if oFDApp.keyboardmodifiers() {
692 oModel.AddSelectedObject(nObjectIndex)
693 oModel.GetObjectByIndex(nObjectIndex).MousePressMany(self)
694 oModel.GetObjectByIndex(nObjectIndex).oCorners.Show()
695 ShowPropertiesWidget()
700 # Here we don't have many objects selected
701 # Support starting multiple selection operation using the keyboard
702 if oFDApp.keyboardmodifiers() {
703 # We save the current object first
704 nOldCurrentIndex = oModel.ActiveObjectIndex()
705 oModel.ClearSelectedObjects()
706 ChangeObjectByCode(nObjectIndex-1)
707 oModel.ActiveObject().oCorners.Show()
708 # Keep the old current object in selection
709 oModel.AddSelectedObject(nOldCurrentIndex)
710 # Draw old current object corners
711 if classname(oModel.GetObjectByIndex(nOldCurrentIndex)) != "formdesigner_qwidget" {
712 oModel.getobjectByIndex(nOldCurrentIndex).oCorners.show()
714 oModel.AddSelectedObject(nObjectIndex)
715 ShowPropertiesWidget()
719 ChangeObjectByCode(nObjectIndex-1)
720 if classname(oModel.ActiveObject()) != "formdesigner_qwidget" {
721 oModel.ActiveObject().MousePress(self)
725 func ActiveObjectMouseRelease nObjectID
726 nObjectIndex = oModel.IDToIndex(nObjectID)
727 if oView.oToolBtn1.ischecked() { # Select Mode
728 if oModel.IsManySelected() {
729 if classname(oModel.GetObjectByIndex(nObjectIndex)) != "formdesigner_qwidget" {
730 oModel.GetObjectByIndex(nObjectIndex).MouseReleaseMany(self)
734 if classname(oModel.ActiveObject()) != "formdesigner_qwidget" {
735 oModel.ActiveObject().MouseRelease(self)
739 func ActiveObjectMouseMove nObjectID
740 nObjectIndex = oModel.IDToIndex(nObjectID)
741 if oView.oToolBtn1.ischecked() { # Select Mode
742 if oModel.IsManySelected() {
743 if classname(oModel.GetObjectByIndex(nObjectIndex)) != "formdesigner_qwidget" {
744 oModel.GetObjectByIndex(nObjectIndex).MouseMoveMany(self)
748 if classname(oModel.ActiveObject()) != "formdesigner_qwidget" {
749 oModel.ActiveObject().MouseMove(self)
754 if oModel.IsManySelected() { KeyPressManyAction() return }
755 if oModel.IsFormActive() { return }
756 nKey = oView.oFilter.getkeycode()
757 nModifier = oView.oFilter.getmodifiers()
759 case 0 # No CTRL Key is pressed
762 oModel.ActiveObject().move( oModel.ActiveObject().x() + 10 ,
763 oModel.ActiveObject().y() )
765 oModel.ActiveObject().move( oModel.ActiveObject().x() - 10 ,
766 oModel.ActiveObject().y() )
768 oModel.ActiveObject().move( oModel.ActiveObject().x() ,
769 oModel.ActiveObject().y() - 10)
771 oModel.ActiveObject().move( oModel.ActiveObject().x() ,
772 oModel.ActiveObject().y() + 10)
777 case 33554432 # Shift
780 oModel.ActiveObject().resize( oModel.ActiveObject().width() + 10 ,
781 oModel.ActiveObject().height() )
783 oModel.ActiveObject().resize( oModel.ActiveObject().width() - 10 ,
784 oModel.ActiveObject().height() )
786 oModel.ActiveObject().resize( oModel.ActiveObject().width() ,
787 oModel.ActiveObject().height() - 10)
789 oModel.ActiveObject().resize( oModel.ActiveObject().width() ,
790 oModel.ActiveObject().height() + 10)
793 if ismethod(oModel.ActiveObject(),"refreshcorners") {
794 oModel.ActiveObject().refreshCorners(oModel.ActiveObject())
798 if oModel.IsManySelected() {
799 aObjects = oModel.getselectedObjects()
800 for item in aObjects {
802 oObject.oCorners.Hide()
805 oModel.deleteselectedObjects()
807 ShowPropertiesWidget()
810 if oModel.IsFormActive() { return }
812 oModel.ActiveObject().close()
813 oModel.deleteactiveObject()
816 if ismethod(oModel.ActiveObject(),"refreshcorners") {
817 oModel.ActiveObject().refreshCorners(oModel.ActiveObject())
820 func KeyPressManyAction
821 nKey = oView.oFilter.getkeycode()
822 nModifier = oView.oFilter.getmodifiers()
823 aObjects = oModel.getselectedObjects()
825 case 0 # No CTRL Key is pressed
828 for item in aObjects {
830 oObject.move( oObject.x() + 10 , oObject.y() )
831 oObject.oCorners.refresh(oObject)
834 for item in aObjects {
836 oObject.move( oObject.x() - 10 , oObject.y() )
837 oObject.oCorners.refresh(oObject)
840 for item in aObjects {
842 oObject.move( oObject.x() , oObject.y() - 10)
843 oObject.oCorners.refresh(oObject)
846 for item in aObjects {
848 oObject.move( oObject.x() , oObject.y() + 10)
849 oObject.oCorners.refresh(oObject)
854 case 33554432 # Shift
857 for item in aObjects {
859 oObject.resize( oObject.width() + 10 , oObject.height() )
860 oObject.oCorners.refresh(oObject)
863 for item in aObjects {
865 oObject.resize( oObject.width() - 10 , oObject.height() )
866 oObject.oCorners.refresh(oObject)
869 for item in aObjects {
871 oObject.resize( oObject.width() , oObject.height() - 10)
872 oObject.oCorners.refresh(oObject)
875 for item in aObjects {
877 oObject.resize( oObject.width() , oObject.height() + 10)
878 oObject.oCorners.refresh(oObject)
885 aObjects = oModel.GetSelectedObjects()
887 for item in aObjects {
889 nX = min( nX , oObject.x() )
891 for item in aObjects {
893 oObject.move( nX , oObject.y() )
894 oObject.oCorners.Refresh(oObject)
898 aObjects = oModel.GetSelectedObjects()
900 for item in aObjects {
902 nRight = max( nRight , oObject.x() + oObject.width() )
904 for item in aObjects {
906 oObject.move( nRight - oObject.width() , oObject.y() )
907 oObject.oCorners.Refresh(oObject)
911 aObjects = oModel.GetSelectedObjects()
913 for item in aObjects {
915 nY = min( nY , oObject.y() )
917 for item in aObjects {
919 oObject.move( oObject.x() , nY )
920 oObject.oCorners.Refresh(oObject)
924 aObjects = oModel.GetSelectedObjects()
926 for item in aObjects {
928 nBottom = max( nBottom , oObject.y() + oObject.height() )
930 for item in aObjects {
932 oObject.move( oObject.x() , nbottom - oObject.height() )
933 oObject.oCorners.Refresh(oObject)
937 aObjects = oModel.GetSelectedObjects()
938 # Get Minimum Top and Maximum Top+Height
941 for item in aObjects {
943 nMinTop = min(nMinTop,oObject.y())
944 nMaxTopHeight = max(nMaxTopHeight,oObject.y()+oObject.Height())
947 nDiff = nMaxTopHeight - nMinTop
948 nTop = (oObject.ParentWidget().Height() - nDiff ) / 2
949 nDiff = nMinTop - nTop
950 # Apply the Top difference to all controls
951 for item in aObjects {
953 oObject.move(oObject.x() ,oObject.y()-nDiff)
954 oObject.oCorners.Refresh(oObject)
958 aObjects = oModel.GetSelectedObjects()
959 # Get Minimum Left and Maximum Left+Width
962 for item in aObjects {
964 nMinLeft = min(nMinLeft,oObject.x())
965 nMaxLeftWidth = max(nMaxLeftWidth,oObject.x()+oObject.Width())
967 # Get Left Difference
968 nDiff = nMaxLeftWidth - nMinLeft
969 nLeft = (oObject.ParentWidget().Width() - nDiff ) / 2
970 nDiff = nMinLeft - nLeft
971 # Apply the Left difference to all controls
972 for item in aObjects {
974 oObject.move(oObject.x()-nDiff,oObject.y())
975 oObject.oCorners.Refresh(oObject)
980 aObjects = oModel.GetSelectedObjects()
982 for item in aObjects {
984 nHeight = max( nHeight , oObject.height() )
986 for item in aObjects {
988 oObject.resize( oObject.width() , nHeight )
989 oObject.oCorners.Refresh(oObject)
992 func MSSizeToShortest
993 aObjects = oModel.GetSelectedObjects()
995 for item in aObjects {
997 nHeight = min( nHeight , oObject.height() )
999 for item in aObjects {
1001 oObject.resize( oObject.width() , nHeight )
1002 oObject.oCorners.Refresh(oObject)
1006 aObjects = oModel.GetSelectedObjects()
1008 for item in aObjects {
1010 nWidth = max( nWidth , oObject.width() )
1012 for item in aObjects {
1014 oObject.resize( nWidth, oObject.Height() )
1015 oObject.oCorners.Refresh(oObject)
1018 func MSSizeToNarrowest
1019 aObjects = oModel.GetSelectedObjects()
1021 for item in aObjects {
1023 nWidth = min( nWidth , oObject.width() )
1025 for item in aObjects {
1027 oObject.resize( nWidth, oObject.Height() )
1028 oObject.oCorners.Refresh(oObject)
1031 func MSHorSpacingMakeEqual
1032 aObjects = oModel.GetSelectedObjects()
1034 for x = 1 to len(aObjects) {
1038 nLastLeft = oObject.x() + oObject.Width() + 10
1041 oObject.move( nLastLeft , oObject.y() )
1042 nLastLeft = oObject.x() + oObject.Width() + 10
1043 oObject.oCorners.Refresh(oObject)
1046 func MSHorSpacingIncrease
1047 aObjects = oModel.GetSelectedObjects()
1048 for x = 2 to len(aObjects) {
1051 oObject.move( oObject.x() + (10*(x-1)) , oObject.y() )
1052 oObject.oCorners.Refresh(oObject)
1055 func MSHorSpacingDecrease
1056 aObjects = oModel.GetSelectedObjects()
1057 for x = 2 to len(aObjects) {
1060 oObject.move( oObject.x() - (10*(x-1)) , oObject.y() )
1061 oObject.oCorners.Refresh(oObject)
1064 func MSVerSpacingMakeEqual
1065 aObjects = oModel.GetSelectedObjects()
1067 for x = 1 to len(aObjects) {
1071 nLastTop = oObject.y() + oObject.Height() + 10
1074 oObject.move( oObject.x() , nLastTop )
1075 nLastTop = oObject.y() + oObject.Height() + 10
1076 oObject.oCorners.Refresh(oObject)
1079 func MSVerSpacingIncrease
1080 aObjects = oModel.GetSelectedObjects()
1081 for x = 2 to len(aObjects) {
1084 oObject.move(oObject.x() , oObject.y() + (10*(x-1)) )
1085 oObject.oCorners.Refresh(oObject)
1088 func MSVerSpacingDecrease
1089 aObjects = oModel.GetSelectedObjects()
1090 for x = 2 to len(aObjects) {
1093 oObject.move(oObject.x() , oObject.y() - (10*(x-1)) )
1094 oObject.oCorners.Refresh(oObject)
1098 cColor = oGeneral.SelectColor()
1099 aObjects = oModel.GetSelectedObjects()
1100 for item in aObjects {
1102 oModel.GetObjectByID(item[3]).setTextColor(cColor)
1106 cColor = oGeneral.SelectColor()
1107 aObjects = oModel.GetSelectedObjects()
1108 for item in aObjects {
1110 oModel.GetObjectByID(item[3]).setBackColor(cColor)
1114 cFont = oGeneral.SelectFont()
1115 aObjects = oModel.GetSelectedObjects()
1116 for item in aObjects {
1118 oModel.GetObjectByID(item[3]).setFontProperty(cFont)
1122 aObjects = oModel.GetSelectedObjects()
1123 for item in aObjects {
1125 oObject.move( oObject.x() , oObject.y() - 10 )
1126 oObject.oCorners.Refresh(oObject)
1130 aObjects = oModel.GetSelectedObjects()
1131 for item in aObjects {
1133 oObject.move( oObject.x() , oObject.y() + 10 )
1134 oObject.oCorners.Refresh(oObject)
1138 aObjects = oModel.GetSelectedObjects()
1139 for item in aObjects {
1141 oObject.move( oObject.x() - 10 , oObject.y() )
1142 oObject.oCorners.Refresh(oObject)
1146 aObjects = oModel.GetSelectedObjects()
1147 for item in aObjects {
1149 oObject.move( oObject.x() + 10 , oObject.y() )
1150 oObject.oCorners.Refresh(oObject)
1153 func MSIncreaseWidth
1154 aObjects = oModel.GetSelectedObjects()
1155 for item in aObjects {
1157 oObject.resize( oObject.width() + 10 , oObject.height() )
1158 oObject.oCorners.Refresh(oObject)
1161 func MSDecreaseWidth
1162 aObjects = oModel.GetSelectedObjects()
1163 for item in aObjects {
1165 oObject.resize( oObject.width() - 10 , oObject.height() )
1166 oObject.oCorners.Refresh(oObject)
1169 func MSIncreaseHeight
1170 aObjects = oModel.GetSelectedObjects()
1171 for item in aObjects {
1173 oObject.resize( oObject.width() , oObject.height() + 10)
1174 oObject.oCorners.Refresh(oObject)
1177 func MSDecreaseHeight
1178 aObjects = oModel.GetSelectedObjects()
1179 for item in aObjects {
1181 oObject.resize( oObject.width() , oObject.height() - 10)
1182 oObject.oCorners.Refresh(oObject)
1186 oFile.NewAction(self)
1189 oFile.OpenAction(self)
1192 oFile.SaveAction(self)
1195 oFile.SaveAsAction(self)
1198 oFile.CloseAction(self)
1202 # The form designer is embedded in Dockable widget
1203 oView.win.parentwidget().Hide()
1209 # Selected objects - if we have many objects selected
1210 oModel.RefreshSelectedObjects()
1211 aObjects = oModel.GetSelectedObjects()
1212 # Support duplication of one selected object
1213 if len(aObjects) = 0 and not oModel.IsFormActive() {
1214 aObjects = oModel.ActiveObjectItemAsList()
1216 # Display messagebox if not objects are selected
1217 if len(aObjects) = 0 {
1218 ShowMsg("Sorry!","No objects are selected","Select objects first to be duplicated")
1221 # Duplication of selected objects
1222 cCode = oFile.Objects2String(self,aObjects)
1224 # Update Name and Position
1226 for item in aObjectsList {
1228 # Remove Numbers from the name
1229 for char in item[:name] {
1230 if not isalpha(char) and isalnum(char) {
1234 item[:name] = substr(item[:name]," ","")
1235 # Add New number to the name
1236 # -1 to avoid counting the window object
1237 item[:name] += "" + (oModel.ObjectsCount()+nIndex-1)
1239 item[:data][:x] += 10
1240 item[:data][:y] += 10
1242 nCount = oModel.ObjectsCount()
1243 oFile.CreateFormObjects(self,aObjectsList)
1244 # Select the new objects
1245 aObjects = oModel.GetObjects()
1246 for x = nCount+1 to len(aObjects) {
1249 oObject.oCorners.Show()
1250 if nCount+1 != len(aObjects) {
1251 oModel.AddSelectedObject(x)
1255 func ShowMsg cTitle,cText,cText2
1256 new qmessagebox(oView.win)
1258 setwindowtitle(cTitle)
1260 setInformativeText(cText2)
1261 setstandardbuttons(QMessageBox_Ok)
1266 if CheckOneObject() {
1267 oModel.ActiveObject().oCorners.Hide()
1268 oModel.ActiveObject().raise()
1269 oModel.RaiseActiveObject()
1274 if CheckOneObject() {
1275 oModel.ActiveObject().oCorners.Hide()
1276 oModel.ActiveObject().lower()
1277 oModel.LowerActiveObject()
1282 if oModel.IsFormActive() or oModel.IsManySelected() {
1283 ShowMsg("Sorry!","Object selection is not correct","Select one object first!")
1289 if oView.oToolBoxDock.isvisible() {
1290 oView.oToolBoxDock.hide()
1292 oView.oToolBoxDock.Show()
1296 if oView.oPropertiesDock.isvisible() {
1297 oView.oPropertiesDock.hide()
1299 oView.oPropertiesDock.Show()
1303 new QDesktopServices {
1304 OpenURL(new qURL("file:///"+substr(exefolder(),"\","/")+"../docs/ring.chm") )
1308 new QDesktopServices {
1309 OpenURL(new qURL("file:///"+substr(exefolder(),"\","/")+"../docs/ring.pdf") )
1312 Func MsgBox cTitle,cMessage
1313 new qMessagebox(NULL) {
1314 setwindowtitle(cTitle)
1320 MsgBox("Programming Language",
1321 "This application developed using the Ring programming language")
1324 MsgBox("GUI Library",
1325 "This application uses the Qt GUI Library through RingQt")
1329 "This application developed using the Ring programming language" + nl +
1330 "Ring Version : " + version() + nl +
1331 "2018-2019, Mahmoud Fayed <msfclipper@yahoo.com>")
1334 oParent = oView.win.parentwidget()
1335 if not oParent.pObject = NULLPointer() {
1340 func OpenFile cFileName
1342 SetFileName(cFileName)
1343 LoadFormFromFile(this)
1346 func PrepareStringForFormFile cString
1347 # To allow writing " in properties
1348 if isString(cString) {
1349 cString = SubStr(cString,'"', '"+char(34)+"')
1353 func SaveIfOnlyFileIsOpened
1354 oFile.SaveIfOnlyFileIsOpened(self)
1356 func ObjectsOrderAction
1357 Open_WindowAndLink(:ObjectsOrderController,self)
1358 ObjectsOrder().loadobjects()
1360 func SelectObjectsWindow
1361 Open_WindowAndLink(:selObjectsController,self)
1362 SelObjects().loadobjects()