├── .gitignore ├── CHANGES ├── LICENSE ├── README.md ├── _config.yml ├── examples ├── class diagram - QComboBox.xgr ├── elements test.xgr ├── mine airing network graph - 117 branches.gexf └── ports.xgr ├── icon.png ├── icon256.png ├── pad_file.xml ├── qvge.cppcheck ├── src ├── 3rdParty │ ├── common.pri │ ├── qprocessinfo │ │ ├── LICENSE │ │ ├── QProcessInfo │ │ ├── README.md │ │ ├── qprocessinfo.cpp │ │ └── qprocessinfo.h │ ├── qsint-widgets │ │ ├── colorbutton.cpp │ │ ├── colorbutton.h │ │ ├── colorcombobox.cpp │ │ ├── colorcombobox.h │ │ ├── colordefs.cpp │ │ ├── colordefs.h │ │ ├── colorgrid.cpp │ │ ├── colorgrid.h │ │ ├── doublespincombobox.cpp │ │ ├── doublespincombobox.h │ │ ├── ledwidget.cpp │ │ ├── ledwidget.h │ │ ├── pathpicker.cpp │ │ ├── pathpicker.h │ │ ├── qfontbutton.cpp │ │ ├── qfontbutton.h │ │ ├── qpenbutton.cpp │ │ ├── qpenbutton.h │ │ ├── qpencombobox.cpp │ │ ├── qpencombobox.h │ │ ├── qsint-widgets.pro │ │ ├── qsplitbutton.cpp │ │ ├── qsplitbutton.h │ │ ├── roundprogressbar.cpp │ │ ├── roundprogressbar.h │ │ ├── slider.cpp │ │ ├── slider.h │ │ ├── slider2d.cpp │ │ ├── slider2d.h │ │ ├── spincombobox.cpp │ │ ├── spincombobox.h │ │ ├── spinslider.cpp │ │ ├── spinslider.h │ │ ├── timepicker.cpp │ │ ├── timepicker.h │ │ └── widgets.pri │ └── qtpropertybrowser │ │ ├── QtAbstractEditorFactoryBase │ │ ├── QtAbstractPropertyBrowser │ │ ├── QtAbstractPropertyManager │ │ ├── QtBoolPropertyManager │ │ ├── QtBrowserItem │ │ ├── QtButtonPropertyBrowser │ │ ├── QtCharEditorFactory │ │ ├── QtCharPropertyManager │ │ ├── QtCheckBoxFactory │ │ ├── QtColorEditorFactory │ │ ├── QtColorPropertyManager │ │ ├── QtCursorEditorFactory │ │ ├── QtCursorPropertyManager │ │ ├── QtDateEditFactory │ │ ├── QtDatePropertyManager │ │ ├── QtDateTimeEditFactory │ │ ├── QtDateTimePropertyManager │ │ ├── QtDoublePropertyManager │ │ ├── QtDoubleSpinBoxFactory │ │ ├── QtEnumEditorFactory │ │ ├── QtEnumPropertyManager │ │ ├── QtFlagPropertyManager │ │ ├── QtFontEditorFactory │ │ ├── QtFontPropertyManager │ │ ├── QtGroupBoxPropertyBrowser │ │ ├── QtGroupPropertyManager │ │ ├── QtIntPropertyManager │ │ ├── QtKeySequenceEditorFactory │ │ ├── QtKeySequencePropertyManager │ │ ├── QtLineEditFactory │ │ ├── QtLocalePropertyManager │ │ ├── QtPointFPropertyManager │ │ ├── QtPointPropertyManager │ │ ├── QtProperty │ │ ├── QtRectFPropertyManager │ │ ├── QtRectPropertyManager │ │ ├── QtScrollBarFactory │ │ ├── QtSizeFPropertyManager │ │ ├── QtSizePolicyPropertyManager │ │ ├── QtSizePropertyManager │ │ ├── QtSliderFactory │ │ ├── QtSpinBoxFactory │ │ ├── QtStringPropertyManager │ │ ├── QtTimeEditFactory │ │ ├── QtTimePropertyManager │ │ ├── QtTreePropertyBrowser │ │ ├── QtVariantEditorFactory │ │ ├── QtVariantProperty │ │ ├── QtVariantPropertyManager │ │ ├── README.TXT │ │ ├── images │ │ ├── cursor-arrow.png │ │ ├── cursor-busy.png │ │ ├── cursor-closedhand.png │ │ ├── cursor-cross.png │ │ ├── cursor-forbidden.png │ │ ├── cursor-hand.png │ │ ├── cursor-hsplit.png │ │ ├── cursor-ibeam.png │ │ ├── cursor-openhand.png │ │ ├── cursor-sizeall.png │ │ ├── cursor-sizeb.png │ │ ├── cursor-sizef.png │ │ ├── cursor-sizeh.png │ │ ├── cursor-sizev.png │ │ ├── cursor-uparrow.png │ │ ├── cursor-vsplit.png │ │ ├── cursor-wait.png │ │ └── cursor-whatsthis.png │ │ ├── lineedit.cpp │ │ ├── lineedit.h │ │ ├── qtbuttonpropertybrowser.cpp │ │ ├── qtbuttonpropertybrowser.h │ │ ├── qteditorfactory.cpp │ │ ├── qteditorfactory.h │ │ ├── qtgroupboxpropertybrowser.cpp │ │ ├── qtgroupboxpropertybrowser.h │ │ ├── qtpropertybrowser.cpp │ │ ├── qtpropertybrowser.h │ │ ├── qtpropertybrowser.pri │ │ ├── qtpropertybrowser.pro │ │ ├── qtpropertybrowser.qrc │ │ ├── qtpropertybrowserutils.cpp │ │ ├── qtpropertybrowserutils_p.h │ │ ├── qtpropertymanager.cpp │ │ ├── qtpropertymanager.h │ │ ├── qttreepropertybrowser.cpp │ │ ├── qttreepropertybrowser.h │ │ ├── qtvariantproperty.cpp │ │ └── qtvariantproperty.h ├── app.pri ├── appbase │ ├── CMainWindow.cpp │ ├── CMainWindow.h │ ├── CPlatformServices.cpp │ ├── CPlatformServices.h │ ├── CPlatformWin32.cpp │ ├── CPlatformWin32.h │ ├── CStartPage.cpp │ ├── CStartPage.h │ ├── CStartPage.ui │ ├── Icons │ │ ├── action-delete.png │ │ ├── document-export.png │ │ ├── document-new.png │ │ ├── document-open.png │ │ ├── document-print.png │ │ └── document-save.png │ ├── appbase.pri │ └── appbase.qrc ├── commonui │ ├── CEasyTableWidget.cpp │ ├── CEasyTableWidget.h │ ├── CExtListInputDialog.cpp │ ├── CExtListInputDialog.h │ ├── CExtListInputDialog.ui │ ├── CPropertyEditorUIBase.cpp │ ├── CPropertyEditorUIBase.h │ ├── CQuickHelpUI.cpp │ ├── CQuickHelpUI.h │ ├── CQuickHelpUI.ui │ └── commonui.pro ├── config.pri ├── lib.pri ├── qdot │ ├── CDOTPreviewPage.cpp │ ├── CDOTPreviewPage.h │ ├── CDOTPreviewPage.ui │ ├── Icons │ │ └── AppIcon.png │ ├── lang │ │ └── en │ │ │ └── help.htm │ ├── main.cpp │ ├── qdot.pro │ ├── qdot.qrc │ ├── qdotMainWindow.cpp │ ├── qdotMainWindow.h │ ├── qdotVersion.h │ └── win32 │ │ └── icon.ico ├── qvge.pro ├── qvge │ ├── Icons │ │ └── AppIcon.png │ ├── lang │ │ └── en │ │ │ └── help.htm │ ├── linux │ │ ├── application-xgr.xml │ │ ├── qvge.appdata.xml │ │ ├── qvge.dbp │ │ ├── qvge.desktop │ │ ├── qvge.png │ │ └── qvge.spec │ ├── main.cpp │ ├── qvge.pro │ ├── qvge.qrc │ ├── qvgeMainWindow.cpp │ ├── qvgeMainWindow.h │ ├── qvgeVersion.h │ └── win32 │ │ └── icon.ico ├── qvgeio │ ├── CFormatDOT.cpp │ ├── CFormatDOT.h │ ├── CFormatGraphML.cpp │ ├── CFormatGraphML.h │ ├── CFormatPlainDOT.cpp │ ├── CFormatPlainDOT.h │ ├── CGraphBase.cpp │ ├── CGraphBase.h │ └── qvgeio.pro ├── qvgeioui │ ├── CCSVImportDialog.cpp │ ├── CCSVImportDialog.h │ ├── CCSVImportDialog.ui │ ├── CDOTExportDialog.cpp │ ├── CDOTExportDialog.h │ ├── CDOTExportDialog.ui │ ├── CImageExportDialog.cpp │ ├── CImageExportDialog.h │ ├── CImageExportDialog.ui │ ├── CImportExportUIController.cpp │ ├── CImportExportUIController.h │ └── qvgeioui.pro ├── qvgelib │ ├── CAttribute.cpp │ ├── CAttribute.h │ ├── CControlPoint.cpp │ ├── CControlPoint.h │ ├── CDiffUndoManager.cpp │ ├── CDiffUndoManager.h │ ├── CDirectEdge.cpp │ ├── CDirectEdge.h │ ├── CEdge.cpp │ ├── CEdge.h │ ├── CEditorScene.cpp │ ├── CEditorScene.h │ ├── CEditorSceneActions.cpp │ ├── CEditorSceneActions.h │ ├── CEditorSceneDefines.h │ ├── CEditorScene_p.cpp │ ├── CEditorScene_p.h │ ├── CEditorView.cpp │ ├── CEditorView.h │ ├── CFileSerializerCSV.cpp │ ├── CFileSerializerCSV.h │ ├── CFileSerializerDOT.cpp │ ├── CFileSerializerDOT.h │ ├── CFileSerializerGEXF.cpp │ ├── CFileSerializerGEXF.h │ ├── CFileSerializerGraphML.cpp │ ├── CFileSerializerGraphML.h │ ├── CFileSerializerPlainDOT.cpp │ ├── CFileSerializerPlainDOT.h │ ├── CFileSerializerXGR.cpp │ ├── CFileSerializerXGR.h │ ├── CGraphInterface.cpp │ ├── CGraphInterface.h │ ├── CImageExport.cpp │ ├── CImageExport.h │ ├── CItem.cpp │ ├── CItem.h │ ├── CNode.cpp │ ├── CNode.h │ ├── CNodeEditorScene.cpp │ ├── CNodeEditorScene.h │ ├── CNodePort.cpp │ ├── CNodePort.h │ ├── CNodeSceneActions.cpp │ ├── CNodeSceneActions.h │ ├── CPDFExport.cpp │ ├── CPDFExport.h │ ├── CPolyEdge.cpp │ ├── CPolyEdge.h │ ├── CSVGExport.cpp │ ├── CSVGExport.h │ ├── CSimpleUndoManager.cpp │ ├── CSimpleUndoManager.h │ ├── CTextLabelEdit.cpp │ ├── CTextLabelEdit.h │ ├── CTransformRect.cpp │ ├── CTransformRect.h │ ├── CUtils.cpp │ ├── CUtils.h │ ├── Doxyfile │ ├── IFileExport.h │ ├── IFileSerializer.h │ ├── IGraphInterface.h │ ├── IInteractive.h │ ├── ISceneEditController.h │ ├── ISceneItemFactory.h │ ├── ISceneMenuController.h │ ├── IUndoManager.h │ ├── Properties.h │ └── qvgelib.pro └── qvgeui │ ├── CAttributesEditorUI.cpp │ ├── CAttributesEditorUI.h │ ├── CAttributesEditorUI.ui │ ├── CClassAttributesEditorUI.cpp │ ├── CClassAttributesEditorUI.h │ ├── CClassAttributesEditorUI.ui │ ├── CColorSchemesUIController.cpp │ ├── CColorSchemesUIController.h │ ├── CCommutationTable.cpp │ ├── CCommutationTable.h │ ├── CCommutationTable.ui │ ├── CNewAttributeDialog.cpp │ ├── CNewAttributeDialog.h │ ├── CNewAttributeDialog.ui │ ├── CNodeEdgePropertiesUI.cpp │ ├── CNodeEdgePropertiesUI.h │ ├── CNodeEdgePropertiesUI.ui │ ├── CNodeEditorUIController.cpp │ ├── CNodeEditorUIController.h │ ├── CNodePortEditorDialog.cpp │ ├── CNodePortEditorDialog.h │ ├── CNodePortEditorDialog.ui │ ├── CNodesFactorDialog.cpp │ ├── CNodesFactorDialog.h │ ├── CNodesFactorDialog.ui │ ├── CSceneMenuUIController.cpp │ ├── CSceneMenuUIController.h │ ├── CSceneOptionsDialog.cpp │ ├── CSceneOptionsDialog.h │ ├── CSceneOptionsDialog.ui │ ├── CSearchDialog.cpp │ ├── CSearchDialog.h │ ├── CSearchDialog.ui │ ├── Icons │ ├── Action-Crop.png │ ├── Action-Link.png │ ├── Action-Unlink.png │ ├── Direction-Both.png │ ├── Direction-None.png │ ├── Direction-One.png │ ├── Edge-Direct.png │ ├── Edge-Polyline.png │ ├── Format-DOT.png │ ├── Format-GEXF.png │ ├── Format-GraphML.png │ ├── Format-PDF.png │ ├── Graph.png │ ├── Grid-Snap.png │ ├── Grid.png │ ├── Mode-AddNodes.png │ ├── Mode-Factor.png │ ├── Mode-Select.png │ ├── Mode-Transform.png │ ├── Node-Hexagon.png │ ├── Node-Romb.png │ ├── Node-Round.png │ ├── Node-Square.png │ ├── Node-Triangle-Down.png │ ├── Node-Triangle.png │ ├── Scroll-Navigator.png │ ├── Search.png │ ├── Settings.png │ ├── edit-copy.png │ ├── edit-cut.png │ ├── edit-delete.png │ ├── edit-paste.png │ ├── edit-redo.png │ ├── edit-undo.png │ ├── label-align-center.png │ ├── label-bottom.png │ ├── label-left.png │ ├── label-right.png │ ├── label-top.png │ ├── text-label.png │ ├── zoom-fit-items.png │ ├── zoom-fit-selection.png │ ├── zoom-in.png │ ├── zoom-original.png │ ├── zoom-out.png │ ├── zoom-previous.png │ └── zoom.png │ ├── gvgraph │ ├── CGVGraphLayoutUIController.cpp │ └── CGVGraphLayoutUIController.h │ ├── ogdf │ ├── COGDFLayout.cpp │ ├── COGDFLayout.h │ ├── COGDFLayoutUIController.cpp │ ├── COGDFLayoutUIController.h │ ├── COGDFNewGraphDialog.cpp │ ├── COGDFNewGraphDialog.h │ └── COGDFNewGraphDialog.ui │ ├── qvgeui.pri │ ├── qvgeui.pro │ └── qvgeui.qrc └── win32 ├── build_msvc_2017_64 └── makevc.bat ├── build_msvc_2019_64 └── makevc.bat ├── build_msvc_2022_64 ├── deployvc.bat └── makevc.bat └── setup ├── icon.ico ├── qvge.ini ├── setup32.iss └── setup64.iss /.gitignore: -------------------------------------------------------------------------------- 1 | # C++ objects and libs 2 | 3 | *.slo 4 | *.lo 5 | *.o 6 | *.a 7 | *.la 8 | *.lai 9 | *.so 10 | *.dll 11 | *.dylib 12 | 13 | # Qt-es 14 | 15 | /.qmake.cache 16 | /.qmake.stash 17 | *.pro.user 18 | *.pro.user.* 19 | *.qbs.user 20 | *.qbs.user.* 21 | *.moc 22 | moc_*.cpp 23 | moc_*.h 24 | qrc_*.cpp 25 | ui_*.h 26 | Makefile* 27 | *build-* 28 | 29 | # QtCreator 30 | 31 | *.autosave 32 | 33 | # QtCtreator Qml 34 | *.qmlproject.user 35 | *.qmlproject.user.* 36 | 37 | # QtCtreator CMake 38 | CMakeLists.txt.user* 39 | 40 | /code/3rdParty/qsint-properties 41 | /_builds_qvge_msvc 42 | /code/makevc.bat 43 | *.ipch 44 | *.obj 45 | *.tlog 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2020 Ars Masiuk 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-leap-day -------------------------------------------------------------------------------- /examples/class diagram - QComboBox.xgr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/examples/class diagram - QComboBox.xgr -------------------------------------------------------------------------------- /examples/elements test.xgr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/examples/elements test.xgr -------------------------------------------------------------------------------- /examples/ports.xgr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/examples/ports.xgr -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/icon.png -------------------------------------------------------------------------------- /icon256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/icon256.png -------------------------------------------------------------------------------- /qvge.cppcheck: -------------------------------------------------------------------------------- 1 | 2 | 3 | qvge-cppcheck-build-dir 4 | win64 5 | false 6 | true 7 | false 8 | 10 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | qt 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/3rdParty/common.pri: -------------------------------------------------------------------------------- 1 | include(../lib.pri) 2 | 3 | 4 | # compiler stuff 5 | win32-msvc*{ 6 | QMAKE_CXXFLAGS += /MP 7 | } 8 | 9 | 10 | # output 11 | CONFIG(debug, debug|release){ 12 | DESTDIR = $$OUT_PWD/../../lib.debug 13 | } 14 | else{ 15 | DESTDIR = $$OUT_PWD/../../lib 16 | } 17 | -------------------------------------------------------------------------------- /src/3rdParty/qprocessinfo/LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2016, Baldur Karlsson 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | * Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /src/3rdParty/qprocessinfo/QProcessInfo: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Baldur Karlsson 2 | // 3 | // Licensed under BSD 2-Clause License, see LICENSE file. 4 | // 5 | // Obtained from https://github.com/baldurk/qprocessinfo 6 | 7 | #include "qprocessinfo.h" 8 | -------------------------------------------------------------------------------- /src/3rdParty/qprocessinfo/README.md: -------------------------------------------------------------------------------- 1 | # QProcessInfo 2 | Simple Qt class to enumerate running processes on a system 3 | 4 | # Building 5 | Should just be able to drop into any Qt project and go, it deliberately doesn't have any dependencies that shouldn't already be there (entirely Qt code on unix, only kernel32.dll on windows). 6 | 7 | # TODO 8 | Only tested briefly on Windows and Linux, enough for my purposes. Window titles are only present on windows and if xdotool is available on linux, on other systems they're always empty. 9 | 10 | # License 11 | 2-clause BSD license. Go hog wild! 12 | -------------------------------------------------------------------------------- /src/3rdParty/qprocessinfo/qprocessinfo.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Baldur Karlsson 2 | // 3 | // Licensed under BSD 2-Clause License, see LICENSE file. 4 | // 5 | // Obtained from https://github.com/baldurk/qprocessinfo 6 | 7 | #pragma once 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | class QProcessInfo; 14 | typedef QList QProcessList; 15 | 16 | class QProcessInfo 17 | { 18 | public: 19 | QProcessInfo(); 20 | 21 | static QProcessList enumerate(bool includeWindowTitles = true); 22 | 23 | uint32_t pid() const; 24 | void setPid(uint32_t pid); 25 | 26 | const QString &name() const; 27 | void setName(const QString &name); 28 | 29 | const QString &windowTitle() const; 30 | void setWindowTitle(const QString &title); 31 | 32 | const QString &commandLine() const; 33 | void setCommandLine(const QString &cmd); 34 | 35 | private: 36 | uint32_t m_pid; 37 | QString m_name; 38 | QString m_title; 39 | QString m_cmdLine; 40 | }; 41 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/colorcombobox.h: -------------------------------------------------------------------------------- 1 | #ifndef QCOLORCOMBOBOX_H 2 | #define QCOLORCOMBOBOX_H 3 | 4 | #include 5 | 6 | #include "colordefs.h" 7 | 8 | 9 | namespace QSint 10 | { 11 | 12 | 13 | class ColorComboBox : public QComboBox 14 | { 15 | Q_OBJECT 16 | public: 17 | explicit ColorComboBox(QWidget *parent = 0); 18 | 19 | /** Sets active color list to \a colorNames. 20 | * The names are shown in the way how they are stored in the \a colorNames. 21 | */ 22 | void setColors(const QStringList& colorNames); 23 | 24 | /** Sets active color list to \a colors. 25 | * The names are shown in the QColor::name() format, i.e. "#RRGGBB" 26 | */ 27 | void setColors(const ColorList& colors); 28 | 29 | /** Returns current color (selected or written). 30 | */ 31 | QColor currentColor() const; 32 | 33 | void allowListColorsOnly(bool on); 34 | 35 | bool isListColorsOnly() const 36 | { return m_listOnly; } 37 | 38 | virtual void setEditable(bool editable); 39 | 40 | QString colorName(const QColor& color) const; 41 | 42 | static QIcon colorIcon(const QColor& color, int size = 14); 43 | 44 | Q_SIGNALS: 45 | /** Emitted when current color has been changed to \a color. 46 | */ 47 | void currentColorChanged(const QColor& color); 48 | 49 | public Q_SLOTS: 50 | /** Sets current color to \a color (same as setCurrentColor()). 51 | */ 52 | void setColor(const QColor& color) 53 | { setCurrentColor(color); } 54 | 55 | /** Sets current color to \a color. 56 | */ 57 | void setCurrentColor(const QColor& color); 58 | 59 | protected Q_SLOTS: 60 | void onCurrentIndexChanged(int index); 61 | void onEdited(); 62 | void onSelectionTextChanged(); 63 | 64 | private: 65 | bool m_listOnly; 66 | }; 67 | 68 | 69 | } 70 | 71 | #endif // QCOLORCOMBOBOX_H 72 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/colordefs.h: -------------------------------------------------------------------------------- 1 | #ifndef COLORDEFS_H 2 | #define COLORDEFS_H 3 | 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | 11 | namespace QSint 12 | { 13 | 14 | 15 | /** This type defines a list of QColor to be used in \a setScheme() functions. 16 | */ 17 | typedef QList ColorList; 18 | 19 | /** Returns default color scheme. 20 | \sa setScheme() 21 | */ 22 | ColorList* defaultColors(); 23 | /** Returns second default color scheme. 24 | \sa setScheme() 25 | */ 26 | ColorList* defaultColors2(); 27 | /** Returns default color scheme based on 16 base colors. 28 | \sa setScheme() 29 | */ 30 | ColorList* baseColors(); 31 | /** Returns default color scheme based on QColor::colorNames() list. 32 | \sa setScheme() 33 | */ 34 | ColorList* namedColors(); 35 | 36 | ColorList* openOfficeColors(); 37 | 38 | 39 | 40 | struct NamedColorsScheme 41 | { 42 | ColorList colors; 43 | QMap colorNames; 44 | int gridWidth; 45 | 46 | void addNamedColor(const QColor& color, const QString& name); 47 | QString colorName(const QColor& color) const; 48 | }; 49 | 50 | const NamedColorsScheme& BaseColors(); 51 | 52 | const NamedColorsScheme& SvgColors(); 53 | 54 | const NamedColorsScheme& OpenOfficeColors(); 55 | 56 | } 57 | 58 | 59 | #endif // COLORDEFS_H 60 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/doublespincombobox.cpp: -------------------------------------------------------------------------------- 1 | #include "doublespincombobox.h" 2 | 3 | 4 | namespace QSint 5 | { 6 | 7 | 8 | DoubleSpinComboBox::DoubleSpinComboBox(QWidget *parent) : 9 | QDoubleSpinBox(parent) 10 | { 11 | m_button = new QToolButton(this); 12 | m_button->setFixedWidth(16); 13 | m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); 14 | m_button->setPopupMode(QToolButton::InstantPopup); 15 | m_button->setVisible(false); 16 | 17 | connect(m_button, SIGNAL(triggered(QAction*)), this, SLOT(onAction(QAction*))); 18 | 19 | QHBoxLayout *mainLayout = new QHBoxLayout(this); 20 | mainLayout->setContentsMargins(0, 0, 0, 0); 21 | mainLayout->setSpacing(0); 22 | setLayout(mainLayout); 23 | 24 | mainLayout->addStretch(); 25 | mainLayout->addWidget(m_button); 26 | } 27 | 28 | 29 | void DoubleSpinComboBox::setValueList(const QList &values) 30 | { 31 | m_button->setVisible(!values.isEmpty()); 32 | if (values.isEmpty()) 33 | return; 34 | 35 | QMenu *m = new QMenu(this); 36 | for (double i : values) 37 | { 38 | QAction *a = m->addAction(QString::number(i)); 39 | a->setData(i); 40 | } 41 | 42 | m_button->setMenu(m); 43 | } 44 | 45 | 46 | // protected members 47 | 48 | void DoubleSpinComboBox::resizeEvent(QResizeEvent *event) 49 | { 50 | QDoubleSpinBox::resizeEvent(event); 51 | 52 | int arrowSize = m_button->width(); 53 | 54 | layout()->setContentsMargins(1, 1, arrowSize - 1, 1); 55 | } 56 | 57 | 58 | void DoubleSpinComboBox::onAction(QAction* act) 59 | { 60 | double v = act->data().toDouble(); 61 | 62 | setValue(v); 63 | } 64 | 65 | 66 | } // namespace 67 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/doublespincombobox.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | 12 | namespace QSint 13 | { 14 | 15 | 16 | /** 17 | \brief Double spin editor with additional drop down menu. 18 | \since 0.4 19 | 20 | \image html DoubleSpinComboBox.png An example of DoubleSpinComboBox 21 | */ 22 | class DoubleSpinComboBox : public QDoubleSpinBox 23 | { 24 | Q_OBJECT 25 | 26 | public: 27 | /** Constructor. 28 | */ 29 | explicit DoubleSpinComboBox(QWidget *parent = 0); 30 | 31 | void setValueList(const QList &values); 32 | 33 | Q_SIGNALS: 34 | 35 | protected Q_SLOTS: 36 | void onAction(QAction* action); 37 | 38 | protected: 39 | virtual void resizeEvent(QResizeEvent* event); 40 | 41 | QToolButton *m_button; 42 | }; 43 | 44 | 45 | } // namespace 46 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/ledwidget.cpp: -------------------------------------------------------------------------------- 1 | #include "ledwidget.h" 2 | 3 | #include 4 | 5 | 6 | namespace QSint 7 | { 8 | 9 | 10 | LedWidget::LedWidget(QWidget *parent) : 11 | QWidget(parent) 12 | { 13 | setColor(Qt::gray); 14 | } 15 | 16 | 17 | void LedWidget::setColor(const QColor &ledColor) 18 | { 19 | m_gradient.setColorAt(0.0, Qt::white); 20 | m_gradient.setColorAt(1.0, ledColor); 21 | } 22 | 23 | 24 | void LedWidget::setColors(const QColor &ledColor, const QColor &highlightColor) 25 | { 26 | m_gradient.setColorAt(0.0, highlightColor); 27 | m_gradient.setColorAt(1.0, ledColor); 28 | } 29 | 30 | 31 | void LedWidget::paintEvent(QPaintEvent * /*event*/) 32 | { 33 | QPainter p(this); 34 | 35 | p.setPen(QPen(Qt::black)); 36 | p.setRenderHint(QPainter::Antialiasing); 37 | 38 | int radius = qMin(rect().width(), rect().height()) / 2 - 2; 39 | 40 | m_gradient.setCenter(rect().center()); 41 | m_gradient.setFocalPoint(rect().center() - QPoint(radius / 2, radius / 2)); 42 | m_gradient.setRadius(radius); 43 | 44 | p.setBrush(m_gradient); 45 | 46 | p.drawEllipse(rect().center(), radius, radius); 47 | } 48 | 49 | 50 | } 51 | 52 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/ledwidget.h: -------------------------------------------------------------------------------- 1 | #ifndef LEDWIDGET_H 2 | #define LEDWIDGET_H 3 | 4 | #include 5 | 6 | 7 | namespace QSint 8 | { 9 | 10 | 11 | /** 12 | \brief Round LED-style widget with gradient fill. 13 | 14 | The gradient consists of two colors: led color (main color of the widget) 15 | and highlight color at the top-left corner (typically, white). 16 | 17 | \since 0.2.2 18 | 19 | \image html LedWidget.png An example of LedWidget 20 | */ 21 | class LedWidget : public QWidget 22 | { 23 | Q_OBJECT 24 | public: 25 | explicit LedWidget(QWidget *parent = 0); 26 | 27 | virtual QSize minimumSizeHint() const 28 | { return QSize(12,12); } 29 | 30 | virtual int heightForWidth(int w) const 31 | { return w; } 32 | 33 | public Q_SLOTS: 34 | /** 35 | * @brief setColor Funtion sets color of LED to \a ledColor. Highlight color is set to Qt::white. 36 | * @param ledColor Color to set (Qt::gray is the default value). 37 | */ 38 | void setColor(const QColor &ledColor); 39 | /** 40 | * @brief setColors Funtion sets color of LED to \a ledColor and its highlight color to \a blickColor. 41 | * @param ledColor (Qt::gray is the default value). 42 | * @param highlightColor (Qt::white is the default value). 43 | */ 44 | void setColors(const QColor &ledColor, const QColor &highlightColor); 45 | 46 | protected: 47 | virtual void paintEvent(QPaintEvent *event); 48 | 49 | QRadialGradient m_gradient; 50 | }; 51 | 52 | 53 | } 54 | 55 | 56 | #endif // LEDWIDGET_H 57 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qfontbutton.cpp: -------------------------------------------------------------------------------- 1 | #include "qfontbutton.h" 2 | 3 | 4 | namespace QSint 5 | { 6 | 7 | 8 | QString QFontButton::fontToText(const QFont& font) 9 | { 10 | QString result(font.family()); 11 | 12 | if (font.pointSizeF() > 0) 13 | result += QString(",%1pt").arg(font.pointSizeF()); 14 | else 15 | result += QString(",%1px").arg(font.pixelSize()); 16 | 17 | if (font.bold()) result += ",Bold"; 18 | if (font.italic()) result += ",Italic"; 19 | if (font.underline()) result += ",Underline"; 20 | 21 | return result; 22 | } 23 | 24 | 25 | QFontButton::QFontButton(QWidget *parent) : QToolButton(parent) 26 | { 27 | setToolButtonStyle(Qt::ToolButtonTextOnly); 28 | setPopupMode(QToolButton::MenuButtonPopup); 29 | 30 | setText("Aa"); 31 | setCurrentFont(QFont()); 32 | 33 | connect(this, SIGNAL(clicked()), this, SLOT(onClicked())); 34 | 35 | m_fontDialog = new QFontDialog(this); 36 | m_fontDialog->setOption(QFontDialog::DontUseNativeDialog, false); 37 | m_fontDialog->setSizeGripEnabled(false); 38 | 39 | QMenu *menu = new QMenu(this); 40 | setMenu(menu); 41 | 42 | QWidgetAction *dialogAction = new QWidgetAction(this); 43 | dialogAction->setDefaultWidget(m_fontDialog); 44 | menu->addAction(dialogAction); 45 | 46 | connect(menu, SIGNAL(aboutToShow()), this, SLOT(onDialogShown())); 47 | connect(m_fontDialog, SIGNAL(accepted()), menu, SLOT(hide())); 48 | connect(m_fontDialog, SIGNAL(rejected()), menu, SLOT(hide())); 49 | connect(m_fontDialog, SIGNAL(fontSelected(const QFont&)), this, SLOT(onDialogFontSelected(const QFont&))); 50 | } 51 | 52 | 53 | void QFontButton::setCurrentFont(const QFont &font) 54 | { 55 | m_font = font; 56 | 57 | setToolTip(fontToText(font)); 58 | 59 | if (m_font.pixelSize() > 20 || m_font.pointSize() > 20) 60 | { 61 | QFont f(font); 62 | f.setPointSize(20); 63 | setFont(f); 64 | } 65 | else 66 | setFont(m_font); 67 | } 68 | 69 | 70 | void QFontButton::onClicked() 71 | { 72 | Q_EMIT activated(m_font); 73 | } 74 | 75 | 76 | void QFontButton::onDialogShown() 77 | { 78 | m_fontDialog->setCurrentFont(m_font); 79 | 80 | m_fontDialog->setVisible(true); 81 | } 82 | 83 | 84 | void QFontButton::onDialogFontSelected(const QFont &font) 85 | { 86 | setCurrentFont(font); 87 | 88 | onClicked(); 89 | } 90 | 91 | 92 | } 93 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qfontbutton.h: -------------------------------------------------------------------------------- 1 | #ifndef QFONTBUTTON_H 2 | #define QFONTBUTTON_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | 10 | namespace QSint 11 | { 12 | 13 | 14 | class QFontButton : public QToolButton 15 | { 16 | Q_OBJECT 17 | 18 | public: 19 | QFontButton(QWidget *parent = Q_NULLPTR); 20 | 21 | const QFont& currentFont() const { return m_font; } 22 | 23 | static QString fontToText(const QFont& font); 24 | 25 | public Q_SLOTS: 26 | void setCurrentFont(const QFont &font); 27 | 28 | Q_SIGNALS: 29 | void activated(const QFont &font); 30 | 31 | private Q_SLOTS: 32 | void onClicked(); 33 | void onDialogShown(); 34 | void onDialogFontSelected(const QFont&); 35 | 36 | private: 37 | QFontDialog *m_fontDialog; 38 | QFont m_font; 39 | }; 40 | 41 | 42 | } 43 | 44 | #endif // QFONTBUTTON_H 45 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qpenbutton.cpp: -------------------------------------------------------------------------------- 1 | #include "qpenbutton.h" 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | 8 | namespace QSint 9 | { 10 | 11 | 12 | QPenButton::QPenButton(QWidget *parent) : QSplitButton(parent) 13 | { 14 | init(); 15 | } 16 | 17 | 18 | QPixmap QPenButton::drawPixmap(Qt::PenStyle style, int width, QSize size) 19 | { 20 | QPen pen; 21 | pen.setWidth(width); 22 | pen.setStyle(style); 23 | 24 | QPixmap pixmap(size); 25 | pixmap.fill(QColor(Qt::transparent)); 26 | 27 | QPainter painter(&pixmap); 28 | painter.setPen(pen); 29 | painter.drawLine(0, int(pixmap.height() / 2.), pixmap.width(), int(pixmap.height() / 2.)); 30 | 31 | return pixmap; 32 | } 33 | 34 | 35 | void QPenButton::init() 36 | { 37 | for (int i = Qt::NoPen; i < Qt::CustomDashLine; i++) 38 | { 39 | QPixmap pixmap = drawPixmap(Qt::PenStyle(i), 2, iconSize() * 2); 40 | 41 | switch (i) 42 | { 43 | case Qt::NoPen: addAction(pixmap, tr("None"), i); break; 44 | case Qt::SolidLine: addAction(pixmap, tr("Solid"), i); break; 45 | case Qt::DashLine: addAction(pixmap, tr("Dashed"), i); break; 46 | case Qt::DotLine: addAction(pixmap, tr("Dotted"), i); break; 47 | case Qt::DashDotLine: addAction(pixmap, tr("Dash-Dot"), i); break; 48 | case Qt::DashDotDotLine: addAction(pixmap, tr("Dash-Dot-Dot"), i); break; 49 | default: break; 50 | } 51 | } 52 | } 53 | 54 | 55 | void QPenButton::setUsedRange(Qt::PenStyle start, Qt::PenStyle end) 56 | { 57 | auto list = actions(); 58 | 59 | for (int i = 0; i setVisible(i >= start && i <= end); 62 | } 63 | 64 | selectActionByIndex(start); 65 | } 66 | 67 | 68 | void QPenButton::setPenStyle(Qt::PenStyle style) 69 | { 70 | selectAction((int)style); 71 | } 72 | 73 | 74 | void QPenButton::onAction(QAction* act) 75 | { 76 | QSplitButton::onAction(act); 77 | 78 | int style = act->data().toInt(); 79 | if (style < Qt::NoPen || style >= Qt::CustomDashLine) 80 | style = Qt::NoPen; 81 | 82 | Q_EMIT activated((Qt::PenStyle)style); 83 | } 84 | 85 | 86 | } 87 | 88 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qpenbutton.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "qsplitbutton.h" 4 | 5 | #include 6 | 7 | 8 | namespace QSint 9 | { 10 | 11 | 12 | class QPenButton : public QSplitButton 13 | { 14 | Q_OBJECT 15 | 16 | public: 17 | QPenButton(QWidget *parent = Q_NULLPTR); 18 | 19 | void setUsedRange(Qt::PenStyle start, Qt::PenStyle end); 20 | 21 | static QPixmap drawPixmap(Qt::PenStyle style, int width = 2, QSize size = QSize(24,24)); 22 | 23 | public Q_SLOTS: 24 | void setPenStyle(Qt::PenStyle style); 25 | 26 | Q_SIGNALS: 27 | void activated(Qt::PenStyle style); 28 | 29 | protected Q_SLOTS: 30 | virtual void onAction(QAction* act); 31 | 32 | private: 33 | virtual void init(); 34 | }; 35 | 36 | 37 | } 38 | 39 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qpencombobox.cpp: -------------------------------------------------------------------------------- 1 | #include "qpencombobox.h" 2 | 3 | #include 4 | #include 5 | 6 | 7 | namespace QSint 8 | { 9 | 10 | 11 | QPenComboBox::QPenComboBox(QWidget *parent) : QComboBox(parent) 12 | { 13 | setEditable(false); 14 | 15 | QPen pen; 16 | pen.setWidth(2); 17 | 18 | for (int i = Qt::SolidLine; i < Qt::CustomDashLine; i++) 19 | { 20 | QPixmap pixmap(24, 24); 21 | pixmap.fill(QColor(Qt::transparent)); 22 | 23 | pen.setStyle(Qt::PenStyle(i)); 24 | 25 | QPainter painter(&pixmap); 26 | painter.setPen(pen); 27 | painter.drawLine(0, int(pixmap.height() / 2.), pixmap.width(), int(pixmap.height() / 2.)); 28 | 29 | switch (i) 30 | { 31 | case Qt::NoPen: addItem(pixmap, tr("None")); break; 32 | case Qt::SolidLine: addItem(pixmap, tr("Solid")); break; 33 | case Qt::DashLine: addItem(pixmap, tr("Dash")); break; 34 | case Qt::DotLine: addItem(pixmap, tr("Dot")); break; 35 | case Qt::DashDotLine: addItem(pixmap, tr("Dash Dot")); break; 36 | case Qt::DashDotDotLine: addItem(pixmap, tr("Dash Dot Dot")); break; 37 | default: addItem(tr("Custom")); break; 38 | } 39 | } 40 | 41 | setCurrentIndex(1); 42 | 43 | setFixedSize(sizeHint()); 44 | } 45 | 46 | 47 | void QPenComboBox::setCurrentStyle(Qt::PenStyle newStyle) 48 | { 49 | setCurrentIndex((int)newStyle); 50 | } 51 | 52 | 53 | Qt::PenStyle QPenComboBox::currentStyle() const 54 | { 55 | return Qt::PenStyle(currentIndex()); 56 | } 57 | 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qpencombobox.h: -------------------------------------------------------------------------------- 1 | #ifndef QPENCOMBOBOX_H 2 | #define QPENCOMBOBOX_H 3 | 4 | #include 5 | #include 6 | 7 | 8 | namespace QSint 9 | { 10 | 11 | 12 | class QPenComboBox: public QComboBox 13 | { 14 | public: 15 | QPenComboBox(QWidget *parent = 0); 16 | 17 | void setCurrentStyle(Qt::PenStyle); 18 | Qt::PenStyle currentStyle() const; 19 | }; 20 | 21 | 22 | } 23 | 24 | #endif // QPENCOMBOBOX_H 25 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qsint-widgets.pro: -------------------------------------------------------------------------------- 1 | include(../common.pri) 2 | 3 | TARGET = qsint-widgets 4 | QT += core gui widgets 5 | 6 | SOURCES += $$files($$PWD/*.cpp) 7 | HEADERS += $$files($$PWD/*.h) 8 | FORMS += $$files($$PWD/*.ui) 9 | RESOURCES += $$files($$PWD/*.qrc) 10 | 11 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/qsplitbutton.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | 9 | namespace QSint 10 | { 11 | 12 | 13 | class QSplitButton : public QToolButton 14 | { 15 | Q_OBJECT 16 | 17 | public: 18 | QSplitButton(QWidget *parent = Q_NULLPTR); 19 | 20 | QAction* addAction(const QString &text, const QVariant &data = QVariant()); 21 | QAction* addAction(const QIcon &icon, const QString &text, const QVariant &data = QVariant()); 22 | 23 | void setDefaultAction(QAction* act); 24 | 25 | public Q_SLOTS: 26 | QAction* selectAction(const QVariant &data); 27 | QAction* selectActionByIndex(int index); 28 | 29 | Q_SIGNALS: 30 | void activated(QVariant data); 31 | 32 | protected Q_SLOTS: 33 | virtual void onAction(QAction* act); 34 | 35 | protected: 36 | virtual void actionEvent(QActionEvent *event); 37 | 38 | QMenu *m_localMenu; 39 | }; 40 | 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/slider.cpp: -------------------------------------------------------------------------------- 1 | #include "slider.h" 2 | 3 | #include 4 | #include 5 | 6 | 7 | namespace QSint 8 | { 9 | 10 | 11 | Slider::Slider(QWidget *parent): QSlider(parent), 12 | m_precise(false), 13 | m_clickJump(false) 14 | { 15 | setPreciseMovement(true); 16 | } 17 | 18 | 19 | void Slider::setPreciseMovement(bool on) 20 | { 21 | if (m_precise != on) 22 | { 23 | m_precise = on; 24 | 25 | if (m_precise) 26 | connect(this, SIGNAL(actionTriggered(int)), this, SLOT(onActionTriggered(int))); 27 | else 28 | disconnect(this); 29 | } 30 | } 31 | 32 | 33 | void Slider::setClickJump(bool on) 34 | { 35 | if (m_clickJump != on) 36 | { 37 | m_clickJump = on; 38 | } 39 | } 40 | 41 | 42 | void Slider::onActionTriggered(int action) 43 | { 44 | if (action == QAbstractSlider::SliderMove) 45 | { 46 | int v = (sliderPosition() / singleStep()) * singleStep(); 47 | setValue(v); 48 | } 49 | else 50 | if (action == QAbstractSlider::SliderPageStepAdd || action == QAbstractSlider::SliderPageStepSub) 51 | { 52 | int v = (sliderPosition() / pageStep()) * pageStep(); 53 | setValue(v); 54 | } 55 | } 56 | 57 | 58 | void Slider::mousePressEvent(QMouseEvent *event) 59 | { 60 | if (m_clickJump) 61 | { 62 | QStyleOptionSlider opt; 63 | initStyleOption(&opt); 64 | QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this); 65 | 66 | if (event->button() == Qt::LeftButton && !sr.contains(event->pos())) 67 | { 68 | int v = minimum(); 69 | 70 | if (orientation() == Qt::Vertical) 71 | v += ((maximum()-minimum()) * (height()-event->y())) / height(); 72 | else 73 | v += ((maximum()-minimum()) * event->x()) / width(); 74 | 75 | if (m_precise) 76 | v = (v / singleStep()) * singleStep(); 77 | 78 | if (invertedAppearance()) 79 | v = (maximum() - v + 1); 80 | 81 | setValue(v); 82 | } 83 | } 84 | 85 | QSlider::mousePressEvent(event); 86 | } 87 | 88 | 89 | } 90 | 91 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/slider.h: -------------------------------------------------------------------------------- 1 | #ifndef SLIDER_H 2 | #define SLIDER_H 3 | 4 | #include 5 | 6 | 7 | namespace QSint 8 | { 9 | 10 | 11 | /** 12 | \brief A slider allowing more precise user control by a mouse. 13 | 14 | See: 15 | - setPreciseMovement() 16 | - setClickJump() 17 | 18 | \since 0.3 19 | */ 20 | 21 | class Slider : public QSlider 22 | { 23 | Q_OBJECT 24 | 25 | public: 26 | Slider(QWidget* parent = 0); 27 | 28 | /// \return true if presice movement has been activated. 29 | /// \sa setPreciseMovement() 30 | /// \since 0.3 31 | bool preciseMovementActive() const 32 | { return m_precise; } 33 | 34 | /// \return true if click jump has been activated. 35 | /// \sa setClickJump() 36 | /// \since 0.3 37 | bool clickJumpActive() const 38 | { return m_clickJump; } 39 | 40 | public Q_SLOTS: 41 | /// Activates precise movement of the slider. Its value will be always rounded up according to singleStep() 42 | /// when dragging & scrolling. 43 | /// Clicking on the slider will round up its value according to pageStep(). 44 | /// 45 | /// Enabled by default. 46 | /// \since 0.3 47 | void setPreciseMovement(bool on = true); 48 | 49 | /// When activated, clicking on the slider will move its handle to the click position immediately. 50 | /// 51 | /// Not enabled by default. 52 | /// \since 0.3 53 | void setClickJump(bool on = true); 54 | 55 | protected Q_SLOTS: 56 | void onActionTriggered(int id); 57 | 58 | protected: 59 | virtual void mousePressEvent(QMouseEvent *event); 60 | 61 | private: 62 | bool m_precise; 63 | bool m_clickJump; 64 | }; 65 | 66 | 67 | } 68 | 69 | #endif // SLIDER_H 70 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/spincombobox.cpp: -------------------------------------------------------------------------------- 1 | #include "spincombobox.h" 2 | 3 | 4 | namespace QSint 5 | { 6 | 7 | 8 | SpinComboBox::SpinComboBox(QWidget *parent) : 9 | QSpinBox(parent) 10 | { 11 | m_button = new QToolButton(this); 12 | m_button->setFixedWidth(16); 13 | m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); 14 | m_button->setPopupMode(QToolButton::InstantPopup); 15 | m_button->setVisible(false); 16 | 17 | connect(m_button, SIGNAL(triggered(QAction*)), this, SLOT(onAction(QAction*))); 18 | 19 | QHBoxLayout *mainLayout = new QHBoxLayout(this); 20 | mainLayout->setContentsMargins(0, 0, 0, 0); 21 | mainLayout->setSpacing(0); 22 | setLayout(mainLayout); 23 | 24 | mainLayout->addStretch(); 25 | mainLayout->addWidget(m_button); 26 | } 27 | 28 | 29 | void SpinComboBox::setValueList(const QList &values) 30 | { 31 | m_button->setVisible(!values.isEmpty()); 32 | if (values.isEmpty()) 33 | return; 34 | 35 | QMenu *m = new QMenu(this); 36 | for (int i : values) 37 | { 38 | QAction *a = m->addAction(QString::number(i)); 39 | a->setData(i); 40 | } 41 | 42 | m_button->setMenu(m); 43 | } 44 | 45 | 46 | // protected members 47 | 48 | void SpinComboBox::resizeEvent(QResizeEvent *event) 49 | { 50 | QSpinBox::resizeEvent(event); 51 | 52 | int arrowSize = m_button->width(); 53 | 54 | layout()->setContentsMargins(1, 1, arrowSize - 1, 1); 55 | } 56 | 57 | 58 | void SpinComboBox::onAction(QAction* act) 59 | { 60 | int v = act->data().toInt(); 61 | 62 | setValue(v); 63 | } 64 | 65 | 66 | } // namespace 67 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/spincombobox.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | 11 | 12 | namespace QSint 13 | { 14 | 15 | 16 | /** 17 | \brief Spin editor with additional drop down menu. 18 | \since 0.4 19 | 20 | \image html SpinComboBox.png An example of SpinComboBox 21 | */ 22 | class SpinComboBox : public QSpinBox 23 | { 24 | Q_OBJECT 25 | 26 | public: 27 | /** Constructor. 28 | */ 29 | explicit SpinComboBox(QWidget *parent = 0); 30 | 31 | void setValueList(const QList &values); 32 | 33 | Q_SIGNALS: 34 | 35 | protected Q_SLOTS: 36 | void onAction(QAction* action); 37 | 38 | protected: 39 | virtual void resizeEvent(QResizeEvent* event); 40 | 41 | QToolButton *m_button; 42 | }; 43 | 44 | 45 | } // namespace 46 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/timepicker.h: -------------------------------------------------------------------------------- 1 | #ifndef TIMEPICKER_H 2 | #define TIMEPICKER_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | 11 | namespace QSint 12 | { 13 | 14 | /** 15 | * @brief The TimePicker class allows to choose a time moment in a hour:minute form via simple UI. 16 | * \since 0.4 17 | */ 18 | class TimePicker : public QWidget 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | /** Constructor. 24 | */ 25 | explicit TimePicker(QWidget *parent = 0); 26 | 27 | /** Returns current time. 28 | */ 29 | QTime time() const 30 | { return m_time; } 31 | 32 | public Q_SLOTS: 33 | /** Sets current time. 34 | */ 35 | void setTime(const QTime& time); 36 | 37 | Q_SIGNALS: 38 | void timePicked(const QTime& time); 39 | 40 | private Q_SLOTS: 41 | void hourClicked(int hour); 42 | void minuteClicked(int minute); 43 | 44 | protected: 45 | QTime m_time; 46 | QButtonGroup m_hourButtons; 47 | QButtonGroup m_minuteButtons; 48 | }; 49 | 50 | 51 | // button with popup dialog 52 | 53 | class TimePickerButton : public QToolButton 54 | { 55 | Q_OBJECT 56 | 57 | public: 58 | TimePickerButton(QWidget *parent = 0); 59 | 60 | void setTimeEdit(QTimeEdit *timeEdit) { m_editor = timeEdit; } 61 | 62 | TimePicker* pickerWidget() { return &m_timePicker; } 63 | QDialog* dialogWidget() { return m_dialog; } 64 | 65 | private Q_SLOTS: 66 | void OnButtonClicked(); 67 | 68 | protected: 69 | QDialog* m_dialog; 70 | QTimeEdit* m_editor; 71 | TimePicker m_timePicker; 72 | }; 73 | 74 | 75 | } 76 | 77 | 78 | #endif // TIMEPICKER_H 79 | -------------------------------------------------------------------------------- /src/3rdParty/qsint-widgets/widgets.pri: -------------------------------------------------------------------------------- 1 | HEADERS += $$files($$PWD/*.h) 2 | SOURCES += $$files($$PWD/*.cpp) 3 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtAbstractEditorFactoryBase: -------------------------------------------------------------------------------- 1 | #include "qtpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtAbstractPropertyBrowser: -------------------------------------------------------------------------------- 1 | #include "qtpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtAbstractPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtBoolPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtBrowserItem: -------------------------------------------------------------------------------- 1 | #include "qtpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtButtonPropertyBrowser: -------------------------------------------------------------------------------- 1 | #include "qtbuttonpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtCharEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtCharPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtCheckBoxFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtColorEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtColorPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtCursorEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtCursorPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtDateEditFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtDatePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtDateTimeEditFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtDateTimePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtDoublePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtDoubleSpinBoxFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtEnumEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtEnumPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtFlagPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtFontEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtFontPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtGroupBoxPropertyBrowser: -------------------------------------------------------------------------------- 1 | #include "qtgroupboxpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtGroupPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtIntPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtKeySequenceEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtKeySequencePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtLineEditFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtLocalePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtPointFPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtPointPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtProperty: -------------------------------------------------------------------------------- 1 | #include "qtpropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtRectFPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtRectPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtScrollBarFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtSizeFPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtSizePolicyPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtSizePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtSliderFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtSpinBoxFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtStringPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtTimeEditFactory: -------------------------------------------------------------------------------- 1 | #include "qteditorfactory.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtTimePropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtpropertymanager.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtTreePropertyBrowser: -------------------------------------------------------------------------------- 1 | #include "qttreepropertybrowser.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtVariantEditorFactory: -------------------------------------------------------------------------------- 1 | #include "qtvariantproperty.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtVariantProperty: -------------------------------------------------------------------------------- 1 | #include "qtvariantproperty.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/QtVariantPropertyManager: -------------------------------------------------------------------------------- 1 | #include "qtvariantproperty.h" 2 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-arrow.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-busy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-busy.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-closedhand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-closedhand.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-cross.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-forbidden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-forbidden.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-hand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-hand.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-hsplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-hsplit.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-ibeam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-ibeam.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-openhand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-openhand.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-sizeall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-sizeall.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-sizeb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-sizeb.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-sizef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-sizef.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-sizeh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-sizeh.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-sizev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-sizev.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-uparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-uparrow.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-vsplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-vsplit.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-wait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-wait.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/images/cursor-whatsthis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/3rdParty/qtpropertybrowser/images/cursor-whatsthis.png -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/lineedit.cpp: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (c) 2007 Trolltech ASA 4 | ** 5 | ** Use, modification and distribution is allowed without limitation, 6 | ** warranty, liability or support of any kind. 7 | ** 8 | ****************************************************************************/ 9 | 10 | #include "lineedit.h" 11 | #include 12 | #include 13 | #include 14 | 15 | QInputDialog *LineEdit::inputDialog = NULL; 16 | 17 | LineEdit::LineEdit(QWidget *parent) 18 | : QLineEdit(parent) 19 | { 20 | editorButton = new QToolButton(this); 21 | editorButton->setText("..."); 22 | editorButton->setCursor(Qt::ArrowCursor); 23 | editorButton->setEnabled(true); 24 | editorButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); 25 | connect(editorButton, SIGNAL(clicked()), this, SLOT(showEditor())); 26 | 27 | int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); 28 | setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(editorButton->sizeHint().width() + frameWidth + 1)); 29 | QSize msz = minimumSizeHint(); 30 | setMinimumSize(qMax(msz.width(), editorButton->sizeHint().height() + frameWidth * 2 + 2), 31 | qMax(msz.height(), editorButton->sizeHint().height() + frameWidth * 2 + 2)); 32 | 33 | if (!inputDialog) 34 | { 35 | inputDialog = new QInputDialog(NULL); 36 | inputDialog->setOption(QInputDialog::UsePlainTextEditForTextInput); 37 | inputDialog->setInputMode(QInputDialog::TextInput); 38 | inputDialog->setWindowTitle(tr("Text Property")); 39 | inputDialog->resize(480, 320); 40 | } 41 | } 42 | 43 | void LineEdit::resizeEvent(QResizeEvent *) 44 | { 45 | QSize sz = editorButton->sizeHint(); 46 | int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); 47 | editorButton->move(rect().right() - frameWidth - sz.width(), 48 | (rect().bottom() + 1 - sz.height()) / 2); 49 | } 50 | 51 | void LineEdit::showEditor() 52 | { 53 | inputDialog->setTextValue(text()); 54 | if (inputDialog->exec() == QDialog::Accepted && inputDialog->textValue() != text()) 55 | { 56 | setText(inputDialog->textValue()); 57 | Q_EMIT editingFinished(); 58 | } 59 | } -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/lineedit.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************** 2 | ** 3 | ** Copyright (c) 2007 Trolltech ASA 4 | ** 5 | ** Use, modification and distribution is allowed without limitation, 6 | ** warranty, liability or support of any kind. 7 | ** 8 | ****************************************************************************/ 9 | 10 | #ifndef LINEEDIT_H 11 | #define LINEEDIT_H 12 | 13 | #include 14 | 15 | class QToolButton; 16 | class QInputDialog; 17 | 18 | class LineEdit : public QLineEdit 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | LineEdit(QWidget *parent = 0); 24 | 25 | protected: 26 | void resizeEvent(QResizeEvent *); 27 | 28 | private Q_SLOTS: 29 | void showEditor(); 30 | 31 | private: 32 | QToolButton *editorButton; 33 | static QInputDialog *inputDialog; 34 | }; 35 | 36 | #endif // LIENEDIT_H 37 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/qtpropertybrowser.pri: -------------------------------------------------------------------------------- 1 | include(../common.pri) 2 | 3 | INCLUDEPATH += $$PWD 4 | DEPENDPATH += $$PWD 5 | 6 | SOURCES += $$PWD/qtpropertybrowser.cpp \ 7 | $$PWD/qtpropertymanager.cpp \ 8 | $$PWD/qteditorfactory.cpp \ 9 | $$PWD/qtvariantproperty.cpp \ 10 | $$PWD/qttreepropertybrowser.cpp \ 11 | $$PWD/qtbuttonpropertybrowser.cpp \ 12 | $$PWD/qtgroupboxpropertybrowser.cpp \ 13 | $$PWD/qtpropertybrowserutils.cpp \ 14 | $$PWD/lineedit.cpp 15 | HEADERS += $$PWD/qtpropertybrowser.h \ 16 | $$PWD/qtpropertymanager.h \ 17 | $$PWD/qteditorfactory.h \ 18 | $$PWD/qtvariantproperty.h \ 19 | $$PWD/qttreepropertybrowser.h \ 20 | $$PWD/qtbuttonpropertybrowser.h \ 21 | $$PWD/qtgroupboxpropertybrowser.h \ 22 | $$PWD/qtpropertybrowserutils_p.h \ 23 | $$PWD/lineedit.h 24 | RESOURCES += $$PWD/qtpropertybrowser.qrc 25 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/qtpropertybrowser.pro: -------------------------------------------------------------------------------- 1 | QT += core gui widgets 2 | 3 | include(qtpropertybrowser.pri) 4 | -------------------------------------------------------------------------------- /src/3rdParty/qtpropertybrowser/qtpropertybrowser.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/cursor-arrow.png 4 | images/cursor-busy.png 5 | images/cursor-closedhand.png 6 | images/cursor-cross.png 7 | images/cursor-forbidden.png 8 | images/cursor-hand.png 9 | images/cursor-hsplit.png 10 | images/cursor-ibeam.png 11 | images/cursor-openhand.png 12 | images/cursor-sizeall.png 13 | images/cursor-sizeb.png 14 | images/cursor-sizef.png 15 | images/cursor-sizeh.png 16 | images/cursor-sizev.png 17 | images/cursor-uparrow.png 18 | images/cursor-vsplit.png 19 | images/cursor-wait.png 20 | images/cursor-whatsthis.png 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/app.pri: -------------------------------------------------------------------------------- 1 | # This file is a part of 2 | # QVGE - Qt Visual Graph Editor 3 | # 4 | # (c) 2016-2020 Ars L. Masiuk (ars.masiuk@gmail.com) 5 | # 6 | # It can be used freely, maintaining the information above. 7 | 8 | 9 | # includes & libs 10 | INCLUDEPATH += $$PWD $$PWD/3rdParty/qtpropertybrowser $$PWD/3rdParty/qsint-widgets 11 | 12 | 13 | CONFIG(debug, debug|release){ 14 | DESTDIR = $$OUT_PWD/../bin.debug 15 | LIBS += -L$$OUT_PWD/../lib.debug 16 | } 17 | else{ 18 | DESTDIR = $$OUT_PWD/../bin 19 | LIBS += -L$$OUT_PWD/../lib 20 | } 21 | 22 | 23 | # workaround for #126 24 | CONFIG += no_lflags_merge 25 | LIBS += -lqvgeui -lqvgeioui -lcommonui -lqvgelib -lqvgeio -lqtpropertybrowser -lqsint-widgets 26 | 27 | 28 | USE_OGDF{ 29 | LIBS += -L$$OGDF_LIB_PATH -l$$OGDF_LIB_NAME 30 | INCLUDEPATH += $$OGDF_INCLUDE_PATH 31 | } 32 | 33 | 34 | USE_BOOST{ 35 | LIBS += -L$$BOOST_LIB_PATH -l$$BOOST_LIB_NAME 36 | INCLUDEPATH += $$BOOST_INCLUDE_PATH 37 | } 38 | 39 | 40 | win32{ 41 | LIBS += -lopengl32 -lglu32 -lshell32 -luser32 -lpsapi 42 | } 43 | 44 | 45 | unix{ 46 | !if(haiku|mac){ 47 | QT += x11extras 48 | LIBS += -lX11 49 | } 50 | } 51 | 52 | -------------------------------------------------------------------------------- /src/appbase/CPlatformServices.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | 7 | class CPlatformServices 8 | { 9 | public: 10 | static bool SetActiveWindow(uint id); 11 | 12 | static bool CloseWindow(uint id); 13 | 14 | typedef QSet PIDs; 15 | static PIDs GetRunningPIDs(); 16 | 17 | static int GetPlatformBits(); // 32 or 64 ... or more 18 | 19 | static quint64 GetTotalRAMBytes(); // total RAM in bytes, 0 if failed 20 | }; 21 | 22 | 23 | #if defined (Q_OS_WIN32) && !defined(Q_OS_CYGWIN) 24 | #include "CPlatformWin32.h" 25 | #endif 26 | -------------------------------------------------------------------------------- /src/appbase/CPlatformWin32.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/CPlatformWin32.cpp -------------------------------------------------------------------------------- /src/appbase/CPlatformWin32.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | class CPlatformWin32 6 | { 7 | public: 8 | enum DdeCommand { 9 | DDEOpen = 0x0001, /* open a file via explorer*/ 10 | DDENew = 0x0002, /* create a new file via explorer*/ 11 | DDEPrint = 0x0004, /* print a file via explorer*/ 12 | }; 13 | Q_DECLARE_FLAGS(DdeCommands, DdeCommand) 14 | 15 | static void registerFileType(const QString& documentId, 16 | const QString& fileTypeName, 17 | const QString& fileExtension, 18 | qint32 appIconIndex = 0, 19 | DdeCommands commands = DDEOpen); 20 | 21 | static void registerCommand(const QString& command, 22 | const QString& documentId, 23 | const QString cmdLineArg = QString::null, 24 | const QString ddeCommand = QString::null); 25 | 26 | private: 27 | static bool SetHkcrUserRegKey(QString key, 28 | const QString& value, 29 | const QString& valueName = QString::null); 30 | }; 31 | -------------------------------------------------------------------------------- /src/appbase/CStartPage.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #include "ui_CStartPage.h" 7 | 8 | class CMainWindow; 9 | 10 | 11 | class CStartPage : public QWidget 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | CStartPage(CMainWindow *parent); 17 | ~CStartPage(); 18 | 19 | protected: 20 | void createActions(); 21 | void createRecentDocs(); 22 | 23 | protected Q_SLOTS: 24 | void onCreateDocument(); 25 | void onRecentDocument(); 26 | void onRemoveDocument(); 27 | 28 | private Q_SLOTS: 29 | void on_CleanRecentButton_clicked(); 30 | 31 | private: 32 | Ui::CStartPage ui; 33 | CMainWindow *m_parent = nullptr; 34 | 35 | QMap m_buttons; 36 | }; 37 | -------------------------------------------------------------------------------- /src/appbase/Icons/action-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/Icons/action-delete.png -------------------------------------------------------------------------------- /src/appbase/Icons/document-export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/Icons/document-export.png -------------------------------------------------------------------------------- /src/appbase/Icons/document-new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/Icons/document-new.png -------------------------------------------------------------------------------- /src/appbase/Icons/document-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/Icons/document-open.png -------------------------------------------------------------------------------- /src/appbase/Icons/document-print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/Icons/document-print.png -------------------------------------------------------------------------------- /src/appbase/Icons/document-save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/appbase/Icons/document-save.png -------------------------------------------------------------------------------- /src/appbase/appbase.pri: -------------------------------------------------------------------------------- 1 | SOURCES += $$PWD/CPlatformServices.cpp $$PWD/CMainWindow.cpp $$PWD/CStartPage.cpp 2 | HEADERS += $$PWD/CPlatformServices.h $$PWD/CMainWindow.h $$PWD/CStartPage.h 3 | 4 | FORMS += $$files($$PWD/*.ui) 5 | RESOURCES += $$files($$PWD/*.qrc) 6 | 7 | unix{ 8 | !if(haiku|mac){ 9 | QT += x11extras 10 | LIBS += -lX11 11 | } 12 | !haiku { 13 | SOURCES += $$PWD/../3rdParty/qprocessinfo/qprocessinfo.cpp 14 | HEADERS += $$PWD/../3rdParty/qprocessinfo/qprocessinfo.h 15 | INCLUDEPATH += $$PWD/../3rdParty/qprocessinfo 16 | } 17 | } 18 | 19 | win32{ 20 | SOURCES += $$PWD/CPlatformWin32.cpp 21 | HEADERS += $$PWD/CPlatformWin32.h 22 | } 23 | -------------------------------------------------------------------------------- /src/appbase/appbase.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | Icons/action-delete.png 4 | Icons/document-new.png 5 | Icons/document-open.png 6 | Icons/document-print.png 7 | Icons/document-save.png 8 | Icons/document-export.png 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/commonui/CEasyTableWidget.cpp: -------------------------------------------------------------------------------- 1 | #include "CEasyTableWidget.h" 2 | 3 | CEasyTableWidget::CEasyTableWidget(QWidget * parent) : QTableWidget(parent) 4 | { 5 | } 6 | 7 | CEasyTableWidget::~CEasyTableWidget() 8 | { 9 | } 10 | 11 | void CEasyTableWidget::reset() 12 | { 13 | setRowCount(0); 14 | setColumnCount(0); 15 | } 16 | 17 | QTableWidgetItem* CEasyTableWidget::setCellText(int row, int column, const QString& text) 18 | { 19 | if (row < 0 || column < 0) 20 | return nullptr; 21 | 22 | if (row >= rowCount() - 1) 23 | setRowCount(row + 1); 24 | 25 | if (column >= columnCount() - 1) 26 | setColumnCount(column + 1); 27 | 28 | auto *cellItem = item(row, column); 29 | if (cellItem == nullptr) 30 | { 31 | cellItem = new QTableWidgetItem(text); 32 | setItem(row, column, cellItem); 33 | return cellItem; 34 | } 35 | else 36 | { 37 | cellItem->setText(text); 38 | return cellItem; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/commonui/CEasyTableWidget.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | class CEasyTableWidget : public QTableWidget 6 | { 7 | 8 | public: 9 | CEasyTableWidget(QWidget * parent = Q_NULLPTR); 10 | ~CEasyTableWidget(); 11 | 12 | void reset(); 13 | 14 | QTableWidgetItem* setCellText(int row, int column, const QString& text); 15 | QTableWidgetItem* setCellText(int row, int column, const QStringRef& text) { return setCellText(row, column, text.toString()); } 16 | }; 17 | -------------------------------------------------------------------------------- /src/commonui/CExtListInputDialog.cpp: -------------------------------------------------------------------------------- 1 | #include "CExtListInputDialog.h" 2 | #include "ui_CExtListInputDialog.h" 3 | 4 | #include 5 | 6 | CExtListInputDialog::CExtListInputDialog(QWidget *parent) : 7 | QDialog(parent), 8 | ui(new Ui::CExtListInputDialog) 9 | { 10 | ui->setupUi(this); 11 | 12 | ui->comboBox->view()->setAlternatingRowColors(true); 13 | ui->comboBox->setStyleSheet("QAbstractItemView::item { height: 32px;}"); 14 | ui->comboBox->setIconSize(QSize(24, 24)); 15 | } 16 | 17 | 18 | CExtListInputDialog::~CExtListInputDialog() 19 | { 20 | delete ui; 21 | } 22 | 23 | 24 | int CExtListInputDialog::getItemIndex(const QString& title, 25 | const QString& label, 26 | const QStringList &texts, 27 | const QList& icons, 28 | int selectedIndex) 29 | { 30 | static CExtListInputDialog* dialog = new CExtListInputDialog(nullptr); 31 | 32 | dialog->setWindowTitle(title); 33 | dialog->ui->label->setText(label); 34 | 35 | dialog->ui->comboBox->clear(); 36 | dialog->ui->comboBox->addItems(texts); 37 | while (dialog->ui->comboBox->count() < icons.size()) 38 | { 39 | dialog->ui->comboBox->addItem(""); 40 | } 41 | 42 | for (int i = 0; i < icons.size(); i++) 43 | { 44 | dialog->ui->comboBox->setItemIcon(i, icons.at(i)); 45 | } 46 | 47 | dialog->ui->comboBox->setCurrentIndex(selectedIndex); 48 | 49 | if (dialog->exec() == QDialog::Rejected) 50 | return -1; 51 | 52 | return dialog->ui->comboBox->currentIndex(); 53 | } 54 | 55 | 56 | int CExtListInputDialog::getItemIndex(const QString& title, 57 | const QString& label, 58 | const QStringList &texts, 59 | int selectedIndex) 60 | { 61 | static CExtListInputDialog* dialog = new CExtListInputDialog(nullptr); 62 | 63 | dialog->setWindowTitle(title); 64 | dialog->ui->label->setText(label); 65 | 66 | dialog->ui->comboBox->clear(); 67 | dialog->ui->comboBox->addItems(texts); 68 | 69 | dialog->ui->comboBox->setCurrentIndex(selectedIndex); 70 | 71 | if (dialog->exec() == QDialog::Rejected) 72 | return -1; 73 | 74 | return dialog->ui->comboBox->currentIndex(); 75 | } 76 | 77 | -------------------------------------------------------------------------------- /src/commonui/CExtListInputDialog.h: -------------------------------------------------------------------------------- 1 | #ifndef CExtListInputDialog_H 2 | #define CExtListInputDialog_H 3 | 4 | #include 5 | 6 | namespace Ui { 7 | class CExtListInputDialog; 8 | } 9 | 10 | class CExtListInputDialog : public QDialog 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | ~CExtListInputDialog(); 16 | 17 | static int getItemIndex(const QString &title, 18 | const QString &label, 19 | const QStringList& texts, 20 | const QList& icons, 21 | int selectedIndex = 0); 22 | 23 | static int getItemIndex(const QString &title, 24 | const QString &label, 25 | const QStringList& texts, 26 | int selectedIndex = 0); 27 | 28 | private: 29 | explicit CExtListInputDialog(QWidget *parent = nullptr); 30 | 31 | Ui::CExtListInputDialog *ui; 32 | }; 33 | 34 | 35 | #endif // CExtListInputDialog_H 36 | -------------------------------------------------------------------------------- /src/commonui/CExtListInputDialog.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | CExtListInputDialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 330 10 | 86 11 | 12 | 13 | 14 | Dialog 15 | 16 | 17 | 18 | 19 | 20 | Select an item: 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Qt::Horizontal 31 | 32 | 33 | QDialogButtonBox::Cancel|QDialogButtonBox::Ok 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | buttonBox 43 | accepted() 44 | CExtListInputDialog 45 | accept() 46 | 47 | 48 | 248 49 | 254 50 | 51 | 52 | 157 53 | 274 54 | 55 | 56 | 57 | 58 | buttonBox 59 | rejected() 60 | CExtListInputDialog 61 | reject() 62 | 63 | 64 | 316 65 | 260 66 | 67 | 68 | 286 69 | 274 70 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /src/commonui/CPropertyEditorUIBase.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | class CPropertyEditorUIBase : public QtTreePropertyBrowser 7 | { 8 | Q_OBJECT 9 | 10 | public: 11 | CPropertyEditorUIBase(QWidget *parent = Q_NULLPTR); 12 | virtual ~CPropertyEditorUIBase(); 13 | 14 | QtBrowserItem* selectItemByName(const QString& name); 15 | 16 | QtProperty* getCurrentTopProperty() const; 17 | QString getCurrentTopPropertyName() const; 18 | QVariant getCurrentTopPropertyValue() const; 19 | int getCurrentTopPropertyValueType() const; 20 | 21 | QVariant getCurrentPropertyValue() const; 22 | int getCurrentPropertyValueType() const; 23 | 24 | virtual void updateTooltip(QtVariantProperty* prop); 25 | }; 26 | -------------------------------------------------------------------------------- /src/commonui/CQuickHelpUI.cpp: -------------------------------------------------------------------------------- 1 | #include "CQuickHelpUI.h" 2 | #include "ui_CQuickHelpUI.h" 3 | 4 | #include 5 | #include 6 | 7 | 8 | CQuickHelpUI::CQuickHelpUI(QWidget *parent): 9 | QWidget(parent), 10 | ui(new Ui::CQuickHelpUI) 11 | { 12 | ui->setupUi(this); 13 | 14 | //QStringList sl; 15 | //sl << QApplication::applicationDirPath() + "/../lang/en"; 16 | //ui->Viewer->setSearchPaths(sl); 17 | //ui->Viewer->setSource(QUrl("help.htm")); 18 | 19 | QFile file(":/Help/Mini_EN"); 20 | if (file.open(QFile::ReadOnly | QFile::Text)) 21 | { 22 | QTextStream stream(&file); 23 | ui->Viewer->setHtml(stream.readAll()); 24 | } 25 | } 26 | 27 | 28 | CQuickHelpUI::~CQuickHelpUI() 29 | { 30 | } 31 | 32 | -------------------------------------------------------------------------------- /src/commonui/CQuickHelpUI.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | namespace Ui { 6 | class CQuickHelpUI; 7 | } 8 | 9 | 10 | class CQuickHelpUI : public QWidget 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | CQuickHelpUI(QWidget *parent = 0); 16 | ~CQuickHelpUI(); 17 | 18 | private: 19 | Ui::CQuickHelpUI *ui; 20 | }; 21 | 22 | -------------------------------------------------------------------------------- /src/commonui/CQuickHelpUI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | CQuickHelpUI 4 | 5 | 6 | 7 | 0 8 | 0 9 | 400 10 | 300 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 0 22 | 23 | 24 | 0 25 | 26 | 27 | 0 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /src/commonui/commonui.pro: -------------------------------------------------------------------------------- 1 | include($$PWD/../lib.pri) 2 | 3 | TARGET = commonui 4 | QT += core gui widgets 5 | 6 | # sources 7 | SOURCES += $$files($$PWD/*.cpp) 8 | HEADERS += $$files($$PWD/*.h) 9 | FORMS += $$files($$PWD/*.ui) 10 | 11 | # includes 12 | INCLUDEPATH += $$PWD $$PWD/.. 13 | INCLUDEPATH += $$PWD/../3rdParty 14 | INCLUDEPATH += $$PWD/../3rdParty/qsint-widgets 15 | INCLUDEPATH += $$PWD/../3rdParty/qtpropertybrowser -------------------------------------------------------------------------------- /src/config.pri: -------------------------------------------------------------------------------- 1 | # This file is a part of 2 | # QVGE - Qt Visual Graph Editor 3 | # 4 | # (c) 2016-2022 Ars L. Masiuk (ars.masiuk@gmail.com) 5 | # 6 | # It can be used freely, maintaining the information above. 7 | 8 | #CONFIG += USE_OGDF 9 | CONFIG += USE_GVGRAPH 10 | #CONFIG += USE_BOOST 11 | 12 | 13 | # external OGDF 14 | USE_OGDF{ 15 | DEFINES += USE_OGDF 16 | 17 | # system-specific OGDF setup 18 | #OGDF_LIB_NAME = ogdf 19 | #OGDF_LIB_PATH = 20 | #OGDF_INCLUDE_PATH = /usr/share/ogdf/include 21 | OGDF_LIB_NAME = ogdf-2020 22 | OGDF_LIB_PATH = "w:\Projects\qvge_github\repo\qvge.0.7.old\src\lib" 23 | OGDF_INCLUDE_PATH = "w:\Projects\qvge_github\repo\qvge.0.7.old\src\3rdParty\ogdf-2020\include" 24 | } 25 | 26 | # external boost::graph 27 | USE_BOOST{ 28 | DEFINES += USE_BOOST 29 | 30 | # system-specific Boost setup 31 | BOOST_LIB_NAME = boost_graph 32 | BOOST_LIB_PATH = 33 | BOOST_INCLUDE_PATH = /usr/share/boost/include 34 | } 35 | 36 | # external GraphViz (only #define) 37 | USE_GVGRAPH{ 38 | DEFINES += USE_GVGRAPH 39 | } 40 | 41 | 42 | # compiler stuff 43 | win32-msvc*{ 44 | QMAKE_CXXFLAGS += /MP 45 | } 46 | 47 | gcc{ 48 | QMAKE_CXXFLAGS += -Wno-unused-variable -Wno-unused-parameter -Wno-misleading-indentation 49 | QMAKE_CXXFLAGS += -isystem 50 | } 51 | 52 | 53 | # common config 54 | QT += core gui widgets xml opengl network printsupport svg 55 | CONFIG += c++14 56 | 57 | 58 | # output 59 | CONFIG(debug, debug|release){ 60 | LIBS += -L$$OUT_PWD/../lib.debug 61 | } 62 | else{ 63 | LIBS += -L$$OUT_PWD/../lib 64 | } 65 | 66 | # temp dirs (unix) 67 | unix{ 68 | MOC_DIR = $$OUT_PWD/_generated 69 | OBJECTS_DIR = $$OUT_PWD/_generated 70 | UI_DIR = $$OUT_PWD/_generated 71 | RCC_DIR = $$OUT_PWD/_generated 72 | } 73 | -------------------------------------------------------------------------------- /src/lib.pri: -------------------------------------------------------------------------------- 1 | # This file is a part of 2 | # QVGE - Qt Visual Graph Editor 3 | # 4 | # (c) 2016-2020 Ars L. Masiuk (ars.masiuk@gmail.com) 5 | # 6 | # It can be used freely, maintaining the information above. 7 | 8 | TEMPLATE=lib 9 | CONFIG+=static 10 | 11 | include($$PWD/config.pri) 12 | 13 | CONFIG(debug, debug|release){ 14 | DESTDIR = $$OUT_PWD/../lib.debug 15 | } 16 | else{ 17 | DESTDIR = $$OUT_PWD/../lib 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/qdot/CDOTPreviewPage.h: -------------------------------------------------------------------------------- 1 | #ifndef CDOTPREVIEWPAGE_H 2 | #define CDOTPREVIEWPAGE_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace Ui { 10 | class CDOTPreviewPage; 11 | } 12 | 13 | class CDOTPreviewPage : public QWidget 14 | { 15 | Q_OBJECT 16 | 17 | public: 18 | explicit CDOTPreviewPage(QWidget *parent = nullptr); 19 | ~CDOTPreviewPage(); 20 | 21 | bool load(const QString &fileName, QString *lastError = nullptr); 22 | 23 | Q_SIGNALS: 24 | void documentChanged(bool changed); 25 | 26 | private Q_SLOTS: 27 | void on_LayoutButton_activated(QVariant data); 28 | void on_DotEditor_undoAvailable(bool available); 29 | 30 | private: 31 | bool runPreview(const QString &engine, const QString &dotFilePath, QString &svgFilePath, QString* lastError = nullptr) const; 32 | QString errorNotWritable(const QString &path) const; 33 | QString errorCannotRun(const QString &path) const; 34 | QString errorCannotFinish(const QString &path) const; 35 | 36 | Ui::CDOTPreviewPage *ui; 37 | QGraphicsScene m_previewScene; 38 | QGraphicsSvgItem m_previewItem; 39 | 40 | QString m_dotFileName; 41 | }; 42 | 43 | #endif // CDOTPREVIEWPAGE_H 44 | -------------------------------------------------------------------------------- /src/qdot/CDOTPreviewPage.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | CDOTPreviewPage 4 | 5 | 6 | 7 | 0 8 | 0 9 | 640 10 | 480 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 20 | Qt::Horizontal 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | Layout 32 | 33 | 34 | 35 | 36 | 37 | 38 | 0 39 | 0 40 | 41 | 42 | 43 | ... 44 | 45 | 46 | QToolButton::MenuButtonPopup 47 | 48 | 49 | Qt::ToolButtonTextBesideIcon 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | Export 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | QSint::QSplitButton 72 | QToolButton 73 |
qsplitbutton.h
74 |
75 |
76 | 77 | 78 |
79 | -------------------------------------------------------------------------------- /src/qdot/Icons/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qdot/Icons/AppIcon.png -------------------------------------------------------------------------------- /src/qdot/lang/en/help.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Some useful hotkeys and actions

4 | 5 |

Selection

6 |

7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
Ctrl+Up   Increase nodes size
Ctrl+Down   Decrease nodes size
Ctrl+Right   Increase edges weight
Ctrl+Left   Decrease edges weight
Cursor keys   Move by one pixel
Shift+Cursor keys   Move by grid step
Shift while moving   Move with vertical or horizontal snap
Ctrl while moving   Clone selection
Ctrl+Click   Extend/contract selection
20 | 21 | 22 |

Workspace

23 |

24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
Ctrl+A   Select all objects
Alt+Cursor keys   Scroll visible area
Ctrl+ +   Zoom in
Ctrl+ -   Zoom out
33 | 34 | 35 |

Labels

36 |

37 | 38 | 39 | 40 | 41 | 42 | 43 |
Double click   Begin editing label
Enter   Start next line
Esc   Finish label editing
44 | 45 | 46 |

Polylines

47 |

48 | 49 | 50 | 51 | 52 |
Double click+Drag   Create a node
Right click on a node   Remove node
53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/qdot/main.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include 11 | 12 | #include "qdotMainWindow.h" 13 | 14 | 15 | int main(int argc, char *argv[]) 16 | { 17 | QApplication a(argc, argv); 18 | Q_INIT_RESOURCE(qvgeui); 19 | Q_INIT_RESOURCE(appbase); 20 | a.setWindowIcon(QIcon(":/Icons/AppIcon")); 21 | // a.setStyle("fusion"); 22 | // a.setStyle("windows"); 23 | 24 | qdotMainWindow w; 25 | w.init(a.arguments()); 26 | 27 | return a.exec(); 28 | } 29 | 30 | -------------------------------------------------------------------------------- /src/qdot/qdot.pro: -------------------------------------------------------------------------------- 1 | # This file is a part of 2 | # QVGE - Qt Visual Graph Editor 3 | # 4 | # (c) 2016-2020 Ars L. Masiuk (ars.masiuk@gmail.com) 5 | # 6 | # It can be used freely, maintaining the information above. 7 | 8 | 9 | TEMPLATE = app 10 | TARGET = qdot 11 | 12 | win32{ 13 | VERSION = 0.0.1.0 14 | RC_ICONS = $$PWD/win32/icon.ico 15 | QMAKE_TARGET_COPYRIGHT = (C) 2016-2020 Ars L. Masiuk 16 | QMAKE_TARGET_DESCRIPTION = Qt Visual GraphViz Assistent 17 | QMAKE_TARGET_PRODUCT = qdot 18 | } 19 | 20 | 21 | include($$PWD/../config.pri) 22 | include($$PWD/../app.pri) 23 | 24 | 25 | # app sources 26 | SOURCES += $$files($$PWD/*.cpp) 27 | HEADERS += $$files($$PWD/*.h) 28 | FORMS += $$files($$PWD/*.ui) 29 | RESOURCES += $$files($$PWD/*.qrc) 30 | 31 | 32 | # includes & libs 33 | INCLUDEPATH += $$PWD 34 | 35 | 36 | # install 37 | unix{ 38 | PREFIX_DIR = $${PREFIX} 39 | 40 | #message($$PREFIX_DIR) 41 | 42 | isEmpty(PREFIX_DIR) { 43 | PREFIX_DIR = /usr/local 44 | } 45 | 46 | #message($$PREFIX_DIR) 47 | 48 | target.path = $$PREFIX_DIR/bin 49 | 50 | #message($$target.path) 51 | 52 | INSTALLS += target 53 | 54 | desktop.path = $$PREFIX_DIR/share/applications/ 55 | desktop.files = $$PWD/linux/qdot.desktop 56 | INSTALLS += desktop 57 | 58 | icon.path = $$PREFIX_DIR/share/pixmaps 59 | icon.files = $$PWD/linux/qdot.png 60 | INSTALLS += icon 61 | 62 | appdata.path = $$PREFIX_DIR/share/appdata/ 63 | appdata.files = $$PWD/linux/qdot.appdata.xml 64 | INSTALLS += appdata 65 | } 66 | 67 | -------------------------------------------------------------------------------- /src/qdot/qdot.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | Icons/AppIcon.png 4 | 5 | 6 | lang/en/help.htm 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/qdot/qdotMainWindow.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | 15 | #include 16 | 17 | 18 | class CDOTPreviewPage; 19 | 20 | 21 | class qdotMainWindow : public CMainWindow 22 | { 23 | Q_OBJECT 24 | 25 | public: 26 | typedef CMainWindow Super; 27 | 28 | qdotMainWindow(QWidget *parent = nullptr); 29 | virtual ~qdotMainWindow(); 30 | 31 | virtual void init(const QStringList& args); 32 | 33 | virtual QSettings& getApplicationSettings() const; 34 | 35 | protected: 36 | virtual void createStartPage(); 37 | 38 | virtual bool createDocument(const QByteArray &docType); 39 | virtual void destroyDocument(); 40 | virtual void onNewDocumentCreated(const QByteArray &docType); 41 | virtual bool openDocument(const QString &fileName, QByteArray &docType); 42 | virtual bool saveDocument(const QString &fileName, const QString &selectedFilter, const QByteArray &docType); 43 | 44 | virtual QString getAboutText() const; 45 | 46 | virtual void doReadSettings(QSettings& settings); 47 | virtual void doWriteSettings(QSettings& settings); 48 | 49 | private: 50 | void updateFileAssociations(); 51 | 52 | CDOTPreviewPage* m_dotPreviewPage = nullptr; 53 | 54 | bool m_portable = false; 55 | }; 56 | 57 | -------------------------------------------------------------------------------- /src/qdot/qdotVersion.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | static QString qdotVersionString("0.0.1"); 16 | static QVersionNumber qdotVersion = QVersionNumber::fromString(qdotVersionString); 17 | 18 | -------------------------------------------------------------------------------- /src/qdot/win32/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qdot/win32/icon.ico -------------------------------------------------------------------------------- /src/qvge.pro: -------------------------------------------------------------------------------- 1 | # This file is a part of 2 | # QVGE - Qt Visual Graph Editor 3 | # 4 | # (c) 2016-2024 Ars L. Masiuk (ars.masiuk@gmail.com) 5 | # 6 | # It can be used freely, maintaining the information above. 7 | 8 | 9 | TEMPLATE = subdirs 10 | CONFIG += ordered 11 | 12 | include($$PWD/config.pri) 13 | 14 | SUBDIRS += qtpropertybrowser 15 | qtpropertybrowser.file = $$PWD/3rdParty/qtpropertybrowser/qtpropertybrowser.pro 16 | 17 | SUBDIRS += qsint 18 | qsint.file = $$PWD/3rdParty/qsint-widgets/qsint-widgets.pro 19 | 20 | SUBDIRS += qvgeio 21 | qvgeio.file = $$PWD/qvgeio/qvgeio.pro 22 | 23 | SUBDIRS += qvgelib 24 | qvgelib.file = $$PWD/qvgelib/qvgelib.pro 25 | 26 | SUBDIRS += commonui 27 | commonui.file = $$PWD/commonui/commonui.pro 28 | 29 | SUBDIRS += qvgeioui 30 | qvgeioui.file = $$PWD/qvgeioui/qvgeioui.pro 31 | 32 | SUBDIRS += qvgeui 33 | qvgeui.file = $$PWD/qvgeui/qvgeui.pro 34 | 35 | SUBDIRS += qvge 36 | qvge.file = $$PWD/qvge/qvge.pro 37 | 38 | #SUBDIRS += qdot 39 | #qdot.file= $$PWD/qdot/qdot.pro 40 | -------------------------------------------------------------------------------- /src/qvge/Icons/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvge/Icons/AppIcon.png -------------------------------------------------------------------------------- /src/qvge/lang/en/help.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Some useful hotkeys and actions

4 | 5 |

Selection

6 |

7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
Ctrl+Up   Increase nodes size
Ctrl+Down   Decrease nodes size
Ctrl+Right   Increase edges weight
Ctrl+Left   Decrease edges weight
Cursor keys   Move by one pixel
Shift+Cursor keys   Move by grid step
Shift while moving   Move with vertical or horizontal snap
Ctrl while moving   Clone selection
Ctrl while node drop   Dont merge nodes on drop
Ctrl+Click   Extend/contract selection
21 | 22 | 23 |

Workspace

24 |

25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
Ctrl+A   Select all objects
Alt+Cursor keys   Scroll visible area
Ctrl+ +   Zoom in
Ctrl+ -   Zoom out
34 | 35 | 36 |

Labels

37 |

38 | 39 | 40 | 41 | 42 | 43 | 44 |
Double click   Begin editing label
Enter   Start next line
Esc   Finish label editing
45 | 46 | 47 |

Polylines

48 |

49 | 50 | 51 | 52 | 53 |
Double click+Drag   Create a node
Right click on a node   Remove node
54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/qvge/linux/application-xgr.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | XGR - binary QVGE graph format 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/qvge/linux/qvge.appdata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | qvge.desktop 5 | MIT 6 | MIT 7 | BSD 8 | LGPL-3.0 9 | Qt visual graph editor 10 |

View and manipulate small till middle-sized graphs. 11 | 12 |

13 | Application for viewing and manipulating small till middle-sized graphs. It supports several formats (GraphML, GEXF, GML, GraphViz/Dot). 14 |

15 |
16 | https://github.com/ArsMasiuk/qvge 17 | https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Z35EHHJ3729GG&source=url 18 | 19 | 20 | https://user-images.githubusercontent.com/19762856/85934275-2a985480-b8e1-11ea-81a9-a5b81f3365e2.PNG 21 | Screenshot of the main window 22 | 23 | 24 | https://github.com/ArsMasiuk/qvge/issues 25 | qvge 26 | 27 | -------------------------------------------------------------------------------- /src/qvge/linux/qvge.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Encoding=UTF-8 3 | Terminal=false 4 | Name=Qt Visual Graph Editor 5 | Comment=View and manipulate small till middle-sized graphs 6 | Exec=qvgeapp %F 7 | Icon=qvge.png 8 | Type=Application 9 | Categories=Graphics;2DGraphics;Education;Science;DataVisualization;ComputerScience;Math;Viewer;Development;Qt; 10 | MimeType=application/xgr 11 | -------------------------------------------------------------------------------- /src/qvge/linux/qvge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvge/linux/qvge.png -------------------------------------------------------------------------------- /src/qvge/linux/qvge.spec: -------------------------------------------------------------------------------- 1 | Name: qvge 2 | Version: 0.6.2 3 | Release: 1 4 | Summary: Qt Visual Graph Editor 5 | License: MIT 6 | URL: https://github.com/ArsMasiuk/qvge 7 | BuildRequires: qt5-devel >= 5.9.0 8 | 9 | %description 10 | QVGE is a multiplatform graph editor written in C++/Qt. Its main goal is to make possible visually edit two-dimensional graphs in a simple and intuitive way. 11 | 12 | QVGE is designed for viewing and manipulating small till middle-sized graphs. It supports several formats (GraphML, GEXF, GML, GraphViz/Dot). 13 | 14 | %install 15 | mkdir -p %{buildroot}/usr/local/bin 16 | cp /usr/local/bin/qvgeapp %buildroot/usr/local/bin 17 | 18 | mkdir -p %{buildroot}/usr/local/share/applications 19 | cp /usr/local/share/applications/qvge.desktop %buildroot/usr/local/share/applications 20 | 21 | mkdir -p %{buildroot}/usr/local/share/pixmaps 22 | cp /usr/local/share/pixmaps/qvge.png %buildroot/usr/local/share/pixmaps 23 | 24 | mkdir -p %{buildroot}/usr/local/share/appdata 25 | cp /usr/local/share/appdata/qvge.appdata.xml %buildroot/usr/local/share/appdata 26 | 27 | mkdir -p %{buildroot}/usr/local/share/mime/packages 28 | cp /usr/local/share/mime/packages/application-xgr.xml %buildroot/usr/local/share/mime/packages 29 | 30 | 31 | %files 32 | /usr/local/bin/qvgeapp 33 | /usr/local/share/applications/qvge.desktop 34 | /usr/local/share/pixmaps/qvge.png 35 | /usr/local/share/appdata/qvge.appdata.xml 36 | /usr/local/share/mime/packages/application-xgr.xml 37 | 38 | %changelog 39 | ------------------------------------------------------------------------------- 40 | * Sat Dec 12 2020 Ars Masiuk 0.6.2 41 | - import of GraphML in SocNetV format supported 42 | - GraphViz accessibility and version can be checked out of the Options dialog 43 | - if GraphViz layout engine happens to freeze, it can be aborted by user via GUI (no need to call Task Manager anymore) 44 | - fixed crash when pressing Escape after creating of a node and immediately editing of a text label (#123) 45 | - fixed issue with forwarding keyboard events during editing of a text label (#124) 46 | - fixed importing default GraphML attributes 47 | - fixed a typo in the default attribute name (#125) 48 | - fixed loading edge id from DOT format 49 | - fixed moving nodes via keyboard 50 | - fixed nodes snapping after transformation 51 | 52 | * Mon Nov 11 2020 Ars Masiuk 0.6.1 53 | - Tighter integration with GraphViz 54 | - Various bugfixes and minor improvements 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/qvge/main.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include 11 | 12 | #include "qvgeMainWindow.h" 13 | 14 | 15 | int main(int argc, char *argv[]) 16 | { 17 | QApplication a(argc, argv); 18 | Q_INIT_RESOURCE(qvgeui); 19 | Q_INIT_RESOURCE(appbase); 20 | a.setWindowIcon(QIcon(":/Icons/AppIcon")); 21 | // a.setStyle("fusion"); 22 | // a.setStyle("windows"); 23 | 24 | qvgeMainWindow w; 25 | w.init(a.arguments()); 26 | 27 | return a.exec(); 28 | } 29 | 30 | -------------------------------------------------------------------------------- /src/qvge/qvge.pro: -------------------------------------------------------------------------------- 1 | # This file is a part of 2 | # QVGE - Qt Visual Graph Editor 3 | # 4 | # (c) 2016-2020 Ars L. Masiuk (ars.masiuk@gmail.com) 5 | # 6 | # It can be used freely, maintaining the information above. 7 | 8 | 9 | TEMPLATE = app 10 | TARGET = qvge 11 | 12 | win32{ 13 | VERSION = 0.7.0.0 14 | RC_ICONS = $$PWD/win32/icon.ico 15 | QMAKE_TARGET_COPYRIGHT = (C) 2016-2020 Ars L. Masiuk 16 | QMAKE_TARGET_DESCRIPTION = Qt Visual Graph Editor 17 | QMAKE_TARGET_PRODUCT = qvge 18 | LIBS += -ladvapi32 19 | } 20 | 21 | 22 | include($$PWD/../config.pri) 23 | include($$PWD/../app.pri) 24 | 25 | 26 | # app sources 27 | SOURCES += $$files($$PWD/*.cpp) 28 | HEADERS += $$files($$PWD/*.h) 29 | FORMS += $$files($$PWD/*.ui) 30 | RESOURCES += $$files($$PWD/*.qrc) 31 | 32 | 33 | # includes & libs 34 | INCLUDEPATH += $$PWD 35 | 36 | 37 | # install 38 | unix{ 39 | PREFIX_DIR = $${PREFIX} 40 | 41 | #message($$PREFIX_DIR) 42 | 43 | isEmpty(PREFIX_DIR) { 44 | PREFIX_DIR = /usr/local 45 | } 46 | 47 | #message($$PREFIX_DIR) 48 | 49 | target.path = $$PREFIX_DIR/bin 50 | 51 | #message($$target.path) 52 | 53 | INSTALLS += target 54 | 55 | desktop.path = $$PREFIX_DIR/share/applications/ 56 | desktop.files = $$PWD/linux/qvge.desktop 57 | INSTALLS += desktop 58 | 59 | icon.path = $$PREFIX_DIR/share/pixmaps 60 | icon.files = $$PWD/linux/qvge.png 61 | INSTALLS += icon 62 | 63 | appdata.path = $$PREFIX_DIR/share/appdata/ 64 | appdata.files = $$PWD/linux/qvge.appdata.xml 65 | INSTALLS += appdata 66 | 67 | xgr.path = $$PREFIX_DIR/share/mime/packages/ 68 | xgr.files = $$PWD/linux/application-xgr.xml 69 | INSTALLS += xgr 70 | } 71 | 72 | -------------------------------------------------------------------------------- /src/qvge/qvge.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | Icons/AppIcon.png 4 | 5 | 6 | lang/en/help.htm 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/qvge/qvgeMainWindow.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef QVGEMAINWINDOW_H 11 | #define QVGEMAINWINDOW_H 12 | 13 | #include 14 | #include 15 | 16 | #include 17 | 18 | 19 | class CNodeEditorUIController; 20 | 21 | 22 | class qvgeMainWindow : public CMainWindow 23 | { 24 | Q_OBJECT 25 | 26 | public: 27 | typedef CMainWindow Super; 28 | 29 | friend class CNodeEditorUIController; 30 | 31 | qvgeMainWindow(QWidget *parent = nullptr); 32 | virtual ~qvgeMainWindow(); 33 | 34 | virtual void init(const QStringList& args); 35 | 36 | virtual QSettings& getApplicationSettings() const; 37 | 38 | protected: 39 | virtual bool createDocument(const QByteArray &docType); 40 | virtual void destroyDocument(); 41 | virtual void onNewDocumentCreated(const QByteArray &docType); 42 | virtual bool openDocument(const QString &fileName, QByteArray &docType); 43 | virtual bool saveDocument(const QString &fileName, const QString &selectedFilter, const QByteArray &docType); 44 | 45 | virtual QString getAboutText() const; 46 | 47 | virtual void doReadSettings(QSettings& settings); 48 | virtual void doWriteSettings(QSettings& settings); 49 | 50 | private: 51 | void updateFileAssociations(); 52 | 53 | CNodeEditorUIController *m_graphEditController = nullptr; 54 | 55 | QPlainTextEdit *m_textEditor = nullptr; 56 | 57 | bool m_portable = false; 58 | }; 59 | 60 | #endif // QVGEMAINWINDOW_H 61 | -------------------------------------------------------------------------------- /src/qvge/qvgeVersion.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef QVGEVERSION_H 11 | #define QVGEVERSION_H 12 | 13 | #include 14 | 15 | 16 | static QString qvgeVersionString("0.7.0"); 17 | static QVersionNumber qvgeVersion = QVersionNumber::fromString(qvgeVersionString); 18 | 19 | 20 | #endif // QVGEVERSION_H 21 | -------------------------------------------------------------------------------- /src/qvge/win32/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvge/win32/icon.ico -------------------------------------------------------------------------------- /src/qvgeio/CFormatDOT.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | class CFormatDOT 16 | { 17 | public: 18 | bool load(const QString& fileName, Graph& graph, QString* lastError = nullptr) const; 19 | bool save(const QString& fileName, Graph& graph, QString* lastError = nullptr) const; 20 | }; 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/qvgeio/CFormatGraphML.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include 19 | 20 | 21 | class CFormatGraphML 22 | { 23 | public: 24 | bool load(const QString& fileName, Graph& graph, QString* lastError = nullptr) const; 25 | bool save(const QString& fileName, Graph& graph, QString* lastError = nullptr) const; 26 | 27 | private: 28 | typedef QMap KeyAttrMap; // key:attrId 29 | typedef QMap ClassKeyAttrMap; // class <> (key:attrId) 30 | 31 | bool readAttrKey(int index, const QDomNode &domNode, Graph& graph, ClassKeyAttrMap& cka) const; 32 | bool readNode(int index, const QDomNode &domNode, Graph& graph, const KeyAttrMap& nodeKeys) const; 33 | bool readEdge(int index, const QDomNode &domNode, Graph& graph, const KeyAttrMap& edgeKeys) const; 34 | 35 | void writeAttributes(QXmlStreamWriter &xsw, const AttributeInfos &attrs, const QByteArray &classId) const; 36 | void writeAttribute(QXmlStreamWriter &xsw, const QString &keyId, const QVariant &value) const; 37 | void writeNodes(QXmlStreamWriter &xsw, const Graph& graph) const; 38 | void writeEdges(QXmlStreamWriter &xsw, const Graph& graph) const; 39 | 40 | enum EdgeType { 41 | Directed, 42 | Undirected, 43 | Mutual 44 | }; 45 | mutable QString m_edgeType; 46 | }; 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/qvgeio/CFormatPlainDOT.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | class CFormatPlainDOT 16 | { 17 | public: 18 | bool load(const QString& fileName, Graph& graph, QString* lastError = nullptr) const; 19 | bool save(const QString& fileName, Graph& graph, QString* lastError = nullptr) const; 20 | 21 | private: 22 | struct GraphInternal 23 | { 24 | float g_scale = 1.0; 25 | float g_x = 1.0; 26 | float g_y = 1.0; 27 | 28 | Graph* g = nullptr; 29 | }; 30 | 31 | bool parseGraph(const QStringList& refs, GraphInternal &gi) const; 32 | bool parseNode(const QStringList& refs, GraphInternal &gi) const; 33 | bool parseEdge(const QStringList& refs, GraphInternal &gi) const; 34 | }; 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/qvgeio/CGraphBase.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CGraphBase.h" 11 | 12 | 13 | void Graph::clear() 14 | { 15 | attrs.clear(); 16 | nodes.clear(); 17 | edges.clear(); 18 | 19 | nodeAttrs.clear(); 20 | edgeAttrs.clear(); 21 | graphAttrs.clear(); 22 | } 23 | 24 | 25 | int Graph::findNodeIndex(const QString &id) const 26 | { 27 | QByteArray bid = id.toUtf8(); 28 | 29 | for (int i = 0; i < nodes.count(); ++i) 30 | if (nodes.at(i).id == bid) 31 | return i; 32 | 33 | return -1; 34 | } 35 | -------------------------------------------------------------------------------- /src/qvgeio/CGraphBase.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | 20 | typedef QMap GraphAttributes; 21 | 22 | 23 | enum AttrFlags 24 | { 25 | ATTR_NONE = 0, 26 | ATTR_VIRTUAL = 1, // read only, not to be stored & read 27 | ATTR_FIXED = 2, // non-user defined 28 | ATTR_NODEFAULT = 4, // has no default value 29 | ATTR_MAPPED = 8 // internal: mapped to some system value, i.e. coordinate or size 30 | }; 31 | 32 | 33 | struct AttrInfo 34 | { 35 | QByteArray id; 36 | QString name; 37 | int valueType = 0; 38 | QVariant defaultValue; 39 | }; 40 | 41 | typedef QMap AttributeInfos; 42 | 43 | 44 | struct NodePort 45 | { 46 | QString name; 47 | float x = 0, y = 0; 48 | QColor color; 49 | int anchor = 0; 50 | }; 51 | 52 | typedef QMap NodePorts; 53 | 54 | 55 | struct Node 56 | { 57 | // generic data 58 | QByteArray id; 59 | GraphAttributes attrs; 60 | 61 | // only for ports 62 | NodePorts ports; 63 | }; 64 | 65 | 66 | struct Edge 67 | { 68 | // generic data 69 | QByteArray id; 70 | GraphAttributes attrs; 71 | 72 | QByteArray startNodeId; 73 | QByteArray endNodeId; 74 | 75 | // only for ports 76 | QByteArray startPortId; 77 | QByteArray endPortId; 78 | }; 79 | 80 | 81 | struct Graph 82 | { 83 | QList nodes; 84 | QList edges; 85 | GraphAttributes attrs; 86 | 87 | AttributeInfos nodeAttrs; 88 | AttributeInfos edgeAttrs; 89 | AttributeInfos graphAttrs; 90 | 91 | // methods 92 | void clear(); 93 | int findNodeIndex(const QString &id) const; 94 | }; 95 | 96 | -------------------------------------------------------------------------------- /src/qvgeio/qvgeio.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = lib 2 | TARGET = qvgeio 3 | 4 | 5 | # common config 6 | CONFIG += static c++14 7 | QT += core xml 8 | 9 | 10 | # compiler stuff 11 | win32-msvc*{ 12 | QMAKE_CXXFLAGS += /MP 13 | } 14 | 15 | gcc{ 16 | QMAKE_CXXFLAGS += -Wno-unused-variable -Wno-unused-parameter 17 | QMAKE_CXXFLAGS += -isystem 18 | } 19 | 20 | 21 | # input 22 | SOURCES += $$files($$PWD/*.cpp) 23 | HEADERS += $$files($$PWD/*.h) 24 | #FORMS += $$files($$PWD/*.ui) 25 | #RESOURCES += $$files($$PWD/*.qrc) 26 | 27 | INCLUDEPATH += $$PWD $$PWD/.. 28 | 29 | 30 | # output 31 | CONFIG(debug, debug|release){ 32 | DESTDIR = $$OUT_PWD/../lib.debug 33 | } 34 | else{ 35 | DESTDIR = $$OUT_PWD/../lib 36 | } 37 | -------------------------------------------------------------------------------- /src/qvgeioui/CCSVImportDialog.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | 6 | namespace Ui { 7 | class CCSVImportDialog; 8 | } 9 | 10 | 11 | class CCSVImportDialog : public QDialog 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | CCSVImportDialog(QWidget *parent = 0); 17 | ~CCSVImportDialog(); 18 | 19 | void setFileName(const QString &fileName); 20 | 21 | const QString& getLastErrorText() const { 22 | return m_lastErrorText; 23 | } 24 | 25 | virtual int exec(); 26 | 27 | private Q_SLOTS: 28 | void on_CustomDelim_toggled(bool on); 29 | void OnDelimToggled(bool on); 30 | void OnCustomChanged(const QString &text); 31 | 32 | private: 33 | int withError(const QString &text); 34 | void preview(); 35 | 36 | Ui::CCSVImportDialog *ui; 37 | 38 | QString m_fileName; 39 | QStringList m_lines; 40 | QString m_lastErrorText; 41 | }; 42 | 43 | -------------------------------------------------------------------------------- /src/qvgeioui/CDOTExportDialog.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CDOTExportDialog.h" 11 | #include "ui_CDOTExportDialog.h" 12 | 13 | 14 | CDOTExportDialog::CDOTExportDialog(QWidget *parent): 15 | QDialog(parent), 16 | ui(new Ui::CDOTExportDialog) 17 | { 18 | ui->setupUi(this); 19 | } 20 | 21 | 22 | CDOTExportDialog::~CDOTExportDialog() 23 | { 24 | } 25 | 26 | 27 | bool CDOTExportDialog::writeBackground() const 28 | { 29 | return ui->WriteBackground->isChecked(); 30 | } 31 | 32 | 33 | bool CDOTExportDialog::writeAttributes() const 34 | { 35 | return ui->WriteAttributes->isChecked(); 36 | } 37 | 38 | -------------------------------------------------------------------------------- /src/qvgeioui/CDOTExportDialog.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /* 4 | This file is a part of 5 | QVGE - Qt Visual Graph Editor 6 | 7 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 8 | 9 | It can be used freely, maintaining the information above. 10 | */ 11 | 12 | #include 13 | 14 | 15 | namespace Ui { 16 | class CDOTExportDialog; 17 | } 18 | 19 | 20 | class CDOTExportDialog : public QDialog 21 | { 22 | Q_OBJECT 23 | 24 | public: 25 | CDOTExportDialog(QWidget *parent = 0); 26 | ~CDOTExportDialog(); 27 | 28 | bool writeBackground() const; 29 | bool writeAttributes() const; 30 | 31 | private: 32 | Ui::CDOTExportDialog *ui; 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /src/qvgeioui/CImageExportDialog.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CImageExportDialog.h" 11 | #include "ui_CImageExportDialog.h" 12 | 13 | #include 14 | 15 | 16 | CImageExportDialog::CImageExportDialog(QWidget *parent): 17 | QDialog(parent), 18 | ui(new Ui::CImageExportDialog) 19 | { 20 | ui->setupUi(this); 21 | 22 | QImage temp(QSize(100,100), QImage::Format_ARGB32); 23 | m_dpi = temp.physicalDpiX(); 24 | if (m_dpi > 0) 25 | ui->Resolution->setCurrentText(QString::number(m_dpi)); 26 | else 27 | m_dpi = 96; // default 28 | 29 | connect(ui->Resolution, &QComboBox::currentTextChanged, this, &CImageExportDialog::updateTargetSize); 30 | connect(ui->CutToContent, &QCheckBox::stateChanged, this, &CImageExportDialog::updateTargetSize); 31 | } 32 | 33 | 34 | CImageExportDialog::~CImageExportDialog() 35 | { 36 | } 37 | 38 | 39 | void CImageExportDialog::doReadSettings(QSettings& settings) 40 | { 41 | settings.beginGroup("ImageExport"); 42 | ui->Resolution->setCurrentText(settings.value("DPI", ui->Resolution->currentText()).toString()); 43 | ui->CutToContent->setChecked(settings.value("CutContent", ui->CutToContent->isChecked()).toBool()); 44 | settings.endGroup(); 45 | } 46 | 47 | 48 | void CImageExportDialog::doWriteSettings(QSettings& settings) 49 | { 50 | settings.beginGroup("ImageExport"); 51 | settings.setValue("DPI", ui->Resolution->currentText()); 52 | settings.setValue("CutContent", ui->CutToContent->isChecked()); 53 | settings.endGroup(); 54 | } 55 | 56 | 57 | void CImageExportDialog::setScene(CEditorScene& scene) 58 | { 59 | m_scene = &scene; 60 | 61 | updateTargetSize(); 62 | } 63 | 64 | 65 | void CImageExportDialog::updateTargetSize() 66 | { 67 | if (!m_scene) 68 | return; 69 | 70 | QSize size = m_scene->sceneRect().size().toSize(); 71 | if (cutToContent()) 72 | size = m_scene->itemsBoundingRect().adjusted(-20, -20, 20, 20).size().toSize(); 73 | 74 | int res = resolution(); 75 | if (res <= 0) 76 | res = m_dpi; 77 | 78 | double coeff = (double)res / (double)m_dpi; 79 | QSize newSize = size * coeff; 80 | ui->ImageSize->setText(QString("%1 x %2").arg(newSize.width()).arg(newSize.height())); 81 | } 82 | 83 | 84 | bool CImageExportDialog::cutToContent() const 85 | { 86 | return ui->CutToContent->isChecked(); 87 | } 88 | 89 | 90 | int CImageExportDialog::resolution() const 91 | { 92 | int res = ui->Resolution->currentText().toUInt(); 93 | return res; 94 | } 95 | 96 | -------------------------------------------------------------------------------- /src/qvgeioui/CImageExportDialog.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /* 4 | This file is a part of 5 | QVGE - Qt Visual Graph Editor 6 | 7 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 8 | 9 | It can be used freely, maintaining the information above. 10 | */ 11 | 12 | #include 13 | #include 14 | 15 | 16 | namespace Ui { 17 | class CImageExportDialog; 18 | } 19 | 20 | class CEditorScene; 21 | 22 | 23 | class CImageExportDialog : public QDialog 24 | { 25 | Q_OBJECT 26 | 27 | public: 28 | CImageExportDialog(QWidget *parent = 0); 29 | ~CImageExportDialog(); 30 | 31 | void doReadSettings(QSettings& settings); 32 | void doWriteSettings(QSettings& settings); 33 | 34 | void setScene(CEditorScene& scene); 35 | 36 | bool cutToContent() const; 37 | int resolution() const; 38 | 39 | private Q_SLOTS: 40 | void updateTargetSize(); 41 | 42 | private: 43 | Ui::CImageExportDialog *ui; 44 | 45 | CEditorScene *m_scene = nullptr; 46 | int m_dpi = 96; 47 | }; 48 | 49 | -------------------------------------------------------------------------------- /src/qvgeioui/CImportExportUIController.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | class CMainWindow; 13 | class CEditorScene; 14 | class CNodeEditorScene; 15 | class IFileSerializer; 16 | 17 | // think: to move? 18 | class CGVGraphLayoutUIController; 19 | 20 | #include 21 | 22 | 23 | class CImportExportUIController: public QObject 24 | { 25 | Q_OBJECT 26 | 27 | public: 28 | CImportExportUIController(CMainWindow *parent); 29 | 30 | // think: to move? 31 | void setGVGraphController(CGVGraphLayoutUIController *gvController) { m_gvController = gvController; } 32 | 33 | void doReadSettings(QSettings& settings); 34 | void doWriteSettings(QSettings& settings); 35 | 36 | void exportImage(CEditorScene& scene); 37 | void exportPDF(CEditorScene& scene); 38 | void exportSVG(CEditorScene& scene); 39 | void exportDOT(CEditorScene& scene); 40 | bool importCSV(CEditorScene& scene, const QString &fileName, QString* lastError); 41 | 42 | bool loadFromFile(const QString &format, const QString &fileName, CNodeEditorScene& scene, QString* lastError); 43 | bool saveToFile(const QString &format, const QString &fileName, CNodeEditorScene& scene, QString* lastError); 44 | 45 | private: 46 | bool doExport(CEditorScene& scene, const IFileSerializer &exporter); 47 | 48 | private: 49 | CMainWindow *m_parent = nullptr; 50 | 51 | class CDOTExportDialog *m_dotDialog = nullptr; 52 | class CImageExportDialog *m_imageDialog = nullptr; 53 | 54 | // think: to move? 55 | CGVGraphLayoutUIController *m_gvController = nullptr; 56 | 57 | QString m_lastExportPath; 58 | }; 59 | -------------------------------------------------------------------------------- /src/qvgeioui/qvgeioui.pro: -------------------------------------------------------------------------------- 1 | include($$PWD/../lib.pri) 2 | 3 | TARGET = qvgeioui 4 | QT += core gui widgets printsupport xml 5 | 6 | # includes 7 | INCLUDEPATH += $$PWD $$PWD/.. 8 | 9 | # sources 10 | SOURCES += $$files($$PWD/*.cpp) 11 | HEADERS += $$files($$PWD/*.h) 12 | FORMS += $$files($$PWD/*.ui) -------------------------------------------------------------------------------- /src/qvgelib/CAttribute.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CAttribute.h" 11 | 12 | 13 | // attributes 14 | 15 | CAttribute::CAttribute(): 16 | flags(ATTR_NONE) 17 | { 18 | valueType = QVariant::String; 19 | } 20 | 21 | 22 | CAttribute::CAttribute(const QByteArray& attrId, const QString& attrName) : 23 | flags(ATTR_NODEFAULT) 24 | { 25 | id = attrId; 26 | name = attrName; 27 | if (name.isEmpty()) name = id; 28 | 29 | valueType = QVariant::String; 30 | } 31 | 32 | 33 | CAttribute::CAttribute( 34 | const QByteArray& attrId, 35 | const QString& attrName, 36 | const QVariant& defaultValue_, 37 | const int attrFlags_) : 38 | flags(attrFlags_) 39 | { 40 | id = attrId; 41 | name = attrName.isEmpty() ? id : attrName; 42 | 43 | valueType = defaultValue_.type(); 44 | defaultValue = (flags & ATTR_NODEFAULT) ? QVariant() : defaultValue_; 45 | } 46 | 47 | 48 | bool CAttribute::storeTo(QDataStream& out, quint64 /*version64*/) const 49 | { 50 | out << id << name << defaultValue << true << true << valueType; 51 | 52 | return true; 53 | } 54 | 55 | 56 | bool CAttribute::restoreFrom(QDataStream& out, quint64 version64) 57 | { 58 | out >> id; 59 | 60 | static bool dummy; 61 | 62 | if (version64 < 6) 63 | out >> classId; // dummy value 64 | 65 | out >> name >> defaultValue >> dummy >> dummy; 66 | //attrFlags = ATTR_USER; 67 | 68 | // size must be converted 69 | if (version64 < 7) 70 | { 71 | if (id == "size") 72 | defaultValue = QSizeF(defaultValue.toDouble(), defaultValue.toDouble()); 73 | } 74 | 75 | if (version64 < 10) 76 | valueType = defaultValue.type(); 77 | else 78 | out >> valueType; 79 | 80 | return true; 81 | } 82 | 83 | 84 | // attribute constrains 85 | 86 | CAttributeConstrains::~CAttributeConstrains() 87 | { 88 | // dummy 89 | } 90 | 91 | -------------------------------------------------------------------------------- /src/qvgelib/CControlPoint.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include 11 | 12 | #include "CControlPoint.h" 13 | #include "CItem.h" 14 | 15 | 16 | CControlPoint::CControlPoint(CItem *parent) : 17 | Shape(dynamic_cast(parent)), 18 | m_parentItem(parent) 19 | { 20 | Q_ASSERT(parent != NULL); 21 | 22 | setRect(-4, -4, 8, 8); 23 | setBrush(Qt::black); 24 | setPen(QPen(Qt::gray, 1)); 25 | } 26 | 27 | 28 | // reimp 29 | 30 | QVariant CControlPoint::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) 31 | { 32 | //if (change == ItemPositionChange) 33 | //{ 34 | // if (auto editScene = dynamic_cast(scene())) 35 | // { 36 | // return editScene->getSnapped(value.toPointF()); 37 | // } 38 | 39 | // return value; 40 | //} 41 | 42 | if (change == ItemPositionHasChanged) 43 | { 44 | m_parentItem->onControlPointMoved(this, value.toPointF()); 45 | 46 | return value; 47 | } 48 | 49 | return Shape::itemChange(change, value); 50 | } 51 | 52 | 53 | // menu 54 | 55 | void CControlPoint::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) 56 | { 57 | event->accept(); 58 | 59 | QMenu menu; 60 | menu.addAction(tr("Delete point"), this, SLOT(onActionDelete())); 61 | menu.exec(event->screenPos()); 62 | } 63 | 64 | 65 | void CControlPoint::onActionDelete() 66 | { 67 | m_parentItem->onControlPointDelete(this); 68 | } 69 | -------------------------------------------------------------------------------- /src/qvgelib/CControlPoint.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | class CItem; 16 | 17 | 18 | class CControlPoint : public QObject, public QGraphicsRectItem 19 | { 20 | Q_OBJECT 21 | 22 | public: 23 | typedef QGraphicsRectItem Shape; 24 | 25 | explicit CControlPoint(CItem *parent); 26 | virtual ~CControlPoint() {} 27 | 28 | protected Q_SLOTS: 29 | void onActionDelete(); 30 | 31 | protected: 32 | // reimp 33 | virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value); 34 | virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); 35 | 36 | CItem *m_parentItem; 37 | }; 38 | 39 | -------------------------------------------------------------------------------- /src/qvgelib/CDiffUndoManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "IUndoManager.h" 13 | 14 | #include 15 | #include 16 | 17 | class CEditorScene; 18 | 19 | 20 | class CDiffUndoManager : public IUndoManager 21 | { 22 | public: 23 | CDiffUndoManager(CEditorScene &scene); 24 | 25 | // reimp 26 | virtual void reset(); 27 | virtual void addState(); 28 | virtual void revertState(); 29 | virtual void undo(); 30 | virtual void redo(); 31 | virtual int availableUndoCount() const; 32 | virtual int availableRedoCount() const; 33 | 34 | private: 35 | struct Command 36 | { 37 | int index; 38 | int sizeToReplace; 39 | QByteArray data; 40 | }; 41 | 42 | CEditorScene *m_scene; 43 | QList m_redoStack, m_undoStack; 44 | QList m_redoStackTemp, m_undoStackTemp; 45 | QByteArray m_lastState; 46 | }; 47 | -------------------------------------------------------------------------------- /src/qvgelib/CDirectEdge.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "CEdge.h" 13 | 14 | 15 | class CDirectEdge : public CEdge 16 | { 17 | public: 18 | typedef CEdge Super; 19 | 20 | CDirectEdge(QGraphicsItem *parent = Q_NULLPTR); 21 | 22 | void setBendFactor(int bf); 23 | 24 | // reimp 25 | static QByteArray factoryId() { return "CDirectEdge"; } 26 | virtual QByteArray typeId() const { return this->factoryId(); } 27 | virtual QByteArray classId() const { return "edge"; } 28 | virtual QByteArray superClassId() const { return Super::classId(); } 29 | 30 | virtual CItem* create() const { return new CDirectEdge(parentItem()); } 31 | CEdge* clone(); 32 | 33 | virtual QPointF getLabelCenter() const { 34 | return m_controlPoint; 35 | } 36 | 37 | // transformations 38 | virtual void transform(const QRectF& oldRect, const QRectF& newRect, 39 | double xc, double yc, 40 | bool changeSize, bool changePos) override 41 | {} 42 | 43 | protected: 44 | // reimp 45 | virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR); 46 | virtual void updateLabelPosition(); 47 | 48 | // callbacks 49 | virtual void onParentGeometryChanged(); 50 | 51 | private: 52 | void createCurvedPath(bool intersected, 53 | const QLineF& shortLine, const QLineF& fullLine, 54 | const QPointF& p1, const QPointF& lp, const QPointF& rp, const QPointF& p2, 55 | double arrowSize); 56 | 57 | protected: 58 | int m_bendFactor; 59 | QPointF m_controlPoint, m_controlPos; 60 | }; 61 | -------------------------------------------------------------------------------- /src/qvgelib/CEditorSceneActions.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include 11 | #include 12 | 13 | #include "CEditorSceneActions.h" 14 | #include "CEditorScene.h" 15 | #include "CNode.h" 16 | #include "CEdge.h" 17 | 18 | 19 | CEditorSceneActions::CEditorSceneActions(CEditorScene *scene) 20 | { 21 | cutAction = new QAction(QIcon(":/Icons/Cut"), tr("Cut"), scene); 22 | cutAction->setStatusTip(tr("Cut selected item(s) to clipboard")); 23 | cutAction->setToolTip(tr("Cut selection")); 24 | cutAction->setShortcut(QKeySequence::Cut); 25 | connect(cutAction, &QAction::triggered, scene, &CEditorScene::cut); 26 | 27 | copyAction = new QAction(QIcon(":/Icons/Copy"), tr("Copy"), scene); 28 | copyAction->setStatusTip(tr("Copy selected item(s) to clipboard")); 29 | copyAction->setToolTip(tr("Copy selection")); 30 | copyAction->setShortcut(QKeySequence::Copy); 31 | connect(copyAction, &QAction::triggered, scene, &CEditorScene::copy); 32 | 33 | pasteAction = new QAction(QIcon(":/Icons/Paste"), tr("Paste"), scene); 34 | pasteAction->setStatusTip(tr("Paste item(s) from clipboard")); 35 | pasteAction->setToolTip(tr("Paste from clipboard")); 36 | pasteAction->setShortcut(QKeySequence::Paste); 37 | connect(pasteAction, &QAction::triggered, scene, &CEditorScene::paste); 38 | 39 | delAction = new QAction(QIcon(":/Icons/Delete"), QObject::tr("Delete"), scene); 40 | delAction->setStatusTip(QObject::tr("Delete selected item(s)")); 41 | delAction->setToolTip(QObject::tr("Delete selection")); 42 | delAction->setShortcut(QKeySequence::Delete); 43 | QObject::connect(delAction, &QAction::triggered, scene, &CEditorScene::del); 44 | } 45 | -------------------------------------------------------------------------------- /src/qvgelib/CEditorSceneActions.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | class CEditorScene; 16 | 17 | 18 | class CEditorSceneActions: public QObject 19 | { 20 | public: 21 | CEditorSceneActions(CEditorScene *scene); 22 | 23 | QAction *cutAction; 24 | QAction *copyAction; 25 | QAction *pasteAction; 26 | QAction *delAction; 27 | }; 28 | 29 | -------------------------------------------------------------------------------- /src/qvgelib/CEditorSceneDefines.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | // common scene states 16 | 17 | enum SceneInfoState 18 | { 19 | SIS_Select = 0, 20 | SIS_Hover, 21 | SIS_Drag, 22 | SIS_Hover_Port, 23 | SIS_Edit_Label 24 | }; 25 | 26 | 27 | // common scene attributes 28 | const QByteArray class_scene = QByteArrayLiteral(""); 29 | const QByteArray class_item = QByteArrayLiteral("item"); 30 | const QByteArray class_node = QByteArrayLiteral("node"); 31 | const QByteArray class_edge = QByteArrayLiteral("edge"); 32 | 33 | const QByteArray attr_id = QByteArrayLiteral("id"); 34 | const QByteArray attr_size = QByteArrayLiteral("size"); 35 | const QByteArray attr_weight = QByteArrayLiteral("weight"); 36 | const QByteArray attr_color = QByteArrayLiteral("color"); 37 | const QByteArray attr_style = QByteArrayLiteral("style"); 38 | const QByteArray attr_shape = QByteArrayLiteral("shape"); 39 | const QByteArray attr_stroke_color = QByteArrayLiteral("stroke.color"); 40 | const QByteArray attr_stroke_style = QByteArrayLiteral("stroke.style"); 41 | const QByteArray attr_stroke_size = QByteArrayLiteral("stroke.size"); 42 | const QByteArray attr_label = QByteArrayLiteral("label"); 43 | const QByteArray attr_label_font = QByteArrayLiteral("label.font"); 44 | const QByteArray attr_label_color = QByteArrayLiteral("label.color"); 45 | const QByteArray attr_label_position = QByteArrayLiteral("label.position"); 46 | const QByteArray attr_labels_policy = QByteArrayLiteral("labels.policy"); 47 | const QByteArray attr_labels_visIds = QByteArrayLiteral("labels.visibleIds"); 48 | const QByteArray attr_edge_direction = QByteArrayLiteral("direction"); 49 | -------------------------------------------------------------------------------- /src/qvgelib/CEditorScene_p.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CEditorScene_p.h" 11 | #include "CEditorScene.h" 12 | #include "CItem.h" 13 | 14 | 15 | CEditorScene_p::CEditorScene_p(class CEditorScene *scene): 16 | m_transformRect(), 17 | m_scene(scene) 18 | { 19 | //QObject::connect(&m_labelEditor, &CTextLabelEdit::editingStarted, m_scene, &CEditorScene::onItemEditingStarted); 20 | QObject::connect(&m_labelEditor, &CTextLabelEdit::editingFinished, m_scene, &CEditorScene::onItemEditingFinished); 21 | } 22 | -------------------------------------------------------------------------------- /src/qvgelib/CEditorScene_p.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "CTextLabelEdit.h" 4 | #include "CTransformRect.h" 5 | 6 | 7 | // pimpl for CEditorScene 8 | 9 | class CEditorScene_p 10 | { 11 | public: 12 | CEditorScene_p(class CEditorScene *scene); 13 | 14 | //void attachScene(class CEditorScene *scene); 15 | //void detachScene(class CEditorScene *scene); 16 | 17 | CTextLabelEdit m_labelEditor; 18 | CTransformRect m_transformRect; 19 | 20 | private: 21 | class CEditorScene *m_scene = nullptr; 22 | }; 23 | 24 | -------------------------------------------------------------------------------- /src/qvgelib/CEditorView.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef CEDITORVIEW_H 11 | #define CEDITORVIEW_H 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | class CEditorScene; 19 | 20 | class CEditorView : public QGraphicsView 21 | { 22 | Q_OBJECT 23 | 24 | public: 25 | typedef QGraphicsView Super; 26 | 27 | CEditorView(CEditorScene *scene, QWidget *parent = NULL); 28 | CEditorView(QWidget *parent = NULL); 29 | virtual ~CEditorView(); 30 | 31 | // zoom 32 | double getZoom() const { return m_currentZoom; } 33 | // target is % value to zoom to (1.0 = 100% = reset zoom, 0.25 = 25% = 1/4 etc.) 34 | void zoomTo(double target); 35 | // factor if relative % value to zoom by (2 = 2x from current etc.) 36 | void zoomBy(double factor); 37 | 38 | double getZoomBeforeFit() const { return m_zoomBeforeFit; } 39 | void fitToView(); 40 | void fitSelectedToView(); 41 | void zoomBack(); 42 | 43 | // center 44 | QPointF getCenter() const; 45 | 46 | void centerContent(); 47 | 48 | // scene 49 | QGraphicsItem* getDragItem() 50 | { 51 | if (scene()) 52 | return scene()->mouseGrabberItem(); 53 | else 54 | return nullptr; 55 | } 56 | 57 | // reimp 58 | virtual void mousePressEvent(QMouseEvent *e); 59 | virtual void mouseMoveEvent(QMouseEvent *e); 60 | virtual void mouseReleaseEvent(QMouseEvent *e); 61 | virtual void contextMenuEvent(QContextMenuEvent *e); 62 | virtual void wheelEvent(QWheelEvent *e); 63 | 64 | void paintEvent(QPaintEvent * event) 65 | { 66 | QPaintEvent *newEvent = new QPaintEvent(event->region().boundingRect()); 67 | QGraphicsView::paintEvent(newEvent); 68 | delete newEvent; 69 | } 70 | 71 | Q_SIGNALS: 72 | void scaleChanged(double); 73 | 74 | private Q_SLOTS: 75 | void restoreContextMenu(); 76 | void onScrollTimeout(); 77 | 78 | private: 79 | DragMode m_dragModeTmp; 80 | Qt::ContextMenuPolicy m_menuModeTmp; 81 | bool m_interactiveTmp = false; 82 | bool m_moved = false; 83 | QPoint m_pos; 84 | 85 | double m_currentZoom = 1.0; 86 | double m_zoomBeforeFit = 0.0; // 0 means no zoom called yet 87 | QPointF m_dxyBeforeFit; 88 | 89 | QTimer m_scrollTimer; 90 | float m_scrollThreshold = 30; 91 | }; 92 | 93 | #endif // CEDITORVIEW_H 94 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerCSV.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CFileSerializerCSV.h" 11 | #include "CAttribute.h" 12 | #include "CNode.h" 13 | #include "CDirectEdge.h" 14 | #include "CGraphInterface.h" 15 | #include "CNodeEditorScene.h" 16 | 17 | #include 18 | #include 19 | #include 20 | 21 | 22 | // reimp 23 | 24 | bool CFileSerializerCSV::load(const QString& fileName, CEditorScene& scene, QString* lastError) const 25 | { 26 | CNodeEditorScene* nodeScene = dynamic_cast(&scene); 27 | if (nodeScene == nullptr) 28 | return false; 29 | 30 | QFile file(fileName); 31 | if (!file.open(QIODevice::ReadOnly)) 32 | return false; 33 | 34 | // try to parse 35 | scene.reset(); 36 | 37 | CGraphInterface graph(*nodeScene); 38 | 39 | QTextStream ts(&file); 40 | while (!ts.atEnd()) 41 | { 42 | QString line = ts.readLine(); 43 | QStringList items = line.split(m_delimiter, QString::SkipEmptyParts); 44 | if (items.size() < 3) 45 | continue; 46 | 47 | // edge - start node - end node 48 | /*auto edge =*/ graph.addEdge(items[0], items[1], items[2]); 49 | } 50 | 51 | file.close(); 52 | 53 | // update scene rect 54 | scene.setSceneRect(scene.itemsBoundingRect()); 55 | 56 | scene.addUndoState(); 57 | 58 | // done 59 | return true; 60 | } 61 | 62 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerCSV.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "IFileSerializer.h" 13 | 14 | class CNode; 15 | 16 | 17 | class CFileSerializerCSV : public IFileSerializer 18 | { 19 | public: 20 | // reimp 21 | virtual QString description() const { 22 | return "Comma Separated Values"; 23 | } 24 | 25 | virtual QString filters() const { 26 | return "*.csv"; 27 | } 28 | 29 | virtual QString defaultFileExtension() const { 30 | return "csv"; 31 | } 32 | 33 | virtual bool loadSupported() const { 34 | return true; 35 | } 36 | 37 | virtual bool load(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 38 | 39 | virtual bool saveSupported() const { 40 | return false; 41 | } 42 | 43 | virtual bool save(const QString& /*fileName*/, CEditorScene& /*scene*/, QString* /*lastError = nullptr*/) const { 44 | return false; 45 | } 46 | 47 | // setup 48 | void setDelimiter(const char d) { 49 | m_delimiter = d; 50 | } 51 | 52 | private: 53 | char m_delimiter = ';'; 54 | }; 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerDOT.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #include "qvgelib/IFileSerializer.h" 17 | 18 | class CNode; 19 | class CEdge; 20 | 21 | class QTextStream; 22 | 23 | 24 | class CFileSerializerDOT : public IFileSerializer 25 | { 26 | public: 27 | CFileSerializerDOT(bool writeBackground = true, bool writeAttrs = true) : 28 | m_writeBackground(writeBackground), 29 | m_writeAttrs(writeAttrs) 30 | {} 31 | 32 | 33 | // reimp 34 | virtual QString description() const { 35 | return "DOT/GraphViz graph format"; 36 | } 37 | 38 | virtual QString filters() const { 39 | return "DOT/GraphViz graphs (*.gv *.dot)"; 40 | } 41 | 42 | virtual QString defaultFileExtension() const { 43 | return "gv"; 44 | } 45 | 46 | virtual bool loadSupported() const { 47 | return true; 48 | } 49 | 50 | virtual bool load(const QString& /*fileName*/, CEditorScene& /*scene*/, QString* /*lastError = nullptr*/) const; 51 | 52 | virtual bool saveSupported() const { 53 | return true; 54 | } 55 | 56 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 57 | 58 | private: 59 | void doWriteNodeDefaults(QTextStream& ts, const CEditorScene& scene) const; 60 | void doWriteNode(QTextStream& ts, const CNode& node, const CEditorScene& scene) const; 61 | void doWriteNodeAttrs(QTextStream& ts, QMap nodeAttrs) const; 62 | 63 | void doWriteEdgeDefaults(QTextStream& ts, const CEditorScene& scene) const; 64 | void doWriteEdge(QTextStream& ts, const CEdge& edge, const CEditorScene& scene) const; 65 | void doWriteEdgeAttrs(QTextStream& ts, QMap edgeAttrs) const; 66 | 67 | void doWriteLabel(QTextStream& ts, QMap& attrs) const; 68 | 69 | bool m_writeBackground = true; 70 | bool m_writeAttrs = true; 71 | }; 72 | 73 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerGEXF.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "IFileSerializer.h" 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | class CNode; 20 | 21 | 22 | class CFileSerializerGEXF : public IFileSerializer 23 | { 24 | public: 25 | 26 | // reimp 27 | virtual QString description() const { 28 | return "Graph Exchange XML Format"; 29 | } 30 | 31 | virtual QString filters() const { 32 | return "*.gexf"; 33 | } 34 | 35 | virtual QString defaultFileExtension() const { 36 | return "gexf"; 37 | } 38 | 39 | virtual bool loadSupported() const { 40 | return true; 41 | } 42 | 43 | virtual bool load(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 44 | 45 | virtual bool saveSupported() const { 46 | return true; 47 | } 48 | 49 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 50 | 51 | private: 52 | struct AttrInfo { 53 | QByteArray id; 54 | int variantType; 55 | }; 56 | typedef QMap IdToAttrMap; 57 | mutable QMap m_classIdMap; 58 | 59 | bool readAttrs(int index, const QDomNode &domNode, CEditorScene& scene) const; 60 | bool readNode(int index, const QDomNode &domNode, const IdToAttrMap &idMap, CEditorScene& scene) const; 61 | bool readEdge(int index, const QDomNode &domNode, const IdToAttrMap &idMap, CEditorScene& scene) const; 62 | void writeClassAttrs(QTextStream &ts, const CEditorScene& scene, const QByteArray &classId) const; 63 | void writeNodes(QTextStream &ts, const CEditorScene& scene) const; 64 | void writeEdges(QTextStream &ts, const CEditorScene& scene) const; 65 | void writeAttValues(QTextStream &ts, const QMap& attvalues) const; 66 | 67 | mutable QMap m_nodeMap; 68 | 69 | enum EdgeType { 70 | Directed, 71 | Undirected, 72 | Mutual 73 | }; 74 | mutable QString m_edgeType; 75 | }; 76 | 77 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerGraphML.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CFileSerializerGraphML.h" 11 | #include "CAttribute.h" 12 | #include "CNode.h" 13 | #include "CDirectEdge.h" 14 | 15 | #include 16 | 17 | #include 18 | #include 19 | 20 | 21 | // reimp 22 | 23 | bool CFileSerializerGraphML::load(const QString& fileName, CEditorScene& scene, QString* lastError) const 24 | { 25 | CFormatGraphML graphML; 26 | Graph graphModel; 27 | 28 | if (graphML.load(fileName, graphModel, lastError)) 29 | return scene.fromGraph(graphModel); 30 | else 31 | return false; 32 | } 33 | 34 | 35 | bool CFileSerializerGraphML::save(const QString& fileName, CEditorScene& scene, QString* lastError) const 36 | { 37 | CFormatGraphML graphML; 38 | Graph graphModel; 39 | 40 | if (scene.toGraph(graphModel)) 41 | return graphML.save(fileName, graphModel, lastError); 42 | else 43 | return false; 44 | } 45 | 46 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerGraphML.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "IFileSerializer.h" 13 | 14 | 15 | class CFileSerializerGraphML : public IFileSerializer 16 | { 17 | public: 18 | 19 | // reimp 20 | virtual QString description() const { 21 | return "GraphML Format"; 22 | } 23 | 24 | virtual QString filters() const { 25 | return "*.graphml"; 26 | } 27 | 28 | virtual QString defaultFileExtension() const { 29 | return "graphml"; 30 | } 31 | 32 | virtual bool loadSupported() const { 33 | return true; 34 | } 35 | 36 | virtual bool load(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 37 | 38 | virtual bool saveSupported() const { 39 | return true; 40 | } 41 | 42 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 43 | }; 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerPlainDOT.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CFileSerializerPlainDOT.h" 11 | #include "CAttribute.h" 12 | #include "CNode.h" 13 | #include "CDirectEdge.h" 14 | 15 | #include 16 | 17 | #include 18 | #include 19 | 20 | 21 | // reimp 22 | 23 | bool CFileSerializerPlainDOT::load(const QString& fileName, CEditorScene& scene, QString* lastError) const 24 | { 25 | CFormatPlainDOT graphFormat; 26 | Graph graphModel; 27 | 28 | if (graphFormat.load(fileName, graphModel, lastError)) 29 | return scene.fromGraph(graphModel); 30 | else 31 | return false; 32 | } 33 | 34 | 35 | bool CFileSerializerPlainDOT::save(const QString& fileName, CEditorScene& scene, QString* lastError) const 36 | { 37 | CFormatPlainDOT graphFormat; 38 | Graph graphModel; 39 | 40 | if (scene.toGraph(graphModel)) 41 | return graphFormat.save(fileName, graphModel, lastError); 42 | else 43 | return false; 44 | } 45 | 46 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerPlainDOT.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "IFileSerializer.h" 13 | 14 | 15 | class CFileSerializerPlainDOT : public IFileSerializer 16 | { 17 | public: 18 | 19 | // reimp 20 | virtual QString description() const { 21 | return "Plain Text DOT Format"; 22 | } 23 | 24 | virtual QString filters() const { 25 | return "Plain Text DOT/GraphViz Graphs (*.plain *.txt)"; 26 | } 27 | 28 | virtual QString defaultFileExtension() const { 29 | return "txt"; 30 | } 31 | 32 | virtual bool loadSupported() const { 33 | return true; 34 | } 35 | 36 | virtual bool load(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 37 | 38 | virtual bool saveSupported() const { 39 | return false; 40 | } 41 | 42 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 43 | }; 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerXGR.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CFileSerializerXGR.h" 11 | #include "CEditorScene.h" 12 | #include "ISceneItemFactory.h" 13 | 14 | #include 15 | #include 16 | 17 | 18 | // static reader with DPSE format support 19 | 20 | class CDPSERecoder : public ISceneItemFactory 21 | { 22 | public: 23 | virtual CItem* createItemOfType(const QByteArray& typeId, const CEditorScene& scene) const 24 | { 25 | if (typeId == "CBranchNode") 26 | { 27 | return scene.createItemOfType("CNode"); 28 | } 29 | 30 | if (typeId == "CFanNode") 31 | { 32 | return scene.createItemOfType("CNode"); 33 | } 34 | 35 | if (typeId == "CBranchConnection" || typeId == "CDirectConnection") 36 | { 37 | return scene.createItemOfType("CDirectEdge"); 38 | } 39 | 40 | return nullptr; 41 | } 42 | }; 43 | 44 | static CDPSERecoder s_dpseRecoder; 45 | 46 | 47 | // reimp 48 | 49 | bool CFileSerializerXGR::load(const QString& fileName, CEditorScene& scene, QString* /*lastError*/) const 50 | { 51 | // read file into document 52 | QFile openFile(fileName); 53 | if (!openFile.open(QIODevice::ReadOnly)) 54 | return false; 55 | 56 | scene.reset(); 57 | 58 | scene.setItemFactoryFilter(&s_dpseRecoder); 59 | 60 | QDataStream ds(&openFile); 61 | #if (QT_VERSION >= 0x050a00) 62 | ds.setVersion(QDataStream::Qt_5_10); 63 | #endif 64 | 65 | scene.restoreFrom(ds, true); 66 | 67 | scene.setItemFactoryFilter(nullptr); 68 | 69 | scene.addUndoState(); 70 | 71 | return true; 72 | } 73 | 74 | 75 | bool CFileSerializerXGR::save(const QString& fileName, CEditorScene& scene, QString* /*lastError*/) const 76 | { 77 | QFile saveFile(fileName); 78 | if (saveFile.open(QFile::WriteOnly)) 79 | { 80 | QDataStream ds(&saveFile); 81 | #if (QT_VERSION >= 0x050a00) 82 | ds.setVersion(QDataStream::Qt_5_10); 83 | #endif 84 | 85 | scene.storeTo(ds, true); 86 | 87 | return true; 88 | } 89 | 90 | return false; 91 | } 92 | -------------------------------------------------------------------------------- /src/qvgelib/CFileSerializerXGR.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | #include "qvgelib/IFileSerializer.h" 15 | 16 | 17 | class CNode; 18 | 19 | class CFileSerializerXGR : public IFileSerializer 20 | { 21 | public: 22 | // reimp 23 | virtual QString description() const { 24 | return "QVGE graph scene format"; 25 | } 26 | 27 | virtual QString filters() const { 28 | return "*.xgr"; 29 | } 30 | 31 | virtual QString defaultFileExtension() const { 32 | return "xgr"; 33 | } 34 | 35 | virtual bool loadSupported() const { 36 | return true; 37 | } 38 | 39 | virtual bool load(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 40 | 41 | virtual bool saveSupported() const { 42 | return true; 43 | } 44 | 45 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 46 | }; 47 | 48 | -------------------------------------------------------------------------------- /src/qvgelib/CGraphInterface.h: -------------------------------------------------------------------------------- 1 | #ifndef CGRAPHINTERFACE_H 2 | #define CGRAPHINTERFACE_H 3 | 4 | #include "IGraphInterface.h" 5 | 6 | class CNodeEditorScene; 7 | 8 | 9 | class CGraphInterface: public IGraphInterface 10 | { 11 | public: 12 | CGraphInterface() {} 13 | explicit CGraphInterface(CNodeEditorScene& scene); 14 | virtual ~CGraphInterface() {} 15 | 16 | void setScene(CNodeEditorScene& scene) { 17 | m_scene = &scene; 18 | } 19 | 20 | // interface (to move out?) 21 | virtual CNode* addNode(const QString& nodeId); 22 | virtual CNode* getNode(const QString& nodeId, bool autoCreate = false); 23 | 24 | virtual CEdge* addEdge(const QString& edgeId, const QString& startNodeId, const QString& endNodeId); 25 | virtual CEdge* getEdge(const QString& edgeId); 26 | virtual bool setEdgeAttr(const QString& edgeId, const QByteArray& attrId, const QVariant& value); 27 | 28 | virtual QList getEdges() const; 29 | virtual QList getNodes() const; 30 | 31 | private: 32 | CNodeEditorScene *m_scene = nullptr; 33 | }; 34 | 35 | #endif // CGRAPHINTERFACE_H 36 | -------------------------------------------------------------------------------- /src/qvgelib/CImageExport.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2020 Ars L.Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | #include "qvgelib/IFileSerializer.h" 15 | 16 | 17 | class CImageExport : public IFileSerializer 18 | { 19 | public: 20 | CImageExport(bool cutContent = true, int resolution = 0) : 21 | m_cutContent(cutContent), 22 | m_resolution(resolution) 23 | {} 24 | 25 | // reimp 26 | virtual QString description() const { 27 | return "Image Format"; 28 | } 29 | 30 | virtual QString filters() const; 31 | 32 | virtual QString defaultFileExtension() const { 33 | return "bmp"; 34 | } 35 | 36 | virtual bool loadSupported() const { 37 | return false; 38 | } 39 | 40 | virtual bool load(const QString& /*fileName*/, CEditorScene& /*scene*/, QString* /*lastError = nullptr*/) const { 41 | return false; 42 | } 43 | 44 | virtual bool saveSupported() const { 45 | return true; 46 | } 47 | 48 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 49 | 50 | private: 51 | bool m_cutContent = true; 52 | int m_resolution = 96; 53 | }; 54 | -------------------------------------------------------------------------------- /src/qvgelib/CNodePort.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | #include "IInteractive.h" 15 | 16 | 17 | class CNode; 18 | 19 | 20 | class CNodePort : public QGraphicsRectItem, public IInteractive 21 | { 22 | public: 23 | typedef QGraphicsRectItem Shape; 24 | 25 | explicit CNodePort(CNode *node, const QByteArray& portId = QByteArray(), int align = 0, double xoff = 0, double yoff = 0); 26 | virtual ~CNodePort(); 27 | 28 | CNode* getNode() const { return m_node; } 29 | const QByteArray& getId() const { return m_id; } 30 | int getAlign() const { return m_align; } 31 | double getX() const { return m_xoff; } 32 | double getY() const { return m_yoff; } 33 | QColor getColor() const; 34 | 35 | void setId(const QByteArray& portId); 36 | void setAlign(int newAlign); 37 | void setOffset(double xoff, double yoff); 38 | void setColor(const QColor& color); 39 | 40 | void copyDataFrom(const CNodePort &port); 41 | 42 | // serialization 43 | virtual bool storeTo(QDataStream& out, quint64 version64) const; 44 | //virtual bool restoreFrom(QDataStream& out, quint64 version64); 45 | 46 | // callbacks 47 | void onParentDeleted(); 48 | virtual void onParentGeometryChanged(); 49 | 50 | virtual void onClick(QGraphicsSceneMouseEvent* /*mouseEvent*/); 51 | 52 | virtual ItemDragTestResult acceptDragFromItem(QGraphicsItem* draggedItem); 53 | virtual void leaveDragFromItem(QGraphicsItem* draggedItem); 54 | 55 | //virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); 56 | //virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); 57 | 58 | protected: 59 | CNode *m_node = nullptr; 60 | 61 | QByteArray m_id; 62 | int m_align; 63 | double m_xoff, m_yoff; 64 | }; 65 | 66 | -------------------------------------------------------------------------------- /src/qvgelib/CNodeSceneActions.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "CEditorSceneActions.h" 13 | 14 | class CNodeEditorScene; 15 | class CNode; 16 | class CEdge; 17 | 18 | 19 | class CNodeSceneActions : public CEditorSceneActions 20 | { 21 | Q_OBJECT 22 | 23 | public: 24 | CNodeSceneActions(CNodeEditorScene *scene); 25 | 26 | public Q_SLOTS: 27 | bool editNodeId(CNode* node); 28 | bool editEdgeId(CEdge* edge); 29 | 30 | void onActionNodeColor(); 31 | void onActionNodeClear(); 32 | void onActionLink(); 33 | void onActionUnlink(); 34 | 35 | void onActionEdgeColor(); 36 | void onActionEdgeClear(); 37 | void onActionEdgeReverse(); 38 | void onActionEdgeDirected(); 39 | void onActionEdgeMutual(); 40 | void onActionEdgeUndirected(); 41 | 42 | void onActionNodeEdgeClear(); 43 | 44 | private: 45 | CNodeEditorScene &nodeScene; 46 | }; 47 | 48 | -------------------------------------------------------------------------------- /src/qvgelib/CPDFExport.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2017 Ars L.Masiuk(ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | #include "qvgelib/IFileSerializer.h" 18 | 19 | 20 | class CPDFExport : public IFileSerializer 21 | { 22 | public: 23 | CPDFExport(); 24 | virtual ~CPDFExport(); 25 | 26 | // setup interface 27 | void readSettings(QSettings& settings); 28 | void writeSettings(QSettings& settings); 29 | bool setupDialog(CEditorScene& scene); 30 | 31 | // reimp: IFileSerializer 32 | virtual QString description() const { 33 | return "Adobe Portable Document Format"; 34 | } 35 | 36 | virtual QString filters() const { 37 | return "Adobe Portable Document Format (*.pdf)"; 38 | } 39 | 40 | virtual QString defaultFileExtension() const { 41 | return "pdf"; 42 | } 43 | 44 | virtual bool loadSupported() const { 45 | return false; 46 | } 47 | 48 | virtual bool load(const QString& /*fileName*/, CEditorScene& /*scene*/, QString* /*lastError = nullptr*/) const { 49 | return false; 50 | } 51 | 52 | virtual bool saveSupported() const { 53 | return true; 54 | } 55 | 56 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 57 | 58 | private: 59 | mutable QPrinter *m_printer = nullptr; 60 | QPageSetupDialog m_pageDialog; 61 | }; 62 | -------------------------------------------------------------------------------- /src/qvgelib/CPolyEdge.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include "CDirectEdge.h" 13 | 14 | 15 | class CControlPoint; 16 | 17 | 18 | class CPolyEdge : public CDirectEdge 19 | { 20 | public: 21 | typedef CDirectEdge Super; 22 | 23 | CPolyEdge(QGraphicsItem *parent = Q_NULLPTR); 24 | 25 | const QList& getPoints() const { return m_polyPoints; } 26 | void setPoints(const QList &points); 27 | bool insertPointAt(const QPointF &pos); 28 | 29 | // reimp 30 | static QByteArray factoryId() { return "CPolyEdge"; } 31 | virtual QByteArray typeId() const { return this->factoryId(); } 32 | virtual QByteArray classId() const { return "polyedge"; } 33 | virtual QByteArray superClassId() const { return Super::classId(); } 34 | 35 | virtual CItem* create() const { return new CPolyEdge(parentItem()); } 36 | CEdge* clone(); 37 | 38 | virtual void reverse(); 39 | 40 | // transformations 41 | virtual void transform(const QRectF& oldRect, const QRectF& newRect, 42 | double xc, double yc, 43 | bool changeSize, bool changePos) override; 44 | 45 | // attributes 46 | virtual bool hasLocalAttribute(const QByteArray& attrId) const; 47 | virtual bool setAttribute(const QByteArray& attrId, const QVariant& v); 48 | virtual bool removeAttribute(const QByteArray& attrId); 49 | 50 | // serialization 51 | virtual bool storeTo(QDataStream& out, quint64 version64) const; 52 | virtual bool restoreFrom(QDataStream& out, quint64 version64); 53 | 54 | // mousing 55 | virtual bool onDoubleClickDrag(QGraphicsSceneMouseEvent *mouseEvent, const QPointF &clickPos); 56 | virtual void onControlPointMoved(CControlPoint* controlPoint, const QPointF& pos); 57 | 58 | // deleting 59 | virtual void onControlPointDelete(CControlPoint* controlPoint); 60 | 61 | // selection 62 | virtual void onItemMoved(const QPointF& delta); 63 | virtual void onItemSelected(bool state); 64 | 65 | protected: 66 | // reimp 67 | virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR); 68 | 69 | // callbacks 70 | virtual void onParentGeometryChanged(); 71 | 72 | private: 73 | void dropControlPoints(); 74 | void createControlPoints(); 75 | void updateShapeFromPoints(); 76 | 77 | private: 78 | // data model 79 | QList m_polyPoints; 80 | 81 | // visual control points 82 | QList m_controlPoints; 83 | }; 84 | -------------------------------------------------------------------------------- /src/qvgelib/CSVGExport.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2020 Ars L.Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "CSVGExport.h" 16 | #include "CEditorScene.h" 17 | 18 | 19 | bool CSVGExport::save(const QString& fileName, CEditorScene& scene, QString* /*lastError*/) const 20 | { 21 | QScopedPointer tempScene(scene.clone()); 22 | 23 | if (m_cutContent) 24 | tempScene->crop(); 25 | 26 | QSvgGenerator svgWriter; 27 | svgWriter.setFileName(fileName); 28 | 29 | QString comment = scene.getClassAttribute("", "comment", false).defaultValue.toString(); 30 | if (comment.size()) 31 | svgWriter.setTitle(comment); 32 | 33 | QString desc = QString("Created with: ") + QApplication::applicationDisplayName(); 34 | svgWriter.setDescription(desc); 35 | 36 | // resolution 37 | if (m_resolution > 0) 38 | { 39 | int res = svgWriter.resolution(); 40 | double coeff = m_resolution / (double)res; 41 | auto size = tempScene->sceneRect().size(); 42 | auto sizeInch = size * coeff; 43 | //auto sizeMM = sizeInch * 25.4; 44 | //svgWriter.setSize(sizeMM.toSize()); 45 | //svgWriter.setResolution(m_resolution); 46 | svgWriter.setSize(sizeInch.toSize()); 47 | } 48 | else 49 | svgWriter.setSize(tempScene->sceneRect().size().toSize()); 50 | 51 | // export 52 | QPainter painter(&svgWriter); 53 | painter.setRenderHint(QPainter::Antialiasing); 54 | painter.setRenderHint(QPainter::TextAntialiasing); 55 | tempScene->render(&painter); 56 | painter.end(); 57 | 58 | return true; 59 | } 60 | -------------------------------------------------------------------------------- /src/qvgelib/CSVGExport.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2020 Ars L.Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | #include "qvgelib/IFileSerializer.h" 15 | 16 | 17 | class CSVGExport : public IFileSerializer 18 | { 19 | public: 20 | CSVGExport(bool cutContent = true, int resolution = 0) : 21 | m_cutContent(cutContent), 22 | m_resolution(resolution) 23 | {} 24 | 25 | // reimp 26 | virtual QString description() const { 27 | return "Scalable Vector Graphics Format"; 28 | } 29 | 30 | virtual QString filters() const { 31 | return "Scalable Vector Graphics (*.svg)"; 32 | } 33 | 34 | virtual QString defaultFileExtension() const { 35 | return "svg"; 36 | } 37 | 38 | virtual bool loadSupported() const { 39 | return false; 40 | } 41 | 42 | virtual bool load(const QString& /*fileName*/, CEditorScene& /*scene*/, QString* /*lastError = nullptr*/) const { 43 | return false; 44 | } 45 | 46 | virtual bool saveSupported() const { 47 | return true; 48 | } 49 | 50 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const; 51 | 52 | private: 53 | bool m_cutContent = true; 54 | int m_resolution = 96; 55 | }; 56 | -------------------------------------------------------------------------------- /src/qvgelib/CSimpleUndoManager.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | 11 | #include "CSimpleUndoManager.h" 12 | #include "CEditorScene.h" 13 | 14 | #include 15 | 16 | 17 | CSimpleUndoManager::CSimpleUndoManager(CEditorScene & scene) 18 | : m_scene(&scene), 19 | m_stackIndex(-1) 20 | { 21 | } 22 | 23 | void CSimpleUndoManager::reset() 24 | { 25 | m_stackIndex = -1; 26 | m_stateStack.clear(); 27 | } 28 | 29 | void CSimpleUndoManager::addState() 30 | { 31 | // serialize & compress 32 | QByteArray snap; 33 | QDataStream ds(&snap, QIODevice::WriteOnly); 34 | m_scene->storeTo(ds, false); 35 | QByteArray compressedSnap = qCompress(snap); 36 | 37 | // push state into stack 38 | if (m_stateStack.size() == ++m_stackIndex) 39 | { 40 | m_stateStack.append(compressedSnap); 41 | } 42 | else 43 | { 44 | while (m_stateStack.size() > m_stackIndex) 45 | m_stateStack.takeLast(); 46 | 47 | m_stateStack.append(compressedSnap); 48 | } 49 | } 50 | 51 | void CSimpleUndoManager::revertState() 52 | { 53 | if (availableUndoCount()) 54 | { 55 | QByteArray &compressedSnap = m_stateStack[m_stackIndex]; 56 | QByteArray snap = qUncompress(compressedSnap); 57 | QDataStream ds(&snap, QIODevice::ReadOnly); 58 | m_scene->restoreFrom(ds, false); 59 | } 60 | } 61 | 62 | void CSimpleUndoManager::undo() 63 | { 64 | if (availableUndoCount()) 65 | { 66 | QByteArray &compressedSnap = m_stateStack[--m_stackIndex]; 67 | QByteArray snap = qUncompress(compressedSnap); 68 | QDataStream ds(&snap, QIODevice::ReadOnly); 69 | m_scene->restoreFrom(ds, false); 70 | } 71 | } 72 | 73 | void CSimpleUndoManager::redo() 74 | { 75 | if (availableRedoCount()) 76 | { 77 | QByteArray &compressedSnap = m_stateStack[++m_stackIndex]; 78 | QByteArray snap = qUncompress(compressedSnap); 79 | QDataStream ds(&snap, QIODevice::ReadOnly); 80 | m_scene->restoreFrom(ds, false); 81 | } 82 | } 83 | 84 | int CSimpleUndoManager::availableUndoCount() const 85 | { 86 | return (m_stackIndex > 0); 87 | } 88 | 89 | int CSimpleUndoManager::availableRedoCount() const 90 | { 91 | return (m_stackIndex >= 0) && (m_stackIndex < m_stateStack.size() - 1); 92 | } 93 | -------------------------------------------------------------------------------- /src/qvgelib/CSimpleUndoManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef CSIMPLEUNDOMANAGER_H 11 | #define CSIMPLEUNDOMANAGER_H 12 | 13 | #include "IUndoManager.h" 14 | 15 | #include 16 | #include 17 | 18 | class CEditorScene; 19 | 20 | 21 | class CSimpleUndoManager : public IUndoManager 22 | { 23 | public: 24 | CSimpleUndoManager(CEditorScene &scene); 25 | 26 | // reimp 27 | virtual void reset(); 28 | virtual void addState(); 29 | virtual void revertState(); 30 | virtual void undo(); 31 | virtual void redo(); 32 | virtual int availableUndoCount() const; 33 | virtual int availableRedoCount() const; 34 | 35 | private: 36 | CEditorScene *m_scene; 37 | QList m_stateStack; 38 | int m_stackIndex; 39 | }; 40 | 41 | #endif // CUNDOMANAGER_H 42 | -------------------------------------------------------------------------------- /src/qvgelib/CTextLabelEdit.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | class CItem; 16 | class CEditorScene; 17 | 18 | 19 | class CTextLabelEdit: public QGraphicsTextItem 20 | { 21 | Q_OBJECT 22 | 23 | public: 24 | CTextLabelEdit(); 25 | ~CTextLabelEdit(); 26 | 27 | void startEdit(CItem *item); 28 | void finishEdit(bool accept = true); 29 | 30 | void onItemLayout(); 31 | 32 | virtual bool onKeyPressed(CEditorScene& scene, QKeyEvent *keyEvent); 33 | virtual bool onKeyReleased(CEditorScene& scene, QKeyEvent *keyEvent); 34 | 35 | Q_SIGNALS: 36 | void editingStarted(CItem *item); 37 | void editingFinished(CItem *item, bool cancelled); 38 | 39 | protected: 40 | virtual bool sceneEvent(QEvent *event); 41 | virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); 42 | 43 | private Q_SLOT: 44 | void updateGeometry(); 45 | 46 | private: 47 | CItem *m_item = nullptr; 48 | QString m_storedText; 49 | bool m_menuActive = false; 50 | }; 51 | 52 | -------------------------------------------------------------------------------- /src/qvgelib/CTransformRect.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "ISceneEditController.h" 19 | 20 | class CEditorScene; 21 | class CItem; 22 | class CNode; 23 | 24 | class QGraphicsItem; 25 | 26 | 27 | class CTransformRect: public QObject, public ISceneEditController 28 | { 29 | Q_OBJECT 30 | 31 | public: 32 | CTransformRect(); 33 | ~CTransformRect(); 34 | 35 | // move-only mode 36 | void setMoveOnly(bool on); 37 | 38 | // ISceneEditController 39 | virtual void onActivated(CEditorScene& scene); 40 | virtual void onDeactivated(CEditorScene& /*scene*/) {} 41 | virtual void onSelectionChanged(CEditorScene& /*scene*/); 42 | virtual void onSceneChanged(CEditorScene& scene); 43 | virtual void onDragItem(CEditorScene& /*scene*/, QGraphicsSceneMouseEvent* /*mouseEvent*/, QGraphicsItem* /*dragItem*/); 44 | virtual void draw(CEditorScene& scene, QPainter *painter, const QRectF &r); 45 | virtual bool onMousePressed(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent); 46 | virtual bool onMouseMove(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent); 47 | virtual bool onMouseReleased(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent); 48 | 49 | private: 50 | void doSetupItems(CEditorScene& scene); 51 | void doReset(); 52 | void doTransformBy(CEditorScene& scene, QRectF oldRect, QRectF newRect); 53 | 54 | struct ControlPoint 55 | { 56 | QPointF pos; 57 | QCursor cursor; 58 | QRectF sceneRect; 59 | }; 60 | 61 | ControlPoint m_points[8]; 62 | 63 | int m_dragPoint = -1; 64 | QPointF m_dragPos; 65 | QRectF m_dragRect; 66 | QPointF m_lastPos; 67 | QRectF m_lastRect; 68 | 69 | bool m_moveOnlyMode = false; 70 | 71 | // transform lists 72 | QList m_nodesTransform, m_nodesMove; 73 | QList m_others; 74 | }; 75 | 76 | -------------------------------------------------------------------------------- /src/qvgelib/CUtils.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | 24 | class CUtils 25 | { 26 | public: 27 | static QString variantToText(const QVariant& v, int type = -1); 28 | static QVariant textToVariant(const QString& text, int type = QVariant::String); 29 | 30 | static Qt::PenStyle textToPenStyle(const QString& text, Qt::PenStyle def = Qt::NoPen); 31 | static QString penStyleToText(int style); 32 | 33 | static QString visToString(const QSet& visIds); 34 | static QSet visFromString(const QString& text); 35 | static QStringList byteArraySetToStringList(const QSet& visIds); 36 | 37 | static QString pointsToString(const QList& points); 38 | static QList pointsFromString(const QString& text); 39 | 40 | template 41 | static void insertUnique(X& dest, const X& from); 42 | 43 | static QPointF closestIntersection(const QLineF& line, const QPolygonF& with); 44 | 45 | static QString cutLastSuffix(const QString& fileName); 46 | 47 | static QRectF getBoundingRect(const QList& items); 48 | 49 | static QLineF extendLine(const QLineF& line, float fromStart, float fromEnd); 50 | }; 51 | 52 | 53 | template 54 | void CUtils::insertUnique(X& dest, const X& from) 55 | { 56 | for (auto it = from.constBegin(); it != from.constEnd(); ++it) 57 | { 58 | if (!dest.contains(it.key())) 59 | dest[it.key()] = it.value(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/qvgelib/IFileExport.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | class CEditorScene; 15 | 16 | 17 | /** 18 | Common interface to file exporters. 19 | */ 20 | class IFileExport 21 | { 22 | public: 23 | virtual bool save(const QString& fileName, const CEditorScene& scene) const = 0; 24 | }; 25 | -------------------------------------------------------------------------------- /src/qvgelib/IFileSerializer.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | class CEditorScene; 15 | 16 | 17 | /** 18 | Common interface to file format serializers. 19 | */ 20 | class IFileSerializer 21 | { 22 | public: 23 | virtual QString description() const = 0; 24 | virtual QString filters() const = 0; 25 | virtual QString defaultFileExtension() const = 0; 26 | 27 | virtual bool loadSupported() const = 0; 28 | virtual bool load(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const = 0; 29 | 30 | virtual bool saveSupported() const = 0; 31 | virtual bool save(const QString& fileName, CEditorScene& scene, QString* lastError = nullptr) const = 0; 32 | }; 33 | -------------------------------------------------------------------------------- /src/qvgelib/IGraphInterface.h: -------------------------------------------------------------------------------- 1 | #ifndef IGRAPHINTERFACE_H 2 | #define IGRAPHINTERFACE_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | class CEdge; 9 | class CNode; 10 | 11 | 12 | class IGraphInterface 13 | { 14 | public: 15 | virtual CNode* addNode(const QString& nodeId) = 0; 16 | virtual CNode* getNode(const QString& nodeId, bool autoCreate = false) = 0; 17 | 18 | virtual CEdge* addEdge(const QString& edgeId, const QString& startNodeId, const QString& endNodeId) = 0; 19 | virtual CEdge* getEdge(const QString& edgeId) = 0; 20 | virtual bool setEdgeAttr(const QString& edgeId, const QByteArray& attrId, const QVariant& value) = 0; 21 | 22 | virtual QList getEdges() const = 0; 23 | virtual QList getNodes() const = 0; 24 | }; 25 | 26 | 27 | #endif // IGRAPHINTERFACE_H 28 | -------------------------------------------------------------------------------- /src/qvgelib/IInteractive.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | 8 | enum ItemDragTestResult 9 | { 10 | Rejected, 11 | Accepted, 12 | Ignored 13 | }; 14 | 15 | 16 | class IInteractive 17 | { 18 | public: 19 | // callbacks 20 | virtual void onItemMoved(const QPointF& /*delta*/) {} 21 | virtual void onDraggedOver(const QSet& /*acceptedItems*/, const QSet& /*rejectedItems*/) {} 22 | virtual bool onDroppedOn(const QSet& /*acceptedItems*/, const QSet& /*rejectedItems*/, QGraphicsItem** mergedWith = nullptr) { return false; } 23 | virtual void onHoverEnter(QGraphicsItem* /*sceneItem*/, QGraphicsSceneHoverEvent* /*event*/) {} 24 | virtual void onHoverLeave(QGraphicsItem* /*sceneItem*/, QGraphicsSceneHoverEvent* /*event*/) {} 25 | virtual void onClick(QGraphicsSceneMouseEvent* /*mouseEvent*/) {} 26 | virtual void onDoubleClick(QGraphicsSceneMouseEvent* /*mouseEvent*/) {} 27 | virtual bool onClickDrag(QGraphicsSceneMouseEvent* /*mouseEvent*/, const QPointF& /*clickPos*/) { return true; } 28 | virtual bool onDoubleClickDrag(QGraphicsSceneMouseEvent* /*mouseEvent*/, const QPointF& /*clickPos*/) { return false; } 29 | virtual ItemDragTestResult acceptDragFromItem(QGraphicsItem* /*draggedItem*/) { return Ignored; } 30 | virtual void leaveDragFromItem(QGraphicsItem* /*draggedItem*/) {} 31 | }; 32 | -------------------------------------------------------------------------------- /src/qvgelib/ISceneEditController.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | class CEditorScene; 13 | 14 | class QGraphicsSceneMouseEvent; 15 | class QPainter; 16 | class QRectF; 17 | class QGraphicsItem; 18 | class QKeyEvent; 19 | 20 | 21 | class ISceneEditController 22 | { 23 | public: 24 | virtual void onActivated(CEditorScene& scene) = 0; 25 | virtual void onDeactivated(CEditorScene& scene) = 0; 26 | 27 | virtual void onSceneChanged(CEditorScene& scene) = 0; 28 | virtual void onSelectionChanged(CEditorScene& scene) = 0; 29 | virtual void onDragItem(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent, QGraphicsItem* dragItem) = 0; 30 | 31 | virtual bool onMousePressed(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent) = 0; 32 | virtual bool onMouseMove(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent) = 0; 33 | virtual bool onMouseReleased(CEditorScene& scene, QGraphicsSceneMouseEvent *mouseEvent) = 0; 34 | 35 | virtual bool onKeyPressed(CEditorScene& scene, QKeyEvent *keyEvent) { return false; } 36 | virtual bool onKeyReleased(CEditorScene& scene, QKeyEvent *keyEvent) { return false; } 37 | 38 | virtual void draw(CEditorScene& scene, QPainter *painter, const QRectF &r) = 0; 39 | }; 40 | -------------------------------------------------------------------------------- /src/qvgelib/ISceneItemFactory.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | class CItem; 15 | class CEditorScene; 16 | 17 | 18 | /** 19 | Common interface to scene item creation filters. 20 | */ 21 | class ISceneItemFactory 22 | { 23 | public: 24 | virtual CItem* createItemOfType(const QByteArray& typeId, const CEditorScene& scene) const = 0; 25 | }; 26 | -------------------------------------------------------------------------------- /src/qvgelib/ISceneMenuController.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class CEditorScene; 4 | 5 | class QGraphicsItem; 6 | class QGraphicsSceneContextMenuEvent; 7 | 8 | 9 | class ISceneMenuController 10 | { 11 | public: 12 | virtual bool exec(CEditorScene *scene, QGraphicsItem *triggerItem, QGraphicsSceneContextMenuEvent *contextMenuEvent) = 0; 13 | }; 14 | 15 | -------------------------------------------------------------------------------- /src/qvgelib/IUndoManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | 13 | class IUndoManager 14 | { 15 | public: 16 | virtual void reset() = 0; 17 | virtual void addState() = 0; 18 | virtual void revertState() = 0; 19 | virtual void undo() = 0; 20 | virtual void redo() = 0; 21 | virtual int availableUndoCount() const = 0; 22 | virtual int availableRedoCount() const = 0; 23 | }; 24 | -------------------------------------------------------------------------------- /src/qvgelib/Properties.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | 13 | enum PropertiesID 14 | { 15 | ITEM_ID = 0, // unique id of an item (text/int) 16 | ITEM_LABEL, // label of an item (arbitrary text) 17 | ITEM_COMMENT, // any additional text 18 | 19 | ID_USER = 1000 // user-defined properties 20 | }; 21 | -------------------------------------------------------------------------------- /src/qvgelib/qvgelib.pro: -------------------------------------------------------------------------------- 1 | TARGET = qvgelib 2 | QT += core gui widgets printsupport xml 3 | 4 | include($$PWD/../lib.pri) 5 | 6 | CONFIG(debug, debug|release){ 7 | DESTDIR = $$OUT_PWD/../lib.debug 8 | } 9 | else{ 10 | DESTDIR = $$OUT_PWD/../lib 11 | } 12 | 13 | SOURCES += $$files($$PWD/*.cpp) 14 | HEADERS += $$files($$PWD/*.h) 15 | FORMS += $$files($$PWD/*.ui) 16 | RESOURCES += $$files($$PWD/*.qrc) 17 | 18 | INCLUDEPATH += $$PWD $$PWD/.. 19 | 20 | -------------------------------------------------------------------------------- /src/qvgeui/CAttributesEditorUI.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef CATTRIBUTESEDITORUI_H 11 | #define CATTRIBUTESEDITORUI_H 12 | 13 | #include 14 | #include 15 | 16 | #include 17 | #include 18 | 19 | class CEditorScene; 20 | class CItem; 21 | 22 | class CPropertyEditorUIBase; 23 | 24 | 25 | namespace Ui { 26 | class CAttributesEditorUI; 27 | } 28 | 29 | class CAttributesEditorUI : public QWidget 30 | { 31 | Q_OBJECT 32 | 33 | public: 34 | explicit CAttributesEditorUI(QWidget *parent = 0); 35 | ~CAttributesEditorUI(); 36 | 37 | int setupFromItems(CEditorScene& scene, QList& items); 38 | 39 | CPropertyEditorUIBase* getEditor(); 40 | 41 | private Q_SLOTS: 42 | void on_AddButton_clicked(); 43 | void on_ChangeButton_clicked(); 44 | void on_RemoveButton_clicked(); 45 | void on_Editor_currentItemChanged(QtBrowserItem*); 46 | void onValueChanged(QtProperty *property, const QVariant &val); 47 | 48 | private: 49 | Ui::CAttributesEditorUI *ui; 50 | 51 | CEditorScene *m_scene; 52 | QList m_items; 53 | 54 | QtVariantPropertyManager m_manager; 55 | QtVariantEditorFactory m_factory; 56 | }; 57 | 58 | #endif // CATTRIBUTESEDITORUI_H 59 | -------------------------------------------------------------------------------- /src/qvgeui/CClassAttributesEditorUI.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | #include 14 | #include 15 | 16 | #include 17 | #include 18 | 19 | #include "ui_CClassAttributesEditorUI.h" 20 | 21 | 22 | class CEditorScene; 23 | class CItem; 24 | 25 | 26 | class CClassAttributesEditorUI : public QWidget 27 | { 28 | Q_OBJECT 29 | 30 | public: 31 | explicit CClassAttributesEditorUI(QWidget *parent = 0); 32 | ~CClassAttributesEditorUI(); 33 | 34 | void setScene(CEditorScene* scene); 35 | 36 | void doReadSettings(QSettings& settings); 37 | void doWriteSettings(QSettings& settings); 38 | 39 | protected: 40 | void connectSignals(CEditorScene* scene); 41 | void onSceneAttached(CEditorScene* scene); 42 | void onSceneDetached(CEditorScene* scene); 43 | 44 | QByteArray getClassId() const; 45 | 46 | protected Q_SLOTS: 47 | void onSceneChanged(); 48 | //void on_ClassId_currentIndexChanged(int); 49 | void on_Editor_currentItemChanged(QtBrowserItem*); 50 | void rebuild(); 51 | 52 | private Q_SLOTS: 53 | void on_AddButton_clicked(); 54 | void on_ChangeButton_clicked(); 55 | void on_RemoveButton_clicked(); 56 | void onValueChanged(QtProperty *property, const QVariant &val); 57 | 58 | private: 59 | Ui::CClassAttributesEditorUI *ui; 60 | 61 | QtVariantPropertyManager m_manager; 62 | QtVariantEditorFactory m_factory; 63 | 64 | CEditorScene *m_scene; 65 | 66 | bool m_locked; 67 | }; 68 | 69 | -------------------------------------------------------------------------------- /src/qvgeui/CColorSchemesUIController.h: -------------------------------------------------------------------------------- 1 | #ifndef CCOLORSCHEMESUICONTROLLER_H 2 | #define CCOLORSCHEMESUICONTROLLER_H 3 | 4 | #include 5 | #include 6 | #include 7 | 8 | class CEditorScene; 9 | 10 | 11 | class CColorSchemesUIController : public QObject 12 | { 13 | Q_OBJECT 14 | public: 15 | explicit CColorSchemesUIController(QObject *parent = nullptr); 16 | 17 | void setScene(CEditorScene* scene) { 18 | m_scene = scene; 19 | } 20 | 21 | QMenu* getSchemesMenu() { 22 | return &m_menu; 23 | } 24 | 25 | Q_SIGNALS: 26 | void colorSchemeApplied(CEditorScene* scene); 27 | 28 | private Q_SLOTS: 29 | void onMenuTriggered(QAction *action); 30 | 31 | private: 32 | QMenu m_menu; 33 | CEditorScene *m_scene = NULL; 34 | 35 | struct Scheme 36 | { 37 | QString name; 38 | QColor bgColor, gridColor; 39 | QColor nodeColor, nodeStrokeColor, nodeLabelColor; 40 | QColor edgeColor, edgeLabelColor; 41 | }; 42 | 43 | QList m_schemes; 44 | 45 | void addScheme(const Scheme& scheme); 46 | void applyScheme(const Scheme& scheme); 47 | }; 48 | 49 | #endif // CCOLORSCHEMESUICONTROLLER_H 50 | -------------------------------------------------------------------------------- /src/qvgeui/CCommutationTable.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef CCommutationTable_H 11 | #define CCommutationTable_H 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | class CEditorScene; 19 | class CNodeEditorScene; 20 | struct CAttribute; 21 | class CEdge; 22 | 23 | #include "ui_CCommutationTable.h" 24 | 25 | 26 | class CCommutationTable : public QWidget 27 | { 28 | Q_OBJECT 29 | 30 | public: 31 | CCommutationTable(QWidget *parent = 0); 32 | ~CCommutationTable(); 33 | 34 | void setScene(CNodeEditorScene* scene); 35 | 36 | void doReadSettings(QSettings& settings); 37 | void doWriteSettings(QSettings& settings); 38 | 39 | protected: 40 | void connectSignals(CEditorScene* scene); 41 | void onSceneAttached(CEditorScene* scene); 42 | void onSceneDetached(CEditorScene* scene); 43 | 44 | protected Q_SLOTS: 45 | void onSceneChanged(); 46 | void onSelectionChanged(); 47 | void on_Table_itemSelectionChanged(); 48 | void on_Table_itemDoubleClicked(QTreeWidgetItem *item, int column); 49 | void onCustomContextMenu(const QPoint &); 50 | void onAddSection(); 51 | void onRemoveSection(); 52 | void on_AddColumnButton_clicked(); 53 | void on_RestoreButton_clicked(); 54 | 55 | private: 56 | Ui::CCommutationTable ui; 57 | 58 | CNodeEditorScene *m_scene; 59 | 60 | QMap m_edgeItemMap; 61 | 62 | QByteArrayList m_extraSectionIds; 63 | }; 64 | 65 | #endif // CCommutationTable_H 66 | -------------------------------------------------------------------------------- /src/qvgeui/CNewAttributeDialog.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #include "CNewAttributeDialog.h" 11 | #include "ui_CNewAttributeDialog.h" 12 | 13 | #include 14 | 15 | 16 | CNewAttributeDialog::CNewAttributeDialog(QWidget *parent) : 17 | QDialog(parent), 18 | ui(new Ui::CNewAttributeDialog) 19 | { 20 | ui->setupUi(this); 21 | 22 | ui->ButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false); 23 | } 24 | 25 | CNewAttributeDialog::~CNewAttributeDialog() 26 | { 27 | delete ui; 28 | } 29 | 30 | 31 | QByteArray CNewAttributeDialog::getId() const 32 | { 33 | return ui->Id->text().toLatin1(); 34 | } 35 | 36 | 37 | void CNewAttributeDialog::setId(const QString& id) 38 | { 39 | ui->Id->setText(id); 40 | } 41 | 42 | 43 | int CNewAttributeDialog::getType() const 44 | { 45 | switch (ui->Type->currentIndex()) 46 | { 47 | case 0: return QVariant::Int; 48 | case 1: return QVariant::Double; 49 | case 2: return QVariant::Bool; 50 | case 3: return QVariant::Color; 51 | case 4: return QVariant::Font; 52 | default: return QVariant::String; 53 | } 54 | } 55 | 56 | 57 | int CNewAttributeDialog::setType(int type) 58 | { 59 | switch (type) 60 | { 61 | case QVariant::Int: ui->Type->setCurrentIndex(0); break; 62 | case QVariant::Double: ui->Type->setCurrentIndex(1); break; 63 | case QVariant::Bool: ui->Type->setCurrentIndex(2); break; 64 | case QVariant::Color: ui->Type->setCurrentIndex(3); break; 65 | case QVariant::Font: ui->Type->setCurrentIndex(4); break; 66 | default: ui->Type->setCurrentIndex(5); break; 67 | } 68 | 69 | return ui->Type->currentIndex(); 70 | } 71 | 72 | 73 | QVariant CNewAttributeDialog::getValue() const 74 | { 75 | switch (ui->Type->currentIndex()) 76 | { 77 | case 0: return int(0); 78 | case 1: return double(0.0); 79 | case 2: return bool(true); 80 | case 3: return QColor(); 81 | case 4: return QFont(); 82 | default: return QString(); 83 | } 84 | } 85 | 86 | 87 | void CNewAttributeDialog::on_Id_textChanged(const QString &text) 88 | { 89 | ui->ButtonBox->button(QDialogButtonBox::Ok)->setEnabled(text.size()); 90 | } 91 | -------------------------------------------------------------------------------- /src/qvgeui/CNewAttributeDialog.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef CNewAttributeDialog_H 11 | #define CNewAttributeDialog_H 12 | 13 | #include 14 | 15 | namespace Ui { 16 | class CNewAttributeDialog; 17 | } 18 | 19 | class CNewAttributeDialog : public QDialog 20 | { 21 | Q_OBJECT 22 | 23 | public: 24 | explicit CNewAttributeDialog(QWidget *parent = 0); 25 | ~CNewAttributeDialog(); 26 | 27 | QByteArray getId() const; 28 | void setId(const QString& id); 29 | 30 | int getType() const; 31 | int setType(int type); 32 | 33 | QVariant getValue() const; 34 | 35 | private Q_SLOTS: 36 | void on_Id_textChanged(const QString& text); 37 | 38 | private: 39 | Ui::CNewAttributeDialog *ui; 40 | }; 41 | 42 | #endif // CNewAttributeDialog_H 43 | -------------------------------------------------------------------------------- /src/qvgeui/CNodePortEditorDialog.cpp: -------------------------------------------------------------------------------- 1 | #include "CNodePortEditorDialog.h" 2 | #include "ui_CNodePortEditorDialog.h" 3 | 4 | #include 5 | #include 6 | 7 | 8 | CNodePortEditorDialog::CNodePortEditorDialog(): ui(new Ui::CNodePortEditorDialog) 9 | { 10 | ui->setupUi(this); 11 | 12 | ui->Anchor->addItem(tr("Left"), Qt::AlignLeft + Qt::AlignVCenter); 13 | ui->Anchor->addItem(tr("Top-Left"), Qt::AlignTop + Qt::AlignLeft); 14 | ui->Anchor->addItem(tr("Top"), Qt::AlignTop + Qt::AlignHCenter); 15 | ui->Anchor->addItem(tr("Top-Right"), Qt::AlignTop + Qt::AlignRight); 16 | ui->Anchor->addItem(tr("Right"), Qt::AlignRight + Qt::AlignVCenter); 17 | ui->Anchor->addItem(tr("Bottom-Right"), Qt::AlignBottom + Qt::AlignRight); 18 | ui->Anchor->addItem(tr("Bottom"), Qt::AlignBottom + Qt::AlignHCenter); 19 | ui->Anchor->addItem(tr("Bottom-Left"), Qt::AlignBottom + Qt::AlignLeft); 20 | ui->Anchor->addItem(tr("Center"), Qt::AlignCenter); 21 | } 22 | 23 | 24 | CNodePortEditorDialog::~CNodePortEditorDialog() 25 | { 26 | } 27 | 28 | 29 | int CNodePortEditorDialog::exec(CNodePort &port) 30 | { 31 | m_port = nullptr; 32 | m_node = nullptr; 33 | 34 | ui->PortId->setText(port.getId()); 35 | 36 | int align = port.getAlign(); 37 | int alignIndex = ui->Anchor->findData(align); 38 | if (alignIndex < 0) alignIndex = 0; 39 | ui->Anchor->setCurrentIndex(alignIndex); 40 | 41 | ui->OffsetX->setValue(port.getX()); 42 | ui->OffsetY->setValue(port.getY()); 43 | 44 | ui->Color->setColor(port.getColor()); 45 | 46 | // set here in order to make interactive during editing 47 | m_port = &port; 48 | m_node = port.getNode(); 49 | 50 | int result = QDialog::exec(); 51 | if (result == QDialog::Accepted) 52 | { 53 | m_node->renamePort(m_port->getId(), ui->PortId->text().toLocal8Bit()); 54 | } 55 | 56 | return result; 57 | } 58 | 59 | 60 | void CNodePortEditorDialog::doUpdate() 61 | { 62 | if (m_port && m_node) 63 | { 64 | int align = ui->Anchor->currentData().toInt(); 65 | int xv = ui->OffsetX->value(); 66 | int yv = ui->OffsetY->value(); 67 | m_node->movePort(m_port->getId(), align, xv, yv); 68 | m_port->setColor(ui->Color->color()); 69 | } 70 | } 71 | 72 | 73 | void CNodePortEditorDialog::on_Color_activated(const QColor &) 74 | { 75 | doUpdate(); 76 | } 77 | 78 | 79 | void CNodePortEditorDialog::on_Anchor_currentIndexChanged(int) 80 | { 81 | doUpdate(); 82 | } 83 | 84 | 85 | void CNodePortEditorDialog::on_OffsetX_valueChanged(int) 86 | { 87 | doUpdate(); 88 | } 89 | 90 | 91 | void CNodePortEditorDialog::on_OffsetY_valueChanged(int) 92 | { 93 | doUpdate(); 94 | } 95 | 96 | -------------------------------------------------------------------------------- /src/qvgeui/CNodePortEditorDialog.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | namespace Ui { 6 | class CNodePortEditorDialog; 7 | } 8 | 9 | class CNode; 10 | class CNodePort; 11 | 12 | 13 | class CNodePortEditorDialog : public QDialog 14 | { 15 | Q_OBJECT 16 | 17 | public: 18 | CNodePortEditorDialog(); 19 | ~CNodePortEditorDialog(); 20 | 21 | int exec(CNodePort &port); 22 | 23 | private Q_SLOTS: 24 | void on_Anchor_currentIndexChanged(int index); 25 | void on_OffsetX_valueChanged(int v); 26 | void on_OffsetY_valueChanged(int v); 27 | void on_Color_activated(const QColor &color); 28 | 29 | private: 30 | void doUpdate(); 31 | 32 | Ui::CNodePortEditorDialog *ui; 33 | 34 | CNodePort *m_port = nullptr; 35 | CNode *m_node = nullptr; 36 | }; 37 | 38 | -------------------------------------------------------------------------------- /src/qvgeui/CNodesFactorDialog.cpp: -------------------------------------------------------------------------------- 1 | #include "CNodesFactorDialog.h" 2 | #include "ui_CNodesFactorDialog.h" 3 | 4 | #include 5 | #include 6 | 7 | 8 | CNodesFactorDialog::CNodesFactorDialog(): ui(new Ui::CNodesFactorDialog) 9 | { 10 | ui->setupUi(this); 11 | } 12 | 13 | 14 | CNodesFactorDialog::~CNodesFactorDialog() 15 | { 16 | } 17 | 18 | 19 | int CNodesFactorDialog::exec(CNodeEditorScene& scene) 20 | { 21 | m_scene = &scene; 22 | 23 | auto nodes = scene.getSelectedNodes(); 24 | if (nodes.isEmpty()) 25 | return QDialog::Rejected; 26 | 27 | ui->FactorX->setValue(100); 28 | ui->FactorY->setValue(100); 29 | 30 | m_sourceMap.clear(); 31 | QRectF boundingRect; 32 | 33 | for (auto node : nodes) 34 | { 35 | m_sourceMap[node] = node->pos(); 36 | boundingRect = boundingRect.united(QRectF(node->pos(), QSizeF(1,1))); 37 | } 38 | 39 | m_sourceCenter = boundingRect.center(); 40 | 41 | return QDialog::exec(); 42 | } 43 | 44 | 45 | void CNodesFactorDialog::on_FactorX_valueChanged(int v) 46 | { 47 | double dv = (double)v / 100.0; 48 | 49 | for (auto it = m_sourceMap.begin(); it != m_sourceMap.end(); ++it) 50 | { 51 | double dx = it.value().x() - m_sourceCenter.x(); 52 | dx *= dv; 53 | double newx = dx + m_sourceCenter.x(); 54 | 55 | it.key()->setPos(newx, it.key()->pos().y()); 56 | } 57 | } 58 | 59 | 60 | void CNodesFactorDialog::on_FactorY_valueChanged(int v) 61 | { 62 | double dv = (double)v / 100.0; 63 | 64 | for (auto it = m_sourceMap.begin(); it != m_sourceMap.end(); ++it) 65 | { 66 | double dy = it.value().y() - m_sourceCenter.y(); 67 | dy *= dv; 68 | double newy = dy + m_sourceCenter.y(); 69 | 70 | it.key()->setPos(it.key()->pos().x(), newy); 71 | } 72 | } 73 | 74 | -------------------------------------------------------------------------------- /src/qvgeui/CNodesFactorDialog.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | 9 | namespace Ui { 10 | class CNodesFactorDialog; 11 | } 12 | 13 | class CNode; 14 | class CNodeEditorScene; 15 | 16 | 17 | class CNodesFactorDialog : public QDialog 18 | { 19 | Q_OBJECT 20 | 21 | public: 22 | CNodesFactorDialog(); 23 | ~CNodesFactorDialog(); 24 | 25 | int exec(CNodeEditorScene& scene); 26 | 27 | private Q_SLOTS: 28 | void on_FactorX_valueChanged(int v); 29 | void on_FactorY_valueChanged(int v); 30 | 31 | private: 32 | Ui::CNodesFactorDialog *ui; 33 | 34 | QMap m_sourceMap; 35 | QPointF m_sourceCenter; 36 | 37 | CNodeEditorScene *m_scene; 38 | }; 39 | 40 | -------------------------------------------------------------------------------- /src/qvgeui/CSceneMenuUIController.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #include 7 | 8 | class CNodeEditorScene; 9 | 10 | 11 | class CSceneMenuUIController : public QObject, public ISceneMenuController 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | CSceneMenuUIController(QObject *parent = nullptr); 17 | virtual ~CSceneMenuUIController(); 18 | 19 | // called before \a menu is about to show. 20 | virtual void fillMenu(QMenu &menu, CEditorScene *scene, QGraphicsItem *triggerItem, QGraphicsSceneContextMenuEvent *contextMenuEvent); 21 | 22 | // reimp: ISceneMenuController 23 | virtual bool exec(CEditorScene *scene, QGraphicsItem *triggerItem, QGraphicsSceneContextMenuEvent *contextMenuEvent); 24 | 25 | Q_SIGNALS: 26 | // emitted before \a menu is about to show. 27 | void onContextMenu(QMenu &menu); 28 | 29 | private: 30 | CNodeEditorScene* m_scene = nullptr; 31 | }; 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/qvgeui/CSceneOptionsDialog.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #ifndef CSCENEOPTIONSDIALOG_H 11 | #define CSCENEOPTIONSDIALOG_H 12 | 13 | #include 14 | 15 | #include 16 | #include 17 | 18 | 19 | namespace Ui { 20 | class CSceneOptionsDialog; 21 | } 22 | 23 | 24 | struct OptionsData 25 | { 26 | int backupPeriod = 10; 27 | 28 | QString graphvizPath; 29 | //QStringList graphvizEngines; 30 | QString graphvizDefaultEngine; 31 | }; 32 | 33 | 34 | class CSceneOptionsDialog : public QDialog 35 | { 36 | Q_OBJECT 37 | 38 | public: 39 | explicit CSceneOptionsDialog(QWidget *parent = 0); 40 | ~CSceneOptionsDialog(); 41 | 42 | public Q_SLOTS: 43 | virtual int exec(CEditorScene &scene, CEditorView &view, OptionsData &data); 44 | 45 | Q_SIGNALS: 46 | void testGraphviz(const QString &graphvizPath); 47 | 48 | private Q_SLOTS: 49 | void on_GraphvizTest_clicked(); 50 | 51 | private: 52 | Ui::CSceneOptionsDialog *ui; 53 | }; 54 | 55 | #endif // CSCENEOPTIONSDIALOG_H 56 | -------------------------------------------------------------------------------- /src/qvgeui/CSearchDialog.h: -------------------------------------------------------------------------------- 1 | /* 2 | This file is a part of 3 | QVGE - Qt Visual Graph Editor 4 | 5 | (c) 2016-2021 Ars L. Masiuk (ars.masiuk@gmail.com) 6 | 7 | It can be used freely, maintaining the information above. 8 | */ 9 | 10 | #pragma once 11 | 12 | #include 13 | 14 | 15 | class CNodeEditorScene; 16 | 17 | 18 | namespace Ui { 19 | class CSearchDialog; 20 | } 21 | 22 | class CSearchDialog : public QDialog 23 | { 24 | Q_OBJECT 25 | 26 | public: 27 | explicit CSearchDialog(QWidget *parent = 0); 28 | ~CSearchDialog(); 29 | 30 | public Q_SLOTS: 31 | void exec(CNodeEditorScene &scene); 32 | 33 | private Q_SLOTS: 34 | void updateButtons(); 35 | void on_Find_clicked(); 36 | void on_Results_itemSelectionChanged(); 37 | 38 | private: 39 | Ui::CSearchDialog *ui; 40 | 41 | CNodeEditorScene *m_scene = 0; 42 | }; 43 | 44 | -------------------------------------------------------------------------------- /src/qvgeui/Icons/Action-Crop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Action-Crop.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Action-Link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Action-Link.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Action-Unlink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Action-Unlink.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Direction-Both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Direction-Both.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Direction-None.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Direction-None.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Direction-One.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Direction-One.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Edge-Direct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Edge-Direct.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Edge-Polyline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Edge-Polyline.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Format-DOT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Format-DOT.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Format-GEXF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Format-GEXF.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Format-GraphML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Format-GraphML.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Format-PDF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Format-PDF.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Graph.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Grid-Snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Grid-Snap.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Grid.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Mode-AddNodes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Mode-AddNodes.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Mode-Factor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Mode-Factor.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Mode-Select.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Mode-Select.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Mode-Transform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Mode-Transform.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Node-Hexagon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Node-Hexagon.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Node-Romb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Node-Romb.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Node-Round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Node-Round.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Node-Square.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Node-Square.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Node-Triangle-Down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Node-Triangle-Down.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Node-Triangle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Node-Triangle.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Scroll-Navigator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Scroll-Navigator.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Search.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/Settings.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/edit-copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/edit-copy.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/edit-cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/edit-cut.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/edit-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/edit-delete.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/edit-paste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/edit-paste.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/edit-redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/edit-redo.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/edit-undo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/edit-undo.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/label-align-center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/label-align-center.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/label-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/label-bottom.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/label-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/label-left.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/label-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/label-right.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/label-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/label-top.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/text-label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/text-label.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom-fit-items.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom-fit-items.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom-fit-selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom-fit-selection.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom-in.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom-original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom-original.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom-out.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom-previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom-previous.png -------------------------------------------------------------------------------- /src/qvgeui/Icons/zoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/src/qvgeui/Icons/zoom.png -------------------------------------------------------------------------------- /src/qvgeui/gvgraph/CGVGraphLayoutUIController.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | class CMainWindow; 6 | class CEditorScene; 7 | 8 | 9 | class CGVGraphLayoutUIController : public QObject 10 | { 11 | Q_OBJECT 12 | 13 | public: 14 | explicit CGVGraphLayoutUIController(CMainWindow *parent, CEditorScene *scene); 15 | 16 | void setPathToGraphviz(const QString &pathToGraphviz); 17 | void setDefaultEngine(const QString &engine); 18 | 19 | // file IO (think: to move?) 20 | bool loadGraph(const QString &filename, CEditorScene &scene, QString* lastError = nullptr); 21 | 22 | Q_SIGNALS: 23 | void loadFinished(); 24 | void layoutFinished(); 25 | 26 | public Q_SLOTS: 27 | void runGraphvizTest(const QString &graphvizPath); 28 | 29 | private Q_SLOTS: 30 | void doDotLayout() { doLayout("dot", *m_scene); } 31 | void doNeatoLayout() { doLayout("neato", *m_scene); } 32 | void doFDPLayout() { doLayout("fdp", *m_scene); } 33 | void doSFDPLayout() { doLayout("sfdp", *m_scene); } 34 | void doTwopiLayout() { doLayout("twopi", *m_scene); } 35 | void doCircularLayout() { doLayout("circo", *m_scene); } 36 | 37 | private: 38 | bool doLayout(const QString &engine, CEditorScene &scene); 39 | bool doRunDOT(const QString &engine, const QString &dotFilePath, QString &plainFilePath, QString* lastError /*= nullptr*/); 40 | QString errorNotWritable(const QString &path) const; 41 | QString errorCannotRun(const QString &path) const; 42 | QString errorCannotFinish(const QString &path) const; 43 | 44 | CMainWindow *m_parent = nullptr; 45 | CEditorScene *m_scene = nullptr; 46 | 47 | QString m_pathToGraphviz; 48 | QString m_defaultEngine; 49 | }; 50 | -------------------------------------------------------------------------------- /src/qvgeui/ogdf/COGDFLayout.h: -------------------------------------------------------------------------------- 1 | #ifndef COGDFLAYOUT_H 2 | #define COGDFLAYOUT_H 3 | 4 | // stl 5 | #include 6 | 7 | // qt 8 | #include 9 | 10 | // qvge 11 | class CNodeEditorScene; 12 | 13 | // ogdf 14 | namespace ogdf 15 | { 16 | class LayoutModule; 17 | class Graph; 18 | class GraphAttributes; 19 | } 20 | 21 | 22 | class COGDFLayout 23 | { 24 | public: 25 | COGDFLayout(); 26 | 27 | static void doLayout(ogdf::LayoutModule& layout, CNodeEditorScene &scene); 28 | 29 | static void graphTopologyToScene(const ogdf::Graph &G, const ogdf::GraphAttributes &GA, CNodeEditorScene &scene); 30 | static void graphToScene(const ogdf::Graph &G, const ogdf::GraphAttributes &GA, CNodeEditorScene &scene); 31 | 32 | static bool loadGraph(const QString &filename, CNodeEditorScene &scene, QString* lastError = nullptr); 33 | 34 | private: 35 | static bool autoLayoutIfNone(const ogdf::Graph &G, ogdf::GraphAttributes &GA); 36 | }; 37 | 38 | #endif // COGDFLAYOUT_H 39 | -------------------------------------------------------------------------------- /src/qvgeui/ogdf/COGDFLayoutUIController.h: -------------------------------------------------------------------------------- 1 | #ifndef COGDFLAYOUTUICONTROLLER_H 2 | #define COGDFLAYOUTUICONTROLLER_H 3 | 4 | #include 5 | 6 | class CMainWindow; 7 | class CNodeEditorScene; 8 | 9 | 10 | class COGDFLayoutUIController : public QObject 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | explicit COGDFLayoutUIController(CMainWindow *parent, CNodeEditorScene *scene); 16 | 17 | Q_SIGNALS: 18 | void layoutFinished(); 19 | 20 | private Q_SLOTS: 21 | void doPlanarLayout(); 22 | void doLinearLayout(); 23 | void doBalloonLayout(); 24 | void doCircularLayout(); 25 | void doTreeLayout(); 26 | void doFMMMLayout(); 27 | void doDHLayout(); 28 | void doSugiyamaLayout(); 29 | 30 | void createNewGraph(); 31 | 32 | private: 33 | CMainWindow *m_parent; 34 | CNodeEditorScene *m_scene; 35 | }; 36 | 37 | #endif // COGDFLAYOUTUICONTROLLER_H 38 | -------------------------------------------------------------------------------- /src/qvgeui/ogdf/COGDFNewGraphDialog.h: -------------------------------------------------------------------------------- 1 | #ifndef COGDFNEWGRAPHDIALOG_H 2 | #define COGDFNEWGRAPHDIALOG_H 3 | 4 | #include 5 | #include 6 | 7 | class CNodeEditorScene; 8 | 9 | namespace Ui { 10 | class COGDFNewGraphDialog; 11 | } 12 | 13 | 14 | class COGDFNewGraphDialog : public QDialog 15 | { 16 | Q_OBJECT 17 | 18 | public: 19 | explicit COGDFNewGraphDialog(QWidget *parent = 0); 20 | ~COGDFNewGraphDialog(); 21 | 22 | bool exec(CNodeEditorScene &scene); 23 | 24 | private Q_SLOTS: 25 | void on_List_currentRowChanged(int currentRow); 26 | void on_List_itemActivated(QListWidgetItem *item); 27 | 28 | private: 29 | Ui::COGDFNewGraphDialog *ui; 30 | }; 31 | 32 | #endif // COGDFNEWGRAPHDIALOG_H 33 | -------------------------------------------------------------------------------- /src/qvgeui/qvgeui.pri: -------------------------------------------------------------------------------- 1 | # config 2 | include($$PWD/../config.pri) 3 | 4 | # app sources 5 | SOURCES += $$files($$PWD/*.cpp) 6 | HEADERS += $$files($$PWD/*.h) 7 | FORMS += $$files($$PWD/*.ui) 8 | RESOURCES += $$files($$PWD/*.qrc) 9 | 10 | # base sources 11 | include($$PWD/../appbase/appbase.pri) 12 | 13 | # includes 14 | INCLUDEPATH += $$PWD $$PWD/.. 15 | INCLUDEPATH += $$PWD/../3rdParty 16 | INCLUDEPATH += $$PWD/../3rdParty/qsint-widgets 17 | INCLUDEPATH += $$PWD/../3rdParty/qtpropertybrowser 18 | 19 | USE_OGDF{ 20 | 21 | INCLUDEPATH += $$OGDF_INCLUDE_PATH 22 | 23 | message(qvgeui.pri - use OGDF) 24 | message($$OGDF_INCLUDE_PATH) 25 | 26 | SOURCES += $$files($$PWD/ogdf/*.cpp) 27 | HEADERS += $$files($$PWD/ogdf/*.h) 28 | FORMS += $$files($$PWD/ogdf/*.ui) 29 | } 30 | 31 | USE_BOOST{ 32 | INCLUDEPATH += $$BOOST_INCLUDE_PATH 33 | } 34 | 35 | USE_GVGRAPH{ 36 | SOURCES += $$files($$PWD/gvgraph/*.cpp) 37 | HEADERS += $$files($$PWD/gvgraph/*.h) 38 | } 39 | -------------------------------------------------------------------------------- /src/qvgeui/qvgeui.pro: -------------------------------------------------------------------------------- 1 | include($$PWD/../lib.pri) 2 | 3 | TARGET = qvgeui 4 | QT += core gui widgets printsupport xml 5 | 6 | include($$PWD/qvgeui.pri) 7 | -------------------------------------------------------------------------------- /win32/build_msvc_2017_64/makevc.bat: -------------------------------------------------------------------------------- 1 | call "c:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" 2 | 3 | c:\Qt\5.13.2\msvc2017_64\bin\qmake -r ../../src/qvge.pro -tp vc -recursive 4 | -------------------------------------------------------------------------------- /win32/build_msvc_2019_64/makevc.bat: -------------------------------------------------------------------------------- 1 | call "c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" 2 | 3 | c:\Qt\5.15.1\msvc2019_64\bin\qmake -r ../../src/qvge.pro -tp vc -recursive 4 | -------------------------------------------------------------------------------- /win32/build_msvc_2022_64/deployvc.bat: -------------------------------------------------------------------------------- 1 | c:\Qt\5.15.12\msvc2022_64\bin\windeployqt ./bin/qvge.exe 2 | -------------------------------------------------------------------------------- /win32/build_msvc_2022_64/makevc.bat: -------------------------------------------------------------------------------- 1 | call "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Auxiliary\Build\vcvars64.bat" 2 | 3 | c:\Qt\5.15.12\msvc2022_64\bin\qmake -r ../../src/qvge.pro -tp vc -recursive 4 | -------------------------------------------------------------------------------- /win32/setup/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ArsMasiuk/qvge/5751948358d407673cfda10f52892683be143d42/win32/setup/icon.ico -------------------------------------------------------------------------------- /win32/setup/qvge.ini: -------------------------------------------------------------------------------- 1 | [General] 2 | instances=@Variant(\0\0\0\b\0\0\0\0) 3 | windowState=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\x1\x45\0\0\x2\xe9\xfc\x2\0\0\0\x2\xfb\0\0\0\x18\0\x64\0\x65\0\x66\0\x61\0u\0l\0t\0s\0\x44\0o\0\x63\0k\x1\0\0\0H\0\0\x1\x8b\0\0\0\x99\0\xff\xff\xff\xfb\0\0\0\x1e\0\x63\0o\0n\0n\0\x65\0\x63\0t\0i\0o\0n\0s\0\x44\0o\0\x63\0k\x1\0\0\x1\xd7\0\0\x1Z\0\0\0z\0\xff\xff\xff\0\0\0\x1\0\0\x1s\0\0\x2\xe9\xfc\x2\0\0\0\x2\xfb\0\0\0\x18\0p\0r\0o\0p\0\x65\0r\0t\0y\0\x44\0o\0\x63\0k\x1\0\0\0H\0\0\x1*\0\0\x1*\0\0\x1*\xfb\0\0\0\x1a\0q\0u\0i\0\x63\0k\0H\0\x65\0l\0p\0\x44\0o\0\x63\0k\x1\0\0\x1v\0\0\x1\xbb\0\0\0]\0\xff\xff\xff\0\0\x3\x80\0\0\x2\xe9\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\x4\0\0\0\x16\0\x66\0i\0l\0\x65\0T\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x16\0\x65\0\x64\0i\0t\0T\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\0z\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0 \0\x65\0\x64\0i\0t\0M\0o\0\x64\0\x65\0s\0T\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\x1\x98\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x16\0z\0o\0o\0m\0T\0o\0o\0l\0\x62\0\x61\0r\x1\0\0\x2\xa5\xff\xff\xff\xff\0\0\0\0\0\0\0\0) 4 | geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\xff\xff\xff\xff\xff\xff\xff\xf8\0\0\x6@\0\0\x3\\\0\0\0\x65\0\0\0Q\0\0\x5\xdc\0\0\x3H\0\0\0\0\x2\0\0\0\x6@\0\0\0\0\0\0\0\x17\0\0\x6?\0\0\x3[) 5 | maximized=true 6 | antialiasing=true 7 | cacheRam=200000 8 | lastExportPath= 9 | backupPeriod=10 10 | lastPath= 11 | 12 | [Scene] 13 | Defaults\showNodeIds=false 14 | Defaults\showEdgeIds=false 15 | Defaults\background=@Variant(\0\0\0\x43\x1\xff\xff\xff\xff\xff\xff\xff\xff\0\0) 16 | Defaults\grid.color=@Variant(\0\0\0MS\0\0\0\0\0\0\0\0\x1\x1\xff\xff\xa0\xa0\xa0\xa0\xa4\xa4\0\0@\0\0\0\0\0\0\0\0\0\0\x2?\xf0\0\0\0\0\0\0@\0\0\0\0\0\0\0) 17 | Defaults\grid.size=25 18 | Defaults\grid.enabled=true 19 | Defaults\grid.snap=true 20 | 21 | [IO] 22 | ImageExport\ImageExport\DPI=96 23 | ImageExport\ImageExport\CutContent=true 24 | lastExportPath= 25 | 26 | [UI] 27 | ItemProperties\nodes\splitterPosition=100 28 | ItemProperties\edges\splitterPosition=100 29 | ClassAttributes\splitterPosition=100 30 | 31 | [GraphViz] 32 | defaultEngine=dot 33 | path=../tools/graphviz 34 | --------------------------------------------------------------------------------