From ae436122cf93573b96b54a3f88782917327574eb Mon Sep 17 00:00:00 2001 From: Daniel Savi Date: Tue, 17 Dec 2013 19:14:55 +0100 Subject: [PATCH] Save app settings to file Copy serial input to clipboard --- RS232Visualizer.pro | 3 ++- appsettings.h | 33 ++++++++++++++++++++++++++++ qml/SerialDataTerminal.qml | 17 ++++++++++++++- qml/SerialPortSettingsDialog.qml | 30 +++++++++++++++++--------- qml/main.qml | 37 +++++++++++++++++++++++++++----- rs232visualizermain.cpp | 24 ++++++++++++++++----- rs232visualizermain.h | 6 ++++-- serialconnect.cpp | 1 - 8 files changed, 126 insertions(+), 25 deletions(-) create mode 100644 appsettings.h diff --git a/RS232Visualizer.pro b/RS232Visualizer.pro index e99915c..1fe393f 100644 --- a/RS232Visualizer.pro +++ b/RS232Visualizer.pro @@ -24,7 +24,8 @@ UI_DIR = ./.ui RCC_DIR = ./.rcc HEADERS += rs232visualizermain.h \ - serialconnect.h + serialconnect.h \ + appsettings.h ICON += bitmaps/logo.png diff --git a/appsettings.h b/appsettings.h new file mode 100644 index 0000000..bae5b64 --- /dev/null +++ b/appsettings.h @@ -0,0 +1,33 @@ +#ifndef APPSETTINGS_H +#define APPSETTINGS_H +#include +#include +#include +#include +#include +#include + +class AppSettings : public QSettings +{ + Q_OBJECT + +public: + explicit AppSettings(QObject *parent = 0) : QSettings(QSettings::UserScope, QCoreApplication::instance()->organizationName(), QCoreApplication::instance()->applicationName(), parent) {} + Q_INVOKABLE inline void setValue(const QString &key, const QVariant &value) { QSettings::setValue(key, value); } + Q_INVOKABLE inline QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const { return QSettings::value(key, defaultValue); } + +signals: + void settingsChanged(); + + +private: + + + Q_DISABLE_COPY(AppSettings); + + +}; + +Q_DECLARE_METATYPE(AppSettings*) + +#endif // APPSETTINGS_H diff --git a/qml/SerialDataTerminal.qml b/qml/SerialDataTerminal.qml index 235d7bd..2a5e507 100644 --- a/qml/SerialDataTerminal.qml +++ b/qml/SerialDataTerminal.qml @@ -23,6 +23,10 @@ Rectangle { guiSendSerialData(text) } + function copy() { + serialDataCommunication.copy() + } + gradient: Gradient { GradientStop { position: 0.00; @@ -35,6 +39,10 @@ Rectangle { } border.color: "#b4bbbe" anchors.fill: parent + + + + Text { anchors.left: parent.left anchors.leftMargin: 5 @@ -96,6 +104,13 @@ Rectangle { anchors.bottom: parent.bottom anchors.bottomMargin: 5 text: qsTr("send carriage return when pressing enter") - onCheckedStateChanged: { sendCarriageReturn = checked } + + checkedState: staticSettings.value("SerialDataTerminal/sendCarriageReturnCheck", Qt.Checked ) + onCheckedStateChanged: { + sendCarriageReturn = checked + staticSettings.setValue("SerialDataTerminal/sendCarriageReturnCheck",checkedState) + } + } + } diff --git a/qml/SerialPortSettingsDialog.qml b/qml/SerialPortSettingsDialog.qml index 2fc75a4..8974c15 100644 --- a/qml/SerialPortSettingsDialog.qml +++ b/qml/SerialPortSettingsDialog.qml @@ -7,10 +7,20 @@ Rectangle { property bool includeSystemPorts: false property string newPortChoice + property int serialBaud onNewPortChoiceChanged: portChoices.append({ "text": newPortChoice }) + function saveSettings() { + staticSettings.setValue("serialPortSettings/BaudChoice", baudCombo.currentIndex) + staticSettings.setValue("serialPortSettings/DataBitsChoice", bitCombo.currentIndex) + staticSettings.setValue("serialPortSettings/ParityChoice", parityCombo.currentIndex) + staticSettings.setValue("serialPortSettings/StopBitsChoice",stopbitsCombo.currentIndex) + staticSettings.setValue("serialPortSettings/FlowControlChoice",flowcontrolCombo.currentIndex) + + } + function sendSerialOpen() { guiSetSerialSettingsPort(portCombo.currentText) guiOpenSerial() @@ -21,10 +31,6 @@ Rectangle { guiSetSerialSettingsFlowcontrol(flowcontrolChoices.get(flowcontrolCombo.currentIndex).value) } - Component.onCompleted: { -//??crash appSettings.setValue("serialPort/BAUD", 9600) - } - ListModel { id: baudChoices @@ -135,7 +141,7 @@ ListModel { ComboBox { id: baudCombo; model: baudChoices; - currentIndex: 2 + currentIndex: staticSettings.value("serialPortSettings/BaudChoice",2) } } RowLayout { @@ -148,7 +154,7 @@ ListModel { ComboBox { id: bitCombo; model: bitChoices; - currentIndex: 1 + currentIndex: staticSettings.value("serialPortSettings/DataBitsChoice",1) } } RowLayout { @@ -161,7 +167,7 @@ ListModel { ComboBox { id: parityCombo; model: parityChoices; - currentIndex: 0 + currentIndex: staticSettings.value("serialPortSettings/ParityChoice",0) } } RowLayout { @@ -174,7 +180,7 @@ ListModel { ComboBox { id: stopbitsCombo; model: stopbitsChoices; - currentIndex: 1 + currentIndex: staticSettings.value("serialPortSettings/StopBitsChoice",1) } } RowLayout { @@ -187,7 +193,7 @@ ListModel { ComboBox { id: flowcontrolCombo; model: flowcontrolChoices; - currentIndex: 0 + currentIndex: staticSettings.value("serialPortSettings/FlowControlChoice",0) } } RowLayout{ @@ -200,13 +206,17 @@ ListModel { Button { id: serialSettingsSet text: qsTr("Set") - onClicked: sendSerialOpen() + onClicked: { + sendSerialOpen() + saveSettings() + } } Button { id: serialSettingsOK text: qsTr("OK") onClicked: { sendSerialOpen() + saveSettings() serialSettingsView.state = "invisible" } } diff --git a/qml/main.qml b/qml/main.qml index 2de367d..1e9e9ee 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -53,6 +53,7 @@ ApplicationWindow { property int getSystemPorts: 0 + // signals to C++ signal guiOpenSerial() signal guiCloseSerial() @@ -70,12 +71,31 @@ ApplicationWindow { // UI internal bindings Component.onCompleted: { + loadSettings() mainwin.guiSendSerialData.connect(serialDataView.deleteTextInputField) } -/* function newSerialDataSlot() { - serialDataView.appendNewSerialData(serialPortC.newSerialData) - } */ + onClosing: { + saveSettings() + } + + function loadSettings() { + mainwin.setX(staticSettings.value("MainWindow/x") ) + mainwin.setY(staticSettings.value("MainWindow/y") ) + mainwin.setWidth(staticSettings.value("MainWindow/width") ) + mainwin.setHeight(staticSettings.value("MainWindow/height") ) + + } + + function saveSettings() { + staticSettings.setValue("MainWindow/x", mainwin.x ) + staticSettings.setValue("MainWindow/y", mainwin.y ) + staticSettings.setValue("MainWindow/width", mainwin.width) + staticSettings.setValue("MainWindow/height", mainwin.height) + + } + + function sendSerialClose() { guiCloseSerial() @@ -100,6 +120,12 @@ ApplicationWindow { serialDataView.appendNewSerialData(serialPortC.newSerialData) } + function copy() { + if (serialDataView.visible ) { + serialDataView.copy() //copies text to clipboard + } + } + menuBar: MenuBar { Menu { title: qsTr("File") @@ -124,11 +150,12 @@ ApplicationWindow { MenuItem { text: qsTr("Copy") shortcut: "Ctrl+C" + onTriggered: copy() } - MenuItem { + /* MenuItem { text: qsTr("Paste") shortcut: "Ctrl+V" - } + } */ } Menu { title: qsTr("Serial Port") diff --git a/rs232visualizermain.cpp b/rs232visualizermain.cpp index 167cbc5..a58a681 100644 --- a/rs232visualizermain.cpp +++ b/rs232visualizermain.cpp @@ -4,6 +4,7 @@ #include #include #include "rs232visualizermain.h" +#include "appsettings.h" /*********************************************************** @@ -15,11 +16,11 @@ RS232VisualizerMain::RS232VisualizerMain(QObject *parent) : QObject(parent) { + initializeSettings(); startSerialPort(); startGUI(); connectionsGUIserial(); - initializeSettings(); - //connect serialDataChanged to this and engine->rootContext()->setContextProperty("serialPortC",serialPort); again to update properties + connectionsCore(); } @@ -33,7 +34,10 @@ void RS232VisualizerMain::initializeSettings() { QCoreApplication::setOrganizationDomain("gaess.ch"); QCoreApplication::setApplicationName("visualize232"); - appSettings = new QSettings; + staticSettings = new AppSettings(); + // staticSettings->setValue("serialPort/test", "value"); + + } int RS232VisualizerMain::startGUI() { @@ -41,7 +45,7 @@ int RS232VisualizerMain::startGUI() { //export context properties to qml engine->rootContext()->setContextProperty("serialPortC",serialPort); - engine->rootContext()->setContextProperty("appSettings",appSettings); + engine->rootContext()->setContextProperty("staticSettings",staticSettings); component = new QQmlComponent(engine); component->loadUrl(QUrl("qrc:/qml/main.qml")); @@ -49,16 +53,19 @@ int RS232VisualizerMain::startGUI() { qWarning("%s", qPrintable(component->errorString())); return 1; } + topLevel = component->create(); window = qobject_cast(topLevel); if ( !window ) { qWarning("Error: Your root item has to be a Window."); return 1; } + + + window->show(); window->setIcon(QIcon(":/bitmaps/RS232VisIcon.png")); - QObject::connect(engine, SIGNAL(quit()),QCoreApplication::instance(), SLOT(quit())); return 0; } @@ -86,13 +93,20 @@ void RS232VisualizerMain::connectionsGUIserial() { } +void RS232VisualizerMain::connectionsCore() { + connect(engine, SIGNAL(quit()),QCoreApplication::instance(), SLOT(quit())); +// connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit()) ); +} + /*********************************************************** * * public slots * ***********************************************************/ +/*void RS232VisualizerMain::aboutToQuit() { +} */ /*********************************************************** * diff --git a/rs232visualizermain.h b/rs232visualizermain.h index 467fe05..99ed631 100644 --- a/rs232visualizermain.h +++ b/rs232visualizermain.h @@ -6,8 +6,8 @@ #include #include #include -#include #include "serialconnect.h" +#include "appsettings.h" class RS232VisualizerMain : public QObject { @@ -29,14 +29,16 @@ class RS232VisualizerMain : public QObject void serialObjectChanged(); public slots: + // void aboutToQuit(); private: SerialConnect* serialPort; - QSettings* appSettings; + AppSettings* staticSettings; int startGUI(); void startSerialPort(); void connectionsGUIserial(); + void connectionsCore(); void initializeSettings(); private slots: diff --git a/serialconnect.cpp b/serialconnect.cpp index 0de5ccb..c4335f1 100644 --- a/serialconnect.cpp +++ b/serialconnect.cpp @@ -241,7 +241,6 @@ void SerialConnect::findAvailablePorts(bool withSystemPorts) { foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { if(!withSystemPorts) { - qDebug() << "SerialConnect::findAvailablePorts(): omitting system port"; if(!info.portName().contains("ttyS")) { availablePortsList.append(info.portName()); //sendAvailablePort((QVariant) info.portName());