From b77648aae90273852fc9c0c78e800d4832ef0d48 Mon Sep 17 00:00:00 2001 From: peri4 Date: Wed, 23 Aug 2023 16:33:43 +0300 Subject: [PATCH] version 2.20 icon change EDockWidget improvements EMainWindow small refactoring Graphic now remember last loaded graphics style and restore it on setGraphicsCount --- CMakeLists.txt | 2 +- icons/layer-visible-off.png | Bin 3446 -> 4755 bytes libs/application/edockwidget.cpp | 101 ++++++++++++++++---- libs/application/edockwidget.h | 27 +++--- libs/application/emainwindow.cpp | 39 ++++---- libs/application/emainwindow.h | 51 +++++----- libs/application/lang/qad_application_en.ts | 95 +++++++++++------- libs/application/lang/qad_application_ru.ts | 95 +++++++++++------- libs/graphic/graphic.cpp | 30 ++++-- libs/graphic/graphic.h | 2 +- libs/graphic/graphic_conf.cpp | 32 +++++++ libs/graphic/graphic_conf.h | 27 +----- 12 files changed, 319 insertions(+), 182 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 22dd7b1..1ab3cbf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake cmake_policy(SET CMP0072 NEW) # FindOpenGL prefers GLVND by default project(QAD) set(QAD_MAJOR 2) -set(QAD_MINOR 19) +set(QAD_MINOR 20) set(QAD_REVISION 0) set(QAD_SUFFIX ) set(QAD_COMPANY SHS) diff --git a/icons/layer-visible-off.png b/icons/layer-visible-off.png index 03ca47df2d214c87aace16fc01ba0baff6d9e8c0..35a2be448da0522c828516edf59c5d9ea3038094 100644 GIT binary patch delta 4750 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 delta 3430 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 IM6N<$g4_jw00000 diff --git a/libs/application/edockwidget.cpp b/libs/application/edockwidget.cpp index 9fe05da..ea94345 100644 --- a/libs/application/edockwidget.cpp +++ b/libs/application/edockwidget.cpp @@ -6,6 +6,27 @@ #include +EDockWidget::EDockWidget(const QString & title, QWidget * parent, Qt::WindowFlags flags): QDockWidget(title, parent, flags) { + init(); +} + + +EDockWidget::EDockWidget(QWidget * parent, Qt::WindowFlags flags): QDockWidget(parent, flags) { + init(); +} + + +EDockWidget::~EDockWidget() { + delete btn_hide; + delete btn_dock; + delete btn_maximize; + delete lbl_title; + delete lbl_icon; + delete header; + delete empty_header; +} + + void EDockWidget::setFeatures(QDockWidget::DockWidgetFeatures features) { btn_dock->setVisible(features.testFlag(DockWidgetFloatable)); btn_hide->setVisible(features.testFlag(DockWidgetClosable)); @@ -31,6 +52,16 @@ void EDockWidget::setWindowIcon(const QIcon & icon) { } +void EDockWidget::setEmptyHeader() { + if (titleBarWidget() != empty_header) setTitleBarWidget(empty_header); +} + + +void EDockWidget::setStandardHeader() { + if (titleBarWidget() != header) setTitleBarWidget(header); +} + + bool EDockWidget::event(QEvent * e) { if (e->type() == QEvent::FontChange || e->type() == QEvent::Polish) { updateStyle(); @@ -39,9 +70,19 @@ bool EDockWidget::event(QEvent * e) { } +void EDockWidget::changeEvent(QEvent * e) { + if (e->type() == QEvent::WindowStateChange || e->type() == QEvent::LanguageChange) { + updateStyle(); + } + QDockWidget::changeEvent(e); +} + + void EDockWidget::init() { header = new QFrame(); header->setFrameShape(QFrame::StyledPanel); + empty_header = new QWidget(); + empty_header->setLayout(new QBoxLayout(QBoxLayout::BottomToTop)); QBoxLayout * lay = new QBoxLayout(features().testFlag(QDockWidget::DockWidgetVerticalTitleBar) ? QBoxLayout::TopToBottom : QBoxLayout::LeftToRight); lay->setContentsMargins(2, 2, 2, 2); @@ -62,38 +103,62 @@ void EDockWidget::init() { // #endif lbl_title = new QLabel(windowTitle()); lbl_title->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); - btn_dock = new QToolButton(); - // btn_dock->setIconSize(QSize(16, 16)); - btn_dock->setAutoRaise(true); - btn_dock->setFocusPolicy(Qt::NoFocus); - btn_dock->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - btn_hide = new QToolButton(); - // btn_hide->setIconSize(QSize(16, 16)); - btn_hide->setAutoRaise(true); - btn_hide->setFocusPolicy(Qt::NoFocus); - btn_hide->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - connect(btn_dock, SIGNAL(clicked(bool)), this, SLOT(dockClicked())); - connect(btn_hide, SIGNAL(clicked(bool)), this, SLOT(hide())); + auto createButton = [this](const char * slot) { + auto * ret = new QToolButton(); + ret->setAutoRaise(true); + ret->setFocusPolicy(Qt::NoFocus); + ret->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + // ret->setIconSize(QSize(16, 16)); + connect(ret, SIGNAL(clicked(bool)), this, slot); + return ret; + }; + btn_dock = createButton(SLOT(dockClicked())); + btn_maximize = createButton(SLOT(maximize())); + btn_hide = createButton(SLOT(hide())); lay->addWidget(lbl_icon); lay->addWidget(lbl_title); lay->addWidget(btn_dock); + lay->addWidget(btn_maximize); lay->addWidget(btn_hide); header->setLayout(lay); updateStyle(); setTitleBarWidget(header); + connect(this, &QDockWidget::topLevelChanged, this, &EDockWidget::updateStyle); } void EDockWidget::updateStyle() { + int eh_m = style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin); + empty_header->layout()->setContentsMargins(eh_m, eh_m, 0, 0); QSize icon_size = preferredIconSize(0.75, this); int bm = 2 * style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, 0, this); QSize btn_size = icon_size; btn_size += QSize(bm, bm); - btn_dock->setIcon(style()->standardIcon(QStyle::SP_TitleBarNormalButton)); - btn_dock->setIconSize(icon_size); - btn_dock->setFixedSize(btn_size); - btn_hide->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton)); - btn_hide->setIconSize(icon_size); - btn_hide->setFixedSize(btn_size); lbl_icon->setFixedSize(preferredIconSize(1.5, this)); + auto restyleButton = [this, icon_size, btn_size](QToolButton * btn, QStyle::StandardPixmap pm) { + btn->setIcon(style()->standardIcon(pm)); + btn->setIconSize(icon_size); + btn->setFixedSize(btn_size); + }; + restyleButton(btn_dock, isFloating() ? QStyle::SP_TitleBarUnshadeButton : QStyle::SP_TitleBarShadeButton); + restyleButton(btn_maximize, isMaximized() ? QStyle::SP_TitleBarNormalButton : QStyle::SP_TitleBarMaxButton); + restyleButton(btn_hide, QStyle::SP_TitleBarCloseButton); + btn_dock->setToolTip(isFloating() ? tr("Dock") : tr("Undock")); + btn_maximize->setToolTip(isMaximized() ? tr("Show normal") : tr("Maximize")); + btn_hide->setToolTip(tr("Hide")); +} + + +void EDockWidget::dockClicked() { + if (!isFloating() && isMaximized()) showNormal(); + setFloating(!isFloating()); +} + + +void EDockWidget::maximize() { + if (!isFloating()) setFloating(true); + if (isMaximized()) + showNormal(); + else + showMaximized(); } diff --git a/libs/application/edockwidget.h b/libs/application/edockwidget.h index b0645eb..6d4ae87 100644 --- a/libs/application/edockwidget.h +++ b/libs/application/edockwidget.h @@ -35,34 +35,31 @@ class QAD_APPLICATION_EXPORT EDockWidget: public QDockWidget { Q_OBJECT public: - explicit EDockWidget(const QString & title, QWidget * parent = 0, Qt::WindowFlags flags = Qt::WindowFlags()) - : QDockWidget(title, parent, flags) { - init(); - } - explicit EDockWidget(QWidget * parent = 0, Qt::WindowFlags flags = Qt::WindowFlags()): QDockWidget(parent, flags) { init(); } - ~EDockWidget() { - delete btn_hide; - delete btn_dock; - delete lbl_title; - delete lbl_icon; - delete header; - } + explicit EDockWidget(const QString & title, QWidget * parent = 0, Qt::WindowFlags flags = Qt::WindowFlags()); + explicit EDockWidget(QWidget * parent = 0, Qt::WindowFlags flags = Qt::WindowFlags()); + ~EDockWidget(); void setFeatures(QDockWidget::DockWidgetFeatures features); void setWindowTitle(const QString & title); void setWindowIcon(const QIcon & icon); + void setEmptyHeader(); + void setStandardHeader(); + private: - bool event(QEvent * e); + bool event(QEvent * e) override; + void changeEvent(QEvent * e) override; void init(); void updateStyle(); QFrame * header; + QWidget * empty_header; QLabel *lbl_title, *lbl_icon; - QToolButton *btn_hide, *btn_dock; + QToolButton *btn_hide, *btn_dock, *btn_maximize; private slots: - void dockClicked() { setFloating(!isFloating()); } + void dockClicked(); + void maximize(); }; #endif // EDOCKWIDGET_H diff --git a/libs/application/emainwindow.cpp b/libs/application/emainwindow.cpp index 40dddb9..720e107 100644 --- a/libs/application/emainwindow.cpp +++ b/libs/application/emainwindow.cpp @@ -4,6 +4,7 @@ #include #include #include +#include EMainWindow::EMainWindow(QWidget * parent) @@ -11,8 +12,7 @@ EMainWindow::EMainWindow(QWidget * parent) , action_show_all_tools(this) , action_hide_all_tools(this) , action_show_all_docks(this) - , action_hide_all_docks(this) - , first_show(true) { + , action_hide_all_docks(this) { menu_recent = 0; action_clear_recent = new QAction(QIcon(":/icons/edit-clear.png"), tr("Clear recent list"), this); connect(action_clear_recent, SIGNAL(triggered()), this, SLOT(clearRecent())); @@ -268,8 +268,8 @@ void EMainWindow::initDocks() { void EMainWindow::initSession() { - connect(&session, SIGNAL(loading(QPIConfig &)), this, SLOT(sessionLoading(QPIConfig &))); - connect(&session, SIGNAL(saving(QPIConfig &)), this, SLOT(sessionSaving(QPIConfig &))); + connect(&session, &SessionManager::loading, this, [this](QPIConfig & conf) { loadingSession(conf); }); + connect(&session, &SessionManager::saving, this, [this](QPIConfig & conf) { savingSession(conf); }); } @@ -289,6 +289,12 @@ bool EMainWindow::checkSave() { } +void EMainWindow::setChanged(bool yes) { + is_changed = yes; + setWindowModified(yes); +} + + void EMainWindow::changedDock() { if (isHidden()) return; QSet invalid_tab_docks; @@ -325,30 +331,19 @@ void EMainWindow::changedDock() { for (QDockWidget * d: docks) { if (!d->titleBarWidget()) continue; - QWidget * ctb = d->titleBarWidget(); - if (!d->property("__titleWidget").isValid()) { - d->setProperty("__titleWidget", qulonglong(ctb)); - QWidget * ntb = new QWidget(); - int m = style()->pixelMetric(QStyle::PM_DockWidgetTitleMargin); - ntb->setLayout(new QBoxLayout(QBoxLayout::BottomToTop)); - ntb->layout()->setContentsMargins(m, m, 0, 0); - d->setProperty("__titleEmptyWidget", qulonglong(ntb)); - } if (!tdocks.contains(d)) { // qDebug() << "add dock" << d; tdocks << d; connect(d, &QObject::destroyed, this, [this, d]() { tdocks.removeOne(d); }); d->installEventFilter(this); } - // qDebug() << d->windowTitle() << tabifiedDockWidgets(d); - if (tabifiedDockWidgets(d).isEmpty() || invalid_tab_docks.contains(d)) { - if (d->titleBarWidget() != (QWidget *)(d->property("__titleWidget").toULongLong())) - d->setTitleBarWidget((QWidget *)(d->property("__titleWidget").toULongLong())); - } else { - if (d->titleBarWidget() != (QWidget *)(d->property("__titleEmptyWidget").toULongLong())) { - d->setTitleBarWidget((QWidget *)(d->property("__titleEmptyWidget").toULongLong())); - d->layout()->setContentsMargins(0, 20, 0, 0); - } + auto * ed = qobject_cast(d); + if (ed) { + // qDebug() << d->windowTitle() << tabifiedDockWidgets(d); + if (tabifiedDockWidgets(d).isEmpty() || invalid_tab_docks.contains(d)) + ed->setStandardHeader(); + else + ed->setEmptyHeader(); } } } diff --git a/libs/application/emainwindow.h b/libs/application/emainwindow.h index 63c7e75..5656878 100644 --- a/libs/application/emainwindow.h +++ b/libs/application/emainwindow.h @@ -88,59 +88,47 @@ public: void setRecentMenu(QMenu * m); int maxRecentItems() const { return max_recent; } + bool isChanged() const { return is_changed; } protected: - // Qt`s overloaded - void showEvent(QShowEvent *); - void closeEvent(QCloseEvent *); - bool eventFilter(QObject * o, QEvent * e); - void changeEvent(QEvent * e); - QMenu * createPopupMenu(); - void addToRecent(const QString & path); - void prepareRecent(); + void showEvent(QShowEvent *) override; + void closeEvent(QCloseEvent *) override; + bool eventFilter(QObject * o, QEvent * e) override; + void changeEvent(QEvent * e) override; + QMenu * createPopupMenu() override; - void init(const QString & config) { - session.setFile(config); - initMenus(); - initSession(); - loadSession(); - } // unusable void saveSession(); void loadSession(); - virtual void savingSession(QPIConfig & conf) {} + void setChanged(bool yes = true); + void addToRecent(const QString & path); + virtual void loadingSession(QPIConfig & conf) {} + virtual void savingSession(QPIConfig & conf) {} virtual QSize dockTabsIconSize() const { return iconSize(); } virtual QString loadFilter() { return "All files(*)"; } virtual QString saveFilter() { return "All files(*)"; } + SessionManager session; + QString file_name; + +private: + void prepareRecent(); + bool checkSave(); - void setChanged(bool yes = true) { - isChanged = yes; - setWindowModified(yes); - } void initMenus(); void initDocks(); void initSession(); QAction action_show_all_tools, action_hide_all_tools, action_show_all_docks, action_hide_all_docks; - QString file_name; QList tbars; QList tdocks; QList actions_recent; QAction * action_clear_recent; QMenu * menu_recent; - SessionManager session; - bool isChanged, first_show; + bool is_changed; int max_recent; -private slots: - void changedDock(); - void sessionLoading(QPIConfig & conf) { loadingSession(conf); } - void sessionSaving(QPIConfig & conf) { savingSession(conf); } - void closeDock(int index); - void recentTriggered(); - public slots: void setMaxRecentItems(int mr); void changed() { setChanged(true); } @@ -152,6 +140,11 @@ public slots: bool saveAsFile(); void clearRecent(); +private slots: + void changedDock(); + void closeDock(int index); + void recentTriggered(); + signals: }; diff --git a/libs/application/lang/qad_application_en.ts b/libs/application/lang/qad_application_en.ts index cc85e91..6fc6ed3 100644 --- a/libs/application/lang/qad_application_en.ts +++ b/libs/application/lang/qad_application_en.ts @@ -9,93 +9,121 @@ - + Versions - + Build - + Authors - + About Qt... - + OK - + About + + EDockWidget + + + Dock + + + + + Undock + + + + + Show normal + + + + + Maximize + + + + + Hide + + + EMainWindow - - + + Clear recent list - - - - + + + + Show all - - - - + + + + Hide all - + Toolbars - + Docks - + Select file to open - + Select files to open - + Save changes%1? - + in - + Select file to save @@ -103,8 +131,8 @@ HistoryView - - + + History cleared @@ -117,26 +145,27 @@ - - - + + + Clear - - + + Select All - - + + Copy - + + All diff --git a/libs/application/lang/qad_application_ru.ts b/libs/application/lang/qad_application_ru.ts index bb4ba21..04c3ea5 100644 --- a/libs/application/lang/qad_application_ru.ts +++ b/libs/application/lang/qad_application_ru.ts @@ -9,93 +9,121 @@ - О программе - + Versions Версии - + Build Сборка - + Authors Авторы - + About Qt... О Qt ... - + OK - + About О программе + + EDockWidget + + + Dock + Закрепить + + + + Undock + Открепить + + + + Show normal + Восстановить + + + + Maximize + Развернуть + + + + Hide + Скрыть + + EMainWindow - - + + Clear recent list Очистить список недавних - - - - + + + + Show all Показать все - - - - + + + + Hide all Скрыть все - + Toolbars Панели инструментов - + Docks Окна - + Select file to open Выбрать файл для открытия - + Select files to open Выберите файлы для открытия - + Save changes%1? Сохранить изменения%1? - + in в - + Select file to save Выберите файл для сохранения @@ -103,8 +131,8 @@ HistoryView - - + + History cleared История очищена @@ -117,26 +145,27 @@ Категория: - - - + + + Clear Очистить - - + + Select All Выделить всё - - + + Copy Копировать - + + All Все diff --git a/libs/graphic/graphic.cpp b/libs/graphic/graphic.cpp index 8e00dba..5297c48 100644 --- a/libs/graphic/graphic.cpp +++ b/libs/graphic/graphic.cpp @@ -1252,24 +1252,31 @@ void Graphic::setCurrentGraphic(int arg) { } -void Graphic::setGraphicsCount(int arg, bool update) { - if (arg < 0) return; - while (graphics.size() < arg) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - graphics.append( - GraphicType(tr("y(x)"), - QColor::fromHsv((graphics.size() * 55) % 360, 255, 255 - QRandomGenerator::global()->generate() % 115))); +# define _G_QRAND_ QRandomGenerator::global()->generate() #else - graphics.append(GraphicType(tr("y(x)"), QColor::fromHsv((graphics.size() * 55) % 360, 255, 255 - qrand() % 115))); +# define _G_QRAND_ qrand() #endif + +void Graphic::setGraphicsCount(int count, bool update) { + if (count < 0) return; + while (graphics.size() < count) { + GraphicType gt(tr("y(x)")); + if (loaded_configs.size() > graphics.size()) + gt = loaded_configs[graphics.size()]; + else + gt.pen.setColor(QColor::fromHsv((graphics.size() * 55) % 360, 255, 255 - _G_QRAND_ % 115)); + graphics.append(gt); } - while (graphics.size() > arg) { + while (graphics.size() > count) { delete graphics.back().pb; graphics.pop_back(); } if (update) updateLegend(); } +#undef _G_QRAND_ + void Graphic::removeGraphic(int arg, bool update) { if (arg < 0 || arg >= graphics.size()) return; @@ -2309,6 +2316,10 @@ void Graphic::on_graphic_buttonConfigure_clicked() { setGridEnabled(conf->ui->groupGrid->isChecked()); updateLegend(); repaintCanvas(); + for (int i = 0; i < qMin(graphics.size(), loaded_configs.size()); ++i) { + loaded_configs[i] = graphics[i]; + loaded_configs[i].removeData(); + } } @@ -2702,6 +2713,9 @@ void Graphic::load(QByteArray ba) { setLegendVisible(a); } break; } + loaded_configs = graphics; + for (auto & i: loaded_configs) + i.removeData(); if (has_opengl != isOGL) setOpenGL(has_opengl); updateLegend(); repaintCanvas(true); diff --git a/libs/graphic/graphic.h b/libs/graphic/graphic.h index 1efacb8..0def15d 100644 --- a/libs/graphic/graphic.h +++ b/libs/graphic/graphic.h @@ -442,7 +442,7 @@ protected: QBrush selbrush; QPen grid_pen, selpen; QColor back_color, text_color; - QVector graphics; + QVector graphics, loaded_configs; int curGraphic; GraphicAction curaction, prevaction; QRectF grect, selrect, limit_, def_rect; diff --git a/libs/graphic/graphic_conf.cpp b/libs/graphic/graphic_conf.cpp index cbf86d4..2d6c255 100644 --- a/libs/graphic/graphic_conf.cpp +++ b/libs/graphic/graphic_conf.cpp @@ -3,6 +3,38 @@ #include "qad_types.h" #include "ui_graphic_conf.h" +// GraphicType + +GraphicType::GraphicType(QString name_, QColor color, Qt::PenStyle style, double width, bool visible_) { + pen.setColor(color); + pen.setStyle(style); + lines = true; + points = false; + fill = false; + fill_color = Qt::yellow; + if (qRound(width) == width) + pen.setWidth(qRound(width)); + else + pen.setWidthF(width); + pen.setWidth(1); + pen.setCosmetic(true); + max_x = 0.; + name = name_; + visible = visible_; + pointWidth = 2.; + pb = new QCheckBox(name); +} + + +void GraphicType::removeData() { + polyline.clear(); + polyline_pause.clear(); + _lod.clear(); + _lod_pause.clear(); +} + + +// GraphicConf GraphicConf::GraphicConf(QVector & graphics_, QWidget * parent): QDialog(parent), graphics(graphics_) { ui = new Ui::GraphicConf(); diff --git a/libs/graphic/graphic_conf.h b/libs/graphic/graphic_conf.h index a6a6624..fe9b7d0 100644 --- a/libs/graphic/graphic_conf.h +++ b/libs/graphic/graphic_conf.h @@ -35,28 +35,11 @@ class GraphicConf; struct QAD_GRAPHIC_EXPORT GraphicType { GraphicType(QString name_ = "y(x)", - QColor color = Qt::red, - Qt::PenStyle style = Qt::SolidLine, - double width = 0., - bool visible_ = true) { - pen.setColor(color); - pen.setStyle(style); - lines = true; - points = false; - fill = false; - fill_color = Qt::yellow; - if (qRound(width) == width) - pen.setWidth(qRound(width)); - else - pen.setWidthF(width); - pen.setWidth(1); - pen.setCosmetic(true); - max_x = 0.; - name = name_; - visible = visible_; - pointWidth = 2.; - pb = new QCheckBox(name); - } + QColor color = Qt::red, + Qt::PenStyle style = Qt::SolidLine, + double width = 0., + bool visible_ = true); + void removeData(); //~GraphicType() {delete pb;} QString name; QPolygonF polyline;