From d10b7efdc55748834007e342eae4e7365cd8bf08 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 19 Nov 2016 02:33:11 +0000 Subject: [PATCH] Initial commit --- Consolas.ttf | Bin 0 -> 120436 bytes ConsoleClient.pro | 39 ++ ConsoleClient.pro.user | 336 +++++++++++++ Makefile | 599 +++++++++++++++++++++++ Resources.qrc | 22 + addconndialog.cpp | 33 ++ addconndialog.h | 35 ++ addconndialog.ui | 179 +++++++ addgroupdialog.cpp | 30 ++ addgroupdialog.h | 30 ++ addgroupdialog.ui | 114 +++++ computer.png | Bin 0 -> 725 bytes connectiondata.cpp | 6 + connectiondata.h | 23 + connectionpane.cpp | 892 +++++++++++++++++++++++++++++++++++ connectionpane.h | 79 ++++ connectionpane.ui | 65 +++ document-new.png | Bin 0 -> 692 bytes document-properties.png | Bin 0 -> 688 bytes edit-clear.png | Bin 0 -> 1237 bytes edit-copy.png | Bin 0 -> 725 bytes edit-cut.png | Bin 0 -> 1177 bytes edit-delete.png | Bin 0 -> 1211 bytes edit-paste.png | Bin 0 -> 773 bytes folder.png | Bin 0 -> 581 bytes groupdata.cpp | 6 + groupdata.h | 18 + main.cpp | 12 + mainwindow.cpp | 767 ++++++++++++++++++++++++++++++ mainwindow.h | 86 ++++ mainwindow.ui | 270 +++++++++++ network-offline.png | Bin 0 -> 685 bytes network-transmit-receive.png | Bin 0 -> 798 bytes preferencesdialog.cpp | 37 ++ preferencesdialog.h | 33 ++ preferencesdialog.ui | 110 +++++ system-log-out.png | Bin 0 -> 1084 bytes systemPreferences.png | Bin 0 -> 1335 bytes tab-new.png | Bin 0 -> 630 bytes view-refresh.png | Bin 0 -> 1364 bytes 40 files changed, 3821 insertions(+) create mode 100644 Consolas.ttf create mode 100644 ConsoleClient.pro create mode 100644 ConsoleClient.pro.user create mode 100644 Makefile create mode 100644 Resources.qrc create mode 100644 addconndialog.cpp create mode 100644 addconndialog.h create mode 100644 addconndialog.ui create mode 100644 addgroupdialog.cpp create mode 100644 addgroupdialog.h create mode 100644 addgroupdialog.ui create mode 100644 computer.png create mode 100644 connectiondata.cpp create mode 100644 connectiondata.h create mode 100644 connectionpane.cpp create mode 100644 connectionpane.h create mode 100644 connectionpane.ui create mode 100644 document-new.png create mode 100644 document-properties.png create mode 100644 edit-clear.png create mode 100644 edit-copy.png create mode 100644 edit-cut.png create mode 100644 edit-delete.png create mode 100644 edit-paste.png create mode 100644 folder.png create mode 100644 groupdata.cpp create mode 100644 groupdata.h create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui create mode 100644 network-offline.png create mode 100644 network-transmit-receive.png create mode 100644 preferencesdialog.cpp create mode 100644 preferencesdialog.h create mode 100644 preferencesdialog.ui create mode 100644 system-log-out.png create mode 100644 systemPreferences.png create mode 100644 tab-new.png create mode 100644 view-refresh.png diff --git a/Consolas.ttf b/Consolas.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2d07794815c81fae54f03b5d3e8fe44c2ba2c5ff GIT binary patch literal 120436 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 literal 0 HcmV?d00001 diff --git a/ConsoleClient.pro b/ConsoleClient.pro new file mode 100644 index 0000000..3e97557 --- /dev/null +++ b/ConsoleClient.pro @@ -0,0 +1,39 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2016-11-16T16:46:32 +# +#------------------------------------------------- + +QT += core gui network xml + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = ConsoleClient +TEMPLATE = app + + +SOURCES += main.cpp\ + mainwindow.cpp \ + connectionpane.cpp \ + connectiondata.cpp \ + addconndialog.cpp \ + groupdata.cpp \ + addgroupdialog.cpp \ + preferencesdialog.cpp + +HEADERS += mainwindow.h \ + connectionpane.h \ + connectiondata.h \ + addconndialog.h \ + groupdata.h \ + addgroupdialog.h \ + preferencesdialog.h + +FORMS += mainwindow.ui \ + connectionpane.ui \ + addconndialog.ui \ + addgroupdialog.ui \ + preferencesdialog.ui + +RESOURCES += \ + Resources.qrc diff --git a/ConsoleClient.pro.user b/ConsoleClient.pro.user new file mode 100644 index 0000000..a6be5d1 --- /dev/null +++ b/ConsoleClient.pro.user @@ -0,0 +1,336 @@ + + + + + + EnvironmentId + {21a24881-731f-4679-9885-7d748f13cb82} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.7.0 clang 64bit + Desktop Qt 5.7.0 clang 64bit + qt.57.clang_64_kit + 0 + 0 + 0 + + /Users/melanie/yrgrid/build-ConsoleClient-Desktop_Qt_5_7_0_clang_64bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + /Users/melanie/yrgrid/build-ConsoleClient-Desktop_Qt_5_7_0_clang_64bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + /Users/melanie/yrgrid/build-ConsoleClient-Desktop_Qt_5_7_0_clang_64bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + ConsoleClient + + Qt4ProjectManager.Qt4RunConfiguration:/Users/melanie/yrgrid/ConsoleClient/ConsoleClient.pro + true + + ConsoleClient.pro + false + + /Users/melanie/yrgrid/build-ConsoleClient-Desktop_Qt_5_7_0_clang_64bit-Debug/ConsoleClient.app/Contents/MacOS + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d20cd46 --- /dev/null +++ b/Makefile @@ -0,0 +1,599 @@ +############################################################################# +# Makefile for building: ConsoleClient.app/Contents/MacOS/ConsoleClient +# Generated by qmake (3.0) (Qt 5.6.0) +# Project: ConsoleClient.pro +# Template: app +# Command: /Users/melanie/Qt5.6.0/5.6/clang_64/bin/qmake -spec macx-clang CONFIG+=debug CONFIG+=x86_64 CONFIG+=qml_debug -o Makefile ConsoleClient.pro +############################################################################# + +MAKEFILE = Makefile + +####### Compiler, tools and options + +CC = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang +CXX = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ +DEFINES = -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB +CFLAGS = -pipe -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -mmacosx-version-min=10.7 -Wall -W -fPIC $(DEFINES) +CXXFLAGS = -pipe -stdlib=libc++ -g -std=gnu++11 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -mmacosx-version-min=10.7 -Wall -W -fPIC $(DEFINES) +INCPATH = -I. -I../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers -I../../Qt5.6.0/5.6/clang_64/lib/QtGui.framework/Headers -I../../Qt5.6.0/5.6/clang_64/lib/QtCore.framework/Headers -I. -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/AGL.framework/Headers -I. -I../../Qt5.6.0/5.6/clang_64/mkspecs/macx-clang -F/Users/melanie/Qt5.6.0/5.6/clang_64/lib +QMAKE = /Users/melanie/Qt5.6.0/5.6/clang_64/bin/qmake +DEL_FILE = rm -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = ConsoleClient1.0.0 +DISTDIR = /Users/melanie/yrgrid/ConsoleClient/.tmp/ConsoleClient1.0.0 +LINK = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ +LFLAGS = -headerpad_max_install_names -stdlib=libc++ -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk -mmacosx-version-min=10.7 -Wl,-rpath,/Users/melanie/Qt5.6.0/5.6/clang_64/lib +LIBS = $(SUBLIBS) -F/Users/melanie/Qt5.6.0/5.6/clang_64/lib -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL +AR = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar cq +RANLIB = /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib -s +SED = sed +STRIP = + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = main.cpp \ + mainwindow.cpp moc_mainwindow.cpp +OBJECTS = main.o \ + mainwindow.o \ + moc_mainwindow.o +DIST = ../../Qt5.6.0/5.6/clang_64/mkspecs/features/spec_pre.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/qdevice.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/device_config.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/unix.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/mac.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/macx.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/sanitize.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/gcc-base.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/gcc-base-mac.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/clang.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/clang-mac.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/qconfig.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcollision.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcollision_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcore.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcore_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dinput.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dinput_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dlogic.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dlogic_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquick.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquick_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquickrender.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3drender.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3drender_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bluetooth.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bluetooth_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bootstrap_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_clucene_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_concurrent.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_concurrent_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_core.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_core_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_dbus.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_dbus_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designer.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designer_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designercomponents_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_enginio.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_enginio_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_gui.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_gui_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_help.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_help_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_labstemplates_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_location.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_location_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_macextras.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_macextras_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimedia.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimedia_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimediawidgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_network.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_network_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_nfc.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_nfc_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_opengl.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_opengl_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_openglextensions.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_openglextensions_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_platformsupport_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_positioning.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_positioning_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_printsupport.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_printsupport_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qml.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qml_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmltest.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmltest_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quick.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quick_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickparticles_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickwidgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_script.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_script_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_scripttools.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_scripttools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sensors.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sensors_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_serialport.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_serialport_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sql.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sql_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_svg.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_svg_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_testlib.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_testlib_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uiplugin.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uitools.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uitools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webchannel.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webchannel_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webengine.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webengine_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginecore.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginecore_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginewidgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_websockets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_websockets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webview.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webview_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_widgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_widgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xml.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xml_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xmlpatterns.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt_functions.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt_config.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/macx-clang/qmake.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/spec_post.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/exclusive_builds.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/default_pre.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/default_pre.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/resolve_config.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/default_post.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/sdk.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/default_post.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/objective_c.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qml_debug.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/warn_on.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/resources.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/moc.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/unix/opengl.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/uic.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/unix/thread.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/rez.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/testcase_targets.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/exceptions.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/yacc.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/lex.prf \ + ConsoleClient.pro mainwindow.h main.cpp \ + mainwindow.cpp +QMAKE_TARGET = ConsoleClient +DESTDIR = +TARGET = ConsoleClient.app/Contents/MacOS/ConsoleClient + + +first: all +####### Build rules + +$(TARGET): ui_mainwindow.h $(OBJECTS) + @test -d ConsoleClient.app/Contents/MacOS/ || mkdir -p ConsoleClient.app/Contents/MacOS/ + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: ConsoleClient.pro ../../Qt5.6.0/5.6/clang_64/mkspecs/macx-clang/qmake.conf ../../Qt5.6.0/5.6/clang_64/mkspecs/features/spec_pre.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/qdevice.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/device_config.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/unix.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/mac.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/macx.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/sanitize.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/gcc-base.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/gcc-base-mac.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/clang.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/common/clang-mac.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/qconfig.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcollision.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcollision_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcore.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcore_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dinput.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dinput_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dlogic.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dlogic_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquick.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquick_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquickrender.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3drender.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3drender_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bluetooth.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bluetooth_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bootstrap_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_clucene_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_concurrent.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_concurrent_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_core.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_core_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_dbus.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_dbus_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designer.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designer_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designercomponents_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_enginio.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_enginio_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_gui.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_gui_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_help.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_help_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_labstemplates_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_location.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_location_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_macextras.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_macextras_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimedia.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimedia_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimediawidgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_network.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_network_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_nfc.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_nfc_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_opengl.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_opengl_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_openglextensions.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_openglextensions_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_platformsupport_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_positioning.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_positioning_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_printsupport.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_printsupport_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qml.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qml_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmltest.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmltest_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quick.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quick_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickparticles_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickwidgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_script.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_script_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_scripttools.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_scripttools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sensors.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sensors_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_serialport.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_serialport_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sql.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sql_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_svg.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_svg_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_testlib.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_testlib_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uiplugin.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uitools.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uitools_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webchannel.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webchannel_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webengine.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webengine_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginecore.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginecore_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginewidgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_websockets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_websockets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webview.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webview_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_widgets.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_widgets_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xml.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xml_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xmlpatterns.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt_functions.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt_config.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/macx-clang/qmake.conf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/spec_post.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/exclusive_builds.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/default_pre.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/default_pre.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/resolve_config.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/default_post.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/sdk.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/default_post.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/objective_c.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qml_debug.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/warn_on.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/resources.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/moc.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/unix/opengl.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/uic.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/unix/thread.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/rez.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/testcase_targets.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/exceptions.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/yacc.prf \ + ../../Qt5.6.0/5.6/clang_64/mkspecs/features/lex.prf \ + ConsoleClient.pro \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/QtWidgets.prl \ + ../../Qt5.6.0/5.6/clang_64/lib/QtGui.framework/QtGui.prl \ + ../../Qt5.6.0/5.6/clang_64/lib/QtCore.framework/QtCore.prl + $(QMAKE) -spec macx-clang CONFIG+=debug CONFIG+=x86_64 CONFIG+=qml_debug -o Makefile ConsoleClient.pro +../../Qt5.6.0/5.6/clang_64/mkspecs/features/spec_pre.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/qdevice.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/device_config.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/unix.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/mac.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/macx.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/sanitize.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/gcc-base.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/gcc-base-mac.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/clang.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/common/clang-mac.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/qconfig.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcollision.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcollision_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcore.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dcore_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dinput.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dinput_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dlogic.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dlogic_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquick.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquick_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquickrender.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3dquickrender_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3drender.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_3drender_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bluetooth.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bluetooth_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_bootstrap_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_clucene_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_concurrent.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_concurrent_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_core.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_core_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_dbus.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_dbus_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designer.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designer_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_designercomponents_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_enginio.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_enginio_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_gui.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_gui_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_help.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_help_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_labstemplates_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_location.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_location_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_macextras.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_macextras_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimedia.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimedia_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimediawidgets.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_network.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_network_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_nfc.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_nfc_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_opengl.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_opengl_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_openglextensions.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_openglextensions_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_platformsupport_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_positioning.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_positioning_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_printsupport.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_printsupport_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qml.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qml_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmldevtools_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmltest.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qmltest_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quick.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quick_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickparticles_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickwidgets.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_quickwidgets_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_script.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_script_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_scripttools.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_scripttools_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sensors.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sensors_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_serialport.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_serialport_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sql.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_sql_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_svg.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_svg_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_testlib.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_testlib_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uiplugin.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uitools.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_uitools_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webchannel.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webchannel_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webengine.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webengine_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginecore.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginecore_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginewidgets.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webenginewidgets_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_websockets.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_websockets_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webview.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_webview_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_widgets.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_widgets_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xml.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xml_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xmlpatterns.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt_functions.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt_config.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/macx-clang/qmake.conf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/spec_post.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/exclusive_builds.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/default_pre.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/default_pre.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/resolve_config.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/default_post.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/sdk.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/default_post.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/objective_c.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/qml_debug.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/warn_on.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/qt.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/resources.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/moc.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/unix/opengl.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/uic.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/unix/thread.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/mac/rez.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/testcase_targets.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/exceptions.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/yacc.prf: +../../Qt5.6.0/5.6/clang_64/mkspecs/features/lex.prf: +ConsoleClient.pro: +../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/QtWidgets.prl: +../../Qt5.6.0/5.6/clang_64/lib/QtGui.framework/QtGui.prl: +../../Qt5.6.0/5.6/clang_64/lib/QtCore.framework/QtCore.prl: +qmake: FORCE + @$(QMAKE) -spec macx-clang CONFIG+=debug CONFIG+=x86_64 CONFIG+=qml_debug -o Makefile ConsoleClient.pro + +qmake_all: FORCE + +ConsoleClient.app/Contents/PkgInfo: + @test -d ConsoleClient.app/Contents || mkdir -p ConsoleClient.app/Contents + @$(DEL_FILE) ConsoleClient.app/Contents/PkgInfo + @echo "APPL????" > ConsoleClient.app/Contents/PkgInfo +ConsoleClient.app/Contents/Resources/empty.lproj: + @test -d ConsoleClient.app/Contents/Resources || mkdir -p ConsoleClient.app/Contents/Resources + @touch ConsoleClient.app/Contents/Resources/empty.lproj + +ConsoleClient.app/Contents/Info.plist: + @test -d ConsoleClient.app/Contents || mkdir -p ConsoleClient.app/Contents + @$(DEL_FILE) ConsoleClient.app/Contents/Info.plist + @sed -e "s,@SHORT_VERSION@,1.0,g" -e "s,@FULL_VERSION@,1.0.0,g" -e "s,@TYPEINFO@,????,g" -e "s,@BUNDLEIDENTIFIER@,com.careminster.ConsoleClient,g" -e "s,@ICON@,,g" -e "s,@EXECUTABLE@,ConsoleClient,g" -e "s,@LIBRARY@,ConsoleClient,g" -e "s,@TYPEINFO@,????,g" ../../Qt5.6.0/5.6/clang_64/mkspecs/macx-clang/Info.plist.app >ConsoleClient.app/Contents/Info.plist + +all: Makefile \ + ConsoleClient.app/Contents/PkgInfo \ + ConsoleClient.app/Contents/Resources/empty.lproj \ + ConsoleClient.app/Contents/Info.plist $(TARGET) + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents mainwindow.h $(DISTDIR)/ + $(COPY_FILE) --parents main.cpp mainwindow.cpp $(DISTDIR)/ + $(COPY_FILE) --parents mainwindow.ui $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) -r ConsoleClient.app + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all + +check: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_header_make_all: moc_mainwindow.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_mainwindow.cpp +moc_mainwindow.cpp: ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/QMainWindow \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h \ + mainwindow.h + /Users/melanie/Qt5.6.0/5.6/clang_64/bin/moc $(DEFINES) -D__APPLE__ -D__GNUC__=4 -D__APPLE_CC__ -I/Users/melanie/Qt5.6.0/5.6/clang_64/mkspecs/macx-clang -I/Users/melanie/yrgrid/ConsoleClient -I/Users/melanie/Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers -I/Users/melanie/Qt5.6.0/5.6/clang_64/lib/QtGui.framework/Headers -I/Users/melanie/Qt5.6.0/5.6/clang_64/lib/QtCore.framework/Headers -F/Users/melanie/Qt5.6.0/5.6/clang_64/lib mainwindow.h -o moc_mainwindow.cpp + +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_mainwindow.h +compiler_uic_clean: + -$(DEL_FILE) ui_mainwindow.h +ui_mainwindow.h: mainwindow.ui + /Users/melanie/Qt5.6.0/5.6/clang_64/bin/uic mainwindow.ui -o ui_mainwindow.h + +compiler_rez_source_make_all: +compiler_rez_source_clean: +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_header_clean compiler_uic_clean + +####### Compile + +main.o: main.cpp mainwindow.h \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/QMainWindow \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/QApplication \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/qapplication.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp + +mainwindow.o: mainwindow.cpp mainwindow.h \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/QMainWindow \ + ../../Qt5.6.0/5.6/clang_64/lib/QtWidgets.framework/Headers/qmainwindow.h \ + ui_mainwindow.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o mainwindow.o mainwindow.cpp + +moc_mainwindow.o: moc_mainwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_mainwindow.o moc_mainwindow.cpp + +####### Install + +install: FORCE + +uninstall: FORCE + +FORCE: + diff --git a/Resources.qrc b/Resources.qrc new file mode 100644 index 0000000..ee62e82 --- /dev/null +++ b/Resources.qrc @@ -0,0 +1,22 @@ + + + view-refresh.png + computer.png + folder.png + document-properties.png + edit-delete.png + network-transmit-receive.png + network-offline.png + document-new.png + edit-clear.png + edit-copy.png + edit-cut.png + edit-paste.png + system-log-out.png + tab-new.png + systemPreferences.png + + + Consolas.ttf + + diff --git a/addconndialog.cpp b/addconndialog.cpp new file mode 100644 index 0000000..0717479 --- /dev/null +++ b/addconndialog.cpp @@ -0,0 +1,33 @@ +#include "addconndialog.h" +#include "ui_addconndialog.h" + +AddConnDialog::AddConnDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AddConnDialog) +{ + ui->setupUi(this); + + Name = ui->Name; + Host = ui->Host; + Port = ui->Port; + User = ui->User; + Pass = ui->Pass; + + connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(OnOK())); + connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(OnCancel())); +} + +AddConnDialog::~AddConnDialog() +{ + delete ui; +} + +void AddConnDialog::OnOK() +{ + done(0); +} + +void AddConnDialog::OnCancel() +{ + done(-1); +} diff --git a/addconndialog.h b/addconndialog.h new file mode 100644 index 0000000..a0e4209 --- /dev/null +++ b/addconndialog.h @@ -0,0 +1,35 @@ +#ifndef ADDCONNDIALOG_H +#define ADDCONNDIALOG_H + +#include + +class QLineEdit; +class QSpinBox; + +namespace Ui { +class AddConnDialog; +} + +class AddConnDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AddConnDialog(QWidget *parent = 0); + ~AddConnDialog(); + + QLineEdit *Name; + QLineEdit *Host; + QSpinBox *Port; + QLineEdit *User; + QLineEdit *Pass; + +public slots: + void OnCancel(); + void OnOK(); + +private: + Ui::AddConnDialog *ui; +}; + +#endif // ADDCONNDIALOG_H diff --git a/addconndialog.ui b/addconndialog.ui new file mode 100644 index 0000000..8fffb50 --- /dev/null +++ b/addconndialog.ui @@ -0,0 +1,179 @@ + + + AddConnDialog + + + + 0 + 0 + 430 + 270 + + + + Edit connection + + + + + 320 + 20 + 91 + 81 + + + + Qt::RightToLeft + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 10 + 161 + 20 + + + + Connection Name + + + + + + 10 + 30 + 291 + 28 + + + + New Connection + + + + + + 10 + 60 + 101 + 20 + + + + Host Name + + + + + + 10 + 80 + 291 + 28 + + + + localhost + + + + + + 10 + 110 + 77 + 20 + + + + Port + + + + + + 10 + 130 + 121 + 30 + + + + 1 + + + 65535 + + + 9000 + + + + + + 10 + 160 + 101 + 20 + + + + User Name + + + + + + 10 + 180 + 291 + 28 + + + + + + + 10 + 210 + 91 + 20 + + + + Password + + + + + + 10 + 230 + 291 + 28 + + + + QLineEdit::Password + + + + + Name + Host + Port + User + Pass + buttonBox + + + + diff --git a/addgroupdialog.cpp b/addgroupdialog.cpp new file mode 100644 index 0000000..9b9e7cb --- /dev/null +++ b/addgroupdialog.cpp @@ -0,0 +1,30 @@ +#include "addgroupdialog.h" +#include "ui_addgroupdialog.h" + +AddGroupDialog::AddGroupDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AddGroupDialog) +{ + ui->setupUi(this); + + Name = ui->Name; + Dns = ui->Dns; + + connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(OnOK())); + connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(OnCancel())); +} + +AddGroupDialog::~AddGroupDialog() +{ + delete ui; +} + +void AddGroupDialog::OnOK() +{ + done(0); +} + +void AddGroupDialog::OnCancel() +{ + done(-1); +} diff --git a/addgroupdialog.h b/addgroupdialog.h new file mode 100644 index 0000000..068820d --- /dev/null +++ b/addgroupdialog.h @@ -0,0 +1,30 @@ +#ifndef ADDGROUPDIALOG_H +#define ADDGROUPDIALOG_H + +#include + +class QLineEdit; + +namespace Ui { +class AddGroupDialog; +} + +class AddGroupDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AddGroupDialog(QWidget *parent = 0); + ~AddGroupDialog(); + + QLineEdit *Name; + QLineEdit *Dns; + +protected slots: + void OnOK(); + void OnCancel(); +private: + Ui::AddGroupDialog *ui; +}; + +#endif // ADDGROUPDIALOG_H diff --git a/addgroupdialog.ui b/addgroupdialog.ui new file mode 100644 index 0000000..d7787fa --- /dev/null +++ b/addgroupdialog.ui @@ -0,0 +1,114 @@ + + + AddGroupDialog + + + + 0 + 0 + 400 + 120 + + + + Edit group + + + + + 290 + 20 + 81 + 81 + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 13 + 65 + 74 + 16 + + + + Nameserver + + + + + + 13 + 11 + 36 + 16 + + + + Name + + + + + + 10 + 26 + 269 + 21 + + + + + + + 10 + 80 + 269 + 21 + + + + + + + + buttonBox + accepted() + AddGroupDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AddGroupDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/computer.png b/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..d0b397bef91b4f6af85bd78a203b2373a36a3b36 GIT binary patch literal 725 zcmV;`0xJE9P)mcr2m5t5TEsdy-8b=+}wNaxQGeX2Z+DTz`*%t zelv4qe0&^$iHV70*4kSlV)%*)R}t}Dz02ZtFPguLxhRpL0NSSqpH{~nZ5 zY4CETTz=<*!X@Bw{|60itY5oM1`5Fm;HvZ9zkM)!--rnRDpdvL6a4fW|5x7u22S_HWPL-A00000NkvXX Hu0mjfV>nSr literal 0 HcmV?d00001 diff --git a/connectiondata.cpp b/connectiondata.cpp new file mode 100644 index 0000000..c2b73e7 --- /dev/null +++ b/connectiondata.cpp @@ -0,0 +1,6 @@ +#include "connectiondata.h" + +ConnectionData::ConnectionData() +{ + +} diff --git a/connectiondata.h b/connectiondata.h new file mode 100644 index 0000000..d6b3543 --- /dev/null +++ b/connectiondata.h @@ -0,0 +1,23 @@ +#ifndef CONNECTIONDATA_H +#define CONNECTIONDATA_H + +#include +#include + +class ConnectionData +{ +public: + ConnectionData(); + + QUuid Uuid; + QString Name; + + QUuid Group; + + QString Host; + int Port; + QString User; + QString Pass; +}; + +#endif // CONNECTIONDATA_H diff --git a/connectionpane.cpp b/connectionpane.cpp new file mode 100644 index 0000000..0d91e1c --- /dev/null +++ b/connectionpane.cpp @@ -0,0 +1,892 @@ +#include "connectionpane.h" +#include "ui_connectionpane.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "connectiondata.h" + +struct CommandData +{ +public: + QString Module; + QString HelpText; + QString LongHelp; + QString Description; + ConnectionPane *instance; + void (*fn)(QString module, ConnectionPane *instance, QStringList args); +}; + +Q_DECLARE_METATYPE (CommandData) + +ConnectionPane::ConnectionPane(ConnectionData *c, QHostAddress addr, QWidget *parent) : + QWidget(parent), + ui(new Ui::ConnectionPane) +{ + ui->setupUi(this); + + Name = c->Name; + Host = c->Host; + Port = c->Port; + User = c->User; + Pass = c->Pass; + + loggedIn = false; + + QDnsLookup lookup; + + if (!addr.isNull()) + { + lookup.setNameserver(addr); + + QHostAddress dest(Host); + if (dest.isNull()) + { + lookup.setName(Host); + lookup.setType(QDnsLookup::A); + + QEventLoop loop; + connect(&lookup, SIGNAL(finished()), &loop, SLOT(quit())); + + lookup.lookup(); + loop.exec(); + + if (lookup.error() == QDnsLookup::NoError) + Host = lookup.hostAddressRecords().first().value().toString(); + } + } + + // Construct the URLs + urlStart.setScheme(QString("http")); + urlStart.setHost(Host); + urlStart.setPort(Port); + + urlClose = urlStart; + urlCommand = urlStart; + urlPoll = urlStart; + + urlStart.setPath(QString("/StartSession/")); + urlClose.setPath(QString("/CloseSession/")); + urlCommand.setPath(QString("/SessionCommand/")); + + // Construct the manager + manager = new QNetworkAccessManager(this); + + pollReply = 0; + loginReply = 0; + cmdReply = 0; + + int id = QFontDatabase::addApplicationFont(":/fonts/Consolas.ttf"); + QString family = QFontDatabase::applicationFontFamilies(id).at(0); + + QSettings settings; + + QString styleSheet; + + if (!settings.value("system_font", false).toBool()) + styleSheet += "font-family: " + family + ";"; + if (settings.value("black_on_white", false).toBool()) + styleSheet += "background-color: black; color: white;"; + else + styleSheet += "background-color: #fcfcfc; color: black;"; + styleSheet += "font-size: 18pt;"; + + ui->mainPane->setStyleSheet(styleSheet); +} + +ConnectionPane::~ConnectionPane() +{ + QNetworkAccessManager *m = manager; + manager = 0; + delete m; + + delete ui; +} + +void ConnectionPane::CommandReply() +{ + QByteArray result = cmdReply->readAll(); + cmdReply->deleteLater(); + cmdReply = 0; + + ui->textEntry->setText(QString("")); + TextChanged(""); +} + +void ConnectionPane::LoginReply() +{ + QByteArray result = loginReply->readAll(); + loginReply->deleteLater(); + + if (result.size() == 0) + { + ui->mainPane->setHtml("Connecting ...
Error!"); + QMessageBox::critical(0, QString("Connection error"), QString("Connection to host failed")); + return; + } + + QDomDocument doc; + doc.setContent(result, false); + + QDomElement root = doc.documentElement(); + + // Get session ID + QDomNodeList sessionL = root.elementsByTagName(QString("SessionID")); + QDomNode sessionNode = sessionL.at(0); + sessionID = sessionNode.toElement().text(); + + urlPoll.setPath(QString("/ReadResponses/")+sessionID+QString("/")); + + QDomNodeList helpL = root.elementsByTagName(QString("HelpTree")); + QDomNode helpNode = helpL.at(0); + + ui->mainPane->setHtml(ui->mainPane->toHtml() + QString("Connected")); + tree.clear(); + + tree = ProcessTreeLevel(helpNode, tree); + + QMap nextLevel; + if (tree.contains("help")) + nextLevel = tree["help"].toMap(); + + CommandData cmd; + cmd.Module = "Local"; + cmd.HelpText = "help []"; + cmd.LongHelp = "Provide help for commands"; + cmd.Description = "Provide help for commands"; + cmd.instance = this; + cmd.fn = Help; + + QVariant v; + v.setValue(cmd); + nextLevel[""] = v; + + tree["help"] = nextLevel; + + nextLevel.clear(); + if (tree.contains("quit:")) + nextLevel = tree["quit"].toMap(); + + cmd.Module = "Local"; + cmd.HelpText = "quit"; + cmd.LongHelp = "Quit console session"; + cmd.Description = "Quit console session"; + cmd.instance = this; + cmd.fn = Quit; + + v.setValue(cmd); + nextLevel[""] = v; + + tree["quit"] = nextLevel; + + // Construct the poll request + QString data = ""; + QNetworkRequest request(urlPoll); + request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-www-form-urlencoded")); + + // Start poll + pollReply = manager->post(request, data.toLatin1()); + connect(pollReply, SIGNAL(finished()), this, SLOT(PollReply())); + + ui->textEntry->setFocus(); + TextChanged(QString("")); + + connect(ui->textEntry, SIGNAL(returnPressed()), this, SLOT(ReturnPressed())); + connect(ui->textEntry, SIGNAL(textChanged(QString)), this, SLOT(TextChanged(QString))); + + loggedIn = true; +} + +void ConnectionPane::PollReply() +{ + if (manager == 0) + return; + + QByteArray result = pollReply->readAll(); + + //qDebug() << QString(result); + pollReply->deleteLater(); + + QString fullText; + + if (result.size() != 0) + { + QDomDocument doc; + doc.setContent(result, false); + + QDomElement root = doc.documentElement(); + + QDomNodeList lineL = root.elementsByTagName(QString("Line")); + + for (int i = 0 ; i < lineL.count() ; i++) + { + QDomElement e = lineL.at(i).toElement(); + + QString level; + bool prompt = false; + bool command = false; + bool input = false; + + if (e.hasAttribute("Level")) + level = e.attributeNode("Level").value(); + + if (e.hasAttribute("Prompt")) + { + if (e.attributeNode("Prompt").value() == "true") + prompt = true; + } + + if (e.hasAttribute("Command")) + { + if (e.attributeNode("Command").value() == "true") + command = true; + } + + if (e.hasAttribute("Input")) + { + if (e.attributeNode("Input").value() == "true") + input = true; + } + + QString line = e.text(); + + if (!input) + fullText += QString("
"); + fullText += FormatLine(line.trimmed(), level).replace("\n", "
"); + if (fullText.endsWith("
")) + fullText = fullText.mid(fullText.length() - 4); + + if (prompt || command) + { + expectingInput = true; + if (command) + expectingCommand = true; + } + } + } + + textContent += fullText; + if (textContent.length() > 131400) + textContent = textContent.right(131400); + + ui->mainPane->setHtml(textContent); + + ui->mainPane->moveCursor(QTextCursor::End); + ui->mainPane->ensureCursorVisible(); + + if (!loggedIn) + return; + + TextChanged(ui->textEntry->text()); + + // Construct the poll request + QString data = ""; + QNetworkRequest request(urlPoll); + request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-www-form-urlencoded")); + + // Poll again + pollReply = manager->post(request, data.toLatin1()); + connect(pollReply, SIGNAL(finished()), this, SLOT(PollReply())); +} + +void ConnectionPane::TextChanged(QString text) +{ + if (!expectingInput) + ui->helpArea->hide(); + else if (!expectingCommand) + ui->helpArea->hide(); + else + ui->helpArea->show(); + + ui->mainPane->moveCursor(QTextCursor::End); + ui->mainPane->ensureCursorVisible(); + + QStringList words = Parse(text); + + bool trailingSpace = text.right(1) == " "; + + QStringList opts = FindNextOption(words, trailingSpace); + + if (opts.size() == 0) + { + ui->helpArea->setText(QString("")); + } + else + { + QString first = opts.at(0); + if (first.indexOf(QString("Command help:")) == 0) + ui->helpArea->setText(first); + else if (text != "") + { + QString output; + output.sprintf("Options: %s", opts.join(" ").toLocal8Bit().data()); + ui->helpArea->setText(output); + } + else + { + QString output; + output.sprintf("Commands: %s", opts.join(" ").toLocal8Bit().data()); + ui->helpArea->setText(output); + } + } +} + +void ConnectionPane::ReturnPressed() +{ + // Construct the command + QString cmd = ui->textEntry->text(); + + if ((!expectingCommand) && expectingInput) + { + if (SendCommand(cmd)) + { + ui->textEntry->setText(QString("")); + TextChanged(ui->textEntry->text()); + } + } + + QStringList resolved = Resolve(Parse(cmd)); + QString historyEntry = resolved.join(" "); +} + +void ConnectionPane::Login() +{ + QUrlQuery queryString; + + queryString.addQueryItem("USER", User); + queryString.addQueryItem("PASS", Pass); + + // Construct the login request + QString data = queryString.query(QUrl::FullyEncoded).toUtf8(); + + QNetworkRequest request(urlStart); + request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/x-www-form-urlencoded")); + + // Log in + + ui->mainPane->setHtml(ui->mainPane->toHtml() + QString("Connecting ...")); + loginReply = manager->post(request, data.toLatin1()); + connect(loginReply, SIGNAL(finished()), this, SLOT(LoginReply())); +} + +void ConnectionPane::CloseConnection() +{ + close(); +} + +void ConnectionPane::ClearScrollback() +{ + ui->mainPane->setHtml(QString("")); +} + +void ConnectionPane::Copy() +{ + ui->mainPane->copy(); +} + +void ConnectionPane::RestartServer() +{ + if (!loggedIn) + return; + + SendCommand("quit"); + + ui->mainPane->setHtml(ui->mainPane->toHtml() + QString("Disconnected")); + pollReply->abort(); + + loggedIn = false; + + QTimer::singleShot(5000, this, SLOT(Login())); +} + +bool ConnectionPane::IsLoggedIn() +{ + return loggedIn; +} + +QStringList ConnectionPane::CollectHelp(QStringList helpParts) +{ + QString originalHelpRequest = helpParts.join(" "); + + QStringList help; + + QMap dict = tree; + while (helpParts.size() > 0) + { + QString helpPart = helpParts.at(0); + + if (!dict.contains(helpPart)) + break; + + QVariant val = dict[helpPart]; + if (QString(val.typeName()) == QString("QVariantMap")) + { + dict = val.toMap(); + } + + helpParts.removeFirst(); + + } + + if (dict.contains(QString(""))) + { + QVariant v = dict[QString("")]; + CommandData ci = v.value(); + + help.append(ci.HelpText); + help.append(ci.LongHelp); + // help.append(ci.Description); + } + else + { + help.append(QString("No help is available for ") + originalHelpRequest); + } + + return help;} + +QStringList ConnectionPane::Parse(QString text) +{ + QStringList result; + int index = 0; + + QStringList unquoted = text.split("\""); + + for (index = 0 ; index < unquoted.size() ; index++) + { + if ((index % 2) == 0) + { + QStringList words = unquoted.at(index).split(" "); + + for (int i = 0 ; i < words.size() ; i++) + { + QString w = words.at(i); + if (w != QString("")) + result.append(w); + } + } + else + { + result.append(unquoted.at(index)); + } + } + + return result; +} + +QStringList ConnectionPane::Resolve(QStringList cmd) +{ + QStringList result(cmd); + int index = -1; + + QMap current = tree; + + for (int i = 0 ; i < cmd.size() ; i++) + { + QString s = cmd.at(i); + + index++; + + QStringList found; + + for (QMap::iterator it = current.begin() ; it != current.end() ; it++) + { + QString opt = it.key(); + + if (opt == s) + { + found.clear(); + found.append(opt); + break; + } + if (opt.indexOf(s) == 0) + { + found.append(opt); + } + } + + if (found.size() == 1) + { + result[index] = found.at(0); + current = current[found.at(0)].toMap(); + } + else if (found.size() > 0) + { + QStringList blank; + return blank; + } + else + { + break; + } + } + + if (current.contains(QString(""))) + { + QVariant v = current[QString("")]; + CommandData ci = v.value(); + + if (!ci.fn) + return QStringList(); + + (*ci.fn)(ci.Module, ci.instance, result); + + return result; + } + + return QStringList(); +} + +QStringList ConnectionPane::FindNextOption(QStringList cmd, bool term) +{ + QMap current = tree; + + int remaining = cmd.size(); + + for (int i = 0 ; i < cmd.size() ; i++) + { + QString s = cmd.at(i); + + remaining--; + + QStringList found; + + for (QMap::iterator it = current.begin() ; it != current.end() ; it++) + { + QString opt = it.key(); + + if (remaining > 0 && opt == s) + { + found.clear(); + found.append(opt); + break; + } + if (opt.indexOf(s) == 0) + { + found.append(opt); + } + } + + if (found.size() == 1 && ((remaining != 0) || term)) + { + current = current[found.at(0)].toMap(); + } + else if (found.size() > 0) + { + return found; + } + else + { + break; + } + } + + if (current.size() > 1) + { + QStringList choices; + + bool addcr = false; + for (QMap::iterator it = current.begin() ; it != current.end() ; it++) + { + QString s = it.key(); + + if (s == QString("")) + { + QVariant v = current[""]; + CommandData ci = v.value(); + if (ci.fn) + addcr = true; + + } + else + choices.append(s); + } + if (addcr) + choices.append(""); + + return choices; + } + + if (current.contains(QString(""))) + { + QVariant v = current[""]; + CommandData ci = v.value(); + + QStringList ch; + ch.append(QString("Command help: ") + ci.HelpText); + return ch; + } + + QList kl = current.keys(); + QStringList ksl(kl); + + return ksl; +} + +void ConnectionPane::Help(QString, ConnectionPane *instance, QStringList args) +{ + instance->ui->mainPane->setHtml(instance->ui->mainPane->toHtml()+instance->OutputLine(QString("# ") + args.join(" "), "command")); + + instance->ui->mainPane->moveCursor(QTextCursor::End); + instance->ui->mainPane->ensureCursorVisible(); + + QStringList help; + QStringList helpParts(args); + + helpParts.removeFirst(); + + instance->ui->textEntry->setText(QString("")); + instance->ui->helpArea->setText(QString("")); + + if (helpParts.size() == 0) + help = instance->CollectHelp(help, instance->tree); + else + help = help + instance->CollectHelp(helpParts); + + for (int i = 0 ; i < help.size() ; i++) + { + instance->ui->mainPane->setHtml(instance->ui->mainPane->toHtml()+instance->OutputLine(help.at(i), "normal")); + } + instance->ui->mainPane->moveCursor(QTextCursor::End); + instance->ui->mainPane->ensureCursorVisible(); +} + +void ConnectionPane::Quit(QString, ConnectionPane *instance, QStringList) +{ + instance->ui->mainPane->setHtml(instance->ui->mainPane->toHtml()+instance->OutputLine("# quit", "command")); + instance->ui->mainPane->setHtml(instance->ui->mainPane->toHtml()+instance->OutputLine("Use the toolbar button to close session", "error")); + instance->ui->mainPane->moveCursor(QTextCursor::End); + instance->ui->mainPane->ensureCursorVisible(); + + instance->ui->textEntry->setText(QString("")); + instance->ui->helpArea->setText(QString("")); +} + +QStringList ConnectionPane::CollectHelp(QStringList help, QMap level) +{ + for (QMap::iterator it = level.begin() ; it != level.end() ; it++) + { + QString key = it.key(); + QVariant val = it.value(); + + if (QString(val.typeName()) == QString("QVariantMap")) + { + QMap nextLevel = val.toMap(); + help = CollectHelp(help, nextLevel); + } + else + { + CommandData cmd = val.value(); + QString item = cmd.HelpText + QString(" - ") + cmd.LongHelp; + help.append(item); + } + } + + return help; +} + +void ConnectionPane::CommandHandler(QString, ConnectionPane *instance, QStringList args) +{ + QString cmd = args.join(" "); + if(instance->SendCommand(cmd)) + { + //instance->ui->mainPane->setHtml(instance->ui->mainPane->toHtml()+instance->OutputLine(QString("# ") + args.join(" "), "command")); + + //instance->ui->mainPane->moveCursor(QTextCursor::End); + //instance->ui->mainPane->ensureCursorVisible(); + + //instance->ui->textEntry->setText(QString("")); + //instance->ui->helpArea->setText(QString("")); + + } +} + +QString ConnectionPane::FormatLine(QString line, QString level) +{ + if (level == "") + return line; + + QRegExp re(QString("^(.*)\\[(.*)\\](.*)$")); + QString ret; + + if (re.exactMatch(line)) + { + QString color = GetColor(re.cap(2)); + ret = re.cap(1)+QString("[")+re.cap(2)+QString("]"); + + line = re.cap(3); + } + + if (level == QString("error")) + { + ret += QString("") + QString(line.toHtmlEscaped()) + QString(""); + } + else if (level == QString("warn")) + { + ret += QString("") + QString(line.toHtmlEscaped()) + QString(""); + } + else if (level == QString("command")) + { + ret += QString("") + QString(line.toHtmlEscaped()) + QString(""); + } + else + { + ret += QString(line.toHtmlEscaped()); + } + + return ret; +} + +QString ConnectionPane::OutputLine(QString line, QString level) +{ + QString ret; + + if (level == QString("error")) + { + ret += QString("") + QString(line.toHtmlEscaped()) + QString(""); + } + else if (level == QString("warn")) + { + ret += QString("") + QString(line.toHtmlEscaped()) + QString(""); + } + else if (level == QString("command")) + { + ret += QString("") + QString(line.toHtmlEscaped()) + QString(""); + } + else + { + ret += QString(line.toHtmlEscaped()); + } + + return ret; +} + +QString ConnectionPane::GetColor(QString text) +{ + QList colors; + + colors.append(QString("#7f7f7f")); + colors.append(QString("#0000ff")); + colors.append(QString("#00cf00")); + colors.append(QString("#00cfcf")); + colors.append(QString("#cf00cf")); + colors.append(QString("#cfcf00")); + + return colors.at(qHash(text.toUpper()) % colors.size()); +} + +/* +void ConnectionPane::DumpTree(QMap level) +{ + QMap::iterator it; + + for (it = level.begin() ; it != level.end() ; it++) + { + QVariant val = it.value(); + QString key = it.key(); + + if (QString(val.typeName()) == QString("QVariantMap")) + { + printf("Level: %s\n", key.toAscii().data()); + QMap nextLevel = val.toMap(); + DumpTree(nextLevel); + } + else + { + CommandData cmd = val.value(); + printf("%s\n", cmd.HelpText.toAscii().data()); + } + } +} +*/ + +bool ConnectionPane::SendCommand(QString cmd) +{ + if (cmdReply) + return false; + + QUrlQuery queryString; + + queryString.addQueryItem("ID", sessionID); + queryString.addQueryItem("COMMAND", cmd); + + QString data = queryString.query(QUrl::FullyEncoded).toUtf8(); + + QNetworkRequest request(urlCommand); + + // Send it + cmdReply = manager->post(request, data.toLatin1()); + connect(cmdReply, SIGNAL(finished()), this, SLOT(CommandReply())); + + return true; +} + +QMap ConnectionPane::ProcessTreeLevel(QDomNode node, QMap level) +{ + QDomNodeList levelL = node.childNodes(); + for (int i = 0 ; i < levelL.count() ; i++) + { + QDomNode n = levelL.at(i); + if (n.isElement()) + { + QDomElement e = n.toElement(); + if (e.tagName() == QString("Level")) + { + QDomNode a = e.attributeNode(QString("Name")); + QDomAttr att = a.toAttr(); + QString name = att.value(); + + QMap nextLevel; + level[name] = ProcessTreeLevel(n, nextLevel); + } + else if (e.tagName() == QString("Command")) + { + CommandData cmd; + + QDomNodeList cmdL = n.childNodes(); + for (int j = 0 ; j < cmdL.count() ; j++) + { + QDomNode cmdN = cmdL.at(j); + QDomElement cmdE = cmdN.toElement(); + + if (cmdE.tagName() == QString("Module")) + cmd.Module = cmdE.text(); + else if(cmdE.tagName() == QString("HelpText")) + cmd.HelpText = cmdE.text(); + else if(cmdE.tagName() == QString("LongHelp")) + cmd.LongHelp = cmdE.text(); + else if(cmdE.tagName() == QString("Description")) + cmd.Description = cmdE.text(); + } + cmd.fn = CommandHandler; + cmd.instance = this; + + level[QString("")].setValue(cmd); + } + } + } + + return level; +} diff --git a/connectionpane.h b/connectionpane.h new file mode 100644 index 0000000..ca90743 --- /dev/null +++ b/connectionpane.h @@ -0,0 +1,79 @@ +#ifndef CONNECTIONPANE_H +#define CONNECTIONPANE_H + +#include +#include +#include +#include +#include +#include + +class QNetworkAccessManager; +class QNetworkReply; +class ConnectionData; + +namespace Ui { +class ConnectionPane; +} + +class ConnectionPane : public QWidget +{ + Q_OBJECT + +public: + explicit ConnectionPane(ConnectionData *c, QHostAddress addr, QWidget *parent = 0); + ~ConnectionPane(); +public slots: + void CommandReply(); + void LoginReply(); + void PollReply(); + void TextChanged(QString text); + void ReturnPressed(); + void Login(); +public: + void CloseConnection(); + void ClearScrollback(); + void Copy(); + void RestartServer(); + bool IsLoggedIn(); + +protected: + QStringList CollectHelp(QStringList helpParts); + QStringList Parse(QString text); + QStringList Resolve(QStringList cmd); + QStringList FindNextOption(QStringList cmd, bool term); + static void Help(QString module, ConnectionPane *instance, QStringList args); + static void Quit(QString module, ConnectionPane *instance, QStringList args); + QStringList CollectHelp(QStringList help, QMap level); + static void CommandHandler(QString module, ConnectionPane *instance, QStringList args); + QString FormatLine(QString line, QString level); + QString OutputLine(QString line, QString level); + QString GetColor(QString text); + //void DumpTree(QMap level); + bool SendCommand(QString cmd); + QMap ProcessTreeLevel(QDomNode node, QMap level); + QString Name; + QString Host; + int Port; + QString User; + QString Pass; + QUrl urlStart; + QUrl urlClose; + QUrl urlCommand; + QUrl urlPoll; + QString sessionID; + QNetworkAccessManager *manager; + QMap tree; + QNetworkReply *loginReply; + QNetworkReply *pollReply; + QNetworkReply *cmdReply; + bool loggedIn; + QString textContent; + bool expectingInput; + bool expectingCommand; + +private: + Ui::ConnectionPane *ui; +}; + +#endif // CONNECTIONPANE_H diff --git a/connectionpane.ui b/connectionpane.ui new file mode 100644 index 0000000..f7b623b --- /dev/null +++ b/connectionpane.ui @@ -0,0 +1,65 @@ + + + ConnectionPane + + + + 0 + 0 + 400 + 300 + + + + Form + + + + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + true + + + + + + + background-color: white; padding: 2px; + + + + + + true + + + + + + + + + + + diff --git a/document-new.png b/document-new.png new file mode 100644 index 0000000000000000000000000000000000000000..e3808a108e335b14e13711783a3717f7b6013375 GIT binary patch literal 692 zcmV;l0!#ggP);y z08cd6u?+wK010qNS#tmY4c7nw4c7reD4Tcy000McNliru)dCU@B{0fECJ6ul0zpYc zK~y-)t(DDd6JZdCpPAiMn&Jmdn>7fYJcxJ_#8&Vh@X~`PZ{pRn2x2dy;>SPX!Ham1 z+(i)tHKi8|da}9HkQgW;F{asM$HRVRQ|)SfA!K*h_jzZ2znNWOpKH`v5ugP4u2;7> zF7d_vhj(uStA7Jk38)+yP+RQbsIfED#}_X&uen~m?`ED`y>b0!VW^o8{zroTOMI(f zl-d6J>5AdJ8g*8ly7>*wW)sJ8Ff&91k+7)jH5esnQPvkYrCDs|65`BrXyG*$Ji9FR zZC&%=7!X6u49qYyEHKOf#;EiV*}-H1bRJOP05C2ChxY^{Kpay+6+|2YIY_`FGTH?H z4FnyAg9c(hHh}Hlf>kyA7ePeR!$eVW2sp}sWrlVFhHJR~b2dM3Ap}o=mb)8RRa1=- zkgUc6DhM-}9K)x=m{ZKom1t~y=gi602jJ&a#%t@1NwYH9CqLpU98Bjh=QuKRnqI$z z>(%?NSGOtfxwA{uYPFoEq;jZ4_fd7CVO5i3!LCxY+wE|ZX(&TdK1mgkr$i4-E%#4d zVPZ*k`Cd*A5J4#bPBsA=nH6dZqS1XEkCF}JxpB`2-o1Z2m61p&MGVbqEU^iDftQ!g zQ>|9h9@fZ2G%`*Q6xD2(Xfchu-R?xYG4Y;|`| aWBLmt`;((hn6}^m0000TX!9obm&d#PbY<+zlDdlWnDJ4oN^7%Xf z^Yin6Js}D3$L{AOTL)P<&isad8nL1REP0 zV_K`#uq=y(g#|jD4#i?|;u*`kj>2&qgb)k{0|tWuySuv_A0KmleNDAm#rJ)D-;bu| zt}~YRHP5zfY}>{(P1@}?hGEcdw@IhdkxD6N%Q#+I*vL?u%_f?rMgGCT0gmI$mhrpy zoe0|R_v!U|R4Nrb&%tgKL} zRH8~8$D!3~q3b$^VQ_SG#M08z^f`827a;@}7Z(%fv{Wi_a&kg8n?=|4=^4jmd3ibU zafFSPQnISKu4)edGtDeSQHB WwDsBxeH6w30000L zlYMB_RUF1Y=l6Q={oUO=x3;-?r)|E?8R>FZVnchAVkJg`G{}GQYEY>WL?O*wg_W37 zN+A_B8BtOhXo_HFin>jw)6JJnMb~mKZF6t;-rbkq@AOAk$y%WJg@<$Ca6aeZ;W=X6 z%ZeXZqzJKG3Xv+LvtenKy@LB3MF`%_8B_T2thvF!lcleCJ-!jkD$CRb_YGE6Jy=*g z+YDbjNWAw7Qy-mUDS~yCWvYH(V8@QfoJ0aeH5hC=i)DGp8a37rEZMqJys+aV^VnBQ z#63Tv0Nc;i9EkYxXJcheroW|zf}#?SnZ_E!mGZ5WOcOce-MeGSithGnl}Gk}Go+1} zfSL9nEuBY58=LN$w{W>TJ9k`EBzX8a((D)~yq;Qn~o&4N?~uXgRsL8&yqQ-&`){ z-&GXbR*Ah*=yOuj{9#XH%;W3`X$2Xh7>dWZ+SkRHPsWq=OaOOEF?~Jl)c&?V+}G35 z7>_$;!3uf#f58A-R*3)(lSY1~d^aI&WNLRbM7I_tZ@t7bTE#Ry=!S*M`v{t+h(E4f zkjD@13CE&?s~tyv8my3sVZpa%ud2RptMY@CS@|O8o$EqzNi@yGG(8xm2Te24H7~j~ zjkwI`boDQhD-B0_W3lKeV0*AaMu!ChY*{IyrDd-hp{|`sCxoUMn5KncTIhNj$S7{N z2USl6vxxoyi~8z);j0&F<5D_n9fvi_f2e?>(i$G@Ml~`4kWwP~+km1Bp_u_9p(xUh zA)+VoyXtxT=~B=0Wy}0hC@XHa;@=}3c6YV4IEHIHAW6g%NZSES?1YW3hR{6|>Fw#q zkp>`9R4NdArZHUhI`Rn=?q0A;od8F z{Q0>2CDb0;89(vskC%FS?UG=HjNAbhLMTEAACLuPA3n+2v$fSx(<(;QGci1wga?O+ zg|Cv5F`e#im4SZA@xyzfr|TL|tlXGb@b>2@LI|G_LMTb70IZ}^0AJP5+-UFUX}C~# zAYrA?#c|@eePijn396BYVU1(|uJy5#r<(RHT^%oP?Z8alwE*jO-GmU{~fB-uaXH(}4{@7Q4b6PHX%{s>9Ebr!Kom&Gf583%ti$Fg%v=kf00000NkvXXu0mjfl$J&e literal 0 HcmV?d00001 diff --git a/edit-copy.png b/edit-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..345b2f1d7cbc2238e895eda7f3ce236f451d12d8 GIT binary patch literal 725 zcmV;`0xJE9P)o@C8T-_3a006Dl?}?!^Gg%N(Y>yRJWM=AgI&$DQBoaw5Gfxa| zHh)H-herpGZf^eM0fZm~A~V3t^_5{65)pllfQ!XK@ZIw~`E}<@e(~uNF*8lPs6?o2 ztj>-!R$YZ#Q@XxxO_e_Y9%Oq#_zDy>AY&Hu3$mMbYD+Kmoz6C|Vj#G>P0frC~Qc7s8 zA%uWG``g7cJ0P7-2aymFY}+1KECNw~7udE9B4O+-D_Fd0Z5LW=Sau@u$S#kdYD{C*72J`o)&&(zUFlO)G2LN1NUEuKh0hq95jXVG0 z{B7HUl;#yH;UH$AF;6 z<+=F}=GKmRDjTbxy4~)B!JDgph#3rM0jg^7z2(K{fBo7&#+023nteo900000NkvXX Hu0mjfy%<3* literal 0 HcmV?d00001 diff --git a/edit-cut.png b/edit-cut.png new file mode 100644 index 0000000000000000000000000000000000000000..7017d1b3c05602eae02c4e24ee0dd623a4a988b9 GIT binary patch literal 1177 zcmV;K1ZMk*P)@nd7muDXRbu{1HZCDn+AB-+xJK7@d@6iHtMr8cef zK?O^Tg+P)9v=kwvArB!GKZ3D_k`_~mX^OQEH6J?YG_mrPO`;?5S&M!A__1!#7@klXwfCgN@p>Z!ezjNCo|-yQ{~& z%gwU3XX8-SVeHJ?xi2l4bMDT~aRC6T4jl%7_7oNr#pCgJ%gZVtgn*`Lh(sd=X~FS$ zd}`?WHOp?dLtzT?^73t0zPmiKJ|{CXbMRn!1vnR=l;YOt&j^J=t!cpkjx9Z1BDx-f zloBQT_9Gk)9a&dxr4XXj<1U1h5>FPNARaeX+gjSY(t_Js+8+bBG&nRMolYmDlz4gn ztLW?Rc?19%85utuJyHYCIT&LYy*+|hELxiC9g-_XTT6SruIqt^f8Cda5ai~%5DEo% zU%YgoYx}mWt(xk9loAtn|A4Bhy@_Hr2Pf3{+xQsSvgH}%V0k4nGc!LaC@g}M5|k3m z&CePqo0{L-XdF|5+gjRtEz27H<<4!(X0t(26sW2O!8r&a_-Xh@ghHX}baPJA#6I|E z`fmv$A*Dp|?iUe>gfTrc4Q8`FNVk;$VB08gb9f|BU31j&-_%rPaY-pm(}ZCd@IQQj z6OBzfu!+)DjN;EajQGq9CjXp3ad9z;g+f@GdW1o{y<;;lN&ayK@NUzz4oXOEoO5mO z-j|5q;lRJ+zoVe+HRQx%n4G*XRmOBn%Km_^e^Cd_qy-P!?Tw1f_IXiOR=%bvQ0TLU z#%E_`B3G6b77_q3EepD7;_=Fg&lKXzV}@})r4<7nca4y;b&t!HzZ#4ACw;yZe>954 za2SRVXISm=3x*J97QnAFUVkKl#c;UK z5Te_mC|C#vVF7oK_w+Xam{N!+rip1QlMd7tv^aYOrZOuQ7&*Velm( zhE&EHoOU}XA@e7I>j1Pm;Co8Qywh%n%2>ma5JM5e;2L9)hVjCBYuVZb#N?i!u4AjF zp@gv;p6qN)EG#U|a^45P4L}0GEa$!O`RZQrcy`P!FW*oY<3U{q<-!d>17HFWG;s^H zGj@3{5I}~aFo&w*p3jG6DS!Ql^L_x?iObk1Yj}N13*pe z1|jPfg-sqWe63=VG)_f&`LnWx)TYzECBc)r|Z?9gzmJw00000NkvXXu0mjfHJ>47 literal 0 HcmV?d00001 diff --git a/edit-delete.png b/edit-delete.png new file mode 100644 index 0000000000000000000000000000000000000000..3811b64895bdf722cd76c798c89ed7a6e625913d GIT binary patch literal 1211 zcmV;s1VsCZP)&}2?QB#3K;+Z01tFU zSad^gZEa<4bO32&AZ%}EZ-&Nqxc~qJElET{R5;76lx=8RRT#(r=iGafrfpt&Z~BsK zwzsKmt=lXcRy%3wU@zblb&69I{h(+S^n))MnyHch%T=}nuPw|kBsnx>5z3T}Tm+~@gU&X0%ZJUj$j^wG%=hjcx$5C1~~ zrJuZd?9J|tT-^Fo*Ax3*?0yO9bUN>G&Wj)$9w7t(AW0HVpE>nBfK9M^xc5B(J?kk$ zB9TBW7Apd7M*1AX83(&Y!NWy@f@i%eq`4C*yI=Qd3jS z*4EZoO-(f+6hy68g{rD5Iv<#2vMe);*&^i&%?AR_fT6A9p3aD~(wR}~>UBkNQcB5; z)mEOBD`eefwHt1?Ygtj8gmK2~HoH+)R>l;?iOIKs;atbvsnedf98&{v0t{COcJcta%1Z1l;y}nkJJYjf)%0AVyXz7 z&=X-vlz3nN*=RbOn$fgaw140$t-Q3nZ8@?uO9)AP_rtgJ_8l$QxoZcK$y6%56b{b% zr!hL}!-EeTS&7AB?&7t{k#1^fx|r1U!1UD2{r(xhQRk`sTogq2v4#fE3)frl z|NIuNRgyp9@X}!4+5X=7`M?zdfB-N7PypC-G0ph|07JepAi01v7=gySn zH0n71Btjr4xeIgQCMlI#aXhER{OgQ^dEs)t^YcBt_x%p{6I6JHhlf7`z5AADCnqN_AC@NyCw@QL z@+=O3WaIS<`iV2|rBt4-t`3AqA5}`Ru<#vC6OmLRHslDsn+G`8OVaO09srN_+3qOh zb1A6?_*>hfHMaMN*4D<7idI)6tpAu(CpYJ$0yKf8q;~JchrPD|dRFPyXZdXCQkyHZ z+rU?|lO1ypx7$NoTYFAJT6B6$Bw&5LLsYe#w{@Rc!bQk6J@<1Q$b*+>aX58q>~@X$ z%}#s|pI}4{#>bzsxVThOvC~Ml*zNYR`%0;TNd<7>{>;qGAyDY=_mKF zbM_ZBIXGVN=2EfS6#-HJj$p%rUuzp<=s;_*02$>V}$MzLaL|EsJnCjLO_y(=-W%)|q%c!L_D^^5AUQPCF!# zjR?)nExAK2`;rVJS_E}Fwks=cmERb9>?5AkDm52wwS3`}Em_`*H?t&0ud-?Fq&yeT z8g#2q9Cp7;^`WSh0#x`w2f2HN8$#1wqLimZ+Y;seMfpH%$*RV{Zd328U~p>ZK*Gq# z?JA%Kr~~Q&573Z_oj@Ge0ycmM@CVq;jIm&FN&@@?USWreIVMnR00000NkvXXu0mjf D-0Nc} literal 0 HcmV?d00001 diff --git a/folder.png b/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..65bd0bbdcb9005cb8929f06e25d9cb15a926366a GIT binary patch literal 581 zcmV-L0=oT)P)2|yPkE-3> z-8b(3_?ov1cYiV%432IDm|3sa>)kUm%nWx2;PmwLe!t&8>~uQMm(4k6LI`Cz9Dc0p zx&Tx;XIE7wlL@7i6(oef_V#uMc)NrGOsCVTl=7;s>w_zRjH+U0Ymj!k-P+vTq}6H> zV^0g%)=c>R8-N-3GD0!|F@>GqJ z%4)bdf_Rm4wwyD#6GYg!0ieZcvQf+lK>!v2)x`$$R0x3iqPe(Z=9oKK7jS;E^w*b55oWe`mg~7=)i^mlj0C%nT8s$wuo= zb!&(s!bMVmQn@?FCx!@o{yMsKc&XWJj=)i68(aN%$9JEC^W*#Yp8+C_MZ$~UM;0NT T9Al?300000NkvXXu0mjfM@0T3 literal 0 HcmV?d00001 diff --git a/groupdata.cpp b/groupdata.cpp new file mode 100644 index 0000000..db9258b --- /dev/null +++ b/groupdata.cpp @@ -0,0 +1,6 @@ +#include "groupdata.h" + +GroupData::GroupData() +{ + +} diff --git a/groupdata.h b/groupdata.h new file mode 100644 index 0000000..1d4b3d6 --- /dev/null +++ b/groupdata.h @@ -0,0 +1,18 @@ +#ifndef GROUPDATA_H +#define GROUPDATA_H + +#include +#include +#include + +class GroupData +{ +public: + GroupData(); + + QUuid Uuid; + QString Name; + QHostAddress Dns; +}; + +#endif // GROUPDATA_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..9669280 --- /dev/null +++ b/main.cpp @@ -0,0 +1,12 @@ +#include "mainwindow.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..e840d87 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,767 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "connectiondata.h" +#include "groupdata.h" +#include "connectionpane.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "addconndialog.h" +#include "addgroupdialog.h" +#include "preferencesdialog.h" +#include "ui_preferencesdialog.h" + +enum ItemType +{ + GroupItem = QTreeWidgetItem::UserType, + ConnectionItem = QTreeWidgetItem::UserType + 1 +}; + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + ui->connList->setColumnCount(1); + ui->connList->setHeaderLabel("Connections"); + ui->connList->setHeaderHidden(true); + ui->connList->sortByColumn(0, Qt::AscendingOrder); + ui->connList->setContextMenuPolicy(Qt::CustomContextMenu); + + connect (ui->consolePane, SIGNAL(tabCloseRequested(int)), this, SLOT(CloseTab(int))); + connect (ui->connList, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(ConnContext(const QPoint &))); + connect(ui->connList, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(ConnectionDoubleClicked(QTreeWidgetItem *, int))); + connect(ui->connList, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(treeWidgetItemChanged(QTreeWidgetItem*,int))); + + QCoreApplication::setOrganizationName("OpenSimulator"); + QCoreApplication::setApplicationName("OpenSim Console Client"); + + QSettings settings; + + ui->connList->blockSignals(true); + + restoreGeometry(settings.value("mainWindowGeometry").toByteArray()); + restoreState(settings.value("mainWindowState").toByteArray()); + + blackOnWhite = settings.value("black_on_white", QVariant(true)).toBool(); + systemFont = settings.value("system_font", QVariant(false)).toBool(); + + if (settings.value("split").isValid()) + ui->splitter->restoreState(settings.value("split").toByteArray()); + + int groupCount = settings.beginReadArray(QString("Groups")); + for (int i = 0 ; i < groupCount ; i++) + { + settings.setArrayIndex(i); + + GroupData *grp = new GroupData(); + + grp->Name = settings.value("Name").toString(); + grp->Uuid = settings.value("Uuid").toUuid(); + QVariant dnsAddress = settings.value("Dns"); + if (dnsAddress.isValid()) + grp->Dns = QHostAddress(dnsAddress.toString()); + + groups[grp->Uuid] = grp; + + insertGroup(grp); + + QTreeWidgetItem *grpItem = findItem(grp->Uuid); + + if (settings.value("Expanded").toBool()) + grpItem->setExpanded(true); + } + settings.endArray(); + + int connCount = settings.beginReadArray(QString("Connections")); + + for (int i = 0 ; i < connCount ; i++) + { + settings.setArrayIndex(i); + + ConnectionData *c = new ConnectionData; + + c->Name = settings.value("Name").toString(); + c->Host = settings.value("Host").toString(); + c->Port = settings.value("Port").toInt(); + c->User = settings.value("User").toString(); + c->Pass = settings.value("Pass").toString(); + c->Uuid = settings.value("Uuid").toUuid(); + + connections[c->Uuid] = c; + + QTreeWidgetItem *connItem; + + QUuid parent = settings.value("Parent").toUuid(); + if (!parent.isNull()) + { + QTreeWidgetItem *parentItem = findItem(parent); + if (parentItem == 0) + continue; + + connItem = new QTreeWidgetItem(parentItem, QStringList(QString(c->Name)), ConnectionItem); + } + else + { + connItem = new QTreeWidgetItem(ui->connList, QStringList(QString(c->Name)), ConnectionItem); + } + + connItem->setIcon(0, QIcon(":/Icons/computer.png")); + connItem->setData(0, Qt::UserRole, c->Uuid); + } + settings.endArray(); + + ui->connList->blockSignals(false); + + ui->connList->sortItems(0, Qt::AscendingOrder); +} + +MainWindow::~MainWindow() +{ + WriteSettings(); + + // No need to free anything as the OS does it for us + + delete ui; +} + +void MainWindow::on_action_Exit_triggered() +{ + close(); +} + +void MainWindow::on_action_Connect_triggered() +{ + QTreeWidgetItem *item = selectedItem(); + if (!item) + return; + + if (item->type() == GroupItem) // Group + { + QUuid groupUuid = item->data(0, Qt::UserRole).toUuid(); + + if (!groups.contains(groupUuid)) + return; + + for (int i = 0 ; i < item->childCount() ; i ++) + { + QTreeWidgetItem *it = item->child(i); + + QUuid uuid = it->data(0, Qt::UserRole).toUuid(); + + if (!connections.contains(uuid)) + continue; + + AddNewTab(groups[groupUuid], connections[uuid], groups[groupUuid]->Dns); + } + return; + } + + QUuid uuid = item->data(0, Qt::UserRole).toUuid(); + + if (!connections.contains(uuid)) + return; + + ConnectionData *c = connections[uuid]; + + QHostAddress dns; + + if (item->parent() != 0) + { + QTreeWidgetItem *parentItem = item->parent(); + QUuid parentUuid = parentItem->data(0, Qt::UserRole).toUuid(); + + if (groups.contains(parentUuid)) + dns = groups[parentUuid]->Dns; + } + AddNewTab(0, c, dns); +} + +void MainWindow::on_action_Disconnect_triggered() +{ + ConnectionPane *cw = GetCurrentTab(); + if (!cw) + return; + + cw->CloseConnection(); + + QTabWidget *p = (QTabWidget *)cw->parent()->parent(); + + QWidget *pp = (QWidget *)p->parent()->parent(); + + if (pp && pp->inherits("QTabWidget") && p->count() == 1) + { + delete cw; + delete p; + } + else + { + delete cw; + } +} + +void MainWindow::on_action_Edit_triggered() +{ + QTreeWidgetItem *item = selectedItem(); + if (item == 0) + return; + + QUuid uuid = item->data(0, Qt::UserRole).toUuid(); + + if (connections.contains(uuid)) + { + ConnectionData *c = connections[uuid]; + + AddConnDialog dlg(this); + + dlg.Name->setEnabled(false); + dlg.Name->setText(c->Name); + dlg.Host->setText(c->Host); + dlg.Port->setValue(c->Port); + dlg.User->setText(c->User); + dlg.Pass->setText(c->Pass); + + if (dlg.exec() < 0) + return; + + c->Host = dlg.Host->text(); + c->Port = dlg.Port->value(); + c->User = dlg.User->text(); + c->Pass = dlg.Pass->text(); + } + + if (groups.contains(uuid)) + { + GroupData *g = groups[uuid]; + + AddGroupDialog dlg(this); + + dlg.Name->setEnabled(false); + dlg.Name->setText(g->Name); + dlg.Dns->setText(g->Dns.toString()); + + if (dlg.exec() < 0) + return; + + if (dlg.Dns->text() != "") + g->Dns = QHostAddress(dlg.Dns->text()); + else + g->Dns = QHostAddress(); + } + + WriteSettings(); +} + +void MainWindow::on_action_Restart_triggered() +{ + ConnectionPane *c = GetCurrentTab(); + if (!c) + return; + + c->RestartServer(); +} + +void MainWindow::on_action_Clear_text_triggered() +{ + ConnectionPane *cw = GetCurrentTab(); + if (!cw) + return; + + cw->ClearScrollback(); +} + +// Recursively find a tab with a given UUID. This returns +// both sub-tab widgets and actual connection panes. +QWidget *MainWindow::findTab(QTabWidget *parent, QUuid uuid) +{ + int count = parent->count(); + + for (int i = 0 ; i < count ; i++) + { + QWidget *w = parent->widget(i); + + QVariant u = w->property("UUID"); + if (!u.isValid()) + continue; + + if (u.toUuid() == uuid) + { + return w; + } + + if (w->inherits("QTabWidget")) + { + w = findTab((QTabWidget *)w, uuid); + if (w != 0) + return w; + } + } + + return 0; +} + +void MainWindow::AddNewTab(GroupData *grp, ConnectionData *conn, QHostAddress addr) +{ + // Assume that it's a root pane + QTabWidget *parent = ui->consolePane; + + // See if there is a connection present and open. If there is one, + // just refuse to add another. If it's not connected, close the old + // pane and another will be created later. + QWidget *w = findTab(ui->consolePane, conn->Uuid); + if (w != 0 && w->inherits("ConnectionPane")) + { + ConnectionPane *c = (ConnectionPane *)w; + + if (c->IsLoggedIn()) + return; + + delete c; + } + + // If this is a group pane being opened, see if there is already + // a multipane for this group. If not, create it. + if (grp != 0) + { + w = findTab(ui->consolePane, grp->Uuid); + + if (w == 0 || (!w->inherits("QTabWidget"))) + { + parent = new QTabWidget(ui->consolePane); + parent->setTabPosition(QTabWidget::North); + parent->setTabShape(QTabWidget::Triangular); + parent->setProperty("UUID", QVariant(grp->Uuid)); + ui->consolePane->addTab(parent, grp->Name); + ui->consolePane->setCurrentWidget(parent); + } + else if (w->inherits("QTabWidget")) + { + parent = (QTabWidget *)w; + } + } + + ConnectionPane *tabContents = new ConnectionPane(conn, addr, parent); + tabContents->setVisible(true); + tabContents->setProperty("UUID", conn->Uuid); + + parent->addTab(tabContents, conn->Name); + parent->setCurrentWidget(tabContents); + + tabContents->Login(); +} + +void MainWindow::WriteSettings() +{ + QSettings settings; + + settings.clear(); + + settings.setValue("mainWindowGeometry", saveGeometry()); + settings.setValue("mainWindowState", saveState()); + settings.setValue("split", ui->splitter->saveState()); + + settings.setValue("black_on_white", blackOnWhite); + settings.setValue("system_font", systemFont); + + settings.beginWriteArray(QString("Groups"), groups.count()); + + int idx = 0; + for (QMap::iterator it = groups.begin() ; it != groups.end() ; it++, idx++) + { + QTreeWidgetItem *grpItem = findItem((*it)->Uuid); + + if (grpItem == 0) + continue; + + settings.setArrayIndex(idx); + settings.setValue("Uuid", QVariant((*it)->Uuid)); + settings.setValue("Name", QVariant((*it)->Name)); + if (!(*it)->Dns.isNull()) + settings.setValue("Dns", (*it)->Dns.toString()); + settings.setValue("Expanded", QVariant(grpItem->isExpanded())); + } + + settings.endArray(); + + settings.beginWriteArray(QString("Connections"), connections.count()); + + idx = 0; + for (QMap::iterator it = connections.begin() ; it != connections.end() ; it++, idx++) + { + QUuid parent; + + if (!(*it)->Uuid.isNull()) + { + QTreeWidgetItem *item = findItem((*it)->Uuid); + if (item == 0) + continue; + + if (item->parent() != 0) + parent = item->parent()->data(0, Qt::UserRole).toUuid(); + } + + settings.setArrayIndex(idx); + settings.setValue("Uuid", QVariant((*it)->Uuid)); + settings.setValue("Name", QVariant((*it)->Name)); + settings.setValue("Host", QVariant((*it)->Host)); + settings.setValue("Port", QVariant((*it)->Port)); + settings.setValue("User", QVariant((*it)->User)); + settings.setValue("Pass", QVariant((*it)->Pass)); + settings.setValue("Parent", (QVariant(parent))); + } + + settings.endArray(); +} + +void MainWindow::ConnectionDoubleClicked(QTreeWidgetItem *, int) +{ + ui->action_Connect->trigger(); +} + +ConnectionPane * MainWindow::GetCurrentTab() +{ + if (ui->consolePane->count() == 0) + return 0; + if (ui->consolePane->count() == 1 && ui->consolePane->tabText(0) == "Not connected") + return 0; + + QWidget *w = ui->consolePane->currentWidget(); + + if (w->inherits("QTabWidget")) // Sub tabs + { + if (((QTabWidget *)w)->count() == 0) + return 0; + + w = ((QTabWidget *)w)->currentWidget(); + } + ConnectionPane *cw = dynamic_cast(w); + return cw; +} + + +void MainWindow::ConnContext(const QPoint &pos) +{ + QTreeWidgetItem *item = ui->connList->itemAt(pos); + ui->connList->clearSelection(); + if (item) + item->setSelected(true); + + QMenu ctx("Connection actions", this); + if (item != 0) + { + if (item->type() == GroupItem) + { + if (item->childCount() > 0) + { + connect (ctx.addAction("Connect Group"), SIGNAL(triggered()), ui->action_Connect, SLOT(trigger())); + ctx.addSeparator(); + } + } + else + { + connect (ctx.addAction("Connect"), SIGNAL(triggered()), ui->action_Connect, SLOT(trigger())); + ctx.addSeparator(); + } + connect (ctx.addAction("Add ..."), SIGNAL(triggered()), ui->action_New, SLOT(trigger())); + } + else + { + connect (ctx.addAction("Add ..."), SIGNAL(triggered()), this, SLOT(addRootConnection())); + } + if (item != 0) + connect (ctx.addAction("Edit ..."), SIGNAL(triggered()), ui->action_Edit, SLOT(trigger())); + if (item != 0 && item->type() != GroupItem) + connect (ctx.addAction("Delete"), SIGNAL(triggered()), ui->actionDelete, SLOT(trigger())); + else if (item != 0 && item->childCount() == 0) + connect (ctx.addAction("Delete"), SIGNAL(triggered()), ui->actionDelete_group, SLOT(trigger())); + ctx.addSeparator(); + connect (ctx.addAction("Add Group..."), SIGNAL(triggered()), ui->actionNew_group, SLOT(trigger())); + + ctx.exec(ui->connList->mapToGlobal(pos)); +} + + +void MainWindow::CloseTab(int index) +{ + QWidget *w = ui->consolePane->widget(index); + + if (w->inherits("QTabWidget")) + { + QTabWidget *tabs = (QTabWidget *)w; + + while (tabs->count()) + { + ConnectionPane *c = (ConnectionPane *)tabs->widget(0); + + c->CloseConnection(); + + delete c; + } + + delete w; + } + else + { + if (w->inherits("ConnectionPane")) + { + ConnectionPane *c = (ConnectionPane *)w; + + c->CloseConnection(); + } + + delete w; + } +} + +void MainWindow::on_actionCopy_triggered() +{ + ConnectionPane *cw = GetCurrentTab(); + if (!cw) + return; + + cw->Copy(); +} + +// Helper to get the selected item from the list. +QTreeWidgetItem *MainWindow::selectedItem() +{ + QList items = ui->connList->selectedItems(); + if (items.count() != 1) + return 0; + + return items.at(0); +} + +// User requests a new group to be created. +void MainWindow::on_actionNew_group_triggered() +{ + GroupData *grp= createGroup(); + + QTreeWidgetItem *item = insertGroup(grp); + + ui->connList->editItem(item, 0); +} + +// Insert a group into the tree view +QTreeWidgetItem *MainWindow::insertGroup(GroupData *grp) +{ + QTreeWidgetItem *item = new QTreeWidgetItem(ui->connList, QStringList(grp->Name), GroupItem); + item->setFlags(item->flags() | Qt::ItemIsEditable); + item->setData(0, Qt::UserRole, grp->Uuid); + item->setIcon(0, QIcon(":/Icons/folder.png")); + + ui->connList->sortItems(0, Qt::AscendingOrder); + + return item; +} + +// Create a new group record and insert it into the groups list. +// Doesn't show or edit it. +GroupData *MainWindow::createGroup() +{ + GroupData *grp = new GroupData(); + + grp->Uuid = QUuid::createUuid(); + grp->Name = "New group"; + + groups[grp->Uuid] = grp; + + return grp; +} + +// Find any item in the list. Works for both groups and connections. +QTreeWidgetItem *MainWindow::findItem(QUuid uuid) +{ + QTreeWidgetItemIterator it(ui->connList); + + while (*it) + { + if ((*it)->data(0, Qt::UserRole).toUuid() == uuid) + return (*it); + it++; + } + + return 0; +} + +// Delete a group from the list +void MainWindow::on_actionDelete_group_triggered() +{ + QTreeWidgetItem *item = selectedItem(); + if (item == 0) + return; + + if (item->childCount() > 0 || item->type() != GroupItem) + return; + + if (QMessageBox::question(0, QString("Delete group"), + QString("Really delete this group?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes) != QMessageBox::Yes) + return; + + QUuid uuid = item->data(0, Qt::UserRole).toUuid(); + + if (groups.contains(uuid)) + { + GroupData *grp = groups[uuid]; + groups.remove(uuid); + delete grp; + } + + delete item; + + WriteSettings(); +} + +void MainWindow::on_action_New_triggered() +{ + QListitems = ui->connList->selectedItems(); + + if (items.count() == 0) + addRootConnection(); + else + addChildConnection(); + + WriteSettings(); +} + +ConnectionData *MainWindow::createConnection() +{ + AddConnDialog dlg(this); + if (dlg.exec() < 0) + return 0; + + ConnectionData *c = new ConnectionData; + c->Name = dlg.Name->text(); + c->Host = dlg.Host->text(); + c->Port = dlg.Port->value(); + c->User = dlg.User->text(); + c->Pass = dlg.Pass->text(); + c->Uuid = QUuid::createUuid(); + + connections[c->Uuid.toString()] = c; + + return c; +} + +void MainWindow::addRootConnection() +{ + ConnectionData *c = createConnection(); + + if (c == 0) + return; + + QTreeWidgetItem *item = addItem(ui->connList, c); + if (!item) + connections.remove(c->Uuid); +} + +void MainWindow::addChildConnection() +{ + QTreeWidgetItem *parent = selectedItem(); + + if (parent == 0) + return; + + ConnectionData *c = createConnection(); + + if (c == 0) + return; + + QTreeWidgetItem *item = addItem(parent, c); + if (!item) + connections.remove(c->Uuid); +} + +void MainWindow::setupItem(QTreeWidgetItem *item, ConnectionData *c) +{ + item->setFlags(item->flags() | Qt::ItemIsEditable); + item->setData(0, Qt::UserRole, c->Uuid); + item->setIcon(0, QIcon(":/Icons/computer.png")); + + ui->connList->clearSelection(); + item->setSelected(true); +} + +QTreeWidgetItem *MainWindow::addItem(QTreeWidget *v, ConnectionData *c) +{ + QTreeWidgetItem *item = new QTreeWidgetItem(v, QStringList(QString(c->Name)), ConnectionItem); + ui->connList->sortItems(0, Qt::AscendingOrder); + + setupItem(item, c); + + return item; +} + +QTreeWidgetItem *MainWindow::addItem(QTreeWidgetItem *i, ConnectionData *c) +{ + i->setExpanded(true); + QTreeWidgetItem *item = new QTreeWidgetItem(i, QStringList(QString(c->Name)), ConnectionItem); + ui->connList->sortItems(0, Qt::AscendingOrder); + + setupItem(item, c); + + return item; +} + +void MainWindow::on_actionDelete_triggered() +{ + QTreeWidgetItem *item = selectedItem(); + + if (item == 0 || item->type() != ConnectionItem) + return; + + QUuid id = item->data(0, Qt::UserRole).toUuid(); + if (QMessageBox::question(0, QString("Delete connection"), + QString("Really delete this connection?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes) != QMessageBox::Yes) + return; + + if (connections.contains(id)) + { + ConnectionData *c = connections[id]; + connections.remove(c->Uuid); + delete c; + } + delete item; + + WriteSettings(); +} + +void MainWindow::treeWidgetItemChanged(QTreeWidgetItem *item, int) +{ + QUuid uuid = item->data(0, Qt::UserRole).toUuid(); + + if (groups.contains(uuid)) + groups[uuid]->Name = item->text(0); + if (connections.contains(uuid)) + connections[uuid]->Name = item->text(0); + + WriteSettings(); +} + +void MainWindow::on_action_Preferences_triggered() +{ + PreferencesDialog dlg; + + dlg.ui->blackOnWhite->setChecked(blackOnWhite); + dlg.ui->useSystemFonts->setChecked(systemFont); + + if (dlg.exec() < 0) + return; + + blackOnWhite = dlg.ui->blackOnWhite->isChecked(); + systemFont = dlg.ui->useSystemFonts->isChecked(); + + WriteSettings(); +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..ebba006 --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,86 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include + +class ConnectionPane; +class QTreeWidget; +class QTreeWidgetItem; +class ConnectionData; +class GroupData; +class QSettings; + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); +protected: + ConnectionPane * GetCurrentTab(); + void WriteSettings(); + +private slots: + void on_action_Exit_triggered(); + + void on_action_Connect_triggered(); + + void on_action_New_triggered(); + + void on_actionDelete_group_triggered(); + + void on_action_Disconnect_triggered(); + + void on_action_Edit_triggered(); + + void on_actionDelete_triggered(); + + void on_action_Restart_triggered(); + + void on_action_Clear_text_triggered(); + + void CloseTab(int index); + void ConnContext(const QPoint &); + void ConnectionDoubleClicked(QTreeWidgetItem * item, int column = 0); + void on_actionCopy_triggered(); + + void on_actionNew_group_triggered(); + + void on_action_Preferences_triggered(); + +public: +protected: + QMap connections; + QMap groups; + ConnectionData *createConnection(); + QTreeWidgetItem *addItem(QTreeWidget *v, ConnectionData *c); + QTreeWidgetItem *addItem(QTreeWidgetItem *i, ConnectionData *c); + void setupItem(QTreeWidgetItem *item, ConnectionData *c); + GroupData *createGroup(); + QTreeWidgetItem *insertGroup(GroupData *grp); + QTreeWidgetItem *findItem(QUuid uuid); + QTreeWidgetItem *selectedItem(); + QWidget *findTab(QTabWidget *parent, QUuid uuid); + void AddNewTab(GroupData *grp, ConnectionData *conn, QHostAddress addr); + bool blackOnWhite; + bool systemFont; + +protected slots: + void addRootConnection(); + void addChildConnection(); + void treeWidgetItemChanged(QTreeWidgetItem *item, int column); +private: + QTreeWidgetItem *findOrAddGroup(QString groupName); + Ui::MainWindow *ui; +}; + +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..983c631 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,270 @@ + + + MainWindow + + + + 0 + 0 + 1107 + 885 + + + + MainWindow + + + + + + + Qt::Horizontal + + + + + 1 + 0 + + + + -1 + + + true + + + true + + + true + + + + + + + + Connections + + + + + + + QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked + + + QAbstractItemView::SelectItems + + + false + + + + 1 + + + + + + + + + + + + + + 0 + 0 + 1107 + 22 + + + + + &File + + + + + + &Connection + + + + + + + + + + + + + + + &Server + + + + + + + + &Edit + + + + + + &Tools + + + + + + + + + + + + TopToolBarArea + + + false + + + + + + + + + + + + + + + + + :/Icons/system-log-out.png:/Icons/system-log-out.png + + + &Exit + + + + + + :/Icons/network-transmit-receive.png:/Icons/network-transmit-receive.png + + + &Connect + + + + + + :/Icons/network-offline.png:/Icons/network-offline.png + + + &Disconnect + + + + + + :/Icons/document-new.png:/Icons/document-new.png + + + &New... + + + + + + :/Icons/document-properties.png:/Icons/document-properties.png + + + &Edit... + + + + + + :/Icons/edit-delete.png:/Icons/edit-delete.png + + + Delete + + + + + + :/Icons/folder.png:/Icons/folder.png + + + Add &group ... + + + + + Delete group + + + + + + :/Icons/view-refresh.png:/Icons/view-refresh.png + + + &Restart + + + + + + :/Icons/edit-clear.png:/Icons/edit-clear.png + + + &Clear text + + + + + + :/Icons/edit-copy.png:/Icons/edit-copy.png + + + Copy + + + + + + :/Icons/document-new.png:/Icons/document-new.png + + + New in group... + + + + + + :/Icons/systemPreferences.png:/Icons/systemPreferences.png + + + &Preferences + + + + + + + + + diff --git a/network-offline.png b/network-offline.png new file mode 100644 index 0000000000000000000000000000000000000000..72dd12cc1d6fa25ba4f2dcd3a0d5d2e04b10ca12 GIT binary patch literal 685 zcmV;e0#f~nP)WFU8GbZ8({Xk{QrNlj1+3MgYKATls8GayP~Yjt8ECu(VJ zZDC_4AX9W@X>Mh5Co}I@0005-Nklj9mLI{6gpJs63Q8xgw%^9+E%5Pw?pra+(&Yr z&vN(P`@X;Dd7t~;2|7gnb#4!s;_k7Uotw`9gnbrHJ$*7xDmCa!)U`hq`hy|Rsc!O>_GfYFi1AVC5`7*`|`!O6*~Yo9Mz*L46CB?RI>&cp(IKdXA~ z^947XO#njSknu!P`Ptz2pBpZJU0VsHl)=DeC?SQa)}V6U04a=Q5uw?>_JbVD%B8Ga=16ET++g1csiceqat~t+E1Xb!_WFU8GbZ8({Xk{QrNlj1+3MgYKATls8GayP~Yjt8ECu(VJ zZDC_4AX9W@X>Mh5Co}I@0007ENkl3G7{Gsby_QCZrp2(ZNX`x{1~BQM zgP0g2lQDI76e5W+aU^%SN}>~k8X?3PS_O!Z>gu zF!JCKcP5wd`Pwfnmn(djz3Z5B1$TKp_M;^L7+d+yh+&i+9O{Z9!H%~VE*;ChH2kz8J9Yx@8U!Aj-@3~H^w zZc4p+{*=)HAiKr@aK`6ny>=PwLlLO8If_n|Vr`?)WQFlx$olaA&R?Ukf%gn!?jRH?>aHmQY3g#IH0s(t{u~@VP0&3D} zl#0JyaBZ{${P}CnOklyY%Afu=>hfEPHD0DO{2xm&_>F@7%+@e-W1p+~2StgbGL@?M( zUtb@&Tn^xhqj}kE768BBPd=Y_l-EkBy}bgft7bp8x3eUZNe&PHVi?9p2lyoVG=`={ zF9M}-IDB<<^xAYLleti-R8qRGKd7$}fb$JWdV#Zmr=iP7RsetupUi(this); + + connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(OnOK())); + connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(OnCancel())); +} + +PreferencesDialog::~PreferencesDialog() +{ + delete ui; +} + +void PreferencesDialog::on_blackOnWhite_toggled(bool) +{ + emit changed(); +} + +void PreferencesDialog::on_useSystemFonts_toggled(bool) +{ + emit changed(); +} + +void PreferencesDialog::OnOK() +{ + done(0); +} + +void PreferencesDialog::OnCancel() +{ + done(-1); +} diff --git a/preferencesdialog.h b/preferencesdialog.h new file mode 100644 index 0000000..2323b56 --- /dev/null +++ b/preferencesdialog.h @@ -0,0 +1,33 @@ +#ifndef PREFERENCESDIALOG_H +#define PREFERENCESDIALOG_H + +#include + +namespace Ui { +class PreferencesDialog; +} + +class PreferencesDialog : public QDialog +{ + Q_OBJECT + +public: + explicit PreferencesDialog(QWidget *parent = 0); + ~PreferencesDialog(); + +private slots: + void on_blackOnWhite_toggled(bool checked); + + void on_useSystemFonts_toggled(bool checked); + +public: + Ui::PreferencesDialog *ui; + +signals: + void changed(); +protected slots: + void OnOK(); + void OnCancel(); +}; + +#endif // PREFERENCESDIALOG_H diff --git a/preferencesdialog.ui b/preferencesdialog.ui new file mode 100644 index 0000000..4153a23 --- /dev/null +++ b/preferencesdialog.ui @@ -0,0 +1,110 @@ + + + PreferencesDialog + + + + 0 + 0 + 380 + 245 + + + + Dialog + + + + + + + + Terminal + + + + -1 + + + + + Black on white + + + + + + + + + + Use system font + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + PreferencesDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + PreferencesDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/system-log-out.png b/system-log-out.png new file mode 100644 index 0000000000000000000000000000000000000000..28ac66f09548e2880e9f6688e7fe4a3245a539d0 GIT binary patch literal 1084 zcmV-C1jGA@P)MCrl+R4 za^)kWYznT|Ykc+1*PjAQfN3f31p|1Vht`@f42hzMIF3n@1OTlyLqkI-rBF%%kWOb9 z86E~m1KWL50pR;ST5F;xB1sb3xi`k(c^;We1|cLuG!+X0T6;Z=zF@62zVG)yg%C(7 z(OToRa@%dKw1|FS*&XCK4xZ=X`#!$!<9S}kwbqEf2>2nJedBu}ZuM0xrR=y;3deDn zn3y1rV~WKhuIu)N{yaT>@$l5t_2AJX^_>tOw;o3w#qDEv`{w2*zV9*& zbL(5O`TXK*SFd_XsYohSmX1>vQ0z(kUa+;6LZQH^Q>QS-bmGDw;LiL!Si%<%i zBn-^XBBW%WVj)E511C<6inv+@`gBbj9EM@1#H5rI z3I(K;jE#+vdu5#2d-wS1>>28toApu0@qb%eGxp!U_*)(X?yhIYaVV8a>;yYhDrMq0 zMhzaKv3QMgt+w)bW20svxn!-|@)!4k+i;~6T5F2MBJ20p(Viy%Ql4BcM-)XEW2l-2 z=eM^%sg=uL3V7Vj=sQ5P)&xPo`uaUy9v|cK<@Y&uY^*u`qL45OiQ|}HcNd^>F^WD1 zKI;p%)}oZcTFZk6_c=5;z=sQ$$>nmmu1g$;)anreuojXeCI|w61_y1BIF6B0^8Byo z2rO^CJx40#`ai+JPQV|3{?5d!&Eq00jYge@X*7Wys^~D1#8Ro0 zp}9T!gGY{zEZ_d|_F{MEiGyZjSL(FZ%j{W6ZTko3rFxN?8Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jB}6 z0R=I_hvo_Z00g&5L_t(I%Y~I)j8u0S#(&TM%*;|sHn!}tu*EhN1))h((XeV1O=xOJ zO=GVN(Hj#JP1A%KWCjzlb7oCrJG0$cLafFMz0k;wrXe-4wE_EKS!{?DODl$txB?|E zC%=vh{n3>I@7~iXtbKd9qKl#7U`yA1$Mr(?CwM^V>OOor=a{m)?v;70$BR~ZF zGOksAxCke}^=g^M#2)H9w*ycB7;jGEK1r=&7FFDA-(~x;g%{F&zyfi-T3+baB3z-- zn!??NKG7sF6W1zx073}2=Xnm0*^UIa^}*wldy9FRP5^JmwaSk>omAr!ZKv6yLk_++ z&8yRge_?xDSD2oX^n&f(wjY#a0NaxEBS}B8-LSp2*Z6KXebZ>Rzhrn0AkR%FNmz5wD4RFk@1Z+Cpghl+IX}zq zrjPpa)j186itf$q8Vc*<>h=q9t3_O`{s-~Ip8K5V$8B??ldyTy{cQdG7`g3p7cQz) zEUr$~GN$28P<%5g4RDbH3Vu+$m;H5S@frrvGV{~LW-}uTS zT)r~LuU>e??_Hh~g0=Uq=Fu;F*4O6#sb_z-pES!*2n1=$_KTqNajpDTPzby8JpaAT zZ*4y$$w``e>|+}Ug^2wxz3z8sudr%#l~)W8`;W&@a&Y=6%SVP-x8`oAS!Mxwo|kR^ z2K=YEIkhDq4foXNk}M(T)~ew{sv2z3{Z#y@4r7!)U_G&H*T=(_U?|%&v%e;7w*to zd2Fiy?31*C?nbS*y)=pWz%Q!W2o+w1J zjiigf3~=7|8#lY6HTAgdy?LG^iLZb8VOFmm@$q*~bL`Kj7$}wa~Xl0B$gCLR}8UgWI1V?arVM2 z7cX6PBkd1ErD8EeQN)GWOFnY!1aH1`k}KE# z;ek?-D2hTakcJ#Mx)b+h6bLN9ZW^ok_gRu3=>ye6Pfh%`_tQYsc*h$2Z!fP<1U z+frA_3EQU@6xXX2zT29lUM){c`n05u(3udz$KzUMa|mIZZ47zOj+vy7#YWYl~ z+y6Z9A*9bVcI}vpn{CCl3jbB#d9u0iy!-pD?jPmp$z^e~oz$C?j+<@A&GyUOqWZah tOS}EAid*eJP)4X3P0s~1z zK~y-)?UcW36hRcnzi(#tc4bZQNA{vg&L+a4XrqONR${NH_(zBYEv!TYArdbTY(gLy zg4l|&5VaHpwFqcxArQhHEPBz~`?Whib}V9|m&r^aBKsu|PfGxE>lxoI+?mg2`;VPFd;XVINGZYW3-ox8;bewE;xx4SpdCzy zNSia*sc)}mY+;XIyl@GXN(IGYv9)At+u(h>KVpZdf;+w7JP&RgB2~K_#+n`)+_qSu zltLJW5JGhJ_1h!H^dV6L$hh+`u>|20lq^?0*S;ZtDQzJT5jf{tYFw<2px#^oVF4NE z9fzD261=L^<{(WD!QKFI z{POAA7yfPVW{m^@XG7e!fj7>Yn7B7SDW$yJEtrVbhRnLIJ4IuKQ9E+w8qzd{wH8qn z{n2=Po(H8AIOmv|onEyC-qkXSsV%IU)#@&G2g+n5AOf{eSGuQ zjlo*2$~of$0Qy158f}<1TG$lCIn&ytb zm1#^AXBfx-?>jR)yR%CSkD4Z}F=^Tmf|{770@hEqO%szQ{n9is zHEGgX6eKmafTT2OwXsKHJW8z!1VLK`LOl=`0dax7=XjrfU?CiS@JlE8XOfv`e)F4W zo|%^s5&n;jKTAy&;^&>EBHBBo`5EO|sKj&=J z5_Cb3Xb}|nqocOcn7QVqeWz0dr@u@KTRZD39?SzX23GoBb3MSyUw(0^ZDmff>~gB$ zoI%$O1VRQLJess_^m+m#;{k~=9QJeN3zwvG=)Bz$Vg)gg)ls`=U>nzH zUSF+63=0$fFk&_?ZmD@ zc?Mck^<7DVOM82J@iOh}mUc1b4RX!_VG$97nd)|hN(wTZg)gK^L_o+OY+avgFUrrb z_dk3R^J-BR>*^ggbs>p)FV8M3)z7(9XZ@K@nhF@qVOPSI5Z_;`t>7V!6wio%`?=P> zA3pu2HQ3fOOioq8(0B+>0w&hyr!z(7uq*-D9-a>d!)pV>lgu3#<6WMedPCPuFCab# zfSWZH-uC*6wktK|<%Vu;{QXK_`-vYrg7FTH%p?t$ZjC~bI4mJpWT7z$sG36^%FIZv zjn(W8V7$*Fn|I;FwAEE~>4te|Dxga-4h2KwAqW6=g~PIlDMA(iFxz8Gh+v}2@nwv| z{_|(`Ig88U z%-%Ny0HAWkqWLbWYDiTyjEIJ7LTO$Sn$F*e42=4Y zwjJNqu+UBx&J;-%$5e;!r^&ELn(+IpY_e?4oS!pp)0T!Qkdf#F1JK<+Mx3!##qTsP zUG&@%p0g~mVbT}eef!?vhrU2Kn{nKoz45Fth%o?ba^f&J9>kEBT0b&DOv1B6Yh(lH4dhQNwwkZ<1V>QD&5vpGVo|a|^hIHgFiABV;(0R{` zR|+$w;{0^28<*3^uZbcVE|zw(r3W-b^98;e$VZ)-gBS*1HciDJ$>!YH7P5%l`C5O zT5zU1RmBKKOo<2(5#OJqeXYj^t~PZ82t^YlqTmdet=@g?&6^GTF9WaxQ0GL6Mv|Ov zB_X3AA?O|U21fh50QBfwN1{+4fCv%MqNRy3Ce4A(LT%lQu} WX