Update to 5.14

This commit is contained in:
Ian Gebbie 2020-11-01 17:49:00 +02:00
parent 5bfd57be11
commit 0ede818ad6
36 changed files with 9945 additions and 160 deletions

73
.gitignore vendored Normal file
View file

@ -0,0 +1,73 @@
# This file is used to ignore files which are generated
# ----------------------------------------------------------------------------
*~
*.autosave
*.a
*.core
*.moc
*.o
*.obj
*.orig
*.rej
*.so
*.so.*
*_pch.h.cpp
*_resource.rc
*.qm
.#*
*.*#
core
!core/
tags
.DS_Store
.directory
*.debug
Makefile*
*.prl
*.app
moc_*.cpp
ui_*.h
qrc_*.cpp
Thumbs.db
*.res
*.rc
/.qmake.cache
/.qmake.stash
# qtcreator generated files
*.pro.user*
# xemacs temporary files
*.flc
# Vim temporary files
.*.swp
# Visual Studio generated files
*.ib_pdb_index
*.idb
*.ilk
*.pdb
*.sln
*.suo
*.vcproj
*vcproj.*.*.user
*.ncb
*.sdf
*.opensdf
*.vcxproj
*vcxproj.*
# MinGW generated files
*.Debug
*.Release
# Python byte code
*.pyc
# Binaries
# --------
*.dll
*.exe

View file

@ -1,173 +1,31 @@
#-------------------------------------------------
#
# Project created by QtCreator 2019-01-21T20:42:03
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtHPConnect
TEMPLATE = app
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
VERSION_MAJOR = HP_MAJOR_VERSION
VERSION_MINOR = HP_MINOR_VERSION
VERSION_PATCH = HP_MINOR_PATCH
VERSION_BUILD = HP_MINOR_BUILD
DEFINES += "VERSION_MAJOR=$$VERSION_MAJOR"\
"VERSION_MINOR=$$VERSION_MINOR"\
"VERSION_PATCH=$$VERSION_PATCH"\
"VERSION_BUILD=$$VERSION_BUILD"
#Target version
VERSION = $${VERSION_MAJOR}.$${VERSION_MINOR}.$${VERSION_PATCH}$${VERSION_BUILD}
#QMAKE_CFLAGS += -Wno-unused-parameter -Werror=shadow -Werror=write-strings -Werror=redundant-decls -Werror=format -Werror=format-nonliteral -Werror=date-time -Werror=missing-prototypes -Werror=pointer-arith -Wunreachable-code -Werror=format-security -Werror=declaration-after-statement -Werror=implicit-function-declaration -Werror=return-type -D_FORTIFY_SOURCE=2 -D__LINUX__ -fvisibility=hidden
#QMAKE_CXXFLAGS += -include cctype -include cstdlib
#QMAKE_CXXFLAGS += -Wno-unused-parameter -Werror=shadow -Werror=write-strings -Werror=redundant-decls -Werror=format -Werror=format-nonliteral -Werror=date-time -Werror=missing-prototypes -Werror=pointer-arith -Wunreachable-code -Werror=format-security -Werror=declaration-after-statement -Werror=implicit-function-declaration -Werror=return-type -D_FORTIFY_SOURCE=2 -D__LINUX__ -fvisibility=hidden
# You can also make your code fail to compile if you use deprecated APIs.
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
abstractdata.cpp \
cntfilesystemmodel.cpp \
datamodel.cpp \
errorhandler.cpp \
eventthread.cpp \
eventtimer.cpp \
getnumber.cpp \
hp_infodialog.cpp \
hp_mdilogwindow.cpp \
hp_mditexteditor.cpp \
hp_mdivariableedit.cpp \
hp_mdiwindow.cpp \
hp_settingsdlg.cpp \
hpdata.cpp \
# hptoolbox.cpp \
hptreeitem.cpp \
hpusb.cpp \
main.cpp \
mainwindow.cpp \
matrixdata.cpp \
options.cpp \
texteditor.cpp \
treemodel.cpp \
variableview.cpp \
vartablemodel.cpp \
libhpcalcs/src/calc_none.c \
libhpcalcs/src/calc_prime.c \
libhpcalcs/src/error.c \
libhpcalcs/src/filetypes.c \
libhpcalcs/src/hpcables.c \
libhpcalcs/src/hpcalcs.c \
libhpcalcs/src/hpfiles.c \
libhpcalcs/src/hpopers.c \
libhpcalcs/src/link_nul.c \
libhpcalcs/src/link_prime_hid.c \
libhpcalcs/src/logging.c \
libhpcalcs/src/prime_cmd.c \
libhpcalcs/src/prime_rpkt.c \
libhpcalcs/src/prime_vpkt.c \
libhpcalcs/src/type2str.c \
libhpcalcs/src/typesprime.c \
libhpcalcs/src/utils.c
mainwindow.cpp
HEADERS += \
hidapi/hidapi.h \
include/abstractdata.h \
include/cntfilesystemmodel.h \
include/datamodel.h \
include/errorhandler.h \
include/eventthread.h \
include/eventtimer.h \
include/getnumber.h \
include/global.h \
include/hp_infodialog.h \
include/hp_mdilogwindow.h \
include/hp_mditexteditor.h \
include/hp_mdivariableedit.h \
include/hp_mdiwindow.h \
include/hp_settingsdlg.h \
include/hp_typedef.h \
include/hpdata.h \
include/hpinterface.h \
include/hptreeitem.h \
include/hpusb.h \
include/main.h \
include/mainwindow.h \
include/matrixdata.h \
include/options.h \
include/texteditor.h \
include/treemodel.h \
include/variableview.h \
include/vartablemodel.h \
include/version.h \
libhpcalcs/include/error.h \
libhpcalcs/include/export.h \
libhpcalcs/include/filetypes.h \
libhpcalcs/include/gettext.h \
libhpcalcs/include/hpcables.h \
libhpcalcs/include/hpcalcs.h \
libhpcalcs/include/hpfiles.h \
libhpcalcs/include/hplibs.h \
libhpcalcs/include/hpopers.h \
libhpcalcs/include/internal.h \
libhpcalcs/include/logging.h \
libhpcalcs/include/prime_cmd.h \
libhpcalcs/include/typesprime.h \
libhpcalcs/include/utils.h
mainwindow.h
FORMS += \
mainwindow.ui \
variableview.ui \
hp_mdiwindow.ui \
getnumber.ui \
hp_infodialog.ui \
hp_settingsdlg.ui \
options.ui
mainwindow.ui
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../../usr/local/lib/release/ -lhpcalcs
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../../usr/local/lib/debug/ -lhpcalcs
else:unix: LIBS +=
#-L$$PWD/../../../../usr/local/lib/ -lhpcalcs
INCLUDEPATH += $$PWD/../../../../usr/local/include
INCLUDEPATH += $$PWD/include
INCLUDEPATH += $$PWD/libhpcalcs/include/
INCLUDEPATH += $$PWD/hidapi/
INCLUDEPATH += /usr/include/libusb-1.0
DEPENDPATH += $$PWD/../../../../usr/local/include
RESOURCES += \
qthpconnect.qrc
DISTFILES += \
model.qmodel \
README.md \
LICENSE \
CHANGELOG.md \
NEWS \
AUTHORS \
Notes \
TODO.md
../hplp-master/libhpcalcs/tests/test_hpcalcs.c
unix|win32: LIBS += -lhidapi-libusb
unix|win32: LIBS += -lusb-1.0
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

View file

@ -1,8 +0,0 @@
gsdfgdsfgdsfg
dfg
dsf
gs
dfg
sdf
gsdfgsdf

21
mainwindow.h Normal file
View file

@ -0,0 +1,21 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets/QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

1180
source/abstractdata.cpp Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,577 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <global.h>
#include "cntfilesystemmodel.h"
#include <QMimeData>
#include <QList>
#include <QStringListModel>
#include <hp_mditexteditor.h>
#include <hp_infodialog.h>
#include <hp_mdivariableedit.h>
#include <QSettings>
#include <QTextCodec>
#include <utility>
#define FILE_NUM 9
//list of file types and associated icons
//Todo fix for all file types
const QString contentFileSystemModel::filetype_list[FILE_NUM][2]={{"hpprgm",":/icons/apps_16x16.png"},
{"CAS Vars",":/icons/casFolder_16x16.png"},
{"Complex",":/icons/complex_16x16.png"},
{"hplist",":/icons/list_16x16.png"},
{"Matrices",":/icons/table_16x16.png"},
{"Notes",":/icons/note_16x16.png"},
{"hpprgm",":/icons/program_16x16.png"},
{"Real",":/icons/real_16x16.png"},
{"Variables",":/icons/varFolder_16x16.png"}
};
//list of data object types used by contentFileSystemModel
const hp_DataType contentFileSystemModel::func_type[FILE_TYPE]={
HP_PROG,
HP_LIST,
HP_MATRIX,
HP_NOTE,
HP_MAIN};
/*
const std::array<std::pair<hp_DataType,QString>,FILE_TYPE> contentFileSystemModel::file_type{ {0,"hpprgm"},
{1,"hplist"},
{2,"hpmat"},
{3,"hpnote"},
{4,""}};
*/
//list of file type suffixes
const QString contentFileSystemModel::file_type[FILE_TYPE]{ "hpprgm",
"hplist",
"hpmat",
"hpnote",
""};
//condstrutor
contentFileSystemModel::contentFileSystemModel(QObject * parent)
:QFileSystemModel(parent)
{
}
//Get and pass on the data to be dragged
QMimeData* contentFileSystemModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeDataPtr = new QMimeData();
QByteArray mydata;
QModelIndex index;
hp_DataStruct filedata;
qDebug()<<"contentFileSystemModel::mimeData";
foreach(index,indexes) {
index=indexes.first();
// qDebug()<<index.data(Qt::DisplayRole);
// QString data;
QFileInfo info = contentFileSystemModel::fileInfo(index);
QFile file(info.absoluteFilePath());
qDebug()<<info.absoluteFilePath();
if (file.open(QIODevice::ReadOnly)) {
QDataStream in(&file);
filedata=getFileType(info);
in.setByteOrder(QDataStream::LittleEndian);
qint8 c;
//read in file
in.startTransaction();
while(!in.atEnd()) {
in>>c;
mydata.append(c);
}
mimeDataPtr->setText(info.baseName());
switch (filedata.type) {
case HP_PROG:
case HP_APP:
case HP_MATRIX:
case HP_NOTE:
case HP_LIST:
case HP_VAR: {
mimeDataPtr->setData(mimetypes[filedata.type][1],mydata);
break;
}
case HP_CAS:
case HP_MAIN:
case HP_COMPLEX:
case HP_SCREEN:
case HP_REAL: {
// no action
}
}
}
file.close();
}
//Allow copy to external file managers
QList<QUrl> urls;
QFileInfo info;
QUrl url;
foreach(index,indexes) {
info = contentFileSystemModel::fileInfo(index);
url = QUrl::fromLocalFile(info.absoluteFilePath());
urls.append(url);
}
mimeDataPtr->setUrls(urls);
return mimeDataPtr;
}
//Set drop actions supported
Qt::DropActions contentFileSystemModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction| Qt::TargetMoveAction;
}
//Not sure that this is neccesary. Item should control this
Qt::ItemFlags contentFileSystemModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QFileSystemModel::flags(index);
if (index.isValid())
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
else
return Qt::ItemIsDropEnabled | defaultFlags;
}
//Allow drop in location
bool contentFileSystemModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
{
qDebug()<<data->formats();
if (data->hasUrls()) {
return true;
}
if (data->hasText()) {
return true;
}
return false;
}
//Process the drop action
bool contentFileSystemModel::dropMimeData(const QMimeData* md_data, Qt::DropAction action, int row,
int column, const QModelIndex &parent)
{
qDebug()<<"contentFileSystemModel::DropMineData";
QSettings appSettings("IRGP","QtHPconnect");
QString path=appSettings.value("contentPath").toString();
QDir dir;
dir= rootDirectory();
if (!dir.exists()) {
qWarning()<<tr("Content Path Does not exist: ")<<path;
if(!dir.mkpath("."))
{
qWarning()<<tr("Path could not be created: ")<<path;
return false;
}
}
if (action == Qt::IgnoreAction) {
return true;
}
//Check for external file drop
if (md_data->hasUrls()) {
QString name = md_data->text();
QList<QUrl> urls = md_data->urls();
QUrl url;
QString filefrom;
QString fileto;
foreach(url,urls) {
filefrom=url.toLocalFile();
QFileInfo fileinfo(filefrom);
fileto=path+"/"+url.fileName();
if(isFileType(fileinfo)) {
//consider check to limit unusual file types
QFile::copy(filefrom,fileto);
}
}
return true;
}
//rework
QByteArray data_in;
QByteArray typeary;
QString name = md_data->text();
typeary=md_data->data("application/x-type");
int type_i=typeary[0];
hp_DataType type=static_cast<hp_DataType>(type_i);
QString type_str=getFileType(type);
name=name+"_2"+"."+type_str;
data_in=md_data->data("application/x-qabstractmodeldatalist");
QFileInfo fileinfo(path,name);
qDebug()<<data_in;
qDebug()<<fileinfo;
// QDataStream stream(&encodedData, QIODevice::ReadOnly);
if (writeFile(fileinfo,data_in)>-1)
{
return true;
}
else
return true;
}
//override to return a file object
QVariant contentFileSystemModel::data( const QModelIndex &index, int role ) const {
if( role == Qt::DecorationRole )
{
QString name = index.data().toString();
QFileInfo info = contentFileSystemModel::fileInfo(index);
//QFileInfo info(name);
if((info.isFile()&&(name==info.fileName())))
{
int i;
for (i=0;i<FILE_NUM;i++) {
if(info.suffix() == filetype_list[i][0])
return QPixmap(filetype_list[i][1]);//I pick the icon depending on the extension
}
return QPixmap(":/icons/file_16x16.png");
}
}
return QFileSystemModel::data(index, role);
}
//action if file is left clicked
void contentFileSystemModel::clickAction(QMdiArea * mdiwin, QModelIndex &index) {
openFile(mdiwin,index);
return;
}
//open a file in the mdi window
bool contentFileSystemModel::openFile(QMdiArea * mdiwin, QModelIndex &index) {
QFileInfo info = contentFileSystemModel::fileInfo(index);
return openFile(mdiwin,info);
}
//open a file in the mdi window
bool contentFileSystemModel::openFile(QMdiArea * mdiwin,QFileInfo info) {
hp_mdiTextEdit * hptextedit = nullptr;
AbstractData * data=nullptr;
QString calc;
QString name;
hp_DataType type;
hp_Information hpinfo;
// hp_infoDialog * hpinfodlg;
hp_mdiVariableEdit * hpvaredit=nullptr;
data = readFile(info);
if (data!=nullptr) {
type=data->getType();
switch (type) {
case HP_NOTE:
case HP_PROG: {
if (hptextedit==nullptr)
hptextedit = new hp_mdiTextEdit(mdiwin,info, data);
if (hptextedit!=nullptr)
hptextedit ->show();
}
break;
case HP_CAS:
case HP_REAL:
case HP_COMPLEX:
case HP_LIST:
case HP_MATRIX: {
if (hpvaredit==nullptr) {
if (data!=nullptr) {
qDebug()<<"Opening Varedit";
hpvaredit = new hp_mdiVariableEdit(mdiwin,info,data);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
}
break;
}
}
else {
qWarning()<<"Read file return null data";
}
return false;
qDebug()<<"ClickAction "<<info.absoluteFilePath();
}
//delete a file
void contentFileSystemModel::deleteFile(QModelIndex &index) {
QFileInfo fileinfo = contentFileSystemModel::fileInfo(index);
qDebug()<<"deleteFile "<<fileinfo.absoluteFilePath();
QFile file(fileinfo.absoluteFilePath());
file.remove();
}
//rename a file
void contentFileSystemModel::renameFile(QModelIndex &index, QString newName) {
QFileInfo fileinfo = contentFileSystemModel::fileInfo(index);
QFile file(fileinfo.absoluteFilePath());
QDir dir=fileinfo.absoluteDir();
QString newPath;
newPath=dir.absolutePath()+"/"+newName;
if (file.rename(newPath)) {
qDebug()<<"File rename succesfull";
}
else {
qDebug()<<"File rename failed";
}
return;
}
//read a file and return the resulting data object
AbstractData * contentFileSystemModel::readFile(QFileInfo fileinfo) const {
AbstractData * data=nullptr;
hp_DataStruct filedata;
QFile file(fileinfo.absoluteFilePath());
if (file.open(QIODevice::ReadOnly),QFileDevice::AutoCloseHandle) {
QDataStream in(&file);
// QTextCodec *codec = QTextCodec::codecForName("UTF-16");
// in.setCodec(codec);
in.setByteOrder(QDataStream::LittleEndian);
filedata=getFileType(fileinfo);
switch (filedata.type) {
case HP_PROG: {
qDebug()<<"HP_PROG";
data = new Program(filedata.filename, HP_PROG, QStringLiteral(""));
data->parseData(in);
}
break;
case HP_NOTE: {
qDebug()<<"HP_NOTE";
data = new Notes(filedata.filename, HP_NOTE, QStringLiteral(""));
data->parseData(in);
}
break;
case HP_LIST: {
qDebug()<<"HP_LIST";
data = new List(filedata.filename, HP_LIST);
data->parseData(in);
}
break;
case HP_MATRIX: {
qDebug()<<"HP_MATRIX";
data = new Matrix(filedata.filename, HP_MATRIX);
data->parseData(in);
}
break;
default: ;
}
file.close();
}
return data;
}
//write a file to the directory store
int contentFileSystemModel::writeFile(QFileInfo fileinfo, QByteArray data_in) const {
QFile file(fileinfo.absoluteFilePath());
if (file.open(QIODevice::ReadWrite)) {
QDataStream out(&file);
// QTextCodec *codec = QTextCodec::codecForName("UTF-8");
// out.setCodec(codec);
out.setByteOrder(QDataStream::LittleEndian);
// quint8 c;
// for (int i =0 ;i< data_in.length();i++)
// {
// c= data_in[i];
// out<<(quint8)c;
// }
// out.writeRawData(data_in,data_in.length());
qDebug()<<"Wriiting";
qDebug()<<data_in;
out<<data_in;
file.close();
return 0;
}
return -1;
}
//create a new folder in the contents location
bool contentFileSystemModel::createNewFolder(QString foldername) {
QSettings appSettings("IRGP","QtHPconnect");
QString path=appSettings.value("contentPath").toString();
path=path+foldername;
QDir dir(path);
if (!dir.exists()) {
if(!dir.mkpath("."))
{
return false;
}
}
qDebug()<<"Create new folder pressed"<<path;
return true;
}
//create a new program file
bool contentFileSystemModel::createNewProgram(QMdiArea * mdiwin, QString filename) {
QSettings appSettings("IRGP","QtHPconnect");
QString path=appSettings.value("contentPath").toString();
QDir dir(path);
QFileInfo fileinfo(dir,filename+"."+getFileType(HP_PROG));
qDebug()<<"Create new program pressed";
return openFile(mdiwin,fileinfo);
}
//create a new note file
bool contentFileSystemModel::createNewNote(QMdiArea * mdiwin,QString filename) {
QSettings appSettings("IRGP","QtHPconnect");
QString path=appSettings.value("contentPath").toString();
QDir dir(path);
QFileInfo fileinfo(dir,filename+"."+getFileType(HP_NOTE));
qDebug()<<"Create new program pressed";
return openFile(mdiwin,fileinfo);
}
//return the file type
hp_DataStruct contentFileSystemModel::getFileType(QFileInfo info) const {
hp_DataStruct filedata;
int i;
QString suffix;
hp_DataType type=HP_MAIN;
suffix=info.completeSuffix();
for (i=0;i<FILE_TYPE;i++) {
if (suffix==file_type[i])
break;
}
type=func_type[i];
if (type!=HP_MAIN) {
filedata.filename=info.completeBaseName();
filedata.type=type;
}
return filedata;
}
//return the file type
bool contentFileSystemModel::isFileType(QFileInfo info) const {
hp_DataStruct filedata;
int i;
QString suffix;
suffix=info.completeSuffix();
for (i=0;i<FILE_TYPE;i++) {
if (suffix==file_type[i])
return true;
}
return false;
}
//return the file type suffix
QString contentFileSystemModel::getFileType(hp_DataType type) const {
int i;
QString suffix=QStringLiteral("");
switch (type) {
case HP_PROG: {
i=0;
break;
}
case HP_LIST: {
i=1;
break;
}
case HP_MATRIX: {
i=2;
break;
}
case HP_NOTE: {
i=3;
break;
}
default: {
i=-1;
}
}
if (i>-1) {
suffix=file_type[i];
}
return suffix;
}
//destructor
contentFileSystemModel::~contentFileSystemModel() {
qDebug()<<"contentFileSystemModel::delete";
}

91
source/datamodel.cpp Normal file
View file

@ -0,0 +1,91 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "datamodel.h"
#include <QDebug>
#include <QWidget>
dataModel::dataModel(QObject *parent)
:QAbstractTableModel(parent)
{
}
int dataModel::rowCount(const QModelIndex & /*parent*/) const
{
return 2;
}
int dataModel::columnCount(const QModelIndex & /*parent*/) const
{
return 3;
}
QVariant dataModel::data(const QModelIndex &index, int role) const
{
int row = index.row();
int col = index.column();
// // generate a log message when this method gets called
// qDebug() << QString("row %1, col%2, role %3")
// .arg(row).arg(col).arg(role);
switch(role){
case Qt::DisplayRole:
if (row == 0 && col == 1) return QString("<--left");
if (row == 1 && col == 1) return QString("right-->");
return QString("Row%1, Column%2")
.arg(row + 1)
.arg(col +1);
break;
case Qt::FontRole:
if (row == 0 && col == 0) //change font only for cell(0,0)
{
QFont boldFont;
boldFont.setBold(true);
return boldFont;
}
break;
case Qt::BackgroundRole:
if (row == 1 && col == 2) //change background only for cell(1,2)
{
QBrush redBackground(Qt::red);
return redBackground;
}
break;
case Qt::TextAlignmentRole:
if (row == 1 && col == 1) //change text alignment only for cell(1,1)
{
return Qt::AlignRight + Qt::AlignVCenter;
}
break;
case Qt::CheckStateRole:
if (row == 1 && col == 0) //add a checkbox to cell(1,0)
{
return Qt::Checked;
}
}
return QVariant();
}
dataModel::~dataModel() {
qDebug()<<"dataModel::close";
}

139
source/errorhandler.cpp Normal file
View file

@ -0,0 +1,139 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "errorhandler.h"
#include "mainwindow.h"
errorHandler::errorHandler()
{
}
errorHandler::errorHandler(QObject * parent)
{
pParent = parent;
}
QString errorHandler::getLogFileName()
{
return QString("hpinterface.log");
}
int errorHandler::writeLog(QString lineToBeLogged)
{
QMutexLocker locker(&m_lineLoggerMutex);
QFile fileLog(getLogFileName());
//doRollLogsIfNeeded(static_cast<qint64>(fileLog.size() + lineToBeLogged.length()));
// Do not open in append mode but seek() to avoid warning for unseekable
// devices, note that if open is made with WriteOnly without Append, the
// file gets truncated
if (!fileLog.open(QIODevice::ReadWrite | QIODevice::Text))
{
QTextStream out(stdout);
out << "CANNOT OPEN LOG FILE: " << getLogFileName();
return -1;
}
// seek() does nothing on sequential devices, this is in essence what QFile
// does when Append flag is set in open()
if (!fileLog.isSequential())
{
fileLog.seek(fileLog.size());
}
QDateTime time(QDateTime::currentDateTime());
QTextStream out(&fileLog);
out << time.toString("yyyy/MM/dd hh:mm:ss") << " "<< lineToBeLogged << endl;
fileLog.close();
return 0;
}
int errorHandler::writeStatus(QString msg)
{
if (MainWindow *pb = qobject_cast<MainWindow*> (pParent))
{
pb->writeStatus( msg);
}
return 0;
}
int errorHandler::writeChatter(QString msg)
{
if (MainWindow *pb = qobject_cast<MainWindow*> (pParent))
{
pb->writeChatter( msg);
}
return 0;
}
int errorHandler::error(ErrLevel el, int num, QString msg, QString Data=QString())
{
switch (el) {
case L0:
writeLog("Abort: "+msg);
writeStatus("Abort: "+msg);
exit(num);
break;
default:
writeLog(" "+msg+Data);
writeStatus(" "+msg);
if (Data=="")
writeChatter(" "+msg);
else
writeChatter(" "+msg+Data);
break;
}
return 0;
}
int errorHandler::dump(uint8_t * data, int size)
{
int i,j;
QString text = QString("Dump:\n");
QString texta = QString("ASCII:\n");
j=0;
text = text + QString().sprintf("%04d | ",0);
for (i=0; i< size; i++)
{
text = text + QString(" %1 ").arg(QChar(data[i]).unicode(),2,16,QChar('0'));
j++;
if (j>15) {
j=0;
text=text+"\n";
text = text + QString().sprintf("%04d | ",i+1);
}
texta = texta +" "+QChar(data[i]).unicode();
}
text = text + "\n";
texta = texta + "\n";
writeLog(text);
writeChatter(text);
writeLog(texta);
writeChatter(texta);
return 0;
}
errorHandler::~errorHandler() {
qDebug()<<"errorHandler:: close";
}

42
source/eventthread.cpp Normal file
View file

@ -0,0 +1,42 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "eventthread.h"
#include <mainwindow.h>
#include <QDebug>
EventThread::EventThread(MainWindow * parent):QThread (parent)
{
main=parent;
if (main)
hpapi=main->getAPI();
if (hpapi==nullptr)
qDebug()<<"hpusb not started";
}
void EventThread::run() {
qDebug()<<"Event run";
// emit startTimer();
hpapi->eventHandler();
qDebug()<<"Event end";
//exec();
}

82
source/eventtimer.cpp Normal file
View file

@ -0,0 +1,82 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "eventtimer.h"
#include "mainwindow.h"
EventTimer::EventTimer(MainWindow * main):QObject()
{
if (main)
hpapi=main->getAPI();
if (hpapi==nullptr)
qDebug()<<"hpusb not started";
}
void EventTimer::timerAction()
{
QMutexLocker locker(&mutex);
// qDebug()<<"In Eventhandler";
// QThread::msleep(1);
if(hpapi!=nullptr) {
hpapi->eventHandler();
}
emit tick();
}
void EventTimer::start() {
timer = new QTimer(this);
timer->setInterval(100);
// timer->callOnTimeout(SLOT(timerEvent()),Qt::AutoConnection);
timer->connect(timer, SIGNAL(timeout()), this, SLOT(timerAction()));
// timer->connect(timer, SIGNAL(timeout()), hpapi, SLOT(eventHandler()),Qt::DirectConnection);
// timer->connect(this, SIGNAL(tick()), this, SLOT(tickEvent()),Qt::AutoConnection);
timer->connect(this, SIGNAL(stop()), this, SLOT(stopTimer()));
timer->start();
qDebug()<<"EventTimer::started Timer";
}
void EventTimer::exit() {
emit stop();
stop();
}
void EventTimer::stopTimer() {
qDebug()<<"EventTimer::stop Timer";
timer->stop();
emit stopped();
}
void EventTimer::tickEvent() {
qDebug()<<"EventTimer::tickEvent";
}
EventTimer::~EventTimer()
{
stopTimer();
if (timer!=nullptr) {
delete timer;
timer=nullptr;
}
qDebug()<<"delete EventTimer";
}

33
source/getnumber.cpp Normal file
View file

@ -0,0 +1,33 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "getnumber.h"
#include "ui_getnumber.h"
#include <QDebug>
getNumber::getNumber(QWidget *parent) :
QDialog(parent),
ui(new Ui::getNumber)
{
ui->setupUi(this);
}
getNumber::~getNumber()
{
// qDebug()<<"Entering ~getNumber()";
delete ui;
}

91
source/getnumber.ui Normal file
View file

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>getNumber</class>
<widget class="QDialog" name="getNumber">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>427</width>
<height>118</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="geometry">
<rect>
<x>0</x>
<y>70</y>
<width>411</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QLineEdit" name="lineEdit">
<property name="geometry">
<rect>
<x>30</x>
<y>20</y>
<width>381</width>
<height>32</height>
</rect>
</property>
</widget>
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>30</x>
<y>70</y>
<width>88</width>
<height>34</height>
</rect>
</property>
<property name="text">
<string>Test</string>
</property>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>getNumber</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>getNumber</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

36
source/hp_infodialog.cpp Normal file
View file

@ -0,0 +1,36 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hp_infodialog.h"
#include "ui_hp_infodialog.h"
#include <QDebug>
hp_infoDialog::hp_infoDialog(QWidget *parent, hp_Information info) :
QDialog(parent),
ui(new Ui::hp_infoDialog)
{
ui->setupUi(this);
ui->serialnum->setText(info.serialnum);
ui->appver->setText(info.appver);
ui->oppver->setText(info.osver);
}
hp_infoDialog::~hp_infoDialog()
{
// qDebug()<<"Entering ~hp_infoDialog()";
delete ui;
}

125
source/hp_infodialog.ui Normal file
View file

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>hp_infoDialog</class>
<widget class="QDialog" name="hp_infoDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>411</width>
<height>143</height>
</rect>
</property>
<property name="windowTitle">
<string>HP Information</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="labelapp">
<property name="text">
<string>Application version:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="appver">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelopp">
<property name="text">
<string>Operational system version:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="oppver">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelser">
<property name="text">
<string>Serial number:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="serialnum">
<property name="text">
<string>-</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>hp_infoDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>hp_infoDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View file

@ -0,0 +1,50 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hp_mdilogwindow.h"
#include <QDebug>
hp_MdiLogWindow::hp_MdiLogWindow(QWidget * parent)
:hp_MdiWindow(parent)
{
setMinimumSize(200,200);
setMaximumSize(1000,1000);
setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
setup();
resize(500,400);
}
void hp_MdiLogWindow::setup() {
textEdit = new QTextEdit(this);
setWidget(textEdit);
}
QTextEdit * hp_MdiLogWindow::getEditor() {
return textEdit;
}
void hp_MdiLogWindow::show() {
textEdit->show();
hp_MdiWindow::show();
}
hp_MdiLogWindow::~hp_MdiLogWindow() {
qDebug()<<"Entering ~hpmdiLogWindow()";
}

202
source/hp_mditexteditor.cpp Normal file
View file

@ -0,0 +1,202 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QMessageBox>
#include <hp_mditexteditor.h>
#include <hp_mdiwindow.h>
#include <hptreeitem.h>
#include <hpdata.h>
#include <abstractdata.h>
#include <QBoxLayout>
#include <QToolBar>
#include <QToolButton>
//Called by the calculator Window
hp_mdiTextEdit::hp_mdiTextEdit(QWidget * parent,hpTreeItem * treeItem, AbstractData * calcData)
:hp_MdiWindow(parent)
{
setMinimumSize(200,200);
setMaximumSize(1000,1000);
setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
qDebug()<<"hp_mdiTextEdit::hp_mdiTextEdit 1";
hptreeitem=treeItem;
content=false;
data = calcData;
filename=treeItem->getFileName();
calculator=treeItem->getCalculatorName();
type=treeItem->getType();
setup();
setWindowTitle(calculator+": "+filename);
}
//Called by the content window
hp_mdiTextEdit::hp_mdiTextEdit(QWidget * parent, QFileInfo filedata, AbstractData * calcData)
:hp_MdiWindow (parent)
{
qDebug()<<"hp_mdiTextEdit::hp_mdiTextEdit 2";
setMinimumSize(200,200);
setMaximumSize(1000,1000);
// setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
calculator=QStringLiteral("Content: ");
content=true;
hptreeitem=nullptr;
data = calcData;
filename=filedata.fileName();
file=filedata;
type=calcData->getType();
setup();
setWindowTitle(calculator+filename);
resize(450,350);
}
void hp_mdiTextEdit::setup() {
QString text;
textEdit = new textEditor(this);
if (data) {
qDebug()<<data->getName();
qDebug()<<data->getType();
if (data->getType()==HP_NOTE) {
Notes *note;
note=static_cast<Notes *>(data);
text=note->getNote();
}
if (data->getType()==HP_PROG) {
Program *prog;
prog=static_cast<Program *>(data);
text=prog->getProg();
textEdit->setDocumentTitle(prog->getName());
}
qDebug()<<text;
textEdit->setPlainText(text);
}
else {
qDebug()<<"hp_mdiTextEdit::setup - Data Null";
}
QIcon save(":/icons/save_22x22.png");
QAction * actionSave= new QAction(save,"Save",this);
QWidget * top = new QWidget();
QBoxLayout * layout = new QVBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
top->setLayout(layout);
QToolBar * toolbar = new QToolBar("Save");
toolbar->addAction(actionSave);
QToolButton *saveButton=new QToolButton();
QMenu * menu = new QMenu(saveButton);
menu->addAction(actionSave);
layout->setMenuBar(menu);
// layout->addWidget(toolbar);
// QSizePolicy sizePolicy1(QSizePolicy::Expanding, QSizePolicy::Expanding);
// sizePolicy1.setHorizontalStretch(0);
// sizePolicy1.setVerticalStretch(0);
// sizePolicy1.setHeightForWidth(textEdit->sizePolicy().hasHeightForWidth());
// textEdit->setSizePolicy(sizePolicy1);
// layout->setSizeConstraint(QLayout::SetNoConstraint);
layout->addWidget(textEdit);
setWidget(top);
connect(actionSave,SIGNAL(triggered()),this,SLOT(eventSave()));
return;
}
void hp_mdiTextEdit::eventSave(){
save();
}
bool hp_mdiTextEdit::save(){
if(content)
return textEdit->save(file);
else {
return textEdit->save(calculator);
}
}
bool hp_mdiTextEdit::saveAs(){
if(content)
return textEdit->saveAs(file);
else {
return textEdit->saveAs(calculator);
}
}
void hp_mdiTextEdit::closeEvent(QCloseEvent *event)
{
if (maybeSave()) {
event->accept();
} else {
event->ignore();
}
QMdiSubWindow::closeEvent(event);
}
bool hp_mdiTextEdit::maybeSave()
{
if (!textEdit->document()->isModified())
return true;
const QMessageBox::StandardButton ret
= QMessageBox::warning(this, tr("MDI"),
tr("'%1' has been modified.\n"
"Do you want to save your changes?")
.arg(file.fileName()),
QMessageBox::Save | QMessageBox::Discard
| QMessageBox::Cancel);
switch (ret) {
case QMessageBox::Save:
return textEdit->save(file);
case QMessageBox::Cancel:
return false;
default:
break;
}
return true;
}
void hp_mdiTextEdit::show() {
if (textEdit)
textEdit->show();
QMdiSubWindow::show();
}
hp_mdiTextEdit::~hp_mdiTextEdit() {
qDebug()<<"Entering ~hpmdiTextEdit()";
if (textEdit!=nullptr)
delete textEdit;
}

View file

@ -0,0 +1,238 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QBoxLayout>
#include <QToolBar>
#include <QToolButton>
#include <QMessageBox>
#include "hp_mdivariableedit.h"
#include "hptreeitem.h"
hp_mdiVariableEdit::hp_mdiVariableEdit(QWidget *parent,
hpTreeItem * treeItem,
hpCalcData * dataStore)
: hp_MdiWindow(parent)
{
setMinimumSize(200,200);
setMaximumSize(1000,1000);
setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
hptreeitem=treeItem;
hpcalc = dataStore;
filename = QStringLiteral("NULL");
if (hpcalc!=nullptr) {
calculator=hpcalc->getCalculatorName();
if (treeItem!=nullptr) {
filename=treeItem->getFileName();
type=treeItem->getType();
}
else {
qWarning()<<"hpcalc is null";
}
data=hpcalc->getData(filename,type);
}
else {
qWarning()<<"hpcalc is null";
}
content=false;
setup();
setWindowTitle(calculator+": "+filename);
}
hp_mdiVariableEdit::hp_mdiVariableEdit(QWidget *parent,
QFileInfo fileinfo,
AbstractData * data_in)
: hp_MdiWindow(parent)
{
setMinimumSize(200,200);
setMaximumSize(1000,1000);
setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
calculator=QStringLiteral("Content: ");
content=true;
hptreeitem=nullptr;
hpcalc = nullptr;
file=fileinfo;
filename=fileinfo.fileName();
data = data_in;
if (data!=nullptr)
type=data->getType();
setup();
setWindowTitle(calculator+filename);
}
void hp_mdiVariableEdit::setup() {
if (data!=nullptr) {
varmodel = new varTableModel(this,data,filename,type);
tableView = new QTableView(this);
tableView->setModel(varmodel);
QIcon save(":/icons/save_22x22.png");
QAction * actionSave= new QAction(save,"Save",this);
QWidget * top = new QWidget();
QBoxLayout * layout = new QVBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
top->setLayout(layout);
QToolBar * toolbar = new QToolBar("Save");
toolbar->addAction(actionSave);
QToolButton *saveButton=new QToolButton();
QMenu * menu = new QMenu(saveButton);
menu->addAction(actionSave);
layout->setMenuBar(menu);
layout->addWidget(tableView);
setWidget(top);
connect(actionSave,SIGNAL(triggered()),this,SLOT(eventSave()));
}
}
void hp_mdiVariableEdit::show() {
if(tableView!=nullptr)
tableView->show();
else {
qWarning()<<"hp_mdiVariableEdit::show tableView null";
}
hp_MdiWindow::show();
}
void hp_mdiVariableEdit::eventSave(){
save();
}
bool hp_mdiVariableEdit::save(){
if (content==true) {
return saveFile(file);
}
return false;
}
bool hp_mdiVariableEdit::saveAs(){
QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
file.absoluteFilePath());
if (fileName.isEmpty())
return false;
if (content==true) {
QFileInfo fileinfo(fileName);
return saveFile(fileinfo);
}
return false;
}
bool hp_mdiVariableEdit::saveFile(const QFileInfo fileinfo)
{
QFile file(fileinfo.absoluteFilePath());
if (!file.open(QFile::ReadWrite)) {
QMessageBox::warning(this, tr("MDI"),
tr("Cannot write file %1:\n%2.")
.arg(fileinfo.canonicalPath(), file.errorString()));
return false;
}
qDebug()<<"Write file";
//Show busy cursor
QApplication::setOverrideCursor(Qt::WaitCursor);
QDataStream ds(&file);
ds.setByteOrder(QDataStream::LittleEndian);
varmodel->getData(ds);
//reset busy cursor
QApplication::restoreOverrideCursor();
varmodel->resetModified();
file.close();
return true;
}
bool hp_mdiVariableEdit::maybeSave()
{
if (varmodel==nullptr)
return false;
if (!varmodel->isModified()) {
qDebug()<<"Var not modified";
return true;
}
if (content==false) {
return true;
}
const QMessageBox::StandardButton ret
= QMessageBox::warning(this, tr("MDI"),
tr("'%1' has been modified.\n"
"Do you want to save your changes?")
.arg(file.fileName()),
QMessageBox::Save | QMessageBox::Discard
| QMessageBox::Cancel);
switch (ret) {
case QMessageBox::Save:
return saveFile(file);
case QMessageBox::Cancel:
return false;
default:
break;
}
return true;
}
void hp_mdiVariableEdit::closeEvent(QCloseEvent *event)
{
qDebug()<<"hp_mdiVariableEdit::closeEvent";
if (maybeSave()) {
event->accept();
} else {
event->ignore();
}
QMdiSubWindow::closeEvent(event);
}
hp_mdiVariableEdit::~hp_mdiVariableEdit() {
qDebug()<<"Entering ~hpmdiVariableEdit()";
if (varmodel!=nullptr)
delete varmodel;
}

64
source/hp_mdiwindow.cpp Normal file
View file

@ -0,0 +1,64 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hp_mdiwindow.h"
#include <QDebug>
#include <QMenu>
#include <QToolBar>
#include <QToolButton>
#include <QBoxLayout>
hp_MdiWindow::hp_MdiWindow(QWidget * parent)
:QMdiSubWindow(parent)
{
// setMinimumSize(500,400);
// setMaximumSize(1000,1000);
setSizePolicy(QSizePolicy::Ignored,QSizePolicy::Ignored);
setup();
}
void hp_MdiWindow::setup() {
}
void hp_MdiWindow::eventSave() {
qDebug()<<"Save pressed";
}
bool hp_MdiWindow::save() {
qDebug()<<"hp_MdiWindow::save";
return false;
}
bool hp_MdiWindow::saveAs() {
qDebug()<<"hp_MdiWindow::saveas";
return false;
}
void hp_MdiWindow::show() {
QMdiSubWindow::show();
}
hp_MdiWindow::~hp_MdiWindow() {
qDebug()<<"Entering ~hpmdiWindow()";
}

58
source/hp_mdiwindow.ui Normal file
View file

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>hp_MdiWindow</class>
<widget class="QMainWindow" name="hp_MdiWindow">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>575</width>
<height>320</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>200</height>
</size>
</property>
<property name="windowTitle">
<string>LogWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="textEdit"/>
</item>
</layout>
</widget>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actionSave"/>
</widget>
<action name="actionSave">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/save_22x22.png</normaloff>:/icons/save_22x22.png</iconset>
</property>
<property name="text">
<string>Save</string>
</property>
</action>
</widget>
<resources>
<include location="qthpconnect.qrc"/>
</resources>
<connections/>
</ui>

125
source/hp_settingsdlg.cpp Normal file
View file

@ -0,0 +1,125 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hp_settingsdlg.h"
#include "ui_hp_settingsdlg.h"
#include <QDebug>
#include <QDialogButtonBox>
hp_SettingsDlg::hp_SettingsDlg(QWidget *parent, hp_Settings * hpset) :
QDialog(parent),
ui(new Ui::hp_SettingsDlg)
{
if (hpset) {
dlgset=*hpset;
retsettings=hpset;
}
ui->setupUi(this);
setupSettings();
connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(on_clicked(QAbstractButton*)));
}
void hp_SettingsDlg::setupSettings() {
ui->cb_angle->setCurrentIndex(dlgset.angle_measure);
ui->cb_format->setCurrentIndex(dlgset.number_format);
ui->cb_precision->setCurrentIndex(dlgset.precision);
ui->cb_grouping->setCurrentIndex(dlgset.digit_grouping);
ui->cb_entry->setCurrentIndex(dlgset.entry);
ui->cb_integers->setCurrentIndex(dlgset.integers);
ui->cb_complex->setCurrentIndex(dlgset.complex);
ui->cb_language->setCurrentIndex(dlgset.language);
ui->cb_font->setCurrentIndex(dlgset.font_size);
ui->cb_theme->setCurrentIndex(dlgset.theme);
ui->le_integer->setText(QString().sprintf("%d",dlgset.bits));
if (dlgset.textbook)
ui->ch_textbook->setCheckState(Qt::Checked);
else
ui->ch_textbook->setCheckState(Qt::Unchecked);
if (dlgset.menu)
ui->ch_menu->setCheckState(Qt::Checked);
else
ui->ch_menu->setCheckState(Qt::Unchecked);
if (dlgset.signed_int)
ui->ch_signed->setCheckState(Qt::Checked);
else
ui->ch_signed->setCheckState(Qt::Unchecked);
}
void hp_SettingsDlg::putSettings() {
dlgset.angle_measure=ui->cb_angle->currentIndex();
dlgset.number_format=ui->cb_format->currentIndex();
dlgset.precision=ui->cb_precision->currentIndex();
dlgset.digit_grouping= ui->cb_grouping->currentIndex();
dlgset.entry=ui->cb_entry->currentIndex();
dlgset.integers=ui->cb_integers->currentIndex();
dlgset.complex=ui->cb_complex->currentIndex();
dlgset.language=ui->cb_language->currentIndex();
dlgset.font_size=ui->cb_font->currentIndex();
dlgset.theme=ui->cb_theme->currentIndex();
dlgset.bits=ui->le_integer->text().toInt();
if (ui->ch_menu->checkState()==Qt::Checked)
dlgset.menu=true;
else
dlgset.menu=false;
if (ui->ch_textbook->checkState()==Qt::Checked)
dlgset.textbook=true;
else
dlgset.textbook=false;
if (ui->ch_signed->checkState()==Qt::Checked)
dlgset.signed_int=true;
else
dlgset.signed_int=false;
}
void hp_SettingsDlg::resetSettings() {
hp_Settings newset;
dlgset = newset;
setupSettings();
}
void hp_SettingsDlg::on_clicked(QAbstractButton * button) {
if(button==(QAbstractButton*) ui->buttonBox->button(QDialogButtonBox::Reset) ){
resetSettings();
}
if(button==(QAbstractButton*) ui->buttonBox->button(QDialogButtonBox::Ok) ){
putSettings();
if (retsettings) {
*retsettings=dlgset;
}
close();
}
if(button==(QAbstractButton*) ui->buttonBox->button(QDialogButtonBox::Cancel) ){
close();
}
}
hp_SettingsDlg::~hp_SettingsDlg()
{
qDebug()<<"delete hp_SettingsDlf";
delete ui;
}

720
source/hp_settingsdlg.ui Normal file
View file

@ -0,0 +1,720 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>hp_SettingsDlg</class>
<widget class="QDialog" name="hp_SettingsDlg">
<property name="enabled">
<bool>true</bool>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>415</width>
<height>455</height>
</rect>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="windowTitle">
<string>Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="hpSettings">
<attribute name="title">
<string>Home Settings</string>
</attribute>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>17</x>
<y>20</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Angle Measure:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="cb_angle">
<property name="geometry">
<rect>
<x>130</x>
<y>20</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Radians</string>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<item>
<property name="text">
<string>Radians</string>
</property>
</item>
<item>
<property name="text">
<string>Degrees</string>
</property>
</item>
<item>
<property name="text">
<string>Gradians</string>
</property>
</item>
</widget>
<widget class="QCheckBox" name="ch_signed">
<property name="geometry">
<rect>
<x>310</x>
<y>150</y>
<width>41</width>
<height>22</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>±:</string>
</property>
</widget>
<widget class="QComboBox" name="cb_format">
<property name="geometry">
<rect>
<x>130</x>
<y>50</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Standard</string>
</property>
<item>
<property name="text">
<string>Standard</string>
</property>
</item>
<item>
<property name="text">
<string>Fixed</string>
</property>
</item>
<item>
<property name="text">
<string>Scientific</string>
</property>
</item>
<item>
<property name="text">
<string>Engineering</string>
</property>
</item>
<item>
<property name="text">
<string>Floating</string>
</property>
</item>
<item>
<property name="text">
<string>Rounded</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="cb_grouping">
<property name="geometry">
<rect>
<x>130</x>
<y>81</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>123,456.789</string>
</property>
<item>
<property name="text">
<string>123,456.789</string>
</property>
</item>
<item>
<property name="text">
<string>123'456.789</string>
</property>
</item>
<item>
<property name="text">
<string>123 456.789</string>
</property>
</item>
<item>
<property name="text">
<string>123456.789</string>
</property>
</item>
<item>
<property name="text">
<string>123.456,789</string>
</property>
</item>
<item>
<property name="text">
<string>123'456,789</string>
</property>
</item>
<item>
<property name="text">
<string>123 456,789</string>
</property>
</item>
<item>
<property name="text">
<string>123&quot;456.789</string>
</property>
</item>
<item>
<property name="text">
<string>123456,789</string>
</property>
</item>
<item>
<property name="text">
<string>1234,5678.901</string>
</property>
</item>
<item>
<property name="text">
<string>1,23,456.789</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>20</x>
<y>50</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Number Format:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>20</x>
<y>80</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Digit Grouping:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="cb_entry">
<property name="geometry">
<rect>
<x>130</x>
<y>112</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Textbook</string>
</property>
<item>
<property name="text">
<string>Textbook</string>
</property>
</item>
<item>
<property name="text">
<string>Algebraic</string>
</property>
</item>
<item>
<property name="text">
<string>RPN</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>20</x>
<y>111</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Entry:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="cb_integers">
<property name="geometry">
<rect>
<x>130</x>
<y>144</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Binary</string>
</property>
<item>
<property name="text">
<string>Binary</string>
</property>
</item>
<item>
<property name="text">
<string>Octal</string>
</property>
</item>
<item>
<property name="text">
<string>Decimal</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>20</x>
<y>143</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Integers:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>20</x>
<y>175</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Complex:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="cb_complex">
<property name="geometry">
<rect>
<x>130</x>
<y>176</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>a+b*i</string>
</property>
<item>
<property name="text">
<string>a+b*i</string>
</property>
</item>
<item>
<property name="text">
<string>(a,b)</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="cb_language">
<property name="geometry">
<rect>
<x>130</x>
<y>208</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Deutsch</string>
</property>
<item>
<property name="text">
<string>Deutsch</string>
</property>
</item>
<item>
<property name="text">
<string>English</string>
</property>
</item>
<item>
<property name="text">
<string>Espanol</string>
</property>
</item>
<item>
<property name="text">
<string>Francais</string>
</property>
</item>
<item>
<property name="text">
<string>Nederlands</string>
</property>
</item>
<item>
<property name="text">
<string>Portugues</string>
</property>
</item>
<item>
<property name="text">
<string>New Item</string>
</property>
</item>
<item>
<property name="text">
<string>New Item</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>20</x>
<y>207</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Language:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
<x>20</x>
<y>239</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Font Size:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="cb_font">
<property name="geometry">
<rect>
<x>130</x>
<y>240</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Small Font</string>
</property>
<item>
<property name="text">
<string>Small Font</string>
</property>
</item>
<item>
<property name="text">
<string>Medium Font</string>
</property>
</item>
<item>
<property name="text">
<string>Large Font</string>
</property>
</item>
</widget>
<widget class="QCheckBox" name="ch_textbook">
<property name="geometry">
<rect>
<x>8</x>
<y>277</y>
<width>141</width>
<height>22</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Textbook Display:</string>
</property>
</widget>
<widget class="QCheckBox" name="ch_menu">
<property name="geometry">
<rect>
<x>151</x>
<y>277</y>
<width>141</width>
<height>22</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Menu Display:</string>
</property>
</widget>
<widget class="QComboBox" name="cb_theme">
<property name="geometry">
<rect>
<x>130</x>
<y>311</y>
<width>131</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>Light</string>
</property>
<item>
<property name="text">
<string>Light</string>
</property>
</item>
<item>
<property name="text">
<string>Dark</string>
</property>
</item>
</widget>
<widget class="QLabel" name="label_17">
<property name="geometry">
<rect>
<x>20</x>
<y>310</y>
<width>101</width>
<height>30</height>
</rect>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="text">
<string>Color Theme:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QComboBox" name="cb_precision">
<property name="geometry">
<rect>
<x>270</x>
<y>50</y>
<width>51</width>
<height>32</height>
</rect>
</property>
<property name="currentText">
<string>0</string>
</property>
<item>
<property name="text">
<string>0</string>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>3</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>5</string>
</property>
</item>
<item>
<property name="text">
<string>6</string>
</property>
</item>
<item>
<property name="text">
<string>7</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>9</string>
</property>
</item>
<item>
<property name="text">
<string>10</string>
</property>
</item>
<item>
<property name="text">
<string>11</string>
</property>
</item>
</widget>
<widget class="QLineEdit" name="le_integer">
<property name="geometry">
<rect>
<x>266</x>
<y>144</y>
<width>41</width>
<height>32</height>
</rect>
</property>
<property name="inputMethodHints">
<set>Qt::ImhDigitsOnly</set>
</property>
<property name="text">
<string>32</string>
</property>
</widget>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>hp_SettingsDlg</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>hp_SettingsDlg</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

438
source/hpdata.cpp Normal file
View file

@ -0,0 +1,438 @@
//
//
//
//
// This class acts as a data store for the interface and calls for data as required
//
#include "hpdata.h"
#include "global.h"
#include "errorhandler.h"
#include "abstractdata.h"
#include "hp_typedef.h"
const QString hpCalcData::func_list[FUNC_NUM][2]={{"Application Library",":/icons/apps_32x32.png"},
{"CAS Vars",":/icons/casFolder_32x32.png"},
{"Real",":/icons/real_32x32.png"},
{"Complex",":/icons/complex_32x32.png"},
{"Lists",":/icons/list_32x32.png"},
{"Matrices",":/icons/table_32x32.png"},
{"Notes",":/icons/note_32x32.png"},
{"Programs",":/icons/program_32x32.png"},
{"Variables",":/icons/varFolder_32x32.png"}
};
const hp_DataType hpCalcData::func_type[FUNC_NUM]={HP_APP,
HP_CAS,
HP_REAL,
HP_COMPLEX,
HP_LIST,
HP_MATRIX,
HP_NOTE,
HP_PROG,
HP_VAR
};
//constructor
hpCalcData::hpCalcData(QString name, hpusb * handle)
:QObject()
{
hp_api = handle;
lData.clear();
calculatorName=name;
//open usb port and store the handle
if (hp_api) {
hp_handle.calc=this;
hp_api->hp_open(getHandle());
}
}
//return the interface class
hp_Handle * hpCalcData::getHandle() {
hp_handle.calc=this;
return &hp_handle;
}
//return the interface class
hpusb * hpCalcData::getAPI() {
return hp_api;
}
//data managment
hp_Information hpCalcData::getInfo() {
return hp_info;
}
//get Name
QString hpCalcData::getName() {
return hp_info.name;
}
//get Calculator Name
QString hpCalcData::getCalculatorName() {
return calculatorName;
}
//get Settings
hp_Settings hpCalcData::getSettings() {
return hp_homesettings;
}
//Add a new object to the list
void hpCalcData::addData(AbstractData * data) {
lData.append(data);
}
void hpCalcData::deleteData(AbstractData * data) {
// lData.erase();
if (data!=nullptr) {
QString name=data->getName();
hp_DataType type=data->getType();
QList<AbstractData *>::iterator i;
i=findData(name,type);
lData.erase(i);
delete data;
qDebug()<<"hpCalcData::deleteData - Object Deleted";
}
else {
qDebug()<<"hpCalcData::deleteData - Object not deleted";
}
}
//returns position of entry in list or returns 0;
QList<AbstractData *>::iterator hpCalcData::findData(QString name, hp_DataType dataType) {
QList<AbstractData *>::iterator i;
AbstractData * ldata;
i = lData.begin();
while (i!= lData.end()) {
ldata=*i;
if (ldata->equivalent(name,dataType)) {
return i;
}
}
return nullptr;
}
//returns position of entry in list or returns 0;
AbstractData * hpCalcData::getData(QString name, hp_DataType dataType) {
for (int i = 0; i < lData.size(); ++i) {
if (lData.at(i)->equivalent(name,dataType)) {
qDebug()<<"hpCalcData::Data found"<<name<<" "<<dataType;
return lData.at(i);
}
}
qDebug()<<"hpCalcData::No data found"<<name<<" "<<dataType;;
return nullptr;
}
AbstractData * hpCalcData::dataAt(int i) {
return lData.at(i);
}
int hpCalcData::dataCount() {
return lData.size();
}
void hpCalcData::refresh() {
readInfo();
readSettings();
}
//read Settings via usb
void hpCalcData::readSettings() {
hpusb * api;
hp_Handle * handle;
hp_Settings hpset;
errlog("hpCalcData::readSettings: -Reading Settings");
qDebug()<<"Reading Settings";
api=getAPI();
handle=getHandle();
if (api) {
if(handle) {
qDebug()<<QString().sprintf("%s %p",__FUNCTION__,handle->usbhandle);
if (api) {
api->get_settings(handle);
}
}
else {
errlog("hpCalcData::readSettings Handle null");
}
}
else {
errlog("hpCalcData::readSettings API null");
}
// hp_homesettings=hpset;
// hp_Change change;
// change.dataChange=HP_MAIN;
// emit dataChanged(change);
}
//read Settings via usb
void hpCalcData::readScreen() {
hpusb * api;
hp_Handle * handle;
hp_Settings hpset;
errlog("Reading Screen");
api=getAPI();
handle=getHandle();
QByteArray imageData;
if (api) {
if(handle) {
qDebug()<<QString().sprintf("%s %p",__FUNCTION__,handle->usbhandle);
if (api) {
api->get_screen_shot(handle);
// if (screenShot!=nullptr) {
// delete screenShot;
// }
//
// screenShot = new QPixmap();
// screenShot->loadFromData(imageData);
}
}
}
// emit emitChange(HP_SCREEN);
}
//recieve Screenshot
void hpCalcData::recvScreen(hp_ScreenShot shot) {
errlog("Recieving Screen");
QByteArray imageData;
if (screenShot!=nullptr) {
delete screenShot;
}
screenShot = shot.image;
emit emitChange(HP_SCREEN);
}
//recieve Setting
void hpCalcData::recvSettings(hp_Data data) {
QString filename;
errlog("hpCalcData::recvSettings: Recieving Setting");
filename = data.name;
qDebug()<<filename;
if (filename==QStringLiteral("calc.hpsettings")) {
qDebug()<<"hpCalcData::recvSetting - Setting";
qDebug()<<"hpCalcData::recvSetting - Real";
errlog("hpCalcData::recvSetting - Real");
Real * obj1 = new Real(data.name,HP_REAL);
obj1->setData(data.data);
addData(obj1);
emit emitChange(HP_REAL);
qDebug()<<"hpCalcData::recvSetting - Complex";
errlog("hpCalcData::recvSetting - Complex");
Complex * obj2 = new Complex(data.name,HP_COMPLEX);
obj2->setData(data.data);
addData(obj2);
emit emitChange(HP_COMPLEX);
}
if (filename== QStringLiteral("cas.hpsettings")) {
qDebug()<<"cas.chps";
qDebug()<<"hpCalcData::recvSetting - CAS";
CASVariables * obj2 = new CASVariables(data.name,HP_CAS);
obj2->setData(data.data);
addData(obj2);
emit emitChange(HP_CAS);
}
if (filename==QStringLiteral("calc.hpvars")) {
qDebug()<<"hpCalcData::recvSetting - Variables";
Variables * var = new Variables(data.name,HP_VAR);
var->setData(data.data);
addData(var);
}
if (filename==QStringLiteral("settings")) {
qDebug()<<"set-";
qDebug()<<"hpCalcData::recvSetting - Variables";
Settings * var = new Settings(data.name,HP_SETTINGS);
var->setData(data.data);
addData(var);
}
emit emitChange(HP_MAIN);
}
//recieve Program
void hpCalcData::recvProg(hp_Prog program) {
errlog("Recieving Program");
qDebug()<<"hpCalcData::recvProg";
qDebug()<<program.filename;
//qDebug()<<program.prog;
Program * obj = new Program(program.filename,HP_PROG, program.prog);
obj->setData(program.data);
addData(obj);
emit emitChange(HP_PROG);
}
//recieve Program
void hpCalcData::recvNote(hp_Note note) {
errlog("Recieving Note");
qDebug()<<"hpCalcData::recvNote";
qDebug()<<note.filename;
Notes * obj = new Notes(note.filename,HP_NOTE, note.text);
obj->setData(note.data);
addData(obj);
emit emitChange(HP_NOTE);
}
//recieve Program
void hpCalcData::recvData(hp_Data data) {
errlog("Recieving Data");
switch (data.type) {
case HP_APP: {
qDebug()<<"hpCalcData::recvData - Application";
Application * obj = new Application(data.name,data.type);
obj->setData(data.data);
addData(obj);
emit emitChange(HP_APP);
}
break;
case HP_LIST: {
List * obj = new List(data.name,data.type);
obj->setData(data.data);
addData(obj);
emit emitChange(HP_LIST);
}
break;
case HP_MATRIX: {
qDebug()<<"hpCalcData::recvData - Matrix";
Matrix * obj = new Matrix(data.name,data.type);
obj->setData(data.data);
addData(obj);
emit emitChange(HP_MATRIX);
}
break;
}
}
void hpCalcData::emitChange(hp_DataType type) {
hp_Change change;
change.dataChange=type;
change.calc = this;
emit dataChanged(change);
}
hp_ScreenShot hpCalcData::getScreenShot() {
hp_ScreenShot scn;
scn.image = screenShot;
scn.format = CALC_SCREENSHOT_FORMAT_PRIME_PNG_320x240x16;
scn.calc = this;
return scn;
}
//set Settings
int hpCalcData::setSettings(hp_Settings set) {
hp_homesettings=set;
}
void hpCalcData::setInfo(hp_Information dtype) {
hp_info=dtype;
return;
}
//read information via hp interface
void hpCalcData::readInfo() {
hpusb * api;
hp_Handle * handle;
hp_Information hpinfo;
api=getAPI();
handle=getHandle();
if (api) {
if(handle) {
qDebug()<<QString().sprintf("%s %p",__FUNCTION__,handle->usbhandle);
if (api)
api->load_info(handle);
}
}
}
void hpCalcData::recvInfo(hp_Information hpinfo) {
hp_info=hpinfo;
emit emitChange(HP_MAIN);
}
void hpCalcData::vpkt_send_experiments(int cmd) {
hpusb * api;
hp_Handle * handle;
api=getAPI();
handle=getHandle();
if (api) {
if(handle) {
if (api) {
api->is_ready(handle);
// api->vpkt_send_experiments(handle,cmd);
}
}
}
}
hpCalcData::~hpCalcData() {
qDebug()<<"Close ~hpCalcData";
};

14
source/hptoolbox.cpp Normal file
View file

@ -0,0 +1,14 @@
#include <hptoolbox.h>
#include "ui_hptoolbox.h"
hpToolBox::hpToolBox(QWidget *parent) :
QToolBox(parent),
ui(new Ui::hpToolBox)
{
ui->setupUi(this);
}
hpToolBox::~hpToolBox()
{
delete ui;
}

641
source/hptreeitem.cpp Normal file
View file

@ -0,0 +1,641 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hptreeitem.h"
#include "global.h"
#include "hpdata.h"
#include "hp_mditexteditor.h"
#include "hp_infodialog.h"
#include "hp_settingsdlg.h"
#include <QMessageBox>
#include <QString>
const QString hpTreeItem::func_list[FUNC_NUM][2]={
{"Main",":/icons/apps_32x32.png"},
{"Application Library",":/icons/apps_32x32.png"},
{"CAS Vars",":/icons/casFolder_32x32.png"},
{"Real",":/icons/real_32x32.png"},
{"Complex",":/icons/complex_32x32.png"},
{"Lists",":/icons/list_32x32.png"},
{"Matrices",":/icons/table_32x32.png"},
{"Notes",":/icons/note_32x32.png"},
{"Programs",":/icons/program_32x32.png"},
{"Variables",":/icons/varFolder_32x32.png"}
};
const hp_DataType hpTreeItem::func_type[FUNC_NUM]={
HP_MAIN,
HP_APP,
HP_CAS,
HP_REAL,
HP_COMPLEX,
HP_LIST,
HP_MATRIX,
HP_NOTE,
HP_PROG,
HP_VAR
};
//QString hpTreeItem::hp_name;
hpTreeItem::hpTreeItem()
:QStandardItem() {
setDropEnabled(true);
setEditable(0);
}
hpTreeItem::hpTreeItem(const QString & name,hpCalcData * hpDataStore,int flag)
:QStandardItem(name)
{
setEditable(0);
setDataStore(hpDataStore);
setDragEnabled(true);
setDropEnabled(true);
// filename=name;
if (flag==0)
setGraphicTree();
}
bool hpTreeItem::dropMimeData(const QMimeData * data, Qt::DropAction action, int row, int column, const QModelIndex & parent) {
qDebug()<<"hpTreeItem::dropMimeData";
}
QStandardItem * hpTreeItem::clone() const {
//return new hpTreeItem(QStringLiteral("test"),getDataStore(),0);
}
void hpTreeItem::setGraphicTree() {
int func_num=FUNC_NUM;
hpTreeItem * newChild;
int i;
for (i=1; i<func_num; i++)
{
newChild= new hpTreeItem(func_list[i][0],getDataStore(),1);
newChild->setType(func_type[i]);
newChild->setIcon(QIcon(func_list[i][1]));
newChild->setEditable(0);
newChild->setToolTip(QString("Manage Applications"));
// newChild->getDataStore()->getInfo().serialnum="12-3456";
appendRow(newChild);
}
}
void hpTreeItem::clickAction(QMdiArea * mdiwin) {
hp_infoDialog * hpinfodlg;
hp_Information hpinfo;
hpCalcData * calc;
hp_DataStruct hpdata;
calc=getDataStore();
AbstractData * data=nullptr;
// QString test;
// test=data(Qt::DisplayRole).toString();
qDebug()<<"hpTreeItem::clickAction ... click";
switch (getType()) {
case HP_MAIN: {
hpCalcData * dataStore;
dataStore = getDataStore();
hpinfo=dataStore->getInfo();
hpinfodlg = new hp_infoDialog(mdiwin,hpinfo);
hpinfodlg->show();
}
break;
case HP_APP: {
}
break;
case HP_CAS:
if (hpvaredit==nullptr) {
if (calc) {
data=calc->getData(getFileName(),HP_COMPLEX);
}
if (data!=nullptr) {
hpvaredit = new hp_mdiVariableEdit(mdiwin,this,calc);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
case HP_COMPLEX:
if (hpvaredit==nullptr) {
if (calc) {
data=calc->getData(getFileName(),HP_COMPLEX);
}
if (data!=nullptr) {
hpvaredit = new hp_mdiVariableEdit(mdiwin,this,calc);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
break;
case HP_LIST:
if (hpvaredit==nullptr) {
if (calc) {
data=calc->getData(getFileName(),HP_LIST);
}
if (data) {
hpvaredit = new hp_mdiVariableEdit(mdiwin,this,calc);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
break;
case HP_MATRIX:
if (hpvaredit==nullptr) {
if (calc) {
data=calc->getData(getFileName(),HP_MATRIX);
}
if (data!=nullptr) {
hpvaredit = new hp_mdiVariableEdit(mdiwin,this,calc);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
break;
case HP_NOTE: {
hpCalcData * dataStore;
dataStore = getDataStore();
AbstractData * data =nullptr;
dataStore = getDataStore();
if (dataStore) {
data=dataStore->getData(getFileName(),getType());
}
//To fix by having hp_mdi reset
hptextedit=nullptr;
if ((hptextedit==nullptr)&&(data!=nullptr))
hptextedit = new hp_mdiTextEdit(mdiwin,this, data);
if (hptextedit!=nullptr)
hptextedit ->show();
}
break;
case HP_PROG: {
hpCalcData * dataStore =nullptr;
AbstractData * data =nullptr;
dataStore = getDataStore();
qDebug()<<"HP_Prog ... click"<<getFileName();
if (dataStore!=nullptr) {
data=dataStore->getData(getFileName(),getType());
if(data!=nullptr) {
qDebug()<<data->getName();
}
}
//To fix by having hp_mdi reset
hptextedit=nullptr;
if ((hptextedit==nullptr)&&(data!=nullptr)) {
hptextedit = new hp_mdiTextEdit(mdiwin,this, data);
}
if (hptextedit!=nullptr)
hptextedit ->show();
}
break;
case HP_REAL:
if (hpvaredit==nullptr) {
if (calc) {
data=calc->getData(getFileName(),HP_REAL);
}
if (data!=nullptr) {
hpvaredit = new hp_mdiVariableEdit(mdiwin,this,calc);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
break;
case HP_VAR:
break;
default: ;
}
}
void hpTreeItem::contextAction(QMdiArea * mdiwin, contextActionType cta) {
hp_SettingsDlg * hpsettingsdlg;
hp_Information hpinfo;
hp_Settings hpset;
int ret=0;
switch (getType()) {
case HP_MAIN: {
switch (cta) {
case CT_PREFERENCE: {
hpCalcData * dataStore;
dataStore = getDataStore();
dataStore->readSettings();
hpset=dataStore->getSettings();
hpsettingsdlg = new hp_SettingsDlg(mdiwin, &hpset);
ret=hpsettingsdlg->exec();
if (ret)
dataStore->setSettings(hpset);
}
break;
default: ;
}
}
break;
default: ;
}
}
hp_DataType hpTreeItem::getType() {
return type;
}
void hpTreeItem::setType(hp_DataType dtype) {
type=dtype;
return;
}
//manage access to datastore
hpCalcData * hpTreeItem::getDataStore() {
if (hp_data) {
qDebug()<<"Data store found";
return hp_data;
}
else {
qDebug()<<"Null data store";
return nullptr;
}
}
void hpTreeItem::setDataStore(hpCalcData * dtype) {
hp_data=dtype;
return;
}
int hpTreeItem::dt2int() {
switch (getType()) {
case HP_APP: return 0;
case HP_CAS: return 1;
case HP_COMPLEX: return 2;
case HP_LIST: return 3;
case HP_MATRIX: return 4;
case HP_NOTE: return 5;
case HP_PROG: return 6;
case HP_REAL: return 7;
case HP_VAR: return 8;
default:;
};
return 0;
}
QString hpTreeItem::getGroupName() {
return func_list[dt2int()][0];
}
QString hpTreeItem::getFileName() {
return text();
}
QString hpTreeItem::getCalculatorName() {
hpCalcData * hpcalc;
QString calcName;
hpcalc=getDataStore();
if (hpcalc!=nullptr)
calcName=hpcalc->getCalculatorName();
qDebug()<<calcName;
return calcName;
}
void hpTreeItem::setFileName(QString file) {
qDebug()<<"rename "<<text()<<" to "<<file;
// filename=file;
setText(file);
return;
}
//Slot to respond to data changes
void hpTreeItem::dataChange(hp_Change hpchange) {
hpCalcData * ptr=nullptr;
QString name;
switch (hpchange.dataChange) {
case HP_MAIN:
ptr=getDataStore();
if (ptr) {
name=ptr->getName();
setData(name,Qt::DisplayRole);
}
break;
case HP_SCREEN: {
emit dataChanged(hpchange);
}
break;
case HP_REAL: {
refresh();
}
break;
case HP_APP: {
refresh();
}
case HP_MATRIX: {
refresh();
}
break;
case HP_LIST: {
refresh();
}
break;
case HP_NOTE: {
refresh();
}
break;
case HP_PROG: {
refresh();
}
break;
default:;
}
}
void hpTreeItem::addChild(AbstractData *obj) {
hpTreeItem * subItem=nullptr;
hp_DataType type;
qDebug()<<"hpTreeItem:Adding Child";
if (obj!=nullptr) {
QString name;
//create fixed variable list
type= obj->getType();
name=obj->getName();
qDebug()<<"hpTreeItem:this is "<<getFileName()<<" of type:"<<getType()
<<"Column:"<<columnCount();
//check if this is the same type
if ((getType()==type)&&(columnCount()<3))
{
qDebug()<<"hpTreeItem: Creating hpTreeItem:"<<type;
qDebug()<<"Column Count:"<<columnCount();
switch (type) {
case HP_APP: {
subItem= new hpTreeItem(name,getDataStore(),1);
subItem->setType(type);
subItem->setIcon(QIcon(func_list[HP_APP][1]));
}
break;
case HP_MATRIX: {
subItem= new hpTreeItem(name,getDataStore(),1);
subItem->setType(type);
subItem->setIcon(QIcon(func_list[HP_MATRIX][1]));
}
break;
case HP_LIST: {
subItem= new hpTreeItem(name,getDataStore(),1);
subItem->setType(type);
subItem->setIcon(QIcon(func_list[HP_LIST][1]));
}
break;
case HP_NOTE: {
subItem= new hpTreeItem(name,getDataStore(),1);
subItem->setType(type);
subItem->setIcon(QIcon(func_list[HP_NOTE][1]));
qDebug()<<"hpTreeItem: Creating Note type:"<<type;
}
break;
case HP_PROG: {
subItem= new hpTreeItem(name,getDataStore(),1);
subItem->setType(type);
subItem->setIcon(QIcon(func_list[HP_PROG][1]));
}
break;
case HP_REAL: {
setType(type);
setFileName(name);
}
break;
case HP_COMPLEX: {
setType(type);
setFileName(name);
}
break;
default: {
subItem= new hpTreeItem(name,getDataStore(),1);
subItem->setType(type);
}
}
if (subItem)
appendRow(subItem);
}
else {
qDebug()<<"hpTreeItem:No Object added";
}
}
}
//Up date the data
void hpTreeItem::refresh() {
int rows,i,j;
int datalen;
hpTreeItem * ti_child;
QString name;
hp_DataType type;
rows=rowCount();
hpCalcData * calc;
calc=getDataStore();
if (calc) {
if (columnCount()==1) {
AbstractData * obj;
datalen=calc->dataCount();
//get object at from calc
//get number of list items
//for all data items in list
for (j=0; j<datalen; j++ ) {
//compare with data
obj= calc->dataAt(j);
if (obj) {
for (i=0; i<rows; i++) {
ti_child=(hpTreeItem *)child(i);
name=ti_child->getFileName();
type=ti_child->getType();
if(obj->getType()==type) {
ti_child->addFile(obj);
}
}
}
else
{
qDebug()<<"hpTreeItem:obj is null!";
}
}
}
/*
//delete excess
qDebug()<<"hpTreeItem: Checking for deletes";
if (columnCount()==1) {
AbstractData * obj;
int ret;
rows=rowCount();
flag =0;
//for all rows check data exists
for (i=0; i<rows; i++) {
ti_child=(hpTreeItem *)child(i);
if (ti_child) {
name=ti_child->getFileName();
type=ti_child->getType();
for (j=0; j<datalen; j++ ) {
//compare with all data
obj= calc->dataAt(j);
if (obj) {
qDebug()<<"hpTreeItem::refresh - calling object";
if(obj->getType()==type) {
ret=ti_child->findFile(obj->getName());
}
if(ret!=0) {
flag =1; //obj found
}
}
}
}
//If data and no row add row
if (flag==0) {
qDebug()<<"hpTreeItem::refresh - deleting ";
removeRow(i);
}
}
}
*/
}
}
//check if file is in the list and add it if not
void hpTreeItem::addFile(AbstractData * obj) {
int i;
int rows;
int flag;
hpTreeItem * ti_child;
QString name;
hp_DataType type;
// qDebug()<<"hpTreeItem::addFile";
rows=rowCount();
flag=0;
if (obj) {
// qDebug()<<"hpTreeItem::addFile - File Not null";
for (i=0; i<rows; i++) {
ti_child=(hpTreeItem *)child(i);
name=ti_child->getFileName();
type=ti_child->getType();
if(obj->equivalent(name,type)) {
flag =1; //obj found
}
}
//If data and no row add row
if (flag==0) {
qDebug()<<"hpTreeItem::addFile - Adding a child";
addChild(obj);
}
}
else
{
qDebug()<<"hpTreeItem:obj is null!";
}
}
//check if file is in the list of children and add it if not return 0 else return row;
int hpTreeItem::findFile(QString dataname) {
int i;
int rows;
int flag;
rows=rowCount();
hpTreeItem * ti_child;
QString name;
for (i=0; i<rows; i++) {
ti_child=static_cast<hpTreeItem *>(child(i));
dataname=ti_child->getFileName();
if(name==dataname) {
return i;
}
}
return 0;
}
hpTreeItem::~hpTreeItem() {
/*
if (hpvaredit!=nullptr) {
hpvaredit->close();
delete hpvaredit;
hpvaredit=nullptr;
}
if (hptextedit!=nullptr) {
hptextedit->close();
delete hptextedit;
hptextedit=nullptr;
}
if (mdiarea!=nullptr) {
mdiarea->close();
mdiarea=nullptr;
}
*/
removeColumn(0);
qDebug()<<"hpTreeItem:: delete"<<text();
}

1419
source/hpusb.cpp Normal file

File diff suppressed because it is too large Load diff

49
source/main.cpp Normal file
View file

@ -0,0 +1,49 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mainwindow.h"
#include <QApplication>
#include <QCommandLineParser>
#include <QCommandLineOption>
int main(int argc, char *argv[])
{
Q_INIT_RESOURCE(qthpconnect);
QApplication a(argc, argv);
QCoreApplication::setOrganizationName("");
QCoreApplication::setApplicationName("Linux QtHP Connect");
QCoreApplication::setApplicationVersion(HP_VERSION_STRING);
QCommandLineParser parser;
MainWindow w;
parser.setApplicationDescription(QCoreApplication::applicationName());
//REWORK
parser.addHelpOption();
parser.addVersionOption();
// parser.addPositionalArgument("file", "The file to open.");
parser.process(a);
// a.setQuitLockEnabled(true);
// if (!parser.positionalArguments().isEmpty())
// w.loadFile(parser.positionalArguments().first());
w.show();
a.exec();
qDebug()<<"Main.cpp:: closing main";
return 1;
}

1083
source/mainwindow.cpp Normal file

File diff suppressed because it is too large Load diff

698
source/mainwindow.ui Normal file
View file

@ -0,0 +1,698 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<author>Ian Gebbie</author>
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>919</width>
<height>584</height>
</rect>
</property>
<property name="windowTitle">
<string>Linux HP Connect</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QMdiArea" name="mdiArea">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>500</width>
<height>0</height>
</size>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAsNeeded</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>919</width>
<height>23</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<widget class="QMenu" name="menuFile">
<property name="title">
<string>Fi&amp;le</string>
</property>
<addaction name="actionExit"/>
</widget>
<widget class="QMenu" name="menuEdit">
<property name="title">
<string>Edit</string>
</property>
<addaction name="separator"/>
<addaction name="actionPreferences"/>
</widget>
<widget class="QMenu" name="menuWindow">
<property name="title">
<string>Wi&amp;ndow</string>
</property>
<addaction name="actionClose"/>
<addaction name="actionClose_all"/>
<addaction name="separator"/>
<addaction name="actionTile"/>
<addaction name="actionCascade"/>
<addaction name="separator"/>
<addaction name="actionNext"/>
<addaction name="actionPrevious"/>
<addaction name="separator"/>
<addaction name="actionMessages"/>
<addaction name="actionMonitor"/>
<addaction name="actionCalculators"/>
<addaction name="actionContent"/>
<addaction name="actionLog"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
<addaction name="actionAbout_HP_Connect"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
<addaction name="menuWindow"/>
<addaction name="menuHelp"/>
</widget>
<widget class="QDockWidget" name="dwCalculator">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>184</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>524287</width>
<height>524287</height>
</size>
</property>
<property name="baseSize">
<size>
<width>300</width>
<height>200</height>
</size>
</property>
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="QWidget" name="wCalculator">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>150</height>
</size>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QTreeView" name="tvCalculators">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="contextMenuPolicy">
<enum>Qt::ActionsContextMenu</enum>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Calculator View&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="lineWidth">
<number>2</number>
</property>
<property name="midLineWidth">
<number>1</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
<addaction name="actionCalculators"/>
<addaction name="actionContent"/>
<addaction name="actionSave"/>
<addaction name="actionSave_All"/>
<addaction name="actionCreateNew"/>
<addaction name="separator"/>
<addaction name="actionMonitor"/>
<addaction name="actionMessages"/>
<addaction name="separator"/>
<addaction name="actionOpen"/>
<addaction name="separator"/>
<addaction name="actionTest"/>
<addaction name="actionTestSettings"/>
<addaction name="actionTestScreen"/>
<addaction name="actionRefresh"/>
</widget>
<widget class="QDockWidget" name="dwContent">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>300</width>
<height>130</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>524287</width>
<height>524287</height>
</size>
</property>
<attribute name="dockWidgetArea">
<number>1</number>
</attribute>
<widget class="QWidget" name="wContent">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTreeView" name="tvContent">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;File View&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectItems</enum>
</property>
<property name="indentation">
<number>15</number>
</property>
<attribute name="headerCascadingSectionResizes">
<bool>true</bool>
</attribute>
<attribute name="headerMinimumSectionSize">
<number>47</number>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>150</number>
</attribute>
<attribute name="headerHighlightSections">
<bool>true</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>false</bool>
</attribute>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QDockWidget" name="dwMessenger">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>150</width>
<height>524287</height>
</size>
</property>
<attribute name="dockWidgetArea">
<number>2</number>
</attribute>
<widget class="QWidget" name="wMessage">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="teMessage"/>
</item>
</layout>
</widget>
</widget>
<widget class="QDockWidget" name="dwMonitor">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<attribute name="dockWidgetArea">
<number>2</number>
</attribute>
<widget class="QWidget" name="wMonitor">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QGridLayout" name="wMonitorGrid" rowstretch="0" columnstretch="0" rowminimumheight="0"/>
</item>
</layout>
</widget>
</widget>
<widget class="QStatusBar" name="statusBar">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>100</horstretch>
<verstretch>20</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>20</height>
</size>
</property>
<property name="toolTip">
<string extracomment="Status"/>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
</widget>
<action name="actionCut">
<property name="icon">
<iconset theme="cut" resource="qthpconnect.qrc">
<normaloff>:/icons/cut_32x32.png</normaloff>:/icons/cut_32x32.png</iconset>
</property>
<property name="text">
<string>&amp;Cut</string>
</property>
<property name="font">
<font/>
</property>
</action>
<action name="actionCopy">
<property name="icon">
<iconset theme="action_copy" resource="qthpconnect.qrc">
<normaloff>:/icons/copy_32x32.png</normaloff>:/icons/copy_32x32.png</iconset>
</property>
<property name="text">
<string>C&amp;opy</string>
</property>
<property name="font">
<font/>
</property>
</action>
<action name="actionPaste">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/paste_32x32.png</normaloff>:/icons/paste_32x32.png</iconset>
</property>
<property name="text">
<string>&amp;Paste</string>
</property>
</action>
<action name="actionClose">
<property name="text">
<string>&amp;Close</string>
</property>
</action>
<action name="actionClose_all">
<property name="text">
<string>C&amp;lose all</string>
</property>
</action>
<action name="actionTile">
<property name="text">
<string>&amp;Tile</string>
</property>
</action>
<action name="actionCascade">
<property name="text">
<string>Ca&amp;scade</string>
</property>
</action>
<action name="actionNext">
<property name="text">
<string>&amp;Next</string>
</property>
</action>
<action name="actionMessages">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/chat_32x32.png</normaloff>:/icons/chat_32x32.png</iconset>
</property>
<property name="text">
<string>&amp;Messages</string>
</property>
</action>
<action name="actionMonitor">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/monitor_32x32.png</normaloff>:/icons/monitor_32x32.png</iconset>
</property>
<property name="text">
<string>M&amp;onitor</string>
</property>
</action>
<action name="actionCalculators">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/calc_tree_32x32.png</normaloff>:/icons/calc_tree_32x32.png</iconset>
</property>
<property name="text">
<string>Calc&amp;ulators</string>
</property>
</action>
<action name="actionAbout_HP_Connect">
<property name="icon">
<iconset theme="about" resource="qthpconnect.qrc">
<normaloff>:/icons/about_32x32.png</normaloff>:/icons/about_32x32.png</iconset>
</property>
<property name="text">
<string>&amp;About HP Connect</string>
</property>
<property name="font">
<font/>
</property>
</action>
<action name="actionPreferences">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/preferences_32x32.png</normaloff>:/icons/preferences_32x32.png</iconset>
</property>
<property name="text">
<string>P&amp;references</string>
</property>
<property name="font">
<font/>
</property>
</action>
<action name="actionPrevious">
<property name="text">
<string>&amp;Previous</string>
</property>
</action>
<action name="actionContent">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/content_32x32.png</normaloff>:/icons/content_32x32.png</iconset>
</property>
<property name="text">
<string>Cont&amp;ent</string>
</property>
</action>
<action name="actionSave">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/save_32x32.png</normaloff>:/icons/save_32x32.png</iconset>
</property>
<property name="text">
<string>Save</string>
</property>
</action>
<action name="actionSave_All">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/save_all_32x32.png</normaloff>:/icons/save_all_32x32.png</iconset>
</property>
<property name="text">
<string>Save All</string>
</property>
</action>
<action name="actionCreateNew">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/add_new_32x32.png</normaloff>:/icons/add_new_32x32.png</iconset>
</property>
<property name="text">
<string>CreateNew</string>
</property>
<property name="toolTip">
<string>Create New </string>
</property>
</action>
<action name="actionExit">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/delete_32x32.png</normaloff>:/icons/delete_32x32.png</iconset>
</property>
<property name="text">
<string>&amp;Exit</string>
</property>
</action>
<action name="actionOpen">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/add_icon_32x32.png</normaloff>:/icons/add_icon_32x32.png</iconset>
</property>
<property name="text">
<string>Open</string>
</property>
</action>
<action name="actionLog">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/note_32x32.png</normaloff>:/icons/note_32x32.png</iconset>
</property>
<property name="text">
<string>Lo&amp;g</string>
</property>
</action>
<action name="actionTest">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/clone_to_32x32.png</normaloff>:/icons/clone_to_32x32.png</iconset>
</property>
<property name="text">
<string>Test</string>
</property>
<property name="toolTip">
<string>Test Button</string>
</property>
</action>
<action name="actionTreePreference">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/preferences_32x32.png</normaloff>:/icons/preferences_32x32.png</iconset>
</property>
<property name="text">
<string>TreePreference</string>
</property>
</action>
<action name="actionTestSettings">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/preferences_32x32.png</normaloff>:/icons/preferences_32x32.png</iconset>
</property>
<property name="text">
<string>TestSettings</string>
</property>
</action>
<action name="actionTestScreen">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/add_background_32x32.png</normaloff>:/icons/add_background_32x32.png</iconset>
</property>
<property name="text">
<string>TestScreen</string>
</property>
<property name="toolTip">
<string>Test get Screen Function</string>
</property>
</action>
<action name="actionRefresh">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/refresh_32x32.png</normaloff>:/icons/refresh_32x32.png</iconset>
</property>
<property name="text">
<string>Refresh</string>
</property>
</action>
<action name="actionSettings">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/preferences_32x32.png</normaloff>:/icons/preferences_32x32.png</iconset>
</property>
<property name="text">
<string>Settings</string>
</property>
</action>
<action name="actionFileOpen">
<property name="icon">
<iconset>
<normalon>:/icons/open_16x16.png</normalon>
</iconset>
</property>
<property name="text">
<string>&amp;Open</string>
</property>
<property name="toolTip">
<string>Open a file</string>
</property>
<property name="shortcut">
<string>Alt+O</string>
</property>
</action>
<action name="actionFileDelete">
<property name="icon">
<iconset>
<normalon>:/icons/delete_16x16.png</normalon>
</iconset>
</property>
<property name="text">
<string>&amp;Delete</string>
</property>
<property name="toolTip">
<string>Delete a file</string>
</property>
<property name="shortcut">
<string>Alt+D</string>
</property>
</action>
<action name="actionFileRename">
<property name="icon">
<iconset>
<normalon>:/icons/rename_16x16.png</normalon>
</iconset>
</property>
<property name="text">
<string>&amp;Rename</string>
</property>
<property name="toolTip">
<string>Rename a file</string>
</property>
<property name="shortcut">
<string>Alt+R</string>
</property>
</action>
<action name="actionCalcOpen">
<property name="icon">
<iconset>
<normalon>:/icons/open_16x16.png</normalon>
</iconset>
</property>
<property name="text">
<string>&amp;Open</string>
</property>
<property name="toolTip">
<string>Open a file</string>
</property>
<property name="shortcut">
<string>Alt+O</string>
</property>
</action>
<action name="actionCalcDelete">
<property name="icon">
<iconset>
<normalon>:/icons/delete_16x16.png</normalon>
</iconset>
</property>
<property name="text">
<string>&amp;Delete</string>
</property>
<property name="toolTip">
<string>Delete a file</string>
</property>
<property name="shortcut">
<string>Alt+D</string>
</property>
</action>
<action name="actionCalcRename">
<property name="icon">
<iconset>
<normalon>:/icons/rename_16x16.png</normalon>
</iconset>
</property>
<property name="text">
<string>&amp;Rename</string>
</property>
<property name="toolTip">
<string>Rename a file</string>
</property>
<property name="shortcut">
<string>Alt+R</string>
</property>
</action>
<action name="actionNewFolder">
<property name="icon">
<iconset resource="qthpconnect.qrc">
<normaloff>:/icons/new_folder_16x16.png</normaloff>:/icons/new_folder_16x16.png</iconset>
</property>
<property name="text">
<string>Folder</string>
</property>
<property name="toolTip">
<string>Create a New Folder</string>
</property>
</action>
<action name="actionNew_Note">
<property name="text">
<string>New Note</string>
</property>
</action>
<action name="actionNew_Program">
<property name="text">
<string>New Program</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="qthpconnect.qrc"/>
</resources>
<connections/>
</ui>

310
source/matrixdata.cpp Normal file
View file

@ -0,0 +1,310 @@
/*
* QtHP Connect: hand-helds support interface.
* Copyright (C) 2019 Ian Gebbie
* Code patterns and snippets borrowed from libhpcalcs :
* Copyright (C) 1999-2009 Romain Li<EFBFBD>vin
* Copyright (C) 2009-2013 Lionel Debroux
* Copyright (C) 1999-2013 libti* contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <QDebug>
#include "matrixdata.h"
extern bool BCD(QDataStream &ds, double real) ;
MatrixData::MatrixData()
{
// clear();
qDebug()<<"MatrixData Construct";
}
//Return the item or a zero item
itemData MatrixData::at(int row, int column)
{
QList<itemData> * rowlist;
itemData item;
if (row<matrix.size()) {
rowlist=matrix.at(row);
if (rowlist) {
if (column<rowlist->size()) {
item=rowlist->at(column);
}
}
}
return item;
}
//Insert a new item and resize the list if larger
void MatrixData::insert(int row, int column, itemData data)
{
QList<itemData> * rowlist=nullptr;
upsize(row+1,column+1);
if(row<matrix.size())
rowlist=matrix.at(row);
if(rowlist) {
rowlist->replace(column,data);
}
}
//Add a new row
void MatrixData::addRow(int row)
{
int rows;
int i;
QList<itemData> * rowlist;
// qDebug()<<"MatrixData::addRow" << row;
rows=matrix.size();
if (rows<=row)
{
for (i=rows; i<=row;i++) {
// qDebug()<<"MatrixData::addRow "<<i;
rowlist = new QList<itemData>;
matrix.insert(i,rowlist);
}
}
}
bool MatrixData::dataOut(QDataStream & ds) {
int row;
int column;
int i,j=0;
qDebug()<<"MatrixData::dataOut(ds)";
row=rows();
column=columns();
itemData item;
QString str;
//header
static const quint8 mydata[] = {0x02, 0x01, 0x04,0x03,0x06,0x05,0x08,0x07};
QByteArray test= QByteArray::fromRawData((char *)mydata,sizeof (mydata));
ds<<static_cast<quint16>(0x0001);
ds<<static_cast<quint16>(0x8014);
ds<<static_cast<quint16>(0x0002);
ds<<static_cast<quint16>(0x0000);
ds<<static_cast<quint32>(row);
ds<<static_cast<quint32>(column);
// ds<<static_cast<quint8>(0x30);
// ds<<static_cast<quint8>(0x31);
// qDebug()<<test;
//body
double real;
for (i=0;i<row;i++) {
for (j=0;j<column;j++) {
item=at(i,j);
real=item.dReal;
BCD(ds,real);
// if(j!=column)
// out.append("");
}
// if (i!=row)
// out.append("");
}
//footer
return true;
}
//get all columns to same size by padding it zero items
void MatrixData::resize(int newrow,int newcol) {
QList<itemData> * row;
int rows=0;
int maxrows=0;
int columns=0;
int maxcolumns=0;
int i;
int j;
qDebug()<<"MatrixData::resize";
itemData item;
rows = matrix.size();
qDebug()<<"MatrixData::resize - maxcolumns "<<maxcolumns;
//decrease rows if not requiered
for(i=0;i<rows;i++) {
if (i>newrow) {
matrix.removeAt(i);
}
}
//increase rows to match
if(newrow>rows) {
for(i=rows;i<newrow;i++) {
addRow(i);
}
}
rows = matrix.size();
qDebug()<<"MatrixData::resize - rows "<<rows;
//match colums
for(i=0;i<rows;i++) {
columns=matrix.at(i)->size();
if (columns<newcol) {
row=matrix.at(i);
for(j=columns;j<maxcolumns; j++) {
row->insert(j,item);
}
}
if (columns>newcol) {
row=matrix.at(i);
if (row) {
for(j=columns;j<maxcolumns; j++) {
row->removeAt(j);
}
}
}
}
}
//get all columns to same size by padding it zero items
void MatrixData::upsize(int newrow,int newcol) {
QList<itemData> * row;
int rows=0;
int columns=0;
int i;
int j;
qDebug()<<"MatrixData::upsize";
itemData item;
item.sValue=QStringLiteral("0");
rows = matrix.size();
// qDebug()<<"MatrixData::upsize - rows:"<<newrow<<" columns:"<<newcol;
//increase rows to match
if(rows<newrow) {
for(i=rows;i<newrow;i++) {
addRow(i);
}
}
rows = matrix.size();
// qDebug()<<"MatrixData::upsize - rows "<<rows;
//match colums
for(i=0;i<rows;i++) {
row=matrix.at(i);
if (row) {
columns=row->size();
for(j=columns;j<newcol; j++) {
if (j<newcol) {
// qDebug()<<"MatrixData::upsize - column "<<newcol<<" at"<<j;
row->insert(j,item);
}
}
}
else {
qDebug()<<"MatrixData::upsize - Null row!";
}
}
}
//get all columns to same size by padding it zero items
void MatrixData::matchsize() {
QList<itemData> * row;
int rows=0;
int maxrows=0;
int columns=0;
int maxcolumns=0;
int i;
int j;
qDebug()<<"MatrixData::matchsize";
itemData item;
rows = matrix.size();
for(i=0;i<rows;i++) {
columns=matrix.at(i)->size();
if (maxcolumns<columns)
maxcolumns=columns;
}
qDebug()<<"MatrixData::matchsize - maxcolumns "<<maxcolumns;
for(i=0;i<rows;i++) {
columns=matrix.at(i)->size();
if (columns<maxcolumns) {
row=matrix.at(i);
for(j=columns;j<maxcolumns; j++) {
row->insert(j,item);
}
}
}
}
void MatrixData::clear()
{
int i;
int r;
QList<itemData> * row;
r=rows();
for(i=0; i<r;i++) {
row=matrix.at(i);
if (row) {
row->clear();
delete row;
}
}
matrix.clear();
}
int MatrixData::columns()
{
QList<itemData> * row;
if (matrix.size()>0) {
row=matrix.at(0);
if (row) {
qDebug()<<"MatrixData: column "<<row->size();
return row->size();
}
}
return 0;
}
int MatrixData::rows()
{
qDebug()<<"MatrixData: row"<<matrix.size();
matrix.size();
}
MatrixData::~MatrixData()
{
qDebug()<<"Entering ~MatrixData()";
clear();
}

56
source/options.cpp Normal file
View file

@ -0,0 +1,56 @@
/*
* QtHP Connect: hand-helds support interface.
* Copyright (C) 2019 Ian Gebbie
* Code patterns and snippets borrowed from libhpcalcs :
* Copyright (C) 1999-2009 Romain Li<EFBFBD>vin
* Copyright (C) 2009-2013 Lionel Debroux
* Copyright (C) 1999-2013 libti* contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "options.h"
#include "ui_options.h"
#include "global.h"
#include <QSettings>
Options::Options(QWidget *parent) :
QDialog(parent),
ui(new Ui::Options)
{
ui->setupUi(this);
QString path;
QSettings appSettings("IRGP","QtHPconnect");
path=appSettings.value("contentPath").toString();
ui->filePath->setText(path);
}
void Options::accept() {
QString path;
path=ui->filePath->text();
QSettings appSettings("IRGP","QtHPconnect");
appSettings.setValue("contentPath",path);
QDialog::accept();
}
void Options::reject() {
QDialog::reject();
}
Options::~Options()
{
qDebug()<<"~Options()";
delete ui;
}

135
source/options.ui Normal file
View file

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Options</class>
<widget class="QDialog" name="Options">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="geometry">
<rect>
<x>10</x>
<y>440</y>
<width>621</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
<widget class="QFrame" name="frame">
<property name="geometry">
<rect>
<x>10</x>
<y>20</y>
<width>621</width>
<height>91</height>
</rect>
</property>
<property name="toolTip">
<string extracomment="Set Global Settings"/>
</property>
<property name="statusTip">
<string extracomment="Set Global Settings"/>
</property>
<property name="whatsThis">
<string extracomment="Set Global Settings"/>
</property>
<property name="accessibleName">
<string extracomment="Settings"/>
</property>
<property name="accessibleDescription">
<string extracomment="Global Settings"/>
</property>
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<widget class="QLineEdit" name="filePath">
<property name="geometry">
<rect>
<x>80</x>
<y>40</y>
<width>521</width>
<height>32</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>58</width>
<height>51</height>
</rect>
</property>
<property name="text">
<string>File Path:</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>141</width>
<height>18</height>
</rect>
</property>
<property name="text">
<string>Environment</string>
</property>
</widget>
</widget>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>Options</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Options</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

165
source/texteditor.cpp Normal file
View file

@ -0,0 +1,165 @@
/*
* This file is part of the QtHPConnect distribution (https://github.com/Indy970/QtHPConnect.git).
* Copyright (c) 2020 Ian Gebbie.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 or later.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "texteditor.h"
#include <QtWidgets>
#include <QRect>
#include <QSettings>
textEditor::textEditor(QWidget *parent) :
QTextEdit(parent)
{
QSettings appSettings("IRGP","QtHPconnect");
wParent = parent;
setAttribute(Qt::WA_DeleteOnClose);
// setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
isUntitled = true;
defaultPath=QDir(appSettings.value("contentPath").toString());
qDebug()<<defaultPath;
}
/*
void textEditor::newFile()
{
static int sequenceNumber = 1;
isUntitled = true;
curFile = tr("document%1.txt").arg(sequenceNumber++);
setWindowTitle(curFile + "[*]");
connect(document(), &QTextDocument::contentsChanged,
this, &textEditor::documentWasModified);
}
*/
/*
bool textEditor::loadFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, tr("MDI"),
tr("Cannot read file %1:\n%2.")
.arg(fileName)
.arg(file.errorString()));
return false;
}
QTextStream in(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
setPlainText(in.readAll());
QApplication::restoreOverrideCursor();
setCurrentFile(fileName);
connect(document(), &QTextDocument::contentsChanged,
this, &textEditor::documentWasModified);
return true;
}
*/
bool textEditor::save(QString Calculator)
{
if (isUntitled) {
return saveAs(Calculator);
} else {
return saveFile(curFile);
}
}
bool textEditor::save(QFileInfo file)
{
if (isUntitled) {
return saveAs(file);
} else {
return saveFile(curFile);
}
}
bool textEditor::saveAs(QFileInfo fileinfo)
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
fileinfo.absoluteFilePath());
if (fileName.isEmpty())
return false;
return saveFile(fileName);
}
bool textEditor::saveAs(QString calculaor)
{
// QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"),
// fileinfo.absoluteFilePath());
QString fileName=curFile;
if (fileName.isEmpty())
return false;
return saveFile(fileName);
}
bool textEditor::saveFile(const QString &fileName)
{
QFileInfo fileinfo(defaultPath,fileName);
QFile file(fileinfo.absoluteFilePath());
if (!file.open(QFile::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, tr("MDI"),
tr("Cannot write file %1:\n%2.")
.arg(QDir::toNativeSeparators(fileName), file.errorString()));
return false;
}
QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
out << toPlainText();
QApplication::restoreOverrideCursor();
setCurrentFile(fileName);
return true;
}
QString textEditor::userFriendlyCurrentFile()
{
return strippedName(curFile);
}
void textEditor::documentWasModified()
{
setWindowModified(document()->isModified());
}
void textEditor::setCurrentFile(const QString &fileName)
{
curFile = QFileInfo(fileName).canonicalFilePath();
isUntitled = false;
document()->setModified(false);
setWindowModified(false);
setWindowTitle(userFriendlyCurrentFile() + "[*]");
}
QString textEditor::strippedName(const QString &fullFileName)
{
return QFileInfo(fullFileName).fileName();
}
textEditor::~textEditor() {
qDebug()<<"textEditor:: delete";
}

607
source/treemodel.cpp Normal file
View file

@ -0,0 +1,607 @@
/*
* QtHP Connect: hand-helds support interface.
* Copyright (C) 2019 Ian Gebbie
* Code patterns and snippets borrowed from libhpcalcs :
* Copyright (C) 1999-2009 Romain Li<EFBFBD>vin
* Copyright (C) 2009-2013 Lionel Debroux
* Copyright (C) 1999-2013 libti* contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
//
// Model to contain the calculator data structure
//
#include "treemodel.h"
#include "hptreeitem.h"
#include <hp_infodialog.h>
#include <hp_mdivariableedit.h>
#include <hp_mditexteditor.h>
#include <QStringListModel>
#include <QMimeData>
//Constructor
treeModel::treeModel(QObject *parent)
:QStandardItemModel(parent)
{
setItemPrototype(new hpTreeItem());
createRoot();
setParent(parent);
}
//Create the start of the tree
int treeModel::createRoot()
{
rootNode = invisibleRootItem();
return 0;
}
//Create Item
AbstractData * treeModel::createData(hp_Data data_in) {
AbstractData * obj=nullptr;
errlog("TreeModel::Creating Data Stucture");
switch (data_in.type) {
case HP_APP: {
qDebug()<<"hpCalcData::recvData - Application";
Application * obj = new Application(data_in.name,data_in.type);
return obj;
}
break;
case HP_LIST: {
List * obj = new List(data_in.name,data_in.type);
return obj;
}
break;
case HP_MATRIX: {
qDebug()<<"hpCalcData::recvData - Matrix";
Matrix * obj = new Matrix(data_in.name,data_in.type);
return obj;
}
break;
}
return obj;
}
//Rework - name should be calc name
int treeModel::addCalculator(QString name, hpusb * handle){
hpCalcData * hpData = new hpCalcData(name, handle);
hpTreeItem * hpCalc = new hpTreeItem(name,hpData,0);
hpCalc->setType(HP_MAIN);
hpCalc->setIcon(QIcon(":/icons/monitor_32x32.png"));
hpCalc->setToolTip(QString("Calculator contents"));
QObject::connect(hpData, SIGNAL(dataChanged(hp_Change)),hpCalc, SLOT(dataChange(hp_Change)));
if (parent()!=nullptr)
QObject::connect(hpData, SIGNAL(dataChanged(hp_Change)),parent(), SLOT(dataChange(hp_Change)));
setHpCalcData(name,hpData,hpCalc);
rootNode->appendRow(hpCalc);
hpData->readInfo();
return 0;
}
//return the calculator data within the model
hpCalcData * treeModel::getCalculator(QString name){
hpDataLink hplink;
hpCalcData * hpdata = nullptr;
if (!hpCalcList.isEmpty()) {
QMap<QString, hpDataLink>::const_iterator i = hpCalcList.find(name);
if (i!=hpCalcList.end()) {
hplink = i.value();
hpdata= hplink.dataItem;
}
}
return hpdata;
}
void treeModel::clickAction(QMdiArea * mdiwin,QModelIndex &index) {
qDebug()<<"row "<<index.row()<<" column "<<index.column();
return openFile(mdiwin,index);
}
void treeModel::openFile(QMdiArea * mdiwin, QModelIndex &index) {
qDebug()<<"treeModel::openFile";
hp_mdiTextEdit * hptextedit = nullptr;
AbstractData * data=nullptr;
hpTreeItem * item=nullptr;
QString calc;
QString name;
hp_DataType type;
hp_Information hpinfo;
hp_infoDialog * hpinfodlg=nullptr;
hpCalcData * hpdata=nullptr;
hp_mdiVariableEdit * hpvaredit=nullptr;
item = static_cast<hpTreeItem *>(itemFromIndex(index));
data=getData(index);
if ((data!=nullptr)&&(item!=nullptr)) {
calc=item->getCalculatorName();
name=item->getFileName();
type=data->getType();
hpdata=getHpCalcData(calc);
switch (type) {
case HP_MAIN: {
hpinfo=hpdata->getInfo();
hpinfodlg = new hp_infoDialog(mdiwin,hpinfo);
hpinfodlg->show();
}
break;
case HP_NOTE:
case HP_PROG: {
if (hptextedit==nullptr)
hptextedit = new hp_mdiTextEdit(mdiwin,item, data);
if (hptextedit!=nullptr)
hptextedit ->show();
}
break;
case HP_CAS:
case HP_REAL:
case HP_COMPLEX:
case HP_LIST:
case HP_MATRIX: {
if (hpvaredit==nullptr) {
if (data!=nullptr) {
hpvaredit = new hp_mdiVariableEdit(mdiwin,item,hpdata);
}
}
if (hpvaredit!=nullptr)
hpvaredit ->show();
}
break;
}
}
else {
qDebug()<<"Null data";
}
return;
}
void treeModel::renameFile(QModelIndex &index,QString newName) {
qDebug()<<"treeModel::renameFile";
AbstractData * adata=nullptr;
hpTreeItem * item=nullptr;
QString calc;
QString name;
hp_DataType type;
hpCalcData * hpdata=nullptr;
qDebug()<<"row "<<index.row()<<" column "<<index.column();
if (index.isValid()) {
item = static_cast<hpTreeItem *>(itemFromIndex(index));
if (item!=nullptr) {
calc=item->getCalculatorName();
name=item->getFileName();
qDebug()<<name;
type=item->getType();
hpdata=getHpCalcData(calc);
if (hpdata!=nullptr) {
adata=hpdata->getData(name,type);
}
else {
qDebug()<<"treeModel::renameFile hpdata is null";
}
//
item->setFileName(newName);
adata->setName(newName);
//
}
else {
qDebug()<<"Null data";
}
}
else {
qDebug()<<"treeModel::renameFile invalid index";
}
}
void treeModel::deleteFile( QModelIndex &index) {
qDebug()<<"treeModel::deleteFile";
AbstractData * adata=nullptr;
hpTreeItem * item=nullptr;
QString calc;
QString name;
hp_DataType type;
hpCalcData * hpdata=nullptr;
if (index.isValid()) {
item = static_cast<hpTreeItem *>(itemFromIndex(index));
if (item!=nullptr) {
calc=item->getCalculatorName();
name=item->getFileName();
qDebug()<<name;
type=item->getType();
hpdata=getHpCalcData(calc);
if (hpdata!=nullptr) {
adata=hpdata->getData(name,type);
}
else {
qDebug()<<"treeMoel::deletFile hpdata is null";
}
//
//delete hpTreeItem
// qDebug()<<"row "<<index.row()<<" column "<<index.column();
if (removeRow(index.row(),index.parent()))
{
//qDebug()<<"Deleted";
}
else {
qDebug()<<"Removal failed";
}
//delete Data
hpdata->deleteData(adata);
}
else {
qDebug()<<"Null data";
}
}
else {
qDebug()<<"treeMoel::deleteFile invalid index";
}
}
//return the calculator data within the model
hpTreeItem * treeModel::getCalculatorItem(QString name){
hpDataLink hplink;
hpTreeItem * hpitem = nullptr;
if (!hpCalcList.isEmpty()) {
QMap<QString, hpDataLink>::const_iterator i = hpCalcList.find(name);
if (i!=hpCalcList.end()) {
hplink = i.value();
hpitem= hplink.treeItem;
}
}
return hpitem;
}
//index system for data retrieval
//review QStandardItemModel should already have one in place
QString treeModel::getLastDataKey() {
if (hpCalcList.isEmpty())
return QStringLiteral("");
else
return hpCalcList.lastKey();
}
//manage link between tree and data
//A map stores the treeItem, dataItem and in future perhaps the handle in a list
// retrievable by a string key
hpCalcData * treeModel::getHpCalcData(QString name) const {
hpDataLink hplink;
hpCalcData * hpdata=nullptr;
if (!hpCalcList.isEmpty()) {
QMap<QString, hpDataLink>::const_iterator i = hpCalcList.find(name);
if (i!=hpCalcList.end()) {
hplink = i.value();
hpdata= hplink.dataItem;
}
}
return hpdata;
}
//manage link between tree and data
void treeModel::setHpCalcData(QString name, hpCalcData * data, hpTreeItem * tree ){
hpDataLink hplink;
hplink.dataItem=data;
hplink.treeItem=tree;
hpCalcList.insert(name,hplink);
return;
}
//Part the the drag and drop system
Qt::DropActions treeModel::supportedDropActions() const
{
return Qt::CopyAction | Qt::MoveAction | Qt::TargetMoveAction;
}
QString treeModel::getName(QModelIndex index) const {
QString calc;
QString name=QStringLiteral("None");
hpTreeItem * item=nullptr;
if (index.isValid()) {
item = static_cast<hpTreeItem *>(itemFromIndex(index));
if (item!=nullptr) {
calc=item->getCalculatorName();
name=item->getFileName();
}
}
return name;
}
//Return the data object belonging to an item
AbstractData * treeModel::getData(QModelIndex index) const {
AbstractData * adata=nullptr;
QString calc;
QString name;
hp_DataType type;
hpTreeItem * item=nullptr;
hpCalcData * hpdata=nullptr;
if (index.isValid()) {
item = static_cast<hpTreeItem *>(itemFromIndex(index));
if (item!=nullptr) {
calc=item->getCalculatorName();
name=item->getFileName();
qDebug()<<name;
type=item->getType();
hpdata=getHpCalcData(calc);
if (hpdata!=nullptr) {
adata=hpdata->getData(name,type);
}
else {
qDebug()<<"treeMoel::getData hpdata is null";
}
}
else {
qDebug()<<"treeMoel::getData item is null";
}
}
else {
qDebug()<<"treeMoel::getData invalid index";
}
return adata;
}
//Get and pass on the data to be dragged
QMimeData* treeModel::mimeData(const QModelIndexList &indexes) const
{
QMimeData *mimeDataPtr = new QMimeData();
AbstractData * adata = nullptr;
QByteArray mydata;
QByteArray datatype;
QModelIndex index;
qDebug()<<"treeModel::mimeData";
for(int i =0; i<indexes.count(); i++)
{
index = indexes.at(i);
adata = getData(index);
if (adata!=nullptr) {
qDebug()<<"Data "<<adata->getType();
mydata = adata->getData();
mimeDataPtr->setText(adata->getName());
datatype[0] = adata->getType();
mimeDataPtr->setData("application/x-type",datatype);
mimeDataPtr->setData("application/x-qabstractmodeldatalist",mydata);
}
else {
qDebug()<<"treeModel::mimeData No Data";
}
}
return mimeDataPtr;
}
//Allow drop in location
bool treeModel::canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const
{
return true;
}
//Process the drop action
bool treeModel::dropMimeData(const QMimeData* md_data, Qt::DropAction action, int row,
int column, const QModelIndex &index)
{
QByteArray data_in;
AbstractData * absitem;
qDebug()<<"treemodel::DropMineData "<<row<<" "<<column;
if (action == Qt::IgnoreAction) {
qDebug()<<"treemodel::IgnoreAction";
return true;
}
hpTreeItem * item=nullptr;
item = static_cast<hpTreeItem *>(itemFromIndex(index));
if (item!=nullptr) {
hp_DataType type=HP_MAIN;
QStringList formatList;
QString mimeType;
formatList=md_data->formats();
foreach(const QString& format, formatList) {
qDebug()<<format;
for(int i = HP_MAIN; i < HP_SETTINGS; i++) {
mimeType=mimetypes[i][1];
qDebug()<<mimeType;
if( mimeType==format) {
type=static_cast<hp_DataType>(i);
break;
}
}
}
if ( type!=HP_MAIN) {
QString name=md_data->text();
data_in=md_data->data(mimetypes[type][1]);
QDataStream in(&data_in,QIODevice::ReadOnly);
qDebug()<<"Type="<<type;
switch(type) {
case HP_NOTE: {
absitem = new Notes(name, HP_NOTE,QStringLiteral(""));
absitem->parseData(in);
break;
}
case HP_LIST: {
absitem = new List(name, HP_LIST);
absitem->parseData(in);
break;
}
case HP_MATRIX: {
absitem = new Matrix(name, HP_MATRIX);
absitem->parseData(in);
break;
}
case HP_PROG: {
absitem = new Program(name, HP_PROG, QStringLiteral(""));
absitem->parseData(in);
break;
}
case HP_VAR: {
absitem = new Variables(name, HP_VAR);
absitem->parseData(in);
break;
}
}
QString calc = item->getCalculatorName();
addItem(calc,absitem);
// qDebug()<<"treemodel::dropMimeData End";
}
else {
qDebug()<<"treemodel::sropMimeData type not found "<<type;
return false;
}
}
return true;
}
//Find the hpTreeItem of a type in a calculator
hpTreeItem * treeModel::findTypeRoot(QString calcName, hp_DataType type) {
qDebug()<<calcName;
hpTreeItem * calc=getCalculatorItem(calcName);
hpTreeItem *item;
// qDebug()<<calc->getGroupName();
QModelIndex in = calc->index();
for (int e = 0; e<calc->rowCount(); e++) {
QModelIndex si=index(e,0,in);
item = static_cast<hpTreeItem *>(itemFromIndex(si));
if(item->getType()==type) {
return item;
}
}
return nullptr;
}
//add an object to the correct place in the tree of a calaculator
int treeModel::addItem(QString calc, AbstractData * obj) {
hp_DataType type;
hpCalcData * hpdata;
if (obj!=nullptr) {
type = obj->getType();
}
else {
return -1;
}
hpTreeItem * rootitem = findTypeRoot(calc,type);
if(rootitem!=nullptr) {
hpdata=rootitem->getDataStore();
}
else {
return -1;
}
rootitem->addChild(obj);
hpdata->addData(obj);
return 0;
}
int treeModel::deleteItem(hpCalcData* hpcalc, AbstractData * obj) {
}
Qt::ItemFlags treeModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index);
if (index.isValid())
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
else
return Qt::ItemIsDropEnabled | defaultFlags;
}
int deletCalculator(QString name, hpusb * handle) {
}
int treeModel::deleteAllCalculators() {
hpDataLink hplink;
hpCalcData * hpdata = nullptr;
foreach(QString key, hpCalcList.keys()) {
QMap<QString, hpDataLink>::const_iterator i = hpCalcList.find(key);
hplink=i.value();
delete(hplink.dataItem);
hpCalcList.remove(key);
}
hpCalcList.clear();
return 0;
}
treeModel::~treeModel() {
deleteAllCalculators();
qDebug()<<"treeModel:: delete";
}

37
source/variableview.cpp Normal file
View file

@ -0,0 +1,37 @@
/*
* QtHP Connect: hand-helds support interface.
* Copyright (C) 2019 Ian Gebbie
* Code patterns and snippets borrowed from libhpcalcs :
* Copyright (C) 1999-2009 Romain Li<EFBFBD>vin
* Copyright (C) 2009-2013 Lionel Debroux
* Copyright (C) 1999-2013 libti* contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include "variableview.h"
#include "ui_variableview.h"
#include <QDebug>
variableView::variableView(QWidget *)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
}
variableView::~variableView()
{
qDebug()<<"delete variableView";
delete ui;
}

28
source/variableview.ui Normal file
View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>variableView</class>
<widget class="QWidget" name="variableView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>347</width>
<height>358</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTableView" name="variableList">
<property name="enabled">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

308
source/vartablemodel.cpp Normal file
View file

@ -0,0 +1,308 @@
/*
* QtHP Connect: hand-helds support interface.
* Copyright (C) 2019 Ian Gebbie
* Code patterns and snippets borrowed from libhpcalcs :
* Copyright (C) 1999-2009 Romain Li<EFBFBD>vin
* Copyright (C) 2009-2013 Lionel Debroux
* Copyright (C) 1999-2013 libti* contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <QFile>
#include <QFileDialog>
#include <QApplication>
#include <QSettings>
#include <QDir>
#include <QMessageBox>
#include "global.h"
#include "vartablemodel.h"
const QStringList varTableModel::real_header={ "A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"o",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
"THETA"
};
const QStringList varTableModel::complex_header={ "Z0",
"Z1",
"Z2",
"Z3",
"Z4",
"Z5",
"Z6",
"Z7",
"Z8",
"Z9"
};
varTableModel::varTableModel(QObject *parent,
AbstractData * data,
QString file,
hp_DataType dtype)
:QAbstractTableModel(parent)
{
q_parent=parent;
dataobj = data;
filename=file;
type=dtype;
setup();
}
//REWORK!
QModelIndex varTableModel::parent(const QModelIndex &index) const {
return QModelIndex();
}
Qt::ItemFlags varTableModel::flags(const QModelIndex &index) const {
return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
}
//rework!
QModelIndex varTableModel::index(int row, int column, const QModelIndex &parent) const {
return createIndex(row,column);
}
//alter the data table if data is edited
bool varTableModel::setData(const QModelIndex &index, const QVariant &value, int role) {
qDebug()<<"Data Changed";
if (type==HP_LIST) {
List * list;
list = static_cast<List *>(dataobj);
list->setItem(index.row(),value.toString(),value.toReal());
ismodified=true;
return true;
}
if (type==HP_MATRIX) {
Matrix * matrix;
matrix = static_cast<Matrix *>(dataobj);
matrix->setItem(index.row(),index.column(),value.toString(),value.toReal());
ismodified=true;
return true;
}
if (type==HP_REAL) {
Real * real;
real = static_cast<Real *>(dataobj);
// item = real->getItem(index.row());
// return item;
}
if (type==HP_COMPLEX) {
Complex * complex;
complex = static_cast<Complex *>(dataobj);
// item = complex->getItem(index.row());
// return item;
}
return false;
}
void varTableModel::setup()
{
ismodified=false;
// if (hpcalc) {
// dataobj=hpcalc->getData(filename,type);
// qDebug()<<"varTableModel: type"<<dataobj->getType();
// }
return;
}
int varTableModel::rowCount(const QModelIndex & parent) const
{
int size=16; //should be zero
if (type==HP_LIST) {
List * list;
list = static_cast<List *>(dataobj);
size= list->getListSize()+1;
}
if (type==HP_REAL) {
Real * real;
real = static_cast<Real *>(dataobj);
size= real->getListSize();
}
if (type==HP_COMPLEX) {
Complex * complex;
complex = static_cast<Complex *>(dataobj);
size= complex->getListSize();
}
if (type==HP_MATRIX) {
Matrix * matrix;
matrix = static_cast<Matrix *>(dataobj);
size= matrix->getMatrixRows()+1;
// qDebug()<<matrix->getName()<<" row"<<size;
}
return size;
}
int varTableModel::columnCount(const QModelIndex & /*parent*/) const
{
int size=1;
if (type==HP_MATRIX) {
Matrix * matrix;
matrix = static_cast<Matrix *>(dataobj);
size= matrix->getMatrixColumns()+1;
// qDebug()<<matrix->getName()<<" column"<<size;
}
if (type==HP_COMPLEX) {
Complex * complex;
complex = static_cast<Complex *>(dataobj);
// size= matrix->getMatrixColumns();
// qDebug()<<matrix->getName()<<" column"<<size;
return 1;
}
return size;
}
void varTableModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles) {
ismodified=true;
qDebug()<<"Data Changed "<<ismodified;
}
QVariant varTableModel::data(const QModelIndex &index, int role) const
{
if (role == Qt::DisplayRole) {
QString item=QStringLiteral("-");
if (type==HP_LIST) {
List * list;
list = static_cast<List *>(dataobj);
item = list->getItem(index.row());
return item;
}
if (type==HP_MATRIX) {
Matrix * matrix;
matrix = static_cast<Matrix *>(dataobj);
item = matrix->getItem(index.row(),index.column());
return item;
}
if (type==HP_REAL) {
Real * real;
real = static_cast<Real *>(dataobj);
item = real->getItem(index.row());
return item;
}
if (type==HP_COMPLEX) {
Complex * complex;
complex = static_cast<Complex *>(dataobj);
item = complex->getItem(index.row());
return item;
}
return QString("Row%1, Column%2")
.arg(index.row() + 1)
.arg(index.column() +1);
}
return QVariant();
}
QVariant varTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole) {
return QVariant();
}
if (orientation == Qt::Horizontal) {
if (type==HP_REAL) {
return QString("%1").arg(section+1);
}
return QString("%1").arg(section+1);
}
if (orientation == Qt::Vertical) {
if (type==HP_REAL) {
if (section < real_header.size()) {
return real_header.at(section);
}
else {
return QString("%1").arg(section);
}
}
if (type==HP_COMPLEX) {
if (section < complex_header.size()) {
return complex_header.at(section);
}
else {
return QString("%1").arg(section);
}
}
return QString("%1").arg(section);
}
return QVariant();
}
bool varTableModel::getData(QDataStream &ds) {
// QByteArray out;
// out.clear();
if(dataobj!=nullptr) {
dataobj->getData(ds);
// out=dataobj->fileOut();
// qDebug()<<out;
// ds<<out;
return true;
}
return false;
}
bool varTableModel::isModified() {
return ismodified;
}
void varTableModel::resetModified() {
ismodified=false;
}
varTableModel::~varTableModel() {
qDebug()<<"Entering ~varTableModel()";
}