From 8cdbe203bf28e26ec37f16f397bb8e28ebfa424f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Thu, 30 Nov 2017 09:13:49 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@334 a8b55f48-bf90-11e4-a774-851b48703e85 --- CMakeLists.txt | 1 + cd_utils/CMakeLists.txt | 41 ++- piqt/CMakeLists.txt | 1 - qad/graphic/graphic.cpp | 69 +++--- qad/graphic/graphic.h | 26 +- qad/graphic/graphic_conf.ui | 66 ++--- qad/icons/dialog-warning.png | Bin 0 -> 29995 bytes qad/icons/evalspinbox.png | Bin 0 -> 10593 bytes qad/widgets/clineedit.h | 2 +- qad/widgets/evalspinbox.cpp | 303 +++++++++++++++++++++++ qad/widgets/evalspinbox.h | 77 ++++++ qad/widgets/plugin/evalspinboxplugin.cpp | 69 ++++++ qad/widgets/plugin/evalspinboxplugin.h | 36 +++ qad/widgets/plugin/qad_widgets.cpp | 6 +- qad/widgets/qad_widgets.qrc | 4 + qad/widgets/qvariantedit.cpp | 15 +- qad/widgets/qvariantedit.h | 4 +- qcd_utils/CMakeLists.txt | 5 +- qcd_utils/pult/form.cpp | 4 + qcd_utils/pult/form.ui | 205 +++++++-------- 20 files changed, 707 insertions(+), 227 deletions(-) create mode 100644 qad/icons/dialog-warning.png create mode 100644 qad/icons/evalspinbox.png create mode 100644 qad/widgets/evalspinbox.cpp create mode 100644 qad/widgets/evalspinbox.h create mode 100644 qad/widgets/plugin/evalspinboxplugin.cpp create mode 100644 qad/widgets/plugin/evalspinboxplugin.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 27bc7a4..8b0eb17 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ if (DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") endif () +include(SDKMacros.cmake) set(PIP_LIBRARY pip) set(PIP_FOLDERS "." "core" "containers" "thread" "system" "io" "console" "math" "code" "geo" "resources" "opencl") diff --git a/cd_utils/CMakeLists.txt b/cd_utils/CMakeLists.txt index 673caaf..7c0240a 100644 --- a/cd_utils/CMakeLists.txt +++ b/cd_utils/CMakeLists.txt @@ -28,28 +28,23 @@ target_link_libraries(${PROJECT_NAME} ${PIP_LIBRARY}) add_executable(cdutilstest "cdutilstest.cpp" "cdtest.h") target_link_libraries(cdutilstest ${PIP_LIBRARY} ${PROJECT_NAME}) message(STATUS "Building ${PROJECT_NAME}") -#if (LIBPROJECT) -# include(SDKMacros) -# sdk_install("" "${PROJECT_NAME}" "${HDRS_UTILS}") -#else() - if(LIB) - if(WIN32) - set(CMAKE_INSTALL_PREFIX ${MINGW_DIR}) - install(FILES ${HDRS_UTILS} DESTINATION ${MINGW_INCLUDE}) - install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_LIB}) - install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_BIN}) - else() - if(APPLE) - set(CMAKE_INSTALL_PREFIX /usr/local) - else() - set(CMAKE_INSTALL_PREFIX /usr) - endif() - install(FILES ${HDRS_UTILS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include) - install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) - endif() - #message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") +if(LIB) + if(WIN32) + set(CMAKE_INSTALL_PREFIX ${MINGW_DIR}) + install(FILES ${HDRS_UTILS} DESTINATION ${MINGW_INCLUDE}) + install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_LIB}) + install(TARGETS ${PROJECT_NAME} DESTINATION ${MINGW_BIN}) else() - install(TARGETS ${PROJECT_NAME} DESTINATION bin) - #message(STATUS "Install ${PROJECT_NAME} to local \"bin\"") + if(APPLE) + set(CMAKE_INSTALL_PREFIX /usr/local) + else() + set(CMAKE_INSTALL_PREFIX /usr) + endif() + install(FILES ${HDRS_UTILS} DESTINATION ${CMAKE_INSTALL_PREFIX}/include) + install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) endif() -#endif() + #message(STATUS "Install ${PROJECT_NAME} to system \"${CMAKE_INSTALL_PREFIX}\"") +else() + install(TARGETS ${PROJECT_NAME} DESTINATION bin) + #message(STATUS "Install ${PROJECT_NAME} to local \"bin\"") +endif() diff --git a/piqt/CMakeLists.txt b/piqt/CMakeLists.txt index b44861a..58c4c55 100644 --- a/piqt/CMakeLists.txt +++ b/piqt/CMakeLists.txt @@ -21,7 +21,6 @@ qt_add_library(${PROJECT_NAME} SHARED out_CPP) qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets) message(STATUS "Building ${PROJECT_NAME}") if(LIBPROJECT) - include(SDKMacros) sdk_install("pip" "${PROJECT_NAME}" "${out_HDR}" "${out_QM}") else() if(LIB) diff --git a/qad/graphic/graphic.cpp b/qad/graphic/graphic.cpp index 85b7ac6..1954126 100644 --- a/qad/graphic/graphic.cpp +++ b/qad/graphic/graphic.cpp @@ -13,34 +13,6 @@ __GraphicRegistrator__ __graphic_registrator__; -ELineEdit::ELineEdit(QWidget * parent): CLineEdit(parent) { - last_ret = complexd_0; - is_auto = false; - is_reset = true; - connect(this, SIGNAL(editingFinished()), this, SLOT(calculate())); - connect(this, SIGNAL(cleared()), this, SLOT(toDefaultClicked())); -} - - -void ELineEdit::wheelEvent(QWheelEvent * e) { - double mul = 1.1; - if (e->delta() < 0) mul = 0.9; - CLineEdit::setText(QString::number(last_ret.real() * mul).toUpper()); - calculate(); -} - - -void ELineEdit::calculate() { - evaluator.check(text().replace(",", ".")); - if (!evaluator.isCorrect()) return; - is_reset = false; - last_ret = evaluator.evaluate(); - CLineEdit::setText(QString::number(last_ret.real()).toUpper()); - emit valueChanged(last_ret.real()); -} - - - Graphic::Graphic(QWidget * parent): QFrame(parent), line_x_min(this), line_x_max(this), line_y_min(this), line_y_max(this) { QTranslator * trans = new QTranslator(); trans->load(":/lang/qad_graphic_" + QLocale::system().name().left(2)); @@ -66,6 +38,10 @@ Graphic::Graphic(QWidget * parent): QFrame(parent), line_x_min(this), line_x_max LN2 = qLn(2.); LN5 = qLn(5.); LN10 = qLn(10.); + line_x_min.setClearButtonVisible(true); + line_x_max.setClearButtonVisible(true); + line_y_min.setClearButtonVisible(true); + line_y_max.setClearButtonVisible(true); connect(&line_x_min, SIGNAL(valueChanged(double)), this, SLOT(lineXMinChanged(double))); connect(&line_x_max, SIGNAL(valueChanged(double)), this, SLOT(lineXMaxChanged(double))); connect(&line_y_min, SIGNAL(valueChanged(double)), this, SLOT(lineYMinChanged(double))); @@ -1249,26 +1225,44 @@ void Graphic::swapToBuffer() { void Graphic::setRectToLines() { is_lines_update = true; - line_x_min.is_auto = line_x_max.is_auto = line_y_min.is_auto = line_y_max.is_auto = true; + //line_x_min.is_auto = line_x_max.is_auto = line_y_min.is_auto = line_y_max.is_auto = true; //qDebug() << "set to lines" << selrect; - line_x_min.is_reset = line_x_max.is_reset = line_y_min.is_reset = line_y_max.is_reset = isFit; - if (!line_x_min.hasFocus()) line_x_min.setValue(selrect.left()); - if (!line_x_max.hasFocus()) line_x_max.setValue(selrect.right()); - if (!line_y_min.hasFocus()) line_y_min.setValue(selrect.bottom()); - if (!line_y_max.hasFocus()) line_y_max.setValue(selrect.top()); - if (!isFit) { + //line_x_min.is_reset = line_x_max.is_reset = line_y_min.is_reset = line_y_max.is_reset = isFit; + if (line_x_min.isVisible() && line_x_max.isVisible() && line_y_min.isVisible() && line_y_max.isVisible()) { + line_x_min.blockSignals(true); line_x_max.blockSignals(true); line_y_min.blockSignals(true); line_y_max.blockSignals(true); + if (!line_x_min.hasFocus()) { + if (isFit) line_x_min.setValue(grect.left()); + else line_x_min.setValue(selrect.left()); + } + if (!line_x_max.hasFocus()) { + if(isFit) line_x_max.setValue(grect.right()); + else line_x_max.setValue(selrect.right()); + } + if (!line_y_min.hasFocus()) { + if(isFit) line_y_min.setValue(grect.bottom()); + else line_y_min.setValue(selrect.bottom()); + } + if (!line_y_max.hasFocus()) { + if(isFit) line_y_max.setValue(grect.top()); + else line_y_max.setValue(selrect.top()); + } line_x_min.setDefaultText(QString::number(grect.left()).toUpper()); line_x_max.setDefaultText(QString::number(grect.right()).toUpper()); line_y_min.setDefaultText(QString::number(grect.bottom()).toUpper()); line_y_max.setDefaultText(QString::number(grect.top()).toUpper()); + line_x_min.blockSignals(false); line_x_max.blockSignals(false); line_y_min.blockSignals(false); line_y_max.blockSignals(false); +// if(isFit) { +// line_y_min.setValue(grect.left()); +// line_y_max.setValue(grect.left()); +// } } - line_x_min.is_auto = line_x_max.is_auto = line_y_min.is_auto = line_y_max.is_auto = false; + //line_x_min.is_auto = line_x_max.is_auto = line_y_min.is_auto = line_y_max.is_auto = false; is_lines_update = false; } void Graphic::checkLines() { - isFit = (line_x_min.isDefault() && line_x_max.isDefault() && line_y_min.isDefault() && line_y_max.isDefault()); + isFit = (line_x_min.isCleared() && line_x_max.isCleared() && line_y_min.isCleared() && line_y_max.isCleared()); update(true); } @@ -1549,6 +1543,7 @@ void Graphic::setBorderInputsVisible(bool visible) { ui->widgetLX->setVisible(visible); ui->widgetLY->setVisible(visible); ui->checkBorderInputs->setChecked(visible); + if (visible) setRectToLines(); } diff --git a/qad/graphic/graphic.h b/qad/graphic/graphic.h index e14b520..f277e07 100644 --- a/qad/graphic/graphic.h +++ b/qad/graphic/graphic.h @@ -16,34 +16,12 @@ #include #include #include "graphic_conf.h" -#include "clineedit.h" -#include "qpievaluator.h" +#include "evalspinbox.h" QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -class ELineEdit: public CLineEdit { - Q_OBJECT -public: - explicit ELineEdit(QWidget * parent = 0); - //void setText(const QString & v) {if (!is_auto) is_reset = false; CLineEdit::setText(v); setDefaultText(v, is_reset); last_ret = complexd(v.toDouble(), 0.); emit valueChanged(last_ret.real());} - void setValue(const int & v) {if (is_reset) setDefaultText(QString::number(v).toUpper(), is_reset); else setText(QString::number(v).toUpper()); last_ret = complexd(v, 0.); if (!is_auto) emit valueChanged(last_ret.real());} - void setValue(const double & v) {if (is_reset) setDefaultText(QString::number(v).toUpper(), is_reset); else setText(QString::number(v).toUpper()); last_ret = complexd(v, 0.); if (!is_auto) emit valueChanged(last_ret.real());} - double value() const {return last_ret.real();} - bool isDefault() const {return !cw->isVisible();} - bool is_reset, is_auto; -protected: - void wheelEvent(QWheelEvent * e); - QPIEvaluator evaluator; - complexd last_ret; -private slots: - void toDefaultClicked() {is_reset = true; calculate();} - void calculate(); -signals: - void valueChanged(double value); -}; - namespace Ui { class Graphic; @@ -381,7 +359,7 @@ protected: Graphic::Buttons buttons_; Graphic::Alignment align; GraphicConf * conf; - ELineEdit line_x_min, line_x_max, line_y_min, line_y_max; + EvalSpinBox line_x_min, line_x_max, line_y_min, line_y_max; QTime tm; QIcon icon_exp_x, icon_exp_y, icon_exp_sx, icon_exp_sy; QImage icon_pause_b, icon_pause_f; diff --git a/qad/graphic/graphic_conf.ui b/qad/graphic/graphic_conf.ui index 1d32b42..7b26a2a 100644 --- a/qad/graphic/graphic_conf.ui +++ b/qad/graphic/graphic_conf.ui @@ -193,6 +193,9 @@ 2 + + 999.990000000000009 + 1.000000000000000 @@ -265,22 +268,6 @@ - - - - 3 - - - 0.001000000000000 - - - 9999999.000000000000000 - - - 50.000000000000000 - - - @@ -295,22 +282,6 @@ - - - - 3 - - - 0.001000000000000 - - - 9999999.000000000000000 - - - 30.000000000000000 - - - @@ -331,6 +302,32 @@ + + + + 30 + + + 30 + + + true + + + + + + + 50 + + + 50 + + + true + + + @@ -474,6 +471,11 @@ colorChanged(QColor) + + EvalSpinBox + QWidget +
evalspinbox.h
+
checkAAlias diff --git a/qad/icons/dialog-warning.png b/qad/icons/dialog-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c62afadc4cc68d5b352c6080a30a17c59517e3d3 GIT binary patch literal 29995 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 +#include +#include +#include +#include +#include +#include +#include "qad_types.h" + + +EvalSpinBox::EvalSpinBox(QWidget * parent): QAbstractSpinBox(parent) { + status = new QWidget(lineEdit()); + cw = new QWidget(lineEdit()); + label = new QLabel(lineEdit()); +// label->hide(); + clear_im.load(":/icons/edit-clear-locationbar-rtl.png"); + icon_ok.load(":/icons/dialog-ok-apply.png"); + icon_fail.load(":/icons/dialog-warning.png"); + icon_calc.load(":/icons/tools-wizard.png"); + icon = icon_ok; + status->setCursor(Qt::ArrowCursor); + status->setToolTip("OK -> 0"); + status->hide(); + cw->setCursor(Qt::ArrowCursor); + cw->setToolTip(tr("Clear")); + cw->hide(); + cw_visible = false; + //lineEdit()->setStyleSheet("color: darkgreen;"); + //lineEdit()->setText(eval.expression() + " -> " + QString::number(value(), 'G', 10)); + cw->installEventFilter(this); + status->installEventFilter(this); + connect(lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(textChanged_(QString))); + connect(this, SIGNAL(editingFinished()), this, SLOT(setExpression_())); + label->setText("0"); + //connect(cw, SIGNAL(mouseReleaseEvent(QMouseEvent * )), this, SLOT(clearMouseRelease(QMouseEvent * ))); +} + + +EvalSpinBox::~EvalSpinBox() { + delete cw; + delete status; + delete label; +} + + +bool EvalSpinBox::eventFilter(QObject * o, QEvent * e) { + switch (e->type()) { + case QEvent::MouseButtonRelease: + if (o == cw) clearMouseRelease((QMouseEvent * )e); + break; + case QEvent::Paint: + if (o == status) statusPaintEvent(); + if (o == cw) cwPaintEvent(); + break; + default : break; + } + return QAbstractSpinBox::eventFilter(o, e); +} + + +void EvalSpinBox::resizeIcons() { + int is = fontHeight(); + int tm = (lineEdit()->height() - is + 1) / 2; + QStyleOptionFrame so; + so.initFrom(lineEdit()); + QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &so, lineEdit()); + label->setGeometry(r.x() + 2, r.y() + (r.height() - fontMetrics().height() + 1) / 2, lineEdit()->width() - 2*tm - (is * 1.2) * ((status->isVisible() ? 1 : 0) + (cw->isVisible() ? 1 : 0)), lineEdit()->height() - 2*tm); + status->setGeometry(lineEdit()->width() - (is + tm) * (cw->isVisible() ? 2 : 1), tm, is, is); + cw->setGeometry(lineEdit()->width() - (is + tm) * 1, tm, is, is); + lineEdit()->setTextMargins(0, 0, (is * 1.2) * ((status->isVisible() ? 1 : 0) + (cw->isVisible() ? 1 : 0)), 0); +} + + +void EvalSpinBox::resizeEvent(QResizeEvent * e) { + QAbstractSpinBox::resizeEvent(e); + resizeIcons(); +} + + +void EvalSpinBox::changeEvent(QEvent * e) { + if (e->type() == QEvent::LanguageChange) { + cw->setToolTip(tr("Clear")); + return; + } + QAbstractSpinBox::changeEvent(e); +} + + +void EvalSpinBox::cwPaintEvent() { + QPainter p(cw); + p.setRenderHint(QPainter::SmoothPixmapTransform); + p.drawImage(cw->rect(), clear_im); +} + + +void EvalSpinBox::statusPaintEvent() { + QPainter p(status); + p.setRenderHint(QPainter::SmoothPixmapTransform); + p.drawImage(status->rect(), icon); +} + + +void EvalSpinBox::clearMouseRelease(QMouseEvent * e) { + if (cw->rect().contains(e->pos())) clear(); +} + + +void EvalSpinBox::textChanged_(const QString & text) { + double pv = value(); + QString t = text; + cw->setVisible(text != dt && cw_visible); + bool td = false; + if (t.endsWith('=')) { + td = true; + t.chop(1); + } + bool ok = eval.check(t); + if (ok) { + eval.evaluate(); + if (td) { + icon = icon_calc; + status->setToolTip("Enter to calc -> "+QString::number(value(), 'G', 10)); + } else { + icon = icon_ok; + status->setToolTip("OK -> "+QString::number(value(), 'G', 10)); + } +// qDebug() << "value =" << value(); + if (pv != value()) emit valueChanged(value()); + } else { + icon = icon_fail; + status->setToolTip(eval.error()); + } + resizeIcons(); +} + + +void EvalSpinBox::setExpression_() { + bool td = false; + double pv = value(); + QString t = text(); + if (t.endsWith('=')) { + td = true; + t.chop(1); + } + if (eval.check(t)) { + if (eval.expression() == "0") lineEdit()->clear(); + else lineEdit()->setText(eval.expression()); + eval.evaluate(); + if (td) lineEdit()->setText(QString::number(value(), 'G', 10)); + status->setToolTip("OK -> " + QString::number(value(), 'G', 10)); + icon = icon_ok; + } else { + icon = icon_fail; + status->setToolTip(eval.error()); +// qDebug() << eval.expression(); + } + if (!label->isHidden()) { + if (eval.expression() != QString::number(value(), 'G', 10) && eval.expression() != QString::number(value(), 'G', 11) && eval.isCorrect()) + label->setText("

" + eval.expression() + " -> " + QString::number(value(), 'G', 10) + "

"); + else label->setText(eval.expression()); + lineEdit()->blockSignals(true); + if (!eval.isCorrect()) { + lineEdit()->setStyleSheet("color: darkred;"); + status->show(); + } else { + lineEdit()->setStyleSheet("color: black;"); + status->hide(); + } + // lineEdit()->setText(eval.expression() + " -> " + QString::number(value(), 'G', 10)); + lineEdit()->setText(""); + lineEdit()->blockSignals(false); + } + +// qDebug() << "value =" << value(); + if (pv != value()) emit valueChanged(value()); +} + + +void EvalSpinBox::setExpression(const QString & expr) { + lineEdit()->setText(expr); + //if (eval.expression() == "0") lineEdit()->clear(); + cw->setVisible(text() != dt && cw_visible); + setExpression_(); +} + + +void EvalSpinBox::setValue(double val) { + lineEdit()->setText(QString::number(val)); + //if (val == 0) lineEdit()->clear(); + cw->setVisible(text() != dt && cw_visible); + setExpression_(); +} + + +void EvalSpinBox::stepBy(int steps) { + QString t = text(); + if (eval.check(t)) { + t = eval.expression(); + QRegExp re("(\\-?\\d+)"); + int pos = 0; + if ((pos = re.indexIn(t)) != -1) { + double v = t.mid(pos, re.matchedLength()).toDouble(); + v += steps; + t.remove(pos, re.matchedLength()); + t.insert(pos, QString::number(v)); + } else { + double v = steps; + t = QString::number(v) + t; + } + eval.check(t); + lineEdit()->setText(eval.expression()); + } +} + + +void EvalSpinBox::clear() { + lineEdit()->setText(dt); + setExpression_(); + cw->hide(); + resizeIcons(); + emit cleared(); +} + + +double EvalSpinBox::value() const { + if (eval.isCorrect()) { + return eval.lastResult().real(); + } + return 0; +} + + +const QString & EvalSpinBox::expression() const { + return eval.expression(); +} + + +bool EvalSpinBox::isCleared() const { + return (dt == eval.expression() || (value() == 0 && dt.isEmpty())); +} + + +QSize EvalSpinBox::sizeHint() const { + QSize s = QAbstractSpinBox::sizeHint(); + s.setWidth(120); + return s; +} + + +QAbstractSpinBox::StepEnabled EvalSpinBox::stepEnabled() const { + return StepUpEnabled | StepDownEnabled; +} + + +void EvalSpinBox::focusInEvent(QFocusEvent * event) { +// qDebug() << "focus_in"; + label->hide(); + status->show(); + lineEdit()->blockSignals(true); + lineEdit()->setStyleSheet("color: black;"); + if (eval.expression() != "0") lineEdit()->setText(eval.expression()); + lineEdit()->blockSignals(false); + QAbstractSpinBox::focusInEvent(event); + resizeIcons(); +} + + +void EvalSpinBox::focusOutEvent(QFocusEvent * event) { + QAbstractSpinBox::focusOutEvent(event); +// qDebug() << eval.expression() << QString::number(value(), 'G', 10); + if (eval.expression() != QString::number(value(), 'G', 10) && eval.expression() != QString::number(value(), 'G', 11) && eval.isCorrect()) + label->setText("

" + eval.expression() + " -> " + QString::number(value(), 'G', 10) + "

"); + else label->setText(eval.expression()); + label->show(); + lineEdit()->blockSignals(true); + if (!eval.isCorrect()) lineEdit()->setStyleSheet("color: darkred;"); + else status->hide(); +// lineEdit()->setText(eval.expression() + " -> " + QString::number(value(), 'G', 10)); + lineEdit()->clear(); + lineEdit()->blockSignals(false); + resizeIcons(); +} + + +void EvalSpinBox::setDefaultText(const QString & t) { +// bool def = (!cw->isHidden()); + dt = t; +// if (def) { +// lineEdit()->setText(dt); +// setExpression_(); +// } + //if (t == eval.expression() || (value() == 0 && t.isEmpty())) clear(); + cw->setVisible((eval.expression() != dt || (dt.isEmpty() && eval.expression() == "0")) && cw_visible); + resizeIcons(); +} + + +void EvalSpinBox::setClearButtonVisible(bool visible) { + cw_visible = visible; + cw->setVisible((eval.expression() != dt || (dt.isEmpty() && eval.expression() == "0")) && cw_visible); + resizeIcons(); +} diff --git a/qad/widgets/evalspinbox.h b/qad/widgets/evalspinbox.h new file mode 100644 index 0000000..a78b092 --- /dev/null +++ b/qad/widgets/evalspinbox.h @@ -0,0 +1,77 @@ +#ifndef EVALSPINBOX_H +#define EVALSPINBOX_H + +#include +#include +#include "qpievaluator.h" + +class QLabel; + +class EvalSpinBox: public QAbstractSpinBox +{ + Q_OBJECT + Q_PROPERTY(double value READ value WRITE setValue NOTIFY valueChanged USER true) + Q_PROPERTY(QString expression READ expression WRITE setExpression USER true) + Q_PROPERTY(QString defaultText READ defaultText WRITE setDefaultText) + Q_PROPERTY(bool clearButtonVisible READ isClearButtonVisible WRITE setClearButtonVisible) + +public: + explicit EvalSpinBox(QWidget * parent = 0); + ~EvalSpinBox(); + + double value() const; + const QString & expression() const; + const QString & defaultText() const {return dt;} + bool isClearButtonVisible() const {return cw_visible;} + bool isCleared() const; + + +protected: + QWidget * status; + QWidget * cw; + QPIEvaluator eval; + QLabel * label; + QImage icon_ok; + QImage icon_fail; + QImage icon_calc; + QImage icon; + QImage clear_im; + QString dt; + bool cw_visible; + +private: + bool eventFilter(QObject * o, QEvent * e); + void resizeEvent(QResizeEvent * ); + void changeEvent(QEvent * e); + void statusPaintEvent(); + void cwPaintEvent(); + void resizeIcons(); + +private slots: + void clearMouseRelease(QMouseEvent * e); + void textChanged_(const QString & text); + void setExpression_(); + +public slots: + void setExpression(const QString & expr); + void setValue(double val); + void setDefaultText(const QString & t); + void setClearButtonVisible(bool visible); + +public: + virtual void stepBy(int steps); + virtual void clear(); + virtual QSize sizeHint() const; + +protected: + virtual StepEnabled stepEnabled() const; + virtual void focusInEvent(QFocusEvent *event); + virtual void focusOutEvent(QFocusEvent *event); + + +signals: + void valueChanged(double val); + void cleared(); +}; + +#endif // EVALSPINBOX_H diff --git a/qad/widgets/plugin/evalspinboxplugin.cpp b/qad/widgets/plugin/evalspinboxplugin.cpp new file mode 100644 index 0000000..7356dc8 --- /dev/null +++ b/qad/widgets/plugin/evalspinboxplugin.cpp @@ -0,0 +1,69 @@ +#include "evalspinbox.h" +#include "evalspinboxplugin.h" +#include + + +EvalSpinBoxPlugin::EvalSpinBoxPlugin(QObject * parent): QObject(parent) { + m_initialized = false; +} + + +void EvalSpinBoxPlugin::initialize(QDesignerFormEditorInterface * /* core */) { + if (m_initialized) + return; + + // Add extension registrations, etc. here + + m_initialized = true; +} + + +bool EvalSpinBoxPlugin::isInitialized() const { + return m_initialized; +} + + +QWidget * EvalSpinBoxPlugin::createWidget(QWidget * parent) { + return new EvalSpinBox(parent); +} + + +QString EvalSpinBoxPlugin::name() const { + return QLatin1String("EvalSpinBox"); +} + + +QString EvalSpinBoxPlugin::group() const { + return QLatin1String("Input Widgets"); +} + + +QIcon EvalSpinBoxPlugin::icon() const { + return QIcon(":/icons/evalspinbox.png"); +} + + +QString EvalSpinBoxPlugin::toolTip() const { + return QLatin1String("Evaluation double SpinBox"); +} + + +QString EvalSpinBoxPlugin::whatsThis() const { + return QLatin1String("Evaluation double SpinBox"); +} + + +bool EvalSpinBoxPlugin::isContainer() const { + return false; +} + + +QString EvalSpinBoxPlugin::domXml() const { + return QLatin1String("\n\n"); +} + + +QString EvalSpinBoxPlugin::includeFile() const { + return QLatin1String("evalspinbox.h"); +} + diff --git a/qad/widgets/plugin/evalspinboxplugin.h b/qad/widgets/plugin/evalspinboxplugin.h new file mode 100644 index 0000000..d0949f0 --- /dev/null +++ b/qad/widgets/plugin/evalspinboxplugin.h @@ -0,0 +1,36 @@ +#ifndef EVALSPINBOXPLUGIN_H +#define EVALSPINBOXPLUGIN_H + +#include +#if QT_VERSION >= 0x050000 +# include +#else +# include +#endif + +class EvalSpinBoxPlugin: public QObject, public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + EvalSpinBoxPlugin(QObject * parent = 0); + + bool isContainer() const; + bool isInitialized() const; + QIcon icon() const; + QString domXml() const; + QString group() const; + QString includeFile() const; + QString name() const; + QString toolTip() const; + QString whatsThis() const; + QWidget * createWidget(QWidget * parent); + void initialize(QDesignerFormEditorInterface * core); + +private: + bool m_initialized; + +}; + +#endif // EVALSPINBOXPLUGIN_H diff --git a/qad/widgets/plugin/qad_widgets.cpp b/qad/widgets/plugin/qad_widgets.cpp index 3e7c7be..d1ab93e 100644 --- a/qad/widgets/plugin/qad_widgets.cpp +++ b/qad/widgets/plugin/qad_widgets.cpp @@ -13,9 +13,10 @@ #include "qcodeeditplugin.h" #include "qvarianteditplugin.h" #include "qpiconfigplugin.h" +#include "evalspinboxplugin.h" -QADWidgets::QADWidgets(QObject * parent): QObject(parent) -{ + +QADWidgets::QADWidgets(QObject * parent): QObject(parent) { m_widgets.append(new SpinSliderPlugin(this)); m_widgets.append(new ColorButtonPlugin(this)); m_widgets.append(new CharDialogPlugin(this)); @@ -30,6 +31,7 @@ QADWidgets::QADWidgets(QObject * parent): QObject(parent) m_widgets.append(new QCodeEditPlugin(this)); m_widgets.append(new QVariantEditPlugin(this)); m_widgets.append(new QPIConfigPlugin(this)); + m_widgets.append(new EvalSpinBoxPlugin(this)); } diff --git a/qad/widgets/qad_widgets.qrc b/qad/widgets/qad_widgets.qrc index 38360db..2f32824 100644 --- a/qad/widgets/qad_widgets.qrc +++ b/qad/widgets/qad_widgets.qrc @@ -36,5 +36,9 @@ ../icons/qvariantedit.png ../icons/code-word.png ../icons/f1.png + ../icons/dialog-ok-apply.png + ../icons/dialog-warning.png + ../icons/tools-wizard.png + ../icons/evalspinbox.png diff --git a/qad/widgets/qvariantedit.cpp b/qad/widgets/qvariantedit.cpp index 9aff068..bbb8148 100644 --- a/qad/widgets/qvariantedit.cpp +++ b/qad/widgets/qvariantedit.cpp @@ -149,6 +149,7 @@ QVariantEdit::QVariantEdit(QWidget * parent): QWidget(parent) { _list = 0; _date = 0; _spin = 0; + _espin = 0; _rect = 0; _point = 0; _path = 0; @@ -222,11 +223,11 @@ void QVariantEdit::_recreate(const QVariant & new_value) { connect(_spin, SIGNAL(valueChanged(double)), this, SLOT(_changed())); break; case QVariant::Double: - _spin = new QDoubleSpinBox(this); - _spin->setDecimals(5); - _spin->setRange(-1E+199, 1E+199); - _cur_edit = _spin; - connect(_spin, SIGNAL(valueChanged(double)), this, SLOT(_changed())); + _espin = new EvalSpinBox(this); + //_spin->setDecimals(5); + //_spin->setRange(-1E+199, 1E+199); + _cur_edit = _espin; + connect(_espin, SIGNAL(valueChanged(double)), this, SLOT(_changed())); break; case QVariant::Color: _color = new ColorButton(this); @@ -321,7 +322,7 @@ QVariant QVariantEdit::value() const { case QVariant::UInt: return (unsigned int)(_spin->value()); case QVariant::LongLong: return qlonglong(_spin->value()); case QVariant::ULongLong: return qulonglong(_spin->value()); - case QVariant::Double: return double(_spin->value()); + case QVariant::Double: return _espin->value(); case QVariant::Color: return _color->color(); case QVariant::String: return _line->text(); case QVariant::StringList: return _list->value(); @@ -372,6 +373,7 @@ void QVariantEdit::setValue(const QVariant & v) { if (_list) {_list->setValue(v.toStringList());} if (_date) {_date->setDateTime(v.toDateTime());} if (_spin) {_spin->setValue(v.toDouble());} + if (_espin) {_espin->setValue(v.toDouble());} if (_rect) {_rect->setValue(v.toRectF());} if (_point) {_point->setValue(v.toPointF());} if (_path) { @@ -394,6 +396,7 @@ void QVariantEdit::_delete() { _list = 0; _date = 0; _spin = 0; + _espin = 0; _rect = 0; _point = 0; _path = 0; diff --git a/qad/widgets/qvariantedit.h b/qad/widgets/qvariantedit.h index a552b70..5ec352e 100644 --- a/qad/widgets/qvariantedit.h +++ b/qad/widgets/qvariantedit.h @@ -1,12 +1,13 @@ #ifndef QVARIANTEDIT_H #define QVARIANTEDIT_H +#include "qad_types.h" #include "clineedit.h" #include "ecombobox.h" #include "colorbutton.h" #include "qrectedit.h" #include "qpointedit.h" -#include "qad_types.h" +#include "evalspinbox.h" #include #include @@ -108,6 +109,7 @@ protected: StringListEdit * _list; QDateTimeEdit * _date; QDoubleSpinBox * _spin; + EvalSpinBox * _espin; QRectEdit * _rect; QPointEdit * _point; PathEdit * _path; diff --git a/qcd_utils/CMakeLists.txt b/qcd_utils/CMakeLists.txt index e8120ee..93a43ac 100644 --- a/qcd_utils/CMakeLists.txt +++ b/qcd_utils/CMakeLists.txt @@ -20,6 +20,9 @@ qt_wrap(${SRC} HDRS out_HDR CPPS out_CPP QMS out_QM) qt_add_library(${PROJECT_NAME} SHARED out_CPP) qt_target_link_libraries(${PROJECT_NAME} pip qad_utils qad_widgets cd_utils piqt) message(STATUS "Building ${PROJECT_NAME}") + +add_subdirectory(pult) + if(LIBPROJECT) #sdk_install("" "${PROJECT_NAME}" "${out_HDR}" "${out_QM}") else() @@ -46,5 +49,3 @@ else() endif() endif() -add_subdirectory(pult) - diff --git a/qcd_utils/pult/form.cpp b/qcd_utils/pult/form.cpp index 6dcf7eb..caf4243 100644 --- a/qcd_utils/pult/form.cpp +++ b/qcd_utils/pult/form.cpp @@ -7,6 +7,7 @@ #include "qcd_core.h" #include "qcd_kmodel.h" #include "pifile.h" +#include "evalspinbox.h" using namespace CDUtils; @@ -116,6 +117,9 @@ Form::Form(QWidget *parent) : QWidget(parent), ui(new Ui::Form) { CDCore::instance()->initPult(); ui->setupUi(this); ui->treeView->setKFile(""); + EvalSpinBox * ev = new EvalSpinBox(); + ev->setValue(2); + ui->groupBox->layout()->addWidget(ev); PIFile f; piCout << f.open("test.kh", PIIODevice::ReadOnly); diff --git a/qcd_utils/pult/form.ui b/qcd_utils/pult/form.ui index 28d1999..0100fa2 100644 --- a/qcd_utils/pult/form.ui +++ b/qcd_utils/pult/form.ui @@ -13,105 +13,114 @@ Form - - - - - Refresh + + + + + Qt::Horizontal - - - - - - Send - - - - - - - Save - - - - - - - - - - Calculate - - - - - - - Load - - - - - - - Clear - - - - - - - update from KDescription - - - - - - - Receive - - - - - - - - 0 - 0 - - - - GroupBox - - - - - - CheckBox - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - + + + + + + Save + + + + + + + Load + + + + + + + Send + + + + + + + Receive + + + + + + + update from KDescription + + + + + + + Clear + + + + + + + Calculate + + + + + + + Refresh + + + + + + + + + + + + 0 + 0 + + + + GroupBox + + + + + + CheckBox + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + +