diff --git a/0011-update-changelog.patch b/0011-update-changelog.patch new file mode 100644 index 0000000..54247ed --- /dev/null +++ b/0011-update-changelog.patch @@ -0,0 +1,8318 @@ +From: wangzhenyu +Date: Tue, 14 Mar 2023 17:16:25 +0800 +Subject: update changelog + +--- + development-files/kysdk-notification.pc | 5 + + kysdk-application.pro | 3 +- + kysdk-notification/kysdk-notification.pro | 30 + + kysdk-notification/src/knotifier.cpp | 172 +++++ + kysdk-notification/src/knotifier.h | 98 +++ + kysdk-notification/testNotifier/main.cpp | 11 + + kysdk-notification/testNotifier/testNotifier.pro | 31 + + kysdk-notification/testNotifier/widget.cpp | 70 ++ + kysdk-notification/testNotifier/widget.h | 21 + + kysdk-qtwidgets/kysdk-qtwidgets.pro | 25 +- + kysdk-qtwidgets/src/kbackgroundgroup.cpp | 440 +++++++++++ + kysdk-qtwidgets/src/kbackgroundgroup.h | 115 +++ + kysdk-qtwidgets/src/kballontip.cpp | 8 +- + kysdk-qtwidgets/src/kborderbutton.cpp | 14 +- + kysdk-qtwidgets/src/kborderlessbutton.cpp | 1 + + kysdk-qtwidgets/src/kbreadcrumb.cpp | 4 + + kysdk-qtwidgets/src/kbubblewidget.cpp | 2 +- + kysdk-qtwidgets/src/kbuttonbox.cpp | 279 +++++++ + kysdk-qtwidgets/src/kbuttonbox.h | 144 ++++ + kysdk-qtwidgets/src/kcolorbutton.cpp | 198 +++++ + kysdk-qtwidgets/src/kcolorbutton.h | 71 ++ + kysdk-qtwidgets/src/kcolorcombobox.cpp | 300 ++++++++ + kysdk-qtwidgets/src/kcolorcombobox.h | 91 +++ + kysdk-qtwidgets/src/kdialog.cpp | 3 +- + kysdk-qtwidgets/src/kiconbar.cpp | 21 +- + kysdk-qtwidgets/src/kinputdialog.cpp | 131 +--- + kysdk-qtwidgets/src/klineframe.cpp | 137 ++++ + kysdk-qtwidgets/src/klineframe.h | 34 + + kysdk-qtwidgets/src/klistviewdelegate.cpp | 1 - + kysdk-qtwidgets/src/kmenubutton.cpp | 2 +- + kysdk-qtwidgets/src/kmessagebox.cpp | 802 +++++++++++++++++++++ + kysdk-qtwidgets/src/kmessagebox.h | 276 +++++++ + kysdk-qtwidgets/src/knavigationbar.cpp | 20 +- + kysdk-qtwidgets/src/kpasswordedit.cpp | 91 +-- + kysdk-qtwidgets/src/kpasswordedit.h | 6 + + kysdk-qtwidgets/src/kpressbutton.cpp | 3 + + kysdk-qtwidgets/src/kprogressbar.cpp | 14 + + kysdk-qtwidgets/src/kprogressbar.h | 6 + + kysdk-qtwidgets/src/kpushbutton.cpp | 9 +- + kysdk-qtwidgets/src/ksearchlineedit.cpp | 17 +- + kysdk-qtwidgets/src/kslider.cpp | 35 +- + kysdk-qtwidgets/src/kslider.h | 2 +- + kysdk-qtwidgets/src/ktabbar.cpp | 30 +- + kysdk-qtwidgets/src/ktabbar.h | 2 +- + kysdk-qtwidgets/src/ktag.cpp | 2 +- + kysdk-qtwidgets/src/ktoolbutton.cpp | 3 +- + kysdk-qtwidgets/src/kwidget.cpp | 197 +++-- + kysdk-qtwidgets/src/kwindowbuttonbar.cpp | 17 +- + kysdk-qtwidgets/src/kwindowbuttonbar.h | 11 + + kysdk-qtwidgets/src/parmscontroller.cpp | 12 +- + kysdk-qtwidgets/test/test.pro | 9 +- + kysdk-qtwidgets/test/testDialog/main.cpp | 10 +- + kysdk-qtwidgets/test/testDialog/testDialog.pro | 2 +- + kysdk-qtwidgets/test/testKBubbleWidget/main.cpp | 11 + + .../test/testKBubbleWidget/testKBubbleWidget.pro | 31 + + kysdk-qtwidgets/test/testKBubbleWidget/widget.cpp | 65 ++ + kysdk-qtwidgets/test/testKBubbleWidget/widget.h | 14 + + kysdk-qtwidgets/test/testKButtonBox/main.cpp | 11 + + .../test/testKButtonBox/testKButtonBox.pro | 31 + + kysdk-qtwidgets/test/testKButtonBox/widget.cpp | 87 +++ + kysdk-qtwidgets/test/testKButtonBox/widget.h | 14 + + kysdk-qtwidgets/test/testKMessageBox/main.cpp | 29 + + .../test/testKMessageBox/testKMessageBox.pro | 31 + + kysdk-qtwidgets/test/testKMessageBox/widget.cpp | 53 ++ + kysdk-qtwidgets/test/testKMessageBox/widget.h | 14 + + kysdk-qtwidgets/test/testKPushButton/main.cpp | 19 + + .../test/testKPushButton/testKPushButton.pro | 2 +- + .../test/testKTranslucentFloor/main.cpp | 19 + + .../testKTranslucentFloor.pro | 2 +- + kysdk-qtwidgets/test/testListView/main.cpp | 19 + + kysdk-qtwidgets/test/testListView/testListView.pro | 2 +- + kysdk-qtwidgets/test/testListWidget/main.cpp | 19 + + .../test/testListWidget/testListWidget.pro | 2 +- + kysdk-qtwidgets/test/testProgressCircle/main.cpp | 19 + + .../test/testProgressCircle/testProgressCircle.pro | 2 +- + kysdk-qtwidgets/test/testPushbutton/main.cpp | 19 + + .../test/testPushbutton/testPushbutton.pro | 2 +- + kysdk-qtwidgets/test/testSwitchButton/main.cpp | 19 + + .../test/testSwitchButton/testSwitchButton.pro | 2 +- + kysdk-qtwidgets/test/testTag/main.cpp | 19 + + kysdk-qtwidgets/test/testTag/testTag.pro | 2 +- + kysdk-qtwidgets/test/testTranslucent/main.cpp | 15 + + .../test/testTranslucent/testTranslucent.pro | 30 + + kysdk-qtwidgets/test/testTranslucent/widget.cpp | 117 +++ + kysdk-qtwidgets/test/testTranslucent/widget.h | 17 + + kysdk-qtwidgets/test/testWidget/main.cpp | 9 + + kysdk-qtwidgets/test/testWidget/testWidget.pro | 2 +- + kysdk-qtwidgets/test/testbadge/main.cpp | 20 +- + kysdk-qtwidgets/test/testbadge/testbadge.pro | 2 +- + kysdk-qtwidgets/test/testballontip/main.cpp | 20 +- + .../test/testballontip/testballontip.pro | 2 +- + kysdk-qtwidgets/test/testbreadcrumb/main.cpp | 20 +- + .../test/testbreadcrumb/testbreadcrumb.pro | 2 +- + kysdk-qtwidgets/test/testcolorbutton/main.cpp | 11 + + .../test/testcolorbutton/testcolorbutton.pro | 31 + + kysdk-qtwidgets/test/testcolorbutton/widget.cpp | 106 +++ + kysdk-qtwidgets/test/testcolorbutton/widget.h | 14 + + kysdk-qtwidgets/test/testinputdialog/main.cpp | 9 + + .../test/testinputdialog/testinputdialog.pro | 2 +- + kysdk-qtwidgets/test/testkbackground/main.cpp | 11 + + .../test/testkbackground/testkbackground.pro | 31 + + kysdk-qtwidgets/test/testkbackground/widget.cpp | 172 +++++ + kysdk-qtwidgets/test/testkbackground/widget.h | 16 + + kysdk-qtwidgets/test/testkcolorcombobox/main.cpp | 11 + + .../test/testkcolorcombobox/testkcolorcombobox.pro | 31 + + kysdk-qtwidgets/test/testkcolorcombobox/widget.cpp | 57 ++ + kysdk-qtwidgets/test/testkcolorcombobox/widget.h | 14 + + kysdk-qtwidgets/test/testkpressbutton/main.cpp | 19 + + .../test/testkpressbutton/testkpressbutton.pro | 2 +- + kysdk-qtwidgets/test/testnavigationbar/main.cpp | 19 + + .../test/testnavigationbar/testnavigationbar.pro | 2 +- + kysdk-qtwidgets/test/testpasswordedit/main.cpp | 19 + + .../test/testpasswordedit/testpasswordedit.pro | 2 +- + kysdk-qtwidgets/test/testprogressbar/main.cpp | 17 + + .../test/testprogressbar/testprogressbar.pro | 2 +- + kysdk-qtwidgets/test/testprogressdialog/main.cpp | 19 + + .../test/testprogressdialog/testprogressdialog.pro | 2 +- + kysdk-qtwidgets/test/testsearchlinedit/main.cpp | 9 + + .../test/testsearchlinedit/testsearchlinedit.pro | 2 +- + kysdk-qtwidgets/test/testsecuritylevelbar/main.cpp | 9 + + .../testsecuritylevelbar/testsecuritylevelbar.pro | 2 +- + kysdk-qtwidgets/test/testslider/main.cpp | 19 + + kysdk-qtwidgets/test/testslider/testslider.pro | 2 +- + kysdk-qtwidgets/test/testtabbar/main.cpp | 19 + + kysdk-qtwidgets/test/testtabbar/testtabbar.pro | 2 +- + kysdk-qtwidgets/test/testtoolbutton/main.cpp | 19 + + .../test/testtoolbutton/testtoolbutton.pro | 2 +- + kysdk-qtwidgets/translations/gui_bo_CN.qm | Bin 3135 -> 3129 bytes + kysdk-qtwidgets/translations/gui_bo_CN.ts | 54 +- + kysdk-qtwidgets/translations/gui_zh_CN.qm | Bin 2131 -> 2133 bytes + kysdk-qtwidgets/translations/gui_zh_CN.ts | 54 +- + .../ukuistylehelper/ukui-decoration-manager.cpp | 4 +- + .../src/ukuistylehelper/ukuistylehelper.cpp | 2 +- + kysdk-widgetutils/kysdk-widgetutils.pro | 5 +- + kysdk-widgetutils/src/kwidgetutils.cpp | 47 ++ + kysdk-widgetutils/src/kwidgetutils.h | 11 + + .../test/testWidgetutils/testWidgetutils.pro | 7 +- + 137 files changed, 5375 insertions(+), 366 deletions(-) + create mode 100644 development-files/kysdk-notification.pc + create mode 100644 kysdk-notification/kysdk-notification.pro + create mode 100644 kysdk-notification/src/knotifier.cpp + create mode 100644 kysdk-notification/src/knotifier.h + create mode 100644 kysdk-notification/testNotifier/main.cpp + create mode 100644 kysdk-notification/testNotifier/testNotifier.pro + create mode 100644 kysdk-notification/testNotifier/widget.cpp + create mode 100644 kysdk-notification/testNotifier/widget.h + create mode 100644 kysdk-qtwidgets/src/kbackgroundgroup.cpp + create mode 100644 kysdk-qtwidgets/src/kbackgroundgroup.h + create mode 100644 kysdk-qtwidgets/src/kbuttonbox.cpp + create mode 100644 kysdk-qtwidgets/src/kbuttonbox.h + create mode 100644 kysdk-qtwidgets/src/kcolorbutton.cpp + create mode 100644 kysdk-qtwidgets/src/kcolorbutton.h + create mode 100644 kysdk-qtwidgets/src/kcolorcombobox.cpp + create mode 100644 kysdk-qtwidgets/src/kcolorcombobox.h + create mode 100644 kysdk-qtwidgets/src/klineframe.cpp + create mode 100644 kysdk-qtwidgets/src/klineframe.h + create mode 100644 kysdk-qtwidgets/src/kmessagebox.cpp + create mode 100644 kysdk-qtwidgets/src/kmessagebox.h + create mode 100644 kysdk-qtwidgets/test/testKBubbleWidget/main.cpp + create mode 100644 kysdk-qtwidgets/test/testKBubbleWidget/testKBubbleWidget.pro + create mode 100644 kysdk-qtwidgets/test/testKBubbleWidget/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testKBubbleWidget/widget.h + create mode 100644 kysdk-qtwidgets/test/testKButtonBox/main.cpp + create mode 100644 kysdk-qtwidgets/test/testKButtonBox/testKButtonBox.pro + create mode 100644 kysdk-qtwidgets/test/testKButtonBox/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testKButtonBox/widget.h + create mode 100644 kysdk-qtwidgets/test/testKMessageBox/main.cpp + create mode 100644 kysdk-qtwidgets/test/testKMessageBox/testKMessageBox.pro + create mode 100644 kysdk-qtwidgets/test/testKMessageBox/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testKMessageBox/widget.h + create mode 100644 kysdk-qtwidgets/test/testTranslucent/main.cpp + create mode 100644 kysdk-qtwidgets/test/testTranslucent/testTranslucent.pro + create mode 100644 kysdk-qtwidgets/test/testTranslucent/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testTranslucent/widget.h + create mode 100644 kysdk-qtwidgets/test/testcolorbutton/main.cpp + create mode 100644 kysdk-qtwidgets/test/testcolorbutton/testcolorbutton.pro + create mode 100644 kysdk-qtwidgets/test/testcolorbutton/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testcolorbutton/widget.h + create mode 100644 kysdk-qtwidgets/test/testkbackground/main.cpp + create mode 100644 kysdk-qtwidgets/test/testkbackground/testkbackground.pro + create mode 100644 kysdk-qtwidgets/test/testkbackground/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testkbackground/widget.h + create mode 100644 kysdk-qtwidgets/test/testkcolorcombobox/main.cpp + create mode 100644 kysdk-qtwidgets/test/testkcolorcombobox/testkcolorcombobox.pro + create mode 100644 kysdk-qtwidgets/test/testkcolorcombobox/widget.cpp + create mode 100644 kysdk-qtwidgets/test/testkcolorcombobox/widget.h + +diff --git a/development-files/kysdk-notification.pc b/development-files/kysdk-notification.pc +new file mode 100644 +index 0000000..6933b54 +--- /dev/null ++++ b/development-files/kysdk-notification.pc +@@ -0,0 +1,5 @@ ++Name: libkysdk-notification ++Description: kysdk notification development library ++Version: 1.2.0 ++Libs: -L/usr/lib/kysdk/applications/ -lkysdk-notification -Wl,-rpath=/usr/lib/kysdk/applications/ ++Cflags: -I/usr/include/kysdk/applications/ +\ No newline at end of file +diff --git a/kysdk-application.pro b/kysdk-application.pro +index 90eb59d..ef56bfc 100644 +--- a/kysdk-application.pro ++++ b/kysdk-application.pro +@@ -8,7 +8,8 @@ SUBDIRS = \ + kysdk-qtwidgets \ + kysdk-kabase/kabase/ \ + kysdk-alm \ +- kysdk-ukenv ++ kysdk-ukenv \ ++ kysdk-notification + + pc.files = development-files/*.pc + pc.path = /usr/share/pkgconfig +diff --git a/kysdk-notification/kysdk-notification.pro b/kysdk-notification/kysdk-notification.pro +new file mode 100644 +index 0000000..13fc769 +--- /dev/null ++++ b/kysdk-notification/kysdk-notification.pro +@@ -0,0 +1,30 @@ ++QT += widgets gui dbus ++ ++TEMPLATE = lib ++ ++CONFIG += c++11 ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++# 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 += \ ++ src/knotifier.cpp ++ ++HEADERS += \ ++ src/knotifier.h ++ ++# Default rules for deployment. ++unix { ++ headers.files = $${HEADERS} ++ headers.path = /usr/include/kysdk/applications/ ++ target.path = /usr/lib/kysdk/applications/ ++} ++!isEmpty(target.path): INSTALLS += target headers +diff --git a/kysdk-notification/src/knotifier.cpp b/kysdk-notification/src/knotifier.cpp +new file mode 100644 +index 0000000..667d324 +--- /dev/null ++++ b/kysdk-notification/src/knotifier.cpp +@@ -0,0 +1,172 @@ ++#include "knotifier.h" ++#include ++#include ++#include ++#include ++#include ++#include ++ ++namespace kdk { ++ ++#define SERVICE "org.freedesktop.Notifications" ++#define PATH "/org/freedesktop/Notifications" ++#define INTERFACE "org.freedesktop.Notifications" ++ ++#define NOTIFY "Notify" ++#define CLOSE "CloseNotification" ++ ++ ++static QList dbusCall(QString serviceName, QString objectPath, QString interfaceName, ++ QString methodName, QList args = QList()) ++{ ++ QList ret; ++ ret.clear(); ++ ++ if (serviceName.isEmpty() || objectPath.isEmpty() || interfaceName.isEmpty() || methodName.isEmpty()) { ++ qDebug() << "knotifier : args error!"; ++ return ret; ++ } ++ ++ QDBusMessage message = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, methodName); ++ if (!args.isEmpty()) { ++ message.setArguments(args); ++ } ++ ++ QDBusMessage reply = QDBusConnection::sessionBus().call(message); ++ if (reply.type() == QDBusMessage::ReplyMessage) { ++ ret = reply.arguments(); ++ return ret; ++ } else { ++ qDebug() << "knotifier : dbus call method fail " << reply.errorMessage(); ++ } ++ ++ return ret; ++} ++ ++class KNotifierPrivate: public QObject ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KNotifier) ++ ++public: ++ KNotifierPrivate(KNotifier *parent = nullptr); ++ ++public: ++ KNotifier *q_ptr; ++ uint m_replaceId; ++ uint m_id; ++ int m_showTime; ++ QString m_bodyText; ++ QString m_summary; ++ QString m_iconName; ++ QString m_appName; ++ QStringList m_actionList; ++ ++}; ++ ++KNotifier::KNotifier(QObject *parent) : ++ QObject(parent), ++ d_ptr(new KNotifierPrivate(this)) ++{ ++ Q_D(KNotifier); ++} ++ ++KNotifier::~KNotifier() ++{ ++ ++} ++ ++void KNotifier::setDefaultAction(const QString &appName) ++{ ++ Q_D(KNotifier); ++ d->m_actionList.insert(0,appName); ++ d->m_actionList.insert(1,"default"); ++} ++ ++uint KNotifier::notify() ++{ ++ Q_D(KNotifier); ++ ++ QMap hints; ++ QList args; ++ args << d->m_appName ++ << d->m_replaceId ++ << d->m_iconName ++ << d->m_summary ++ << d->m_bodyText ++ << d->m_actionList ++ << hints ++ << d->m_showTime; ++ QList list = dbusCall(SERVICE,PATH,INTERFACE,NOTIFY,args); ++ d->m_id = list.at(0).toUInt(); ++ return d->m_id; ++} ++ ++void KNotifier::addAction(const QString &appName, const QString &text) ++{ ++ Q_D(KNotifier); ++ ++ d->m_actionList.append(appName); ++ d->m_actionList.append(text); ++} ++ ++void KNotifier::setShowTime(int milliseconds) ++{ ++ Q_D(KNotifier); ++ ++ d->m_showTime = milliseconds; ++} ++ ++void KNotifier::setAppName(const QString &appName) ++{ ++ Q_D(KNotifier); ++ ++ d->m_appName = appName; ++} ++ ++void KNotifier::setBodyText(const QString &bodyText) ++{ ++ Q_D(KNotifier); ++ ++ d->m_bodyText = bodyText; ++} ++ ++void KNotifier::setSummary(const QString &summary) ++{ ++ Q_D(KNotifier); ++ ++ d->m_summary = summary; ++} ++ ++void KNotifier::setAppIcon(const QString &iconName) ++{ ++ Q_D(KNotifier); ++ ++ d->m_iconName = iconName; ++} ++ ++void KNotifier::setReplaceId(const uint id) ++{ ++ Q_D(KNotifier); ++ d->m_replaceId = id; ++} ++ ++void KNotifier::closeNotification(uint id) ++{ ++ ++ QList args; ++ args << id; ++ dbusCall(SERVICE,PATH,INTERFACE,CLOSE,args); ++} ++ ++KNotifierPrivate::KNotifierPrivate(KNotifier *parent) ++ :q_ptr(parent), ++ m_replaceId(0), ++ m_showTime(KNotifier::Default) ++{ ++ setParent(parent); ++} ++ ++} ++#include "knotifier.moc" ++#include "moc_knotifier.cpp" +diff --git a/kysdk-notification/src/knotifier.h b/kysdk-notification/src/knotifier.h +new file mode 100644 +index 0000000..8333b72 +--- /dev/null ++++ b/kysdk-notification/src/knotifier.h +@@ -0,0 +1,98 @@ ++#ifndef NOTIFIER_H ++#define NOTIFIER_H ++ ++#include ++ ++namespace kdk { ++ ++class KNotifierPrivate; ++ ++/** ++ * @brief 消息通知类,调用notify()发消息后会在屏幕右上角以弹窗形式展示消息内容和支持的操作 ++ * 支持设置应用名称,应用图标,消息标题,消息主体内容,显示时长,添加action等 ++ */ ++ ++class KNotifier : public QObject ++{ ++ Q_OBJECT ++ ++public: ++ ++ enum ShowTime ++ { ++ Default = -1, //系统默认显示消息时长 ++ AllTheTime = 0 //消息常驻 ++ }; ++ explicit KNotifier(QObject *parent = nullptr); ++ ~KNotifier(); ++ ++ /** ++ * @brief 发送消息通知请求 ++ * @return 返回消息通知id ++ */ ++ uint notify(); ++ ++ /** ++ * @brief 设置默认跳转应用,点击消息弹窗时进行跳转 ++ * @param 应用名称 ++ */ ++ void setDefaultAction(const QString& appName); ++ ++ /** ++ * @brief 在消息弹窗中添加跳转按钮,最多可以添加三个 ++ * @param 按钮显示文本 ++ * @param 跳转应用名称 ++ */ ++ void addAction(const QString& appName, const QString& text); ++ ++ /** ++ * @brief 设置消息弹窗的显示时长,Default为系统默认时长,AllTheTime为常驻消息 ++ * @param 毫秒数 ++ */ ++ void setShowTime(int milliseconds); ++ ++ /** ++ * @brief 设置消息弹窗应用名称 ++ * @param 应用名称 ++ */ ++ void setAppName(const QString& appName); ++ ++ /** ++ * @brief 设置消息弹窗主内容 ++ * @param 主内容 ++ */ ++ void setBodyText(const QString& bodyText); ++ ++ /** ++ * @brief 设置消息弹窗标题 ++ * @param 标题 ++ */ ++ void setSummary(const QString& summary); ++ ++ /** ++ * @brief 设置消息弹窗应用图标,仅支持系统图标 ++ * @param 图标名称 ++ */ ++ void setAppIcon(const QString& iconName); ++ ++ /** ++ * @brief 设置替换消息弹窗的id替换通知即更新通知内容,在通知还未消失时,更新通知弹窗的主题、正文、跳转动作和按钮。 ++ * @param id ++ */ ++ void setReplaceId(const uint id); ++ ++ /** ++ * @brief 主动关闭消息弹窗 ++ * @param id ++ */ ++ static void closeNotification(uint id); ++ ++private: ++ Q_DECLARE_PRIVATE(KNotifier) ++ KNotifierPrivate* const d_ptr; ++ ++}; ++ ++} ++ ++#endif // NOTIFIER_H +diff --git a/kysdk-notification/testNotifier/main.cpp b/kysdk-notification/testNotifier/main.cpp +new file mode 100644 +index 0000000..b0a4ec2 +--- /dev/null ++++ b/kysdk-notification/testNotifier/main.cpp +@@ -0,0 +1,11 @@ ++#include "widget.h" ++ ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-notification/testNotifier/testNotifier.pro b/kysdk-notification/testNotifier/testNotifier.pro +new file mode 100644 +index 0000000..5b8d7b0 +--- /dev/null ++++ b/kysdk-notification/testNotifier/testNotifier.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++ ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-notification ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-notification/testNotifier/widget.cpp b/kysdk-notification/testNotifier/widget.cpp +new file mode 100644 +index 0000000..2752656 +--- /dev/null ++++ b/kysdk-notification/testNotifier/widget.cpp +@@ -0,0 +1,70 @@ ++#include "widget.h" ++#include ++ ++#include ++ ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QHBoxLayout *hLayout = new QHBoxLayout(this); ++ ++ QPushButton *btn1 = new QPushButton("常规通知",this); ++ QPushButton *btn2 = new QPushButton("通知内容替换",this); ++ QPushButton *btn3 = new QPushButton("常驻通知",this); ++ QPushButton *btn4 = new QPushButton("关闭通知",this); ++ ++ hLayout->addWidget(btn1); ++ hLayout->addWidget(btn2); ++ hLayout->addWidget(btn3); ++ hLayout->addWidget(btn4); ++ ++ connect(btn1,&QPushButton::clicked,this,[=](){ ++ KNotifier notifier; ++ notifier.setAppName("ukui-control-center"); ++ notifier.setAppIcon("ukui-control-center"); ++ notifier.setBodyText("bodyText"); ++ notifier.setSummary("summary"); ++ notifier.setDefaultAction("ukui-control-center"); ++ notifier.addAction("kylin-music","music"); ++ m_id = notifier.notify(); ++ qDebug() << "notifacation id:"< ++#include ++#include ++#include ++ ++using namespace kdk; ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++ ++private: ++ int m_id; ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/kysdk-qtwidgets.pro b/kysdk-qtwidgets/kysdk-qtwidgets.pro +index 7989998..658b4c7 100644 +--- a/kysdk-qtwidgets/kysdk-qtwidgets.pro ++++ b/kysdk-qtwidgets/kysdk-qtwidgets.pro +@@ -1,4 +1,4 @@ +-QT += widgets core sql x11extras KWindowSystem dbus ++QT += widgets core sql x11extras KWindowSystem dbus widgets-private + + TEMPLATE = lib + DEFINES += GUI_LIBRARY +@@ -30,11 +30,10 @@ LIBS += -L../kysdk-waylandhelper -lkysdk-waylandhelper -Wl,-rpath=/usr/lib/kysdk + TRANSLATIONS += ./translations/gui_zh_CN.ts \ + ./translations/gui_bo_CN.ts + +-SUBDIRS += build +- + SOURCES += \ +- src/parmscontroller.cpp \ ++ src/parmscontroller.cpp\ + src/kbreadcrumb.cpp \ ++ src/kcolorcombobox.cpp \ + src/kpasswordedit.cpp \ + src/kpixmapcontainer.cpp \ + src/kprogressbar.cpp \ +@@ -71,12 +70,17 @@ SOURCES += \ + src/kpressbutton.cpp\ + src/kpushbutton.cpp\ + src/ktranslucentfloor.cpp\ +- src/kbubblewidget.cpp +- ++ src/kbubblewidget.cpp\ ++ src/kbuttonbox.cpp\ ++ src/kbackgroundgroup.cpp\ ++ src/klineframe.cpp\ ++ src/kcolorbutton.cpp\ ++ src/kmessagebox.cpp + + HEADERS += \ +- src/parmscontroller.h \ ++ src/parmscontroller.h\ + src/kbreadcrumb.h \ ++ src/kcolorcombobox.h \ + src/kpasswordedit.h \ + src/kpixmapcontainer.h \ + src/kprogressbar.h \ +@@ -114,7 +118,12 @@ HEADERS += \ + src/kpressbutton.h\ + src/kpushbutton.h\ + src/ktranslucentfloor.h\ +- src/kbubblewidget.h ++ src/kbubblewidget.h\ ++ src/kbuttonbox.h\ ++ src/kbackgroundgroup.h\ ++ src/klineframe.h\ ++ src/kcolorbutton.h\ ++ src/kmessagebox.h + + + +diff --git a/kysdk-qtwidgets/src/kbackgroundgroup.cpp b/kysdk-qtwidgets/src/kbackgroundgroup.cpp +new file mode 100644 +index 0000000..5ad48e6 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kbackgroundgroup.cpp +@@ -0,0 +1,440 @@ ++#include "kbackgroundgroup.h" ++#include "themeController.h" ++#include ++#include "klineframe.h" ++#include ++#include ++#include ++ ++namespace kdk { ++ ++class KBackgroundGroupPrivate : public QObject ,public ThemeController ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KBackgroundGroup) ++public: ++ enum WidgetPosition ++ { ++ Beginning, ++ Middle, ++ End ++ }; ++ KBackgroundGroupPrivate(KBackgroundGroup* parent); ++ void updateLayout(); ++private: ++ KBackgroundGroup* q_ptr; ++ QVBoxLayout* m_pmainWidgetLayout; ++ QList m_pwidgetList; ++ QList m_pwidgetStateList; ++ QPalette::ColorRole m_brushColorRole; ++ QColor m_backgroundColor; ++ WidgetPosition m_widgetPosition; ++ QRect m_rect; ++ int m_rectLocal; ++ int m_radius; ++}; ++ ++KBackgroundGroup::KBackgroundGroup(QWidget *parent) ++ :QFrame(parent) ++ ,d_ptr(new KBackgroundGroupPrivate(this)) ++{ ++ setFrameShape(QFrame::Box); ++ setFrameShadow(QFrame::Plain); ++ setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); ++} ++ ++void KBackgroundGroup::addWidget(QWidget *widget) ++{ ++ Q_D(KBackgroundGroup); ++ if(widget->maximumHeight() != widget->minimumHeight()) ++ widget->setFixedHeight(60); ++ if(!d->m_pwidgetList.contains(widget)) ++ d->m_pwidgetList.append(widget); ++ else ++ return; ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::addWidgetList(QList list) ++{ ++ Q_D(KBackgroundGroup); ++ for (int i = 0; i < list.count();i++) ++ { ++ auto widget = list.at(i); ++ if(widget->maximumHeight() != widget->minimumHeight()) ++ widget->setFixedHeight(60); ++ if(!d->m_pwidgetList.contains(list.at(i))) ++ d->m_pwidgetList.append(list.at(i)); ++ else ++ continue ; ++ } ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::removeWidgetAt(int i) ++{ ++ Q_D(KBackgroundGroup); ++ if(d->m_pwidgetList.contains(d->m_pwidgetList.at(i))) ++ d->m_pwidgetList.removeAt(i); ++ else ++ return; ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::removeWidget(QWidget *widget) ++{ ++ Q_D(KBackgroundGroup); ++ if(d->m_pwidgetList.contains(widget)) ++ d->m_pwidgetList.removeOne(widget); ++ else ++ return ; ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::removeWidgetList(QList list) ++{ ++ Q_D(KBackgroundGroup); ++ for (int i = 0; i < list.count();i++) ++ { ++ if(d->m_pwidgetList.contains(list.at(i))) ++ d->m_pwidgetList.removeOne(list.at(i)); ++ else ++ continue ; ++ } ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::insertWidgetAt(int index, QWidget *widget) ++{ ++ Q_D(KBackgroundGroup); ++ if(widget->maximumHeight() != widget->minimumHeight()) ++ widget->setFixedHeight(60); ++ if(!d->m_pwidgetList.contains(widget)) ++ d->m_pwidgetList.insert(index,widget); ++ else ++ return ; ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::insertWidgetList(int index, QList list) ++{ ++ Q_D(KBackgroundGroup); ++ for (int i = 0; i < list.count();i++) ++ { ++ auto widget = list.at(i); ++ if(widget->maximumHeight() != widget->minimumHeight()) ++ widget->setFixedHeight(60); ++ if(!d->m_pwidgetList.contains(list.at(i))) ++ d->m_pwidgetList.insert(index++,list.at(i)); ++ else ++ continue ; ++ } ++ d->updateLayout(); ++} ++ ++void KBackgroundGroup::setBorderRadius(int radius) ++{ ++ Q_D(KBackgroundGroup); ++ d->m_radius = radius; ++} ++ ++int KBackgroundGroup::borderRadius() ++{ ++ Q_D(KBackgroundGroup); ++ return d->m_radius; ++} ++ ++void KBackgroundGroup::setBackgroundRole(QPalette::ColorRole role) ++{ ++ Q_D(KBackgroundGroup); ++ d->m_brushColorRole = role; ++} ++ ++QPalette::ColorRole KBackgroundGroup::backgroundRole() const ++{ ++ Q_D(const KBackgroundGroup); ++ return d->m_brushColorRole ; ++} ++ ++void KBackgroundGroup::setStateEnable(QWidget *widget, bool flag) ++{ ++ Q_D(KBackgroundGroup); ++ if(!d->m_pwidgetStateList.contains(widget) && flag) ++ { ++ d->m_pwidgetStateList.append(widget); ++ widget->installEventFilter(this); ++ widget->setAttribute(Qt::WA_TranslucentBackground); ++ } ++} ++ ++QList KBackgroundGroup::widgetList() ++{ ++ Q_D(KBackgroundGroup); ++ return d->m_pwidgetList; ++} ++ ++void KBackgroundGroup::paintEvent(QPaintEvent *event) ++{ ++ Q_D(KBackgroundGroup); ++ //绘制backgroundgroup ++ QRect rect =this->rect(); ++ ++ QPainter painter(this); ++ painter.setRenderHint(QPainter::Antialiasing); ++ painter.setPen(Qt::transparent); ++ painter.setBrush(palette().color(d->m_brushColorRole)); ++ ++ QPainterPath path; ++ path.moveTo(rect.topLeft() + QPointF(d->m_radius , 0)); ++ path.quadTo(rect.topLeft() , rect.topLeft() + QPointF(0,d->m_radius)); ++ path.lineTo(rect.bottomLeft() - QPointF(0, d->m_radius)); ++ path.quadTo(rect.bottomLeft() , rect.bottomLeft() + QPointF(d->m_radius,0)); ++ path.lineTo(rect.bottomRight() - QPointF(d->m_radius,0)); ++ path.quadTo(rect.bottomRight() , rect.bottomRight() - QPointF(0,d->m_radius)); ++ path.lineTo(rect.topRight() + QPointF(0,d->m_radius)); ++ path.quadTo(rect.topRight() , rect.topRight() - QPointF(d->m_radius,0)); ++ path.lineTo(rect.topLeft() + QPointF(d->m_radius , 0)); ++ painter.drawPath(path); ++ ++ //三态事件响应颜色 ++ painter.save(); ++ painter.setBrush(d->m_backgroundColor); ++ painter.setRenderHint(QPainter::Antialiasing); ++ painter.setPen(Qt::transparent); ++ ++ //确定三态区域 ++ int index,offset=0; ++ for(index =0;indexm_pwidgetList.count()-1;index++) ++ { ++ auto widget = d->m_pwidgetList.at(index); ++ if( widget == d->m_pwidgetStateList.at(d->m_rectLocal)) ++ break; ++ else ++ offset = offset + d->m_pwidgetList.at(index)->height(); ++ } ++ ++ d->m_rect = d->m_rect.translated(0,offset+index); ++ d->m_rect = d->m_rect.adjusted(0,0,2,2); ++ ++ //三态区域颜色调整 ++ QPainterPath path1; ++ if(d->m_pwidgetList.count() == 1 && d->m_pwidgetStateList.count() == 1) ++ { ++ painter.drawRoundedRect(d->m_rect,d->m_radius,d->m_radius); ++ } ++ else if(d->m_pwidgetList.count() > 1) ++ { ++ switch (d->m_widgetPosition) ++ { ++ case KBackgroundGroupPrivate::Beginning: ++ path1.moveTo(d->m_rect.topLeft() + QPointF(0,d->m_radius)); ++ path1.lineTo(d->m_rect.bottomLeft()); ++ path1.lineTo(d->m_rect.bottomRight()); ++ path1.lineTo(d->m_rect.topRight() + QPointF(0,d->m_radius)); ++ path1.quadTo(d->m_rect.topRight() , d->m_rect.topRight() - QPointF(d->m_radius,0)); ++ path1.lineTo(d->m_rect.topLeft() + QPointF(d->m_radius,0)); ++ path1.quadTo(d->m_rect.topLeft() , d->m_rect.topLeft() + QPointF(0,d->m_radius)); ++ painter.drawPath(path1); ++ break; ++ case KBackgroundGroupPrivate::Middle: ++ painter.drawRoundedRect(d->m_rect,0,0); ++ break; ++ case KBackgroundGroupPrivate::End: ++ path1.moveTo(d->m_rect.topLeft()); ++ path1.lineTo(d->m_rect.bottomLeft() - QPointF(0,d->m_radius)); ++ path1.quadTo(d->m_rect.bottomLeft() , d->m_rect.bottomLeft() + QPointF(d->m_radius,0)); ++ path1.lineTo(d->m_rect.bottomRight() - QPointF(d->m_radius,0)); ++ path1.quadTo(d->m_rect.bottomRight() , d->m_rect.bottomRight() - QPointF(0,d->m_radius)); ++ path1.lineTo(d->m_rect.topRight()); ++ path1.lineTo(d->m_rect.topLeft()); ++ painter.drawPath(path1); ++ break; ++ default: ++ break; ++ } ++ } ++ painter.restore(); ++} ++ ++bool KBackgroundGroup::eventFilter(QObject *watched, QEvent *event) ++{ ++ Q_D(KBackgroundGroup); ++ auto widget = static_cast(watched); ++ ++ if(d->m_pwidgetStateList.contains(widget)) ++ { ++ //事件过滤器判断事件设置颜色 ++ QColor color; ++ switch (event->type()) ++ { ++ case QEvent::HoverEnter: ++ d->m_rect = widget->rect(); ++ //设置三态区域背景色 ++ if(ThemeController::themeMode() == LightTheme) ++ { ++ color = palette().button().color();//QColor("#E6E6E6"); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::black,0.05); ++ } ++ else ++ { ++ color =palette().base().color();// QColor("#373737"); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::white,0.2); ++ } ++ //获取三态区域位置 ++ if(d->m_pwidgetList.at(0) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::Beginning; ++ else if(d->m_pwidgetList.at(d->m_pwidgetList.count()-1) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::End; ++ else ++ d->m_widgetPosition = KBackgroundGroupPrivate::Middle; ++ d->m_rectLocal =d->m_pwidgetStateList.indexOf(widget); ++ update(); ++ break; ++ case QEvent::Enter: ++ d->m_rect = widget->rect(); ++ if(ThemeController::themeMode() == LightTheme) ++ { ++ color = palette().button().color(); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::black,0.05); ++ } ++ else ++ { ++ color = palette().base().color(); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::white,0.2); ++ } ++ if(d->m_pwidgetList.at(0) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::Beginning; ++ else if(d->m_pwidgetList.at(d->m_pwidgetList.count()-1) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::End; ++ else ++ d->m_widgetPosition = KBackgroundGroupPrivate::Middle; ++ d->m_rectLocal =d->m_pwidgetStateList.indexOf(widget); ++ update(); ++ break; ++ case QEvent::MouseButtonPress: ++ d->m_rect = widget->rect(); ++ if(ThemeController::themeMode() == LightTheme) ++ { ++ color = palette().button().color(); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::black,0.2); ++ } ++ else ++ { ++ color = palette().base().color(); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::white,0.05); ++ } ++ if(d->m_pwidgetList.at(0) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::Beginning; ++ else if(d->m_pwidgetList.at(d->m_pwidgetList.count()-1) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::End; ++ else ++ d->m_widgetPosition = KBackgroundGroupPrivate::Middle; ++ d->m_rectLocal =d->m_pwidgetStateList.indexOf(widget); ++ update(); ++ break; ++ case QEvent::MouseButtonRelease: ++ { ++ d->m_rect = widget->rect(); ++ if(ThemeController::themeMode() == LightTheme) ++ { ++ color = palette().button().color(); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::black,0.05); ++ } ++ else ++ { ++ color = palette().base().color(); ++ d->m_backgroundColor = ThemeController::mixColor(color,Qt::white,0.2); ++ } ++ if(d->m_pwidgetList.at(0) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::Beginning; ++ else if(d->m_pwidgetList.at(d->m_pwidgetList.count()-1) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::End; ++ else ++ d->m_widgetPosition = KBackgroundGroupPrivate::Middle; ++ Q_EMIT clicked(widget); ++ d->m_rectLocal =d->m_pwidgetStateList.indexOf(widget); ++ update(); ++ break; ++ } ++ case QEvent::Leave: ++ d->m_rect = widget->rect(); ++ d->m_backgroundColor = palette().color(QPalette::Base); ++ if(d->m_pwidgetList.at(0) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::Beginning; ++ else if(d->m_pwidgetList.at(d->m_pwidgetList.count()-1) == widget) ++ d->m_widgetPosition = KBackgroundGroupPrivate::End; ++ else ++ d->m_widgetPosition = KBackgroundGroupPrivate::Middle; ++ d->m_rectLocal =d->m_pwidgetStateList.indexOf(widget); ++ update(); ++ break; ++ default: ++ break; ++ } ++ } ++ return QObject::eventFilter(watched,event); ++} ++ ++KBackgroundGroupPrivate::KBackgroundGroupPrivate(KBackgroundGroup *parent) ++ :q_ptr(parent) ++ ,m_widgetPosition(KBackgroundGroupPrivate::Beginning),m_rectLocal(0) ++ ,m_radius(12),m_backgroundColor(parent->palette().color(QPalette::Base)) ++ ,m_brushColorRole(QPalette::Base) ++{ ++ Q_Q(KBackgroundGroup); ++ m_pmainWidgetLayout = new QVBoxLayout(q); ++ m_pmainWidgetLayout->setContentsMargins(0,0,0,0); ++ m_pmainWidgetLayout->setSpacing(0); ++ m_pmainWidgetLayout->setMargin(0); ++ ++// q->setFocus(Qt::MouseFocusReason); ++ connect(m_gsetting,&QGSettings::changed,this,[=](){ ++ initThemeStyle(); ++ }); ++} ++ ++void KBackgroundGroupPrivate::updateLayout() ++{ ++ Q_Q(KBackgroundGroup); ++ //清空 ++ QLayoutItem *child; ++ while ((child = m_pmainWidgetLayout->takeAt(0)) != 0) ++ { ++ //删除Stretch(弹簧)等布局 ++ if (child->spacerItem()) ++ { ++ m_pmainWidgetLayout->removeItem(child); ++ continue; ++ } ++ //删除布局 ++ m_pmainWidgetLayout->removeWidget(child->widget()); ++ child->widget()->setParent(nullptr); ++ delete child; ++ child =nullptr; ++ } ++ ++ //添加布局 ++ if(m_pwidgetList.count() < 1) ++ return; ++ else if(m_pwidgetList.count() == 1) ++ { ++ m_pmainWidgetLayout->addWidget(m_pwidgetList.at(0)); ++ } ++ else ++ { ++ for (int i = 0; i < m_pwidgetList.count(); ++i) ++ { ++ m_pmainWidgetLayout->addWidget(m_pwidgetList.at(i)); ++ if(i != m_pwidgetList.count()-1) ++ { ++ KHLineFrame* frame = new KHLineFrame(); ++ m_pmainWidgetLayout->addWidget(frame); ++ } ++ } ++ } ++} ++ ++} ++ ++#include "kbackgroundgroup.moc" ++#include "moc_kbackgroundgroup.cpp" +diff --git a/kysdk-qtwidgets/src/kbackgroundgroup.h b/kysdk-qtwidgets/src/kbackgroundgroup.h +new file mode 100644 +index 0000000..f061078 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kbackgroundgroup.h +@@ -0,0 +1,115 @@ ++#ifndef KBACKGROUNDGROUP_H ++#define KBACKGROUNDGROUP_H ++ ++#include "gui_g.h" ++#include ++#include ++namespace kdk { ++ ++class KBackgroundGroupPrivate; ++ ++class GUI_EXPORT KBackgroundGroup : public QFrame ++{ ++ Q_OBJECT ++ ++public: ++ KBackgroundGroup(QWidget* parent = nullptr); ++ ++ /** ++ * @brief 添加一个widget控件 ++ * @param widget ++ */ ++ void addWidget(QWidget* widget); ++ ++ /** ++ * @brief 添加一个widget list ++ * @param list ++ */ ++ void addWidgetList(QList list); ++ ++ /** ++ * @brief 删除一个制定index的widget ++ * @param i ++ */ ++ void removeWidgetAt(int i); ++ ++ /** ++ * @brief 删除一个widget ++ * @param widget ++ */ ++ void removeWidget(QWidget* widget); ++ ++ /** ++ * @brief 删除一个widget list ++ * @param list ++ */ ++ void removeWidgetList(QList list); ++ ++ /** ++ * @brief 指定位置插入一个widget ++ * @param index ++ * @param widget ++ */ ++ void insertWidgetAt(int index, QWidget *widget); ++ ++ /** ++ * @brief 指定位置插入一个widget list ++ * @param index ++ * @param list ++ */ ++ void insertWidgetList(int index, QList list); ++ ++ /** ++ * @brief 设置KBackgroundGroup的圆角 ++ * @param radius ++ */ ++ void setBorderRadius(int radius); ++ ++ /** ++ * @brief 返回KBackgroundGroup的圆角 ++ * @return ++ */ ++ int borderRadius(); ++ ++ /** ++ * @brief 设置背景颜色 ++ * @param role ++ */ ++ void setBackgroundRole(QPalette::ColorRole role); ++ ++ /** ++ * @brief 返回背景颜色 ++ * @return ++ */ ++ QPalette::ColorRole backgroundRole() const; ++ ++ /** ++ * @brief 设置窗体是否可以相应三态 ++ * @param flag ++ * @param widget ++ */ ++ void setStateEnable(QWidget* widget,bool flag); ++ ++ /** ++ * @brief 返回widget列表 ++ * @return ++ */ ++ QList widgetList(); ++ ++Q_SIGNALS: ++ /** ++ * @brief 点击会发出信号 ++ */ ++ void clicked(QWidget*); ++ ++protected: ++ void paintEvent(QPaintEvent *event); ++ bool eventFilter(QObject *watched, QEvent *event); ++ ++private: ++ Q_DECLARE_PRIVATE(KBackgroundGroup) ++ KBackgroundGroupPrivate* const d_ptr; ++}; ++ ++} ++#endif // KBACKGROUNDGROUP_H +diff --git a/kysdk-qtwidgets/src/kballontip.cpp b/kysdk-qtwidgets/src/kballontip.cpp +index 784929d..499e39d 100644 +--- a/kysdk-qtwidgets/src/kballontip.cpp ++++ b/kysdk-qtwidgets/src/kballontip.cpp +@@ -45,9 +45,10 @@ KBallonTip::KBallonTip(QWidget *parent) + d_ptr(new KBallonTipPrivate(this)) + { + Q_D(KBallonTip); ++ setWindowFlag(Qt::ToolTip); + d->m_pVLayout = new QVBoxLayout(this); + d->m_pLayout = new QHBoxLayout(this); +- d->m_pLayout->setSpacing(13); ++ d->m_pLayout->setSpacing(12); + this->setContentsMargins(24,18,24,18); + d->m_pContentLabel = new QLabel(this); + d->m_pContentLabel->setWordWrap(true); +@@ -75,7 +76,7 @@ KBallonTip::KBallonTip(QWidget *parent) + d->m_pVLayout->addLayout(d->m_pLayout); + d->m_pVLayout->addStretch(); + d->adjustStyle(); +- d->m_pVLayout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); ++ d->m_pVLayout->setSizeConstraint(QLayout::SizeConstraint::SetMinimumSize); + if(ThemeController::systemFontSize() > 11) + vLayout->setContentsMargins(0,(ThemeController::systemFontSize()-11),0,0); + else +@@ -205,7 +206,8 @@ void KBallonTipPrivate::adjustStyle() + m_pIconLabel->hide(); + break; + case TipType::Normal: +- m_icon = QIcon::fromTheme("ukui-dialog-success"); ++// m_icon = QIcon::fromTheme("ukui-dialog-success"); ++ m_icon = QIcon::fromTheme("ukui-dialog-success", QIcon::fromTheme("emblem-default")); + m_pIconLabel->show(); + break; + case TipType::Info:; +diff --git a/kysdk-qtwidgets/src/kborderbutton.cpp b/kysdk-qtwidgets/src/kborderbutton.cpp +index 42fd3a2..1598833 100644 +--- a/kysdk-qtwidgets/src/kborderbutton.cpp ++++ b/kysdk-qtwidgets/src/kborderbutton.cpp +@@ -38,6 +38,12 @@ KBorderButton::~KBorderButton() + { + } + ++QSize KBorderButton::sizeHint() const ++{ ++ auto size = QPushButton::sizeHint(); ++ size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); ++ return size; ++} + bool KBorderButton::eventFilter(QObject *watched, QEvent *event) + { + Q_D(KBorderButton); +@@ -89,6 +95,7 @@ void KBorderButton::paintEvent(QPaintEvent *event) + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::TextAntialiasing); ++ p.setRenderHint(QPainter::SmoothPixmapTransform); + QPen pen; + pen.setCapStyle(Qt::RoundCap); + pen.setJoinStyle(Qt::RoundJoin); +@@ -150,13 +157,6 @@ void KBorderButton::paintEvent(QPaintEvent *event) + p.drawText(ir,tf,option.text); + } + +-QSize KBorderButton::sizeHint() const +-{ +- auto size = QPushButton::sizeHint(); +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); +- return size; +-} +- + KBorderButton::KBorderButton(const QString &text, QWidget *parent ):KBorderButton(parent) + { + setText(text); +diff --git a/kysdk-qtwidgets/src/kborderlessbutton.cpp b/kysdk-qtwidgets/src/kborderlessbutton.cpp +index d7c7c3f..81cb28d 100644 +--- a/kysdk-qtwidgets/src/kborderlessbutton.cpp ++++ b/kysdk-qtwidgets/src/kborderlessbutton.cpp +@@ -138,6 +138,7 @@ void KBorderlessButton::paintEvent(QPaintEvent *event) + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::TextAntialiasing); ++ p.setRenderHint(QPainter::SmoothPixmapTransform); + QPen pen; + pen.setCapStyle(Qt::RoundCap); + pen.setJoinStyle(Qt::RoundJoin); +diff --git a/kysdk-qtwidgets/src/kbreadcrumb.cpp b/kysdk-qtwidgets/src/kbreadcrumb.cpp +index 322a59a..8a3760a 100644 +--- a/kysdk-qtwidgets/src/kbreadcrumb.cpp ++++ b/kysdk-qtwidgets/src/kbreadcrumb.cpp +@@ -92,6 +92,10 @@ void KBreadCrumb::paintEvent(QPaintEvent *event) + focusColor = "#262626"; + } + QPainter p(this); ++ p.setRenderHint(QPainter::Antialiasing); ++ p.setRenderHint(QPainter::HighQualityAntialiasing); ++ p.setRenderHint(QPainter::TextAntialiasing); ++ p.setRenderHint(QPainter::SmoothPixmapTransform); + for(int i = 0 ; i < count(); i++) + { + QRect rc = tabRect(i); +diff --git a/kysdk-qtwidgets/src/kbubblewidget.cpp b/kysdk-qtwidgets/src/kbubblewidget.cpp +index 85ac6d7..5ddaced 100644 +--- a/kysdk-qtwidgets/src/kbubblewidget.cpp ++++ b/kysdk-qtwidgets/src/kbubblewidget.cpp +@@ -3,8 +3,8 @@ + #include + #include + #include +-#include + #include "themeController.h" ++#include + + namespace kdk { + +diff --git a/kysdk-qtwidgets/src/kbuttonbox.cpp b/kysdk-qtwidgets/src/kbuttonbox.cpp +new file mode 100644 +index 0000000..b92ae85 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kbuttonbox.cpp +@@ -0,0 +1,279 @@ ++#include "kbuttonbox.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include "themeController.h" ++ ++namespace kdk { ++class KButtonBoxPrivate : public QObject ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KButtonBox) ++public: ++ KButtonBoxPrivate(KButtonBox* parent); ++ void updateBorderRadius(); ++ void updateButtonList(); ++private: ++ KButtonBox *q_ptr; ++ QButtonGroup *m_buttonGroup; ++ QBoxLayout *m_layout; ++ int m_radius; ++ bool m_isCheckable; ++ QList m_buttonList; ++}; ++ ++KButtonBoxPrivate::KButtonBoxPrivate(KButtonBox *parent) ++ :q_ptr(parent) ++{ ++ Q_Q(KButtonBox); ++ m_buttonGroup = new QButtonGroup(q); ++ q->connect(m_buttonGroup, SIGNAL(buttonClicked(QAbstractButton*)), q, SIGNAL(buttonClicked(QAbstractButton*))); ++ q->connect(m_buttonGroup, SIGNAL(buttonPressed(QAbstractButton*)), q, SIGNAL(buttonPressed(QAbstractButton*))); ++ q->connect(m_buttonGroup, SIGNAL(buttonReleased(QAbstractButton*)), q, SIGNAL(buttonReleased(QAbstractButton*))); ++ q->connect(m_buttonGroup, SIGNAL(buttonToggled(QAbstractButton*, bool)), q, SIGNAL(buttonToggled(QAbstractButton*, bool))); ++ ++ m_layout = new QHBoxLayout(q); ++ m_layout->setSizeConstraint(QLayout::SetFixedSize); ++ m_layout->setMargin(0); ++ m_layout->setSpacing(0); ++ m_radius = 6; ++ m_isCheckable = false; ++} ++ ++void KButtonBoxPrivate::updateBorderRadius() ++{ ++ Q_Q(KButtonBox); ++ QList buttonList = q->buttonList(); ++ switch (q->orientation()) { ++ case Qt::Horizontal: { ++ for(int i = 0 ; i < buttonList.count(); i++) ++ { ++ KPushButton *button = buttonList.at(i); ++ if(i == 0){ ++ Q_ASSERT(button); ++ button->setBorderRadius(m_radius,m_radius,0,0); ++ } ++ else if(i == buttonList.count()-1){ ++ Q_ASSERT(button); ++ button->setBorderRadius(0,0,m_radius,m_radius); ++ } ++ else { ++ Q_ASSERT(button); ++ button->setBorderRadius(0); ++ } ++ } ++ break; ++ } ++ case Qt::Vertical: { ++ for(int i = 0 ; i < buttonList.count(); i++) ++ { ++ KPushButton *button = buttonList.at(i); ++ if(i == 0){ ++ Q_ASSERT(button); ++ button->setBorderRadius(0,m_radius,m_radius,0); ++ } ++ else if(i == buttonList.count()-1){ ++ Q_ASSERT(button); ++ button->setBorderRadius(m_radius,0,0,m_radius); ++ } ++ else { ++ Q_ASSERT(button); ++ button->setBorderRadius(0); ++ } ++ } ++ break; ++ } ++ default: ++ break; ++ } ++ q->update(); ++} ++ ++void KButtonBoxPrivate::updateButtonList() ++{ ++ Q_Q(KButtonBox); ++ ++ for (QAbstractButton *button : m_buttonGroup->buttons()) { ++ m_buttonGroup->removeButton(button); ++ m_layout->removeWidget(button); ++ } ++ for (int i = 0; i < m_buttonList.count(); ++i) { ++ KPushButton *button = m_buttonList.at(i); ++ button->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); ++ m_layout->insertWidget(i,button); ++ m_buttonGroup->addButton(button,i); ++ button->setCheckable(m_isCheckable); ++ } ++ updateBorderRadius(); ++} ++ ++KButtonBox::KButtonBox(QWidget *parent) ++ :QWidget(parent) ++ ,d_ptr(new KButtonBoxPrivate(this)) ++{ ++ Q_D(KButtonBox); ++} ++ ++KButtonBox::~KButtonBox() ++{ ++ ++} ++ ++Qt::Orientation KButtonBox::orientation() ++{ ++ Q_D(KButtonBox); ++ QBoxLayout::Direction layoutDirection = d->m_layout->direction(); ++ if(layoutDirection == QBoxLayout::LeftToRight || layoutDirection == QBoxLayout::RightToLeft) ++ { ++ return Qt::Horizontal; ++ } ++ return Qt::Vertical; ++} ++ ++void KButtonBox::setOrientation(Qt::Orientation orientation) ++{ ++ Q_D(KButtonBox); ++ if(orientation == Qt::Vertical) ++ { ++ d->m_layout->setDirection(QBoxLayout::TopToBottom); ++ d->updateBorderRadius(); ++ return; ++ } ++ d->m_layout->setDirection(QBoxLayout::LeftToRight); ++ d->updateBorderRadius(); ++} ++ ++void KButtonBox::addButton(KPushButton *button ,int i) ++{ ++ Q_D(KButtonBox); ++ if(i < -1) ++ return; ++ ++ if(i == -1 || i >= d->m_buttonList.count()){ ++ d->m_buttonList.append(button); ++ } ++ else{ ++ d->m_buttonList.insert(i,button); ++ } ++ ++ button->show(); ++ ++ setButtonList(d->m_buttonList); ++} ++ ++void KButtonBox::removeButton(KPushButton *button) ++{ ++ Q_D(KButtonBox); ++ if(d->m_buttonList.contains(button)){ ++ d->m_buttonList.removeAll(button); ++ button->hide(); ++ } ++ setButtonList(d->m_buttonList); ++} ++ ++void KButtonBox::removeButton(int i) ++{ ++ Q_D(KButtonBox); ++ if(i < 0 || i >= d->m_buttonList.count()) ++ return; ++ auto button = d->m_buttonList.at(i); ++ if(button) ++ button->hide(); ++ d->m_buttonList.removeAt(i); ++ setButtonList(d->m_buttonList); ++} ++ ++void KButtonBox::setButtonList(const QList &list) ++{ ++ Q_D(KButtonBox); ++ d->m_buttonList = list; ++ d->updateButtonList(); ++} ++ ++QList KButtonBox::buttonList() ++{ ++ Q_D(KButtonBox); ++ return d->m_buttonList; ++} ++ ++void KButtonBox::setBorderRadius(int radius) ++{ ++ Q_D(KButtonBox); ++ d->m_radius = radius; ++ update(); ++} ++ ++int KButtonBox::borderRadius() ++{ ++ Q_D(KButtonBox); ++ return d->m_radius; ++} ++ ++void KButtonBox::setId(KPushButton *button, int id) ++{ ++ Q_D(KButtonBox); ++ d->m_buttonGroup->setId(button,id); ++} ++ ++int KButtonBox::id(KPushButton *button) ++{ ++ Q_D(KButtonBox); ++ return d->m_buttonGroup->id(button); ++} ++ ++KPushButton *KButtonBox::checkedButton() ++{ ++ Q_D(KButtonBox); ++ KPushButton * button = dynamic_cast(d->m_buttonGroup->checkedButton()); ++ return button; ++} ++ ++KPushButton *KButtonBox::button(int id) ++{ ++ Q_D(KButtonBox); ++ KPushButton * button = dynamic_cast(d->m_buttonGroup->button(id)); ++ return button; ++} ++ ++int KButtonBox::checkedId() ++{ ++ Q_D(KButtonBox); ++ return d->m_buttonGroup->checkedId(); ++} ++ ++void KButtonBox::setExclusive(bool exclusive) ++{ ++ Q_D(KButtonBox); ++ d->m_buttonGroup->setExclusive(exclusive); ++} ++ ++bool KButtonBox::exclusive() ++{ ++ Q_D(KButtonBox); ++ return d->m_buttonGroup->exclusive(); ++} ++ ++void KButtonBox::setCheckable(bool flag) ++{ ++ Q_D(KButtonBox); ++ d->m_isCheckable = flag; ++ QList list = buttonList(); ++ for (int i = 0; i < list.count(); ++i) { ++ KPushButton *button = list.at(i); ++ button->setCheckable(d->m_isCheckable); ++ } ++ update(); ++} ++ ++bool KButtonBox::isCheckable() ++{ ++ Q_D(KButtonBox); ++ return d->m_isCheckable; ++} ++ ++} ++#include "kbuttonbox.moc" ++#include "moc_kbuttonbox.cpp" +diff --git a/kysdk-qtwidgets/src/kbuttonbox.h b/kysdk-qtwidgets/src/kbuttonbox.h +new file mode 100644 +index 0000000..424ed45 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kbuttonbox.h +@@ -0,0 +1,144 @@ ++#ifndef KBUTTONBOX_H ++#define KBUTTONBOX_H ++ ++#include "gui_g.h" ++#include "kpushbutton.h" ++#include ++#include ++ ++ ++namespace kdk { ++ ++class KButtonBoxPrivate; ++ ++class GUI_EXPORT KButtonBox : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ explicit KButtonBox(QWidget *parent = nullptr); ++ ~KButtonBox(); ++ ++ /** ++ * @brief 获取KButtonBox的布局类型 ++ * @return ++ */ ++ Qt::Orientation orientation(); ++ ++ /** ++ * @brief 设置KButtonBox的布局类型,包括水平类型和垂直类型 ++ * @param orientation ++ */ ++ void setOrientation(Qt::Orientation orientation); ++ ++ /** ++ * @brief 添加按钮 ++ * @param button ++ */ ++ void addButton(KPushButton *button,int i = -1); ++ ++ /** ++ * @brief 删除按钮 ++ * @param button ++ */ ++ void removeButton(KPushButton *button); ++ ++ /** ++ * @brief 按id删除指定按钮 ++ * @param i ++ */ ++ void removeButton(int i); ++ ++ /** ++ * @brief 以列表形式向KButtonBox中添加按钮 ++ * @param list ++ * @param checkable ++ */ ++ void setButtonList(const QList &list); ++ ++ /** ++ * @brief 获取KButtonBox中的按钮列表 ++ * @return ++ */ ++ QList buttonList(); ++ ++ /** ++ * @brief 设置KButtonBox首尾部分按钮的圆角 ++ * @param radius ++ */ ++ void setBorderRadius(int radius); ++ ++ /** ++ * @brief 获取KButtonBox首尾部分按钮的圆角 ++ * @return ++ */ ++ int borderRadius(); ++ ++ /** ++ * @brief 设置按钮id ++ * @param button ++ * @param id ++ */ ++ void setId(KPushButton *button, int id); ++ ++ /** ++ * @brief 获取按钮id ++ * @param button ++ * @return ++ */ ++ int id(KPushButton *button); ++ ++ /** ++ * @brief 返回已选中的按钮 ++ * @return ++ */ ++ KPushButton * checkedButton(); ++ ++ /** ++ * @brief 通过按钮id获取按钮 ++ * @param id ++ * @return ++ */ ++ KPushButton *button(int id); ++ ++ /** ++ * @brief 返回已选中按钮的id ++ * @return ++ */ ++ int checkedId(); ++ ++ /** ++ * @brief 设置KButtonBox按钮间是否互斥 ++ */ ++ void setExclusive(bool); ++ ++ /** ++ * @brief 返回KButtonBox按钮间是否互斥 ++ * @return ++ */ ++ bool exclusive(); ++ ++ /** ++ * @brief 设置KButtonBox中的按钮是否可选中 ++ */ ++ void setCheckable(bool flag); ++ ++ /** ++ * @brief 返回KButtonBox中的按钮是否可选中 ++ * @return ++ */ ++ bool isCheckable(); ++ ++Q_SIGNALS: ++ void buttonClicked(QAbstractButton *); ++ void buttonPressed(QAbstractButton *); ++ void buttonReleased(QAbstractButton *); ++ void buttonToggled(QAbstractButton *, bool); ++ ++private: ++ Q_DECLARE_PRIVATE(KButtonBox) ++ KButtonBoxPrivate* const d_ptr; ++}; ++ ++} ++#endif // KBUTTONBOX_H +diff --git a/kysdk-qtwidgets/src/kcolorbutton.cpp b/kysdk-qtwidgets/src/kcolorbutton.cpp +new file mode 100644 +index 0000000..f407b98 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kcolorbutton.cpp +@@ -0,0 +1,198 @@ ++#include "kcolorbutton.h" ++#include ++#include ++#include "themeController.h" ++#include ++ ++namespace kdk { ++ ++static const int circleButtonSize = 20; ++static const int normalButtonSize = 24; ++ ++class KColorButtonPrivate : public QObject,public ThemeController ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KColorButton) ++public: ++ KColorButtonPrivate(KColorButton* parent); ++ ++protected: ++ void changeTheme(); ++ ++private: ++ KColorButton* const q_ptr; ++ bool m_backgroundFlag; ++ QColor m_backgroundColor; ++ int m_radius; ++ KColorButton::ButtonType m_buttonType; ++}; ++ ++KColorButton::KColorButton(QWidget *parent) ++ :QPushButton(parent) ++ ,d_ptr(new KColorButtonPrivate(this)) ++{ ++ Q_D(KColorButton); ++ setCheckable(true); ++} ++ ++void KColorButton::setBackgroundColor(QColor color) ++{ ++ Q_D(KColorButton); ++ d->m_backgroundFlag = true; ++ d->m_backgroundColor = color; ++ update(); ++} ++ ++QColor KColorButton::backgroundColor() ++{ ++ Q_D(KColorButton); ++ return d->m_backgroundColor; ++} ++ ++void KColorButton::setBorderRadius(int radious) ++{ ++ Q_D(KColorButton); ++ d->m_radius = radious; ++} ++ ++void KColorButton::setButtonType(KColorButton::ButtonType type) ++{ ++ Q_D(KColorButton); ++ d->m_buttonType = type; ++} ++ ++void KColorButton::paintEvent(QPaintEvent *) ++{ ++ Q_D(KColorButton); ++ QStyleOptionButton option; ++ initStyleOption(&option); ++ ++ QRect rect = option.rect; ++ ++ QPainter painter(this); ++ painter.setRenderHint(QPainter::Antialiasing); ++ painter.setRenderHint(QPainter::HighQualityAntialiasing); ++ painter.setRenderHint(QPainter::SmoothPixmapTransform); ++ painter.setPen(Qt::NoPen); ++ ++ if(!option.state.testFlag(QStyle::State_Enabled)) ++ { ++ painter.save(); ++ painter.setBrush(option.palette.color(QPalette::Disabled,QPalette::ButtonText)); ++ painter.drawRoundedRect(rect,d->m_radius,d->m_radius); ++ painter.restore(); ++ } ++ else if(d->m_buttonType == RoundedRect) ++ { ++ painter.save(); ++ if(d->m_backgroundFlag) ++ { ++ painter.setBrush(d->m_backgroundColor); ++ } ++ else ++ { ++ painter.setBrush(palette().highlight().color()); ++ } ++ if(isChecked() || option.state.testFlag(QStyle::State_MouseOver)) ++ { ++ painter.save(); ++ painter.setBrush(Qt::white); ++ painter.drawRoundedRect(rect,d->m_radius,d->m_radius);//绘制边框 ++ rect = rect.adjusted(2,2,-2,-2); ++ painter.restore(); ++ ++ painter.drawRoundedRect(rect,d->m_radius/2,d->m_radius/2); ++ } ++ else ++ painter.drawRoundedRect(rect,d->m_radius,d->m_radius); ++ painter.restore(); ++ } ++ else if(d->m_buttonType == Circle) ++ { ++ painter.save(); ++ QRect rect = option.rect.adjusted(1,1,0,0); ++ if(d->m_backgroundFlag) ++ { ++ painter.setBrush(d->m_backgroundColor); ++ } ++ else ++ { ++ painter.setBrush(palette().highlight().color()); ++ } ++ ++ painter.drawEllipse(rect); ++ ++ QRect rect1 = rect.adjusted(rect.width()/4,rect.height()/4,-rect.width()/4,-rect.height()/4); ++ if(option.state.testFlag(QStyle::State_MouseOver) || isChecked()) ++ { ++ painter.save(); ++ painter.setBrush(Qt::white); ++ painter.drawEllipse(rect1); ++ painter.restore(); ++ } ++ painter.restore(); ++ } ++ else ++ { ++ painter.save(); ++ if(d->m_backgroundFlag) ++ { ++ painter.setBrush(d->m_backgroundColor); ++ } ++ else ++ { ++ painter.setBrush(palette().highlight().color()); ++ } ++ if(isChecked()) ++ { ++ QPointF points[3] = { ++ QPointF(rect.x() + rect.width() * 2 / 11, rect.y() + rect.height() * 6 / 11), ++ QPointF(rect.x() + rect.width() * 5 / 11, rect.y() + rect.height() * 8 / 11), ++ QPointF(rect.x() + rect.width() * 9 / 11, rect.y() + rect.height() * 4 / 11), ++ }; ++ painter.drawRoundedRect(rect,d->m_radius,d->m_radius); ++ painter.setPen(QPen(Qt::white,2)); ++ painter.drawPolyline(points, 3); ++ } ++ else ++ { ++ painter.drawRoundedRect(rect,d->m_radius,d->m_radius); ++ } ++ painter.restore(); ++ } ++} ++ ++QSize KColorButton::sizeHint() const ++{ ++ Q_D(const KColorButton); ++ if(d->m_buttonType == Circle) ++ return QSize(circleButtonSize,circleButtonSize); ++ else ++ return QSize(normalButtonSize,normalButtonSize); ++} ++ ++KColorButtonPrivate::KColorButtonPrivate(KColorButton *parent) ++ :q_ptr(parent) ++{ ++ Q_Q(KColorButton); ++ m_backgroundFlag = false; ++ m_radius =6; ++ m_buttonType = KColorButton::RoundedRect; ++ m_backgroundColor = q->palette().highlight().color(); ++ connect(m_gsetting,&QGSettings::changed,this,[=](){ ++ changeTheme(); ++ q->update(); ++ }); ++} ++ ++void KColorButtonPrivate::changeTheme() ++{ ++ Q_Q(KColorButton); ++ initThemeStyle(); ++} ++ ++ ++} ++ ++#include "kcolorbutton.moc" ++#include "moc_kcolorbutton.cpp" +diff --git a/kysdk-qtwidgets/src/kcolorbutton.h b/kysdk-qtwidgets/src/kcolorbutton.h +new file mode 100644 +index 0000000..58d381c +--- /dev/null ++++ b/kysdk-qtwidgets/src/kcolorbutton.h +@@ -0,0 +1,71 @@ ++#ifndef KCOLORBUTTON_H ++#define KCOLORBUTTON_H ++ ++#include ++#include "gui_g.h" ++ ++namespace kdk { ++ ++class KColorButtonPrivate; ++ ++class GUI_EXPORT KColorButton :public QPushButton ++{ ++ Q_OBJECT ++public: ++ ++ enum ButtonType{ ++ Circle, ++ RoundedRect, ++ CheckedRect ++ }; ++ ++ KColorButton(QWidget* parent = nullptr); ++ ++ /** ++ * @brief 设置colorButton背景色 ++ * @param color ++ */ ++ void setBackgroundColor(QColor color); ++ ++ /** ++ * @brief 返回colorButton背景色 ++ * @return ++ */ ++ QColor backgroundColor(); ++ ++ /** ++ * @brief 设置圆角(仅NormalType类型生效) ++ * @param radious ++ */ ++ void setBorderRadius(int radious); ++ ++ /** ++ * @brief 返回圆角 ++ * @return ++ */ ++ int borderRadius(); ++ ++ /** ++ * @brief 设置colorButton类型 ++ * @param type ++ */ ++ void setButtonType(KColorButton::ButtonType type); ++ ++ /** ++ * @brief 返回colorButton类型 ++ * @return ++ */ ++ KColorButton::ButtonType buttonType(); ++ ++protected: ++ void paintEvent(QPaintEvent *) override; ++ QSize sizeHint() const override; ++ ++private: ++ Q_DECLARE_PRIVATE(KColorButton) ++ KColorButtonPrivate* const d_ptr; ++}; ++ ++} ++ ++#endif // KCOLORBUTTON_H +diff --git a/kysdk-qtwidgets/src/kcolorcombobox.cpp b/kysdk-qtwidgets/src/kcolorcombobox.cpp +new file mode 100644 +index 0000000..eeef9c9 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kcolorcombobox.cpp +@@ -0,0 +1,300 @@ ++#include "kcolorcombobox.h" ++#include "themeController.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++namespace kdk { ++ ++const static int defaultBorderRadius = 4; ++const static QSize defaultPopupItemSize(20,20); ++static QSize g_size; ++ ++class KComboStyle:public QProxyStyle ++{ ++public: ++ KComboStyle(){} ++ ~KComboStyle(){} ++ ++QSize sizeFromContents(QStyle::ContentsType type, ++ const QStyleOption *option, ++ const QSize &contentsSize, ++ const QWidget *widget = nullptr) const override; ++ ++}; ++ ++class KColorComboBoxDelegate:public QStyledItemDelegate ++{ ++ Q_OBJECT ++ ++public: ++ enum ItemRoles { ++ ColorRole = Qt::UserRole + 1 ++ }; ++ ++ KColorComboBoxDelegate(QObject *parent = nullptr,KColorComboBox* combo = nullptr); ++ void paint(QPainter *painter, ++ const QStyleOptionViewItem &option, const QModelIndex &index) const override; ++ QSize sizeHint(const QStyleOptionViewItem &option, ++ const QModelIndex &index) const override; ++ ++private: ++ KColorComboBox* m_combo; ++}; ++ ++class KColorComboBoxPrivate:public QObject,public ThemeController ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KColorComboBox) ++ ++public: ++ KColorComboBoxPrivate(KColorComboBox*parent); ++ void updateList(); ++ ++public Q_SLOTS: ++ void slotActivated(int); ++ void slotHighlighted(int); ++ void slotCurrentIndexChanged(int); ++ ++private: ++ KColorComboBox* q_ptr; ++ KColorComboBox::ComboType m_comboType; ++ QList m_colorList; ++ int m_borderRadius; ++ QColor m_currentColor; ++ QSize m_popupItemSize; ++}; ++ ++KColorComboBox::KColorComboBox(QWidget *parent) ++ : QComboBox(parent), ++ d_ptr(new KColorComboBoxPrivate(this)) ++{ ++ Q_D(KColorComboBox); ++ setItemDelegate(new KColorComboBoxDelegate(this,this)); ++ KComboStyle*style = new KComboStyle(); ++ setStyle(style); ++ view()->setFixedWidth(d->m_popupItemSize.width()); ++ connect(this, SIGNAL(activated(int)), d, SLOT(slotActivated(int))); ++ connect(this, SIGNAL(highlighted(int)),d, SLOT(slotHighlighted(int))); ++ connect(this, SIGNAL(currentIndexChanged(int)),d, SLOT(slotCurrentIndexChanged(int))); ++} ++ ++void KColorComboBox::setColorList(const QList &list) ++{ ++ Q_D(KColorComboBox); ++ d->m_colorList = list; ++ d->updateList(); ++} ++ ++QList KColorComboBox::colorList() ++{ ++ Q_D(KColorComboBox); ++ return d->m_colorList; ++} ++ ++void KColorComboBox::addColor(const QColor &color) ++{ ++ Q_D(KColorComboBox); ++ d->m_colorList.append(color); ++ addItem(QString()); ++ setItemData(d->m_colorList.count()-1 , d->m_colorList.back(), KColorComboBoxDelegate::ColorRole); ++ update(); ++} ++ ++void KColorComboBox::setComboType(const KColorComboBox::ComboType &type) ++{ ++ Q_D(KColorComboBox); ++ d->m_comboType = type; ++ update(); ++} ++ ++KColorComboBox::ComboType KColorComboBox::comboType() ++{ ++ Q_D(KColorComboBox); ++ return d->m_comboType; ++} ++ ++void KColorComboBox::setPopupItemSize(const QSize &size) ++{ ++ Q_D(KColorComboBox); ++ ++ //d->m_popupItemSize = size; ++ d->m_popupItemSize = size.expandedTo(this->size()); ++ g_size = d->m_popupItemSize; ++ view()->setFixedWidth(d->m_popupItemSize.width()); ++ update(); ++} ++ ++QSize KColorComboBox::popupItemSzie() ++{ ++ Q_D(KColorComboBox); ++ return d->m_popupItemSize; ++} ++ ++void KColorComboBox::paintEvent(QPaintEvent *event) ++{ ++ Q_UNUSED(event) ++ Q_D(KColorComboBox); ++ QStylePainter painter(this); ++ painter.setPen(Qt::NoPen); ++ ++ QStyleOptionComboBox opt; ++ initStyleOption(&opt); ++ ++ QRect frame = this->rect(); ++ painter.setRenderHint(QPainter::Antialiasing); ++ painter.setPen(Qt::transparent); ++ if(d->m_currentColor.isValid()) ++ painter.setBrush(d->m_currentColor); ++ if(d->m_comboType == KColorComboBox::Circle) ++ { ++ painter.drawEllipse(frame.adjusted(1, 1, -1, -1)); ++ } ++ else ++ { ++ painter.drawRoundedRect(frame.adjusted(1, 1, -1, -1), d->m_borderRadius, d->m_borderRadius); ++ } ++} ++ ++void KColorComboBox::resizeEvent(QResizeEvent *event) ++{ ++ setPopupItemSize(event->size()); ++ QComboBox::resizeEvent(event); ++} ++ ++KColorComboBoxPrivate::KColorComboBoxPrivate(KColorComboBox *parent) ++ :q_ptr(parent), ++ m_comboType(KColorComboBox::Circle), ++ m_borderRadius(defaultBorderRadius), ++ m_popupItemSize(defaultPopupItemSize) ++{ ++ setParent(parent); ++} ++ ++void KColorComboBoxPrivate::updateList() ++{ ++ Q_Q(KColorComboBox); ++ while (q->count()) { ++ q->removeItem(0); ++ } ++ for (int i = 0 ; i < m_colorList.count(); ++i) { ++ q->addItem(QString()); ++ q->setItemData(i , m_colorList[i], KColorComboBoxDelegate::ColorRole); ++ } ++ q->update(); ++} ++ ++void KColorComboBoxPrivate::slotActivated(int index) ++{ ++ Q_Q(KColorComboBox); ++ ++ m_currentColor = m_colorList[index]; ++ q->update(); ++ Q_EMIT q->activated(m_currentColor); ++} ++ ++void KColorComboBoxPrivate::slotHighlighted(int index) ++{ ++ Q_Q(KColorComboBox); ++ ++ auto color = m_colorList[index]; ++ q->update(); ++ Q_EMIT q->highlighted(color); ++} ++ ++void KColorComboBoxPrivate::slotCurrentIndexChanged(int index) ++{ ++ Q_Q(KColorComboBox); ++ ++ m_currentColor = m_colorList[index]; ++ q->update(); ++ Q_EMIT q->currentColorChanged(m_currentColor); ++} ++ ++KColorComboBoxDelegate::KColorComboBoxDelegate(QObject *parent,KColorComboBox*combo) ++ :QStyledItemDelegate(parent), ++ m_combo(combo) ++{ ++} ++ ++void KColorComboBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const ++{ ++ auto variant = index.data(ItemRoles::ColorRole); ++ auto color = variant.value(); ++ auto paintRect = option.rect.adjusted(5,5,-5,-5); ++ ++ switch (m_combo->comboType()) { ++ case KColorComboBox::Circle: ++ { ++ if(color.isValid()) ++ { ++ painter->save(); ++ painter->setRenderHint(QPainter::Antialiasing); ++ painter->setPen(Qt::NoPen); ++ painter->setBrush(color); ++ painter->drawEllipse(paintRect); ++ painter->restore(); ++ } ++ if(option.state & (QStyle::State_MouseOver | QStyle::State_Selected)) ++ { ++ painter->save(); ++ painter->setRenderHint(QPainter::Antialiasing); ++ painter->setPen(Qt::NoPen); ++ painter->setBrush(Qt::white); ++ QRect subRect(paintRect.top(),paintRect.left(),paintRect.width()/2,paintRect.height()/2); ++ subRect.moveCenter(paintRect.center()); ++ painter->drawEllipse(subRect); ++ painter->restore(); ++ } ++ break; ++ } ++ case KColorComboBox::RoundedRect: ++ { ++ if(color.isValid()) ++ { ++ painter->save(); ++ painter->setRenderHint(QPainter::Antialiasing); ++ if(option.state & (QStyle::State_MouseOver | QStyle::State_Selected)) ++ { ++ QPen pen; ++ pen.setWidth(2); ++ pen.setBrush(Qt::white); ++ painter->setPen(pen); ++ } ++ else ++ { ++ painter->setPen(Qt::NoPen); ++ } ++ painter->setBrush(color); ++ painter->drawRoundedRect(paintRect,defaultBorderRadius,defaultBorderRadius); ++ painter->restore(); ++ } ++ break; ++ } ++ default: ++ break; ++ } ++} ++ ++QSize KColorComboBoxDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const ++{ ++ return m_combo->popupItemSzie(); ++} ++ ++QSize KComboStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget) const ++{ ++ if(type == QStyle::CT_ComboBox) ++ return g_size; ++ ++ return QProxyStyle::sizeFromContents(type,option,contentsSize,widget); ++} ++ ++} ++#include "kcolorcombobox.moc" ++#include "moc_kcolorcombobox.cpp" +diff --git a/kysdk-qtwidgets/src/kcolorcombobox.h b/kysdk-qtwidgets/src/kcolorcombobox.h +new file mode 100644 +index 0000000..49995c6 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kcolorcombobox.h +@@ -0,0 +1,91 @@ ++#ifndef KCOLORCOMBOBOX_H ++#define KCOLORCOMBOBOX_H ++ ++#include ++#include ++#include ++#include "gui_g.h" ++ ++namespace kdk { ++ ++class KColorComboBoxPrivate; ++ ++/** ++ * @brief 颜色选择框 ++ */ ++class GUI_EXPORT KColorComboBox : public QComboBox ++{ ++ Q_OBJECT ++ ++public: ++ ++ /** ++ * @brief 指定显示样式,圆形或者圆角矩形 ++ */ ++ enum ComboType ++ { ++ Circle, ++ RoundedRect ++ }; ++ ++ explicit KColorComboBox(QWidget *parent = nullptr); ++ ++ /** ++ * @brief 以列表形式添加颜色选项 ++ * @param list ++ */ ++ void setColorList(const QList& list); ++ ++ /** ++ * @brief 获取颜色列表 ++ * @return ++ */ ++ QList colorList(); ++ ++ /** ++ * @brief 添加颜色选项 ++ * @param color ++ */ ++ void addColor(const QColor& color); ++ ++ /** ++ * @brief 设置显示样式 ++ * @param type ++ */ ++ void setComboType(const ComboType& type); ++ ++ /** ++ * @brief 获取显示样式 ++ * @return ++ */ ++ ComboType comboType(); ++ ++ /** ++ * @brief 设置item尺寸 ++ * @param size ++ */ ++ void setPopupItemSize(const QSize&size); ++ ++ /** ++ * @brief 返回item尺寸 ++ * @return ++ */ ++ QSize popupItemSzie(); ++ ++ ++Q_SIGNALS: ++ ++ void activated(const QColor& color); ++ void currentColorChanged(const QColor& color); ++ void highlighted(const QColor& color); ++ ++protected: ++ void paintEvent(QPaintEvent *event) override; ++ void resizeEvent(QResizeEvent *event) override; ++ ++private: ++ Q_DECLARE_PRIVATE(KColorComboBox) ++ KColorComboBoxPrivate*const d_ptr; ++}; ++} ++#endif // KCOLORCOMBOBOX_H +diff --git a/kysdk-qtwidgets/src/kdialog.cpp b/kysdk-qtwidgets/src/kdialog.cpp +index 7a2d25c..0b2a4fe 100644 +--- a/kysdk-qtwidgets/src/kdialog.cpp ++++ b/kysdk-qtwidgets/src/kdialog.cpp +@@ -2,9 +2,9 @@ + #include + #include + #include "xatom-helper.h" +-#include "ukuistylehelper/ukui-decoration-manager.h" + #include "parmscontroller.h" + ++#include "ukuistylehelper/ukui-decoration-manager.h" + namespace kdk + { + class KDialogPrivate:public QObject +@@ -101,6 +101,7 @@ void KDialog::setWindowTitle(const QString &title) + { + Q_D(KDialog); + d->m_pIconBar->setWidgetName(title); ++ QDialog::setWindowTitle(title); + } + + QPushButton *KDialog::maximumButton() +diff --git a/kysdk-qtwidgets/src/kiconbar.cpp b/kysdk-qtwidgets/src/kiconbar.cpp +index cb937a7..2e9af67 100644 +--- a/kysdk-qtwidgets/src/kiconbar.cpp ++++ b/kysdk-qtwidgets/src/kiconbar.cpp +@@ -39,7 +39,9 @@ KIconBar::KIconBar(QWidget*parent) + setFixedHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_IconbarHeight)); + connect(Parmscontroller::self(),&Parmscontroller::modeChanged,this,[=](){ + setFixedHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_IconbarHeight)); +- d->m_pIconLabel->setPixmap(QIcon::fromTheme(d->m_IconName).pixmap(QSize(Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize),Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize)))); ++ d->m_pIconLabel->setPixmap(QIcon::fromTheme(d->m_IconName).pixmap( ++ QSize(Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize), ++ Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize)))); + updateGeometry(); + }); + } +@@ -75,7 +77,7 @@ void KIconBar::setIcon(const QIcon &icon) + + if(!d->m_pIconLabel) + return; +- d->m_pIconLabel->setPixmap(icon.pixmap(Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize),Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize))); ++ d->m_pIconLabel->setPixmap(icon.pixmap(QSize(Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize),Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize)))); + d->m_IconName = icon.name(); + setWindowIcon(icon.pixmap(QSize(Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize),Parmscontroller::parm(Parmscontroller::Parm::PM_IconBarIconSize)))); + } +@@ -92,6 +94,12 @@ void KIconBar::setWidgetName(const QString &widgetName) + d->elideWidgetName(); + } + ++QSize KIconBar::sizeHint() const ++{ ++ auto size = QFrame::sizeHint(); ++ size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); ++ return size; ++} + QLabel *KIconBar::nameLabel() + { + Q_D(KIconBar); +@@ -118,13 +126,6 @@ void KIconBar::resizeEvent(QResizeEvent *event) + d->elideWidgetName(); + } + +-QSize KIconBar::sizeHint() const +-{ +- auto size =QFrame::sizeHint(); +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); +- return size; +-} +- + KIconBarPrivate::KIconBarPrivate(KIconBar *parent) + :q_ptr(parent) + { +@@ -132,6 +133,8 @@ KIconBarPrivate::KIconBarPrivate(KIconBar *parent) + setParent(parent); + m_pMainLayout = new QHBoxLayout(q); + m_pIconLabel = new QLabel(q); ++ m_pIconLabel->setScaledContents(true); ++ m_pIconLabel->setFixedSize(24,24); + m_pNameLabel = new QLabel(q); + + m_pMainLayout->addSpacing(8); +diff --git a/kysdk-qtwidgets/src/kinputdialog.cpp b/kysdk-qtwidgets/src/kinputdialog.cpp +index 2a728f7..be1fd8c 100644 +--- a/kysdk-qtwidgets/src/kinputdialog.cpp ++++ b/kysdk-qtwidgets/src/kinputdialog.cpp +@@ -15,7 +15,6 @@ + #include "qvalidator.h" + #include "qevent.h" + #include "kinputdialog.h" +-#include "parmscontroller.h" + + namespace kdk + { +@@ -130,19 +129,6 @@ private: + } + }; + +-class KInputDialogListView : public QListView +-{ +-public: +- KInputDialogListView(QWidget *parent = nullptr) : QListView(parent) {} +- QVariant inputMethodQuery(Qt::InputMethodQuery query) const override +- { +- if (query == Qt::ImEnabled) +- return false; +- return QListView::inputMethodQuery(query); +- } +-}; +- +- + class KInputDialogLineEdit :public QLineEdit + { + public: +@@ -152,13 +138,16 @@ protected: + }; + + +-class KInputDialogButton : public QPushButton ++class KInputDialogListView : public QListView + { + public: +- KInputDialogButton(QWidget *parent = nullptr) : QPushButton(parent){} +- KInputDialogButton(const QString &text, QWidget *parent = nullptr):QPushButton(text,parent){} +-protected: +- QSize sizeHint() const; ++ KInputDialogListView(QWidget *parent = nullptr) : QListView(parent) {} ++ QVariant inputMethodQuery(Qt::InputMethodQuery query) const override ++ { ++ if (query == Qt::ImEnabled) ++ return false; ++ return QListView::inputMethodQuery(query); ++ } + }; + + class KInputDialogPrivate : public QObject +@@ -188,17 +177,16 @@ public: + void _q_currentRowChanged(const QModelIndex &newIndex, const QModelIndex &oldIndex); + + mutable QLabel *label; +- mutable KInputDialogButton *okButton; +- mutable KInputDialogButton *cancelButton; ++ mutable QPushButton *okButton; ++ mutable QPushButton *cancelButton; + mutable KInputDialogLineEdit *lineEdit; + mutable QPlainTextEdit *plainTextEdit; +- mutable KInputDialogSpinBox *intSpinBox; ++ mutable QSpinBox *intSpinBox; + mutable QDoubleSpinBox *doubleSpinBox; + mutable QComboBox *comboBox; + mutable KInputDialogListView *listView; + mutable QWidget *inputWidget; + mutable QVBoxLayout *mainLayout; +- mutable QHBoxLayout *hLayout; + KInputDialog::InputDialogOptions opts; + QString textValue; + QPointer receiverToDisconnectOnClose; +@@ -210,67 +198,19 @@ private: + + KInputDialogPrivate::KInputDialogPrivate(KInputDialog*parent) + : q_ptr(parent),label(nullptr), okButton(nullptr),cancelButton(nullptr), lineEdit(nullptr), plainTextEdit(nullptr), intSpinBox(nullptr), doubleSpinBox(nullptr), +- comboBox(nullptr), listView(nullptr), inputWidget(nullptr), mainLayout(nullptr),hLayout(nullptr) ++ comboBox(nullptr), listView(nullptr), inputWidget(nullptr), mainLayout(nullptr) + { + Q_Q(KInputDialog); ++ q->setMinimumHeight(198); ++ q->setMinimumWidth(336); + connect(q->m_gsetting,&QGSettings::changed,q,&KInputDialog::changeTheme); +- connect(Parmscontroller::self(),&Parmscontroller::modeChanged,this,[=](){ +- +- ensureLayout(); +- q->updateGeometry(); +- }); + } + + void KInputDialogPrivate::ensureLayout() + { + Q_Q(KInputDialog); +- +- if(hLayout) +- { +- QLayoutItem *child; +- while((child = hLayout->takeAt(0))!= 0) +- { +- if(child->spacerItem()) +- { +- hLayout->removeItem(child); +- continue; +- } +- hLayout->removeWidget(child->widget()); +- } +- hLayout->setContentsMargins(0,0,0,0); +- hLayout->setSpacing(0); +- hLayout->addStretch(); +- hLayout->addWidget(cancelButton); +- hLayout->addSpacing(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Button_Spacing)); +- hLayout->addWidget(okButton); +- } + if (mainLayout) +- { +- QLayoutItem *child; +- while((child = mainLayout->takeAt(0))!= 0) +- { +- if(child->spacerItem()) +- { +- mainLayout->removeItem(child); +- continue; +- } +- mainLayout->removeWidget(child->widget()); +- } +- +- mainLayout->setSpacing(0); +- mainLayout->setContentsMargins(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Right_Spacing) +- ,0 +- ,Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Right_Spacing) +- ,Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Bottom_Spacing)); +- mainLayout->addStretch(); +- mainLayout->addWidget(label); +- mainLayout->addSpacing(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Label_Spacing)); +- mainLayout->addWidget(inputWidget); +- mainLayout->addSpacing(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Widget_Spacing)); +- mainLayout->addLayout(hLayout); + return; +- } +- + if (!inputWidget) { + ensureLineEdit(); + inputWidget = lineEdit; +@@ -285,29 +225,28 @@ void KInputDialogPrivate::ensureLayout() + #endif + label->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); + label->setWordWrap(true); +- hLayout = new QHBoxLayout(); +- okButton = new KInputDialogButton(tr("ok"),q); +- cancelButton = new KInputDialogButton(tr("cancel"),q); ++ QHBoxLayout *hLayout = new QHBoxLayout(); ++ okButton = new QPushButton(tr("ok"),q); ++ okButton->setFixedSize(96,36); ++ cancelButton = new QPushButton(tr("cancel"),q); ++ cancelButton->setFixedSize(96,36); + hLayout->setContentsMargins(0,0,0,0); + hLayout->setSpacing(0); + hLayout->addStretch(); + hLayout->addWidget(cancelButton); +- hLayout->addSpacing(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Button_Spacing)); ++ hLayout->addSpacing(10); + hLayout->addWidget(okButton); + QObject::connect(okButton, SIGNAL(clicked(bool)), q, SLOT(accept())); + QObject::connect(cancelButton, SIGNAL(clicked(bool)), q, SLOT(reject())); + + mainLayout = new QVBoxLayout(); + mainLayout->setSpacing(0); +- mainLayout->setContentsMargins(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Right_Spacing) +- ,0 +- ,Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Right_Spacing) +- ,Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Bottom_Spacing)); +- mainLayout->addStretch(); ++ mainLayout->setContentsMargins(24,0,24,24); + mainLayout->addWidget(label); +- mainLayout->addSpacing(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Label_Spacing)); ++ mainLayout->addSpacing(8); + mainLayout->addWidget(inputWidget); +- mainLayout->addSpacing(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Widget_Spacing)); ++ mainLayout->addSpacing(32); ++ //mainLayout->addStretch(); + mainLayout->addLayout(hLayout); + q->mainWidget()->setLayout(mainLayout); + q->changeTheme(); +@@ -321,6 +260,7 @@ void KInputDialogPrivate::ensureLineEdit() + Q_Q(KInputDialog); + if (!lineEdit) { + lineEdit = new KInputDialogLineEdit(q); ++ lineEdit->setFixedHeight(36); + lineEdit->hide(); + QObject::connect(lineEdit, SIGNAL(textChanged(QString)), + q, SLOT(_q_textChanged(QString))); +@@ -940,8 +880,7 @@ QSize KInputDialog::sizeHint() const + { + Q_D(const KInputDialog); + d->ensureLayout(); +- QSize size(Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Width),Parmscontroller::parm(Parmscontroller::Parm::PM_InputDialog_Height)); +- return size; ++ return QDialog::sizeHint(); + } + + void KInputDialog::setVisible(bool visible) +@@ -1134,27 +1073,19 @@ double KInputDialog::doubleStep() const + return 1.0; + } + +-QSize KInputDialogLineEdit::sizeHint() const ++QSize KInputDialogSpinBox::sizeHint() const + { + QSize size; + size.setWidth(288); +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); ++ size.setHeight(36); + return size; + } + +-QSize KInputDialogButton::sizeHint() const +-{ +- QSize size; +- size.setWidth(96); +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); +- return size; +-} +- +-QSize KInputDialogSpinBox::sizeHint() const ++QSize KInputDialogLineEdit::sizeHint() const + { + QSize size; + size.setWidth(288); +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); ++ size.setHeight(36); + return size; + } + +@@ -1162,7 +1093,7 @@ QSize KInputDialogDoubleSpinBox::sizeHint() const + { + QSize size; + size.setWidth(288); +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); ++ size.setHeight(36); + return size; + } + +diff --git a/kysdk-qtwidgets/src/klineframe.cpp b/kysdk-qtwidgets/src/klineframe.cpp +new file mode 100644 +index 0000000..58eb7dc +--- /dev/null ++++ b/kysdk-qtwidgets/src/klineframe.cpp +@@ -0,0 +1,137 @@ ++#include "klineframe.h" ++#include "themeController.h" ++#include ++#include ++ ++namespace kdk { ++class KHLineFramePrivate:public QObject,public ThemeController ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KHLineFrame) ++ ++public: ++ KHLineFramePrivate(KHLineFrame* parent); ++ ++ void changeTheme(); ++private: ++ KHLineFrame* q_ptr; ++}; ++ ++class KVLineFramePrivate:public QObject,public ThemeController ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KVLineFrame) ++ ++public: ++ KVLineFramePrivate(KVLineFrame* parent); ++ ++ void changeTheme(); ++private: ++ KVLineFrame* q_ptr; ++}; ++ ++KHLineFrame::KHLineFrame(QWidget *parent) ++ :QFrame(parent) ++ ,d_ptr(new KHLineFramePrivate(this)) ++{ ++ setContentsMargins(0,10,0,10); ++ this->setFrameShape(QFrame::Shape::HLine); ++ setLineWidth(1); ++ QPalette palette =qApp->palette(); ++ QColor color(ThemeController::mixColor(Qt::gray,Qt::white,0.1)); ++ color.setAlphaF(0.2); ++ palette.setColor(QPalette::Window,color); ++ setPalette(palette); ++ setFixedHeight(1); ++} ++ ++KHLineFrame::~KHLineFrame() ++{ ++ ++} ++ ++KHLineFramePrivate::KHLineFramePrivate(KHLineFrame *parent) ++ :q_ptr(parent) ++{ ++ Q_Q(KHLineFrame); ++ connect(m_gsetting,&QGSettings::changed,this,[=](){ ++ changeTheme(); ++ }); ++} ++ ++void KHLineFramePrivate::changeTheme() ++{ ++ Q_Q(KHLineFrame); ++ if(ThemeController::themeMode() == LightTheme) ++ { ++ QPalette palette =qApp->palette(); ++ QColor color(ThemeController::mixColor(Qt::gray,Qt::white,0.1)); ++ color.setAlphaF(0.2); ++ palette.setColor(QPalette::Window,color); ++ q->setPalette(palette); ++ } ++ else ++ { ++ QPalette palette =qApp->palette(); ++ QColor color(ThemeController::mixColor(Qt::gray,Qt::white,0.1)); ++ color.setAlphaF(0.3); ++ palette.setColor(QPalette::Window,color); ++ q->setPalette(palette); ++ } ++} ++ ++KVLineFrame::KVLineFrame(QWidget *parent) ++ :QFrame(parent) ++ ,d_ptr(new KVLineFramePrivate(this)) ++{ ++ setContentsMargins(10,0,10,0); ++ setLineWidth(1); ++ this->setFrameShape(QFrame::Shape::VLine); ++ QPalette palette =qApp->palette(); ++ QColor color(ThemeController::mixColor(Qt::gray,Qt::white,0.1)); ++ color.setAlphaF(0.2); ++ palette.setColor(QPalette::Window,color); ++ setPalette(palette); ++ setFixedWidth(1); ++} ++ ++KVLineFrame::~KVLineFrame() ++{ ++ ++} ++ ++KVLineFramePrivate::KVLineFramePrivate(KVLineFrame *parent) ++ :q_ptr(parent) ++{ ++ Q_Q(KVLineFrame); ++ connect(m_gsetting,&QGSettings::changed,this,[=](){ ++ changeTheme(); ++ }); ++} ++ ++void KVLineFramePrivate::changeTheme() ++{ ++ Q_Q(KVLineFrame); ++ if(ThemeController::themeMode() == LightTheme) ++ { ++ QPalette palette =qApp->palette(); ++ QColor color(ThemeController::mixColor(Qt::gray,Qt::white,0.1)); ++ color.setAlphaF(0.2); ++ palette.setColor(QPalette::Window,color); ++ q->setPalette(palette); ++ } ++ else ++ { ++ QPalette palette =qApp->palette(); ++ QColor color(ThemeController::mixColor(Qt::gray,Qt::white,0.1)); ++ color.setAlphaF(0.3); ++ palette.setColor(QPalette::Window,color); ++ q->setPalette(palette); ++ } ++} ++ ++} ++ ++ ++#include "klineframe.moc" ++#include "moc_klineframe.cpp" +diff --git a/kysdk-qtwidgets/src/klineframe.h b/kysdk-qtwidgets/src/klineframe.h +new file mode 100644 +index 0000000..9851e81 +--- /dev/null ++++ b/kysdk-qtwidgets/src/klineframe.h +@@ -0,0 +1,34 @@ ++#ifndef KLINEFRAME_H ++#define KLINEFRAME_H ++ ++#include ++#include "gui_g.h" ++namespace kdk { ++ ++class KHLineFramePrivate; ++class KVLineFramePrivate; ++ ++class GUI_EXPORT KHLineFrame : public QFrame ++{ ++ Q_OBJECT ++public: ++ KHLineFrame(QWidget* parent = nullptr); ++ ~KHLineFrame(); ++private: ++ Q_DECLARE_PRIVATE(KHLineFrame) ++ KHLineFramePrivate* const d_ptr; ++}; ++ ++class GUI_EXPORT KVLineFrame : public QFrame ++{ ++ Q_OBJECT ++public: ++ KVLineFrame(QWidget* parent = nullptr); ++ ~KVLineFrame(); ++private: ++ Q_DECLARE_PRIVATE(KVLineFrame) ++ KVLineFramePrivate* const d_ptr; ++}; ++ ++} ++#endif // KLINEFRAME_H +diff --git a/kysdk-qtwidgets/src/klistviewdelegate.cpp b/kysdk-qtwidgets/src/klistviewdelegate.cpp +index ea46632..222262a 100644 +--- a/kysdk-qtwidgets/src/klistviewdelegate.cpp ++++ b/kysdk-qtwidgets/src/klistviewdelegate.cpp +@@ -1,7 +1,6 @@ + #include "klistviewdelegate.h" + #include + #include +-#include + #include + #include + #include +diff --git a/kysdk-qtwidgets/src/kmenubutton.cpp b/kysdk-qtwidgets/src/kmenubutton.cpp +index 4a0536a..209f70c 100644 +--- a/kysdk-qtwidgets/src/kmenubutton.cpp ++++ b/kysdk-qtwidgets/src/kmenubutton.cpp +@@ -37,7 +37,7 @@ KMenuButton::KMenuButton(QWidget *parent) + //setArrowType(Qt::NoArrow); + d->m_pMenu =new QMenu(this); + setMenu(d->m_pMenu); +- setToolTip(tr("more")); ++ setToolTip(tr("option")); + d->m_pSettingAction = new QAction(tr("Setting"),d->m_pMenu); + d->m_pThemeAction = new QAction(tr("Theme"),d->m_pMenu); + d->m_pAssistAction = new QAction(tr("Assist"),d->m_pMenu); +diff --git a/kysdk-qtwidgets/src/kmessagebox.cpp b/kysdk-qtwidgets/src/kmessagebox.cpp +new file mode 100644 +index 0000000..d429fe6 +--- /dev/null ++++ b/kysdk-qtwidgets/src/kmessagebox.cpp +@@ -0,0 +1,802 @@ ++#include "kmessagebox.h" ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "private/qapplication_p.h" ++#include "private/qlabel_p.h" ++#include ++#include ++#include ++#include ++#include "themeController.h" ++ ++namespace kdk { ++ ++enum Button { Old_Ok = 1, Old_Cancel = 2, Old_Yes = 3, Old_No = 4, Old_Abort = 5, Old_Retry = 6, ++ Old_Ignore = 7, Old_YesAll = 8, Old_NoAll = 9, Old_ButtonMask = 0xFF, ++ NewButtonMask = 0xFFFFFC00 }; ++ ++class KMessageBoxPrivate: public QObject, public QDialogPrivate, public ThemeController ++{ ++ Q_OBJECT ++ Q_DECLARE_PUBLIC(KMessageBox) ++ ++public: ++ KMessageBoxPrivate(KMessageBox*parent); ++ ++ void init(const QString &title = QString(), const QString &text = QString()); ++ static QPixmap standardIcon(KMessageBox::Icon icon, KMessageBox *mb); ++ void setupLayout(); ++ void updateSize(); ++ void setClickedButton(QAbstractButton *button); ++ int execReturnCode(QAbstractButton *button); ++ int dialogCodeForButton(QAbstractButton *button) const; ++ void addOldButtons(int button0, int button1, int button2); ++ QAbstractButton *findButton(int button0, int button1, int button2, int flags); ++ ++public Q_SLOTS: ++ void _q_buttonClicked(QAbstractButton *); ++ void _q_clicked(QPlatformDialogHelper::StandardButton button, QPlatformDialogHelper::ButtonRole role); ++ ++protected: ++ void changeTheme(); ++ ++private: ++ KMessageBox *q_ptr; ++ QLabel *iconLabel; ++ QLabel *label; ++ QLabel *informativeLabel; ++ QDialogButtonBox *buttonBox; ++ QList customButtonList; ++ QSharedPointer options; ++ KMessageBox::Icon icon; ++ QAbstractButton *clickedButton; ++ QCheckBox *checkbox; ++ QPointer receiverToDisconnectOnClose; ++ QByteArray memberToDisconnectOnClose; ++ QByteArray signalToDisconnectOnClose; ++ QPushButton *defaultButton; ++ bool autoAddOkButton; ++ bool compatMode; ++ QString m_iconName; ++ ++ void initHelper(QPlatformDialogHelper *) override; ++ void helperPrepareShow(QPlatformDialogHelper *) override; ++ void helperDone(KDialog::DialogCode, QPlatformDialogHelper *) override; ++}; ++ ++KMessageBox::KMessageBox(QWidget *parent) ++ : KDialog(parent), ++ d_ptr(new KMessageBoxPrivate(this)) ++{ ++ Q_D(KMessageBox); ++ d->init(); ++ d->changeTheme(); ++ connect(d->m_gsetting,&QGSettings::changed,this,[=](){d->changeTheme();}); ++} ++ ++KMessageBox::~KMessageBox() ++{ ++} ++ ++void KMessageBox::setCustomIcon(const QIcon &icon) ++{ ++ Q_D(KMessageBox); ++ d->m_iconName = icon.name(); ++ this->setIconPixmap(icon.pixmap(24,24)); ++} ++ ++void KMessageBox::addButton(QAbstractButton *button, ButtonRole role) ++{ ++ Q_D(KMessageBox); ++ if (!button) ++ return; ++ removeButton(button); ++ d->options->addButton(button->text(), static_cast(role), ++ button); ++ d->buttonBox->addButton(button, (QDialogButtonBox::ButtonRole)role); ++ d->customButtonList.append(button); ++ d->autoAddOkButton = false; ++} ++ ++QPushButton *KMessageBox::addButton(const QString &text, ButtonRole role) ++{ ++ Q_D(KMessageBox); ++ QPushButton *pushButton = new QPushButton(text); ++ addButton(pushButton, role); ++ return pushButton; ++} ++ ++QPushButton *KMessageBox::addButton(StandardButton button) ++{ ++ Q_D(KMessageBox); ++ QPushButton *pushButton = d->buttonBox->addButton((QDialogButtonBox::StandardButton)button); ++ if (pushButton) ++ d->autoAddOkButton = false; ++ return pushButton; ++} ++ ++void KMessageBox::removeButton(QAbstractButton *button) ++{ ++ Q_D(KMessageBox); ++ d->customButtonList.removeAll(button); ++ if (d->defaultButton == button) ++ d->defaultButton = 0; ++ d->buttonBox->removeButton(button); ++} ++ ++QAbstractButton *KMessageBox::button(KMessageBox::StandardButton which) const ++{ ++ Q_D(const KMessageBox); ++ return d->buttonBox->button(QDialogButtonBox::StandardButton(which)); ++} ++ ++QList KMessageBox::buttons() const ++{ ++ Q_D(const KMessageBox); ++ return d->buttonBox->buttons(); ++} ++ ++KMessageBox::ButtonRole KMessageBox::buttonRole(QAbstractButton *button) const ++{ ++ Q_D(const KMessageBox); ++ return KMessageBox::ButtonRole(d->buttonBox->buttonRole(button)); ++} ++ ++QCheckBox *KMessageBox::checkBox() const ++{ ++ Q_D(const KMessageBox); ++ return d->checkbox; ++} ++ ++void KMessageBox::setCheckBox(QCheckBox *cb) ++{ ++ Q_D(KMessageBox); ++ ++ if (cb == d->checkbox) ++ return; ++ ++ if (d->checkbox) { ++ d->checkbox->hide(); ++ layout()->removeWidget(d->checkbox); ++ if (d->checkbox->parentWidget() == this) { ++ d->checkbox->setParent(0); ++ d->checkbox->deleteLater(); ++ } ++ } ++ d->checkbox = cb; ++ if (d->checkbox) { ++ QSizePolicy sp = d->checkbox->sizePolicy(); ++ sp.setHorizontalPolicy(QSizePolicy::MinimumExpanding); ++ d->checkbox->setSizePolicy(sp); ++ } ++ d->setupLayout(); ++} ++ ++QString KMessageBox::text() const ++{ ++ Q_D(const KMessageBox); ++ return d->label->text(); ++} ++ ++void KMessageBox::setText(const QString &text) ++{ ++ Q_D(KMessageBox); ++ d->label->setText(text); ++ d->label->setWordWrap(d->label->textFormat() == Qt::RichText ++ || (d->label->textFormat() == Qt::AutoText && Qt::mightBeRichText(text))); ++ d->updateSize(); ++} ++ ++QString KMessageBox::informativeText() const ++{ ++ Q_D(const KMessageBox); ++ return d->informativeLabel ? d->informativeLabel->text() : QString(); ++} ++ ++void KMessageBox::setInformativeText(const QString &text) ++{ ++ Q_D(KMessageBox); ++ if (text.isEmpty()) { ++ if (d->informativeLabel) { ++ d->informativeLabel->hide(); ++ d->informativeLabel->deleteLater(); ++ } ++ d->informativeLabel = 0; ++ } else { ++ if (!d->informativeLabel) { ++ QLabel *label = new QLabel; ++ label->setObjectName(QLatin1String("qt_msgbox_informativelabel")); ++ label->setTextInteractionFlags(Qt::TextInteractionFlags(style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, this))); ++ label->setAlignment(Qt::AlignTop | Qt::AlignLeft); ++ label->setOpenExternalLinks(true); ++ label->setWordWrap(true); ++ d->informativeLabel = label; ++ } ++ d->informativeLabel->setText(text); ++ } ++ d->setupLayout(); ++} ++ ++KMessageBox::Icon KMessageBox::icon() const ++{ ++ Q_D(const KMessageBox); ++ return d->icon; ++} ++ ++void KMessageBox::setIcon(Icon icon) ++{ ++ Q_D(KMessageBox); ++ setIconPixmap(KMessageBoxPrivate::standardIcon((KMessageBox::Icon)icon,this)); ++ d->icon = icon; ++} ++ ++QPixmap KMessageBox::iconPixmap() const ++{ ++ Q_D(const KMessageBox); ++ if (d->iconLabel && d->iconLabel->pixmap()) ++ return *d->iconLabel->pixmap(); ++ return QPixmap(); ++} ++ ++void KMessageBox::setIconPixmap(const QPixmap &pixmap) ++{ ++ Q_D(KMessageBox); ++ d->iconLabel->setPixmap(pixmap); ++ d->icon = NoIcon; ++ d->setupLayout(); ++} ++ ++KMessageBox::StandardButtons KMessageBox::standardButtons() const ++{ ++ Q_D(const KMessageBox); ++ return KMessageBox::StandardButtons(int(d->buttonBox->standardButtons())); ++} ++ ++void KMessageBox::setStandardButtons(KMessageBox::StandardButtons buttons) ++{ ++ Q_D(KMessageBox); ++ d->buttonBox->setStandardButtons(QDialogButtonBox::StandardButtons(int(buttons))); ++ ++ QList buttonList = d->buttonBox->buttons(); ++ if (!buttonList.contains(d->defaultButton)) ++ d->defaultButton = 0; ++ d->autoAddOkButton = false; ++} ++ ++KMessageBox::StandardButton KMessageBox::standardButton(QAbstractButton *button) const ++{ ++ Q_D(const KMessageBox); ++ return (KMessageBox::StandardButton)d->buttonBox->standardButton(button); ++} ++ ++QPushButton *KMessageBox::defaultButton() const ++{ ++ Q_D(const KMessageBox); ++ return d->defaultButton; ++} ++ ++void KMessageBox::setDefaultButton(QPushButton *button) ++{ ++ Q_D(KMessageBox); ++ if (!d->buttonBox->buttons().contains(button)) ++ return; ++ d->defaultButton = button; ++ button->setDefault(true); ++ button->setFocus(); ++} ++ ++void KMessageBox::setDefaultButton(KMessageBox::StandardButton button) ++{ ++ Q_D(KMessageBox); ++ setDefaultButton(d->buttonBox->button(QDialogButtonBox::StandardButton(button))); ++} ++ ++QAbstractButton *KMessageBox::clickedButton() const ++{ ++ Q_D(const KMessageBox); ++ return d->clickedButton; ++} ++ ++QPixmap KMessageBox::standardIcon(KMessageBox::Icon icon) ++{ ++ return KMessageBoxPrivate::standardIcon(icon, 0); ++} ++ ++KMessageBox::StandardButton KMessageBox::information(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, KMessageBox::StandardButton defaultButton) ++{ ++ KMessageBox msgBox(parent); ++ msgBox.setIcon(KMessageBox::Icon::Information); ++ msgBox.setWindowTitle(title); ++ msgBox.setText(text); ++ msgBox.setStandardButtons(buttons); ++ msgBox.setDefaultButton(defaultButton); ++ msgBox.setParent(parent); ++ QDialogButtonBox *buttonBox = msgBox.findChild(); ++ Q_ASSERT(buttonBox != 0); ++ ++ if (msgBox.exec() == -1) ++ return KMessageBox::Cancel; ++ return msgBox.standardButton(msgBox.clickedButton()); ++} ++ ++KMessageBox::StandardButton KMessageBox::question(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, KMessageBox::StandardButton defaultButton) ++{ ++ KMessageBox msgBox(parent); ++ msgBox.setIcon(KMessageBox::Icon::Question); ++ msgBox.setWindowTitle(title); ++ msgBox.setText(text); ++ msgBox.setStandardButtons(buttons); ++ msgBox.setDefaultButton(defaultButton); ++ msgBox.setParent(parent); ++ QDialogButtonBox *buttonBox = msgBox.findChild(); ++ Q_ASSERT(buttonBox != 0); ++ ++ if (msgBox.exec() == -1) ++ return KMessageBox::Cancel; ++ return msgBox.standardButton(msgBox.clickedButton()); ++} ++ ++KMessageBox::StandardButton KMessageBox::warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, KMessageBox::StandardButton defaultButton) ++{ ++ KMessageBox msgBox(parent); ++ msgBox.setIcon(KMessageBox::Icon::Warning); ++ msgBox.setWindowTitle(title); ++ msgBox.setText(text); ++ msgBox.setStandardButtons(buttons); ++ msgBox.setDefaultButton(defaultButton); ++ msgBox.setParent(parent); ++ QDialogButtonBox *buttonBox = msgBox.findChild(); ++ Q_ASSERT(buttonBox != 0); ++ ++ if (msgBox.exec() == -1) ++ return KMessageBox::Cancel; ++ return msgBox.standardButton(msgBox.clickedButton()); ++} ++ ++KMessageBox::StandardButton KMessageBox::critical(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, KMessageBox::StandardButton defaultButton) ++{ ++ KMessageBox msgBox(parent); ++ msgBox.setIcon(KMessageBox::Icon::Critical); ++ msgBox.setWindowTitle(title); ++ msgBox.setText(text); ++ msgBox.setStandardButtons(buttons); ++ msgBox.setDefaultButton(defaultButton); ++ msgBox.setParent(parent); ++ QDialogButtonBox *buttonBox = msgBox.findChild(); ++ Q_ASSERT(buttonBox != 0); ++ ++ if (msgBox.exec() == -1) ++ return KMessageBox::Cancel; ++ return msgBox.standardButton(msgBox.clickedButton()); ++} ++ ++KMessageBox::StandardButton KMessageBox::success(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, KMessageBox::StandardButton defaultButton) ++{ ++ KMessageBox msgBox(parent); ++ msgBox.setCustomIcon(QIcon::fromTheme("ukui-dialog-success")); ++ msgBox.setWindowTitle(title); ++ msgBox.setText(text); ++ msgBox.setStandardButtons(buttons); ++ msgBox.setDefaultButton(defaultButton); ++ msgBox.setParent(parent); ++ QDialogButtonBox *buttonBox = msgBox.findChild(); ++ Q_ASSERT(buttonBox != 0); ++ ++ if (msgBox.exec() == -1) ++ return KMessageBox::Cancel; ++ return msgBox.standardButton(msgBox.clickedButton()); ++} ++ ++bool KMessageBox::event(QEvent *e) ++{ ++ Q_D(KMessageBox); ++ bool result =KDialog::event(e); ++ switch (e->type()) { ++ case QEvent::LayoutRequest: ++ d->updateSize(); ++ break; ++ case QEvent::FontChange: ++ d->updateSize(); ++ break; ++ default: ++ break; ++ } ++ return result; ++} ++ ++KMessageBoxPrivate::KMessageBoxPrivate(KMessageBox *parent):q_ptr(parent), options(QMessageDialogOptions::create()), informativeLabel(0), ++ checkbox(0), compatMode(false), clickedButton(0), defaultButton(0) ++ ++{ ++ Q_Q(KMessageBox); ++} ++ ++void KMessageBoxPrivate::init(const QString &title, const QString &text) ++{ ++ Q_Q(KMessageBox); ++ ++ label = new QLabel; ++ label->setObjectName(QLatin1String("qt_kmsgbox_label")); ++ label->setTextInteractionFlags(Qt::TextInteractionFlags(q->style()->styleHint(QStyle::SH_MessageBox_TextInteractionFlags, 0, q))); ++ label->setAlignment(Qt::AlignVCenter | Qt::AlignLeft); ++ label->setOpenExternalLinks(true); ++ iconLabel = new QLabel(q); ++ iconLabel->setObjectName(QLatin1String("qt_kmsgbox_icon_label")); ++ iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); ++ ++ buttonBox = new QDialogButtonBox; ++ buttonBox->setObjectName(QLatin1String("qt_kmsgbox_buttonbox")); ++ buttonBox->setCenterButtons(q->style()->styleHint(QStyle::SH_MessageBox_CenterButtons, nullptr, q)); ++ QObject::connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), ++ this, SLOT(_q_buttonClicked(QAbstractButton*))); ++ setupLayout(); ++ if (!title.isEmpty() || !text.isEmpty()) { ++ q->setWindowTitle(title); ++ q->setText(text); ++ } ++ q->setModal(true); ++ icon = KMessageBox::NoIcon; ++} ++ ++QPixmap KMessageBoxPrivate::standardIcon(KMessageBox::Icon icon, KMessageBox *mb) ++{ ++ QStyle *style = mb ? mb->style() : QApplication::style(); ++ int iconSize = style->pixelMetric(QStyle::PM_MessageBoxIconSize, nullptr, mb); ++ QIcon tmpIcon; ++ switch (icon) { ++ case KMessageBox::Information: ++ tmpIcon = style->standardIcon(QStyle::SP_MessageBoxInformation, nullptr, mb); ++ break; ++ case KMessageBox::Warning: ++ tmpIcon = style->standardIcon(QStyle::SP_MessageBoxWarning, nullptr, mb); ++ break; ++ case KMessageBox::Critical: ++ tmpIcon = style->standardIcon(QStyle::SP_MessageBoxCritical, nullptr, mb); ++ break; ++ case KMessageBox::Question: ++ tmpIcon = style->standardIcon(QStyle::SP_MessageBoxQuestion, nullptr, mb); ++ default: ++ break; ++ } ++ if (!tmpIcon.isNull()) { ++ QWindow *window = nullptr; ++ if (mb) { ++ window = mb->windowHandle(); ++ if (!window) { ++ if (const QWidget *nativeParent = mb->nativeParentWidget()) ++ window = nativeParent->windowHandle(); ++ } ++ } ++ return tmpIcon.pixmap(window, QSize(iconSize, iconSize)); ++ } ++ ++ return QPixmap(); ++} ++ ++void KMessageBoxPrivate::setupLayout() ++{ ++ Q_Q(KMessageBox); ++ if(q->mainWidget()->layout()) ++ delete q->mainWidget()->layout(); ++ ++ QGridLayout *grid = new QGridLayout; ++ QHBoxLayout *buttonLayout = new QHBoxLayout; ++ buttonLayout->setContentsMargins(0,0,0,0); ++ grid->setHorizontalSpacing(8); ++ if(informativeLabel) ++ grid->setVerticalSpacing(8); ++ else ++ grid->setVerticalSpacing(0); ++ grid->setContentsMargins(0,0,0,0); ++ ++ bool hasIcon = iconLabel->pixmap() && !iconLabel->pixmap()->isNull(); ++ if (hasIcon) ++ grid->addWidget(iconLabel, 0, 0, 2, 1, Qt::AlignTop); ++ iconLabel->setVisible(hasIcon); ++ grid->addWidget(label, 0, hasIcon ? 2 : 1, 1, 1); ++ ++ if (informativeLabel) { ++ grid->addWidget(informativeLabel, 1, hasIcon ? 2 : 1, 1, 1); ++ } ++ grid->setSizeConstraint(QLayout::SetNoConstraint); ++ ++ QVBoxLayout *layout = new QVBoxLayout; ++ layout->setContentsMargins(24,0,24,24); ++ ++ buttonLayout->setSizeConstraint(QLayout::SetNoConstraint); ++ if(checkbox) ++ buttonLayout->addWidget(checkbox, 0, Qt::AlignLeft | Qt::AlignVCenter); ++ buttonLayout->addWidget(buttonBox,0, Qt::AlignRight | Qt::AlignVCenter); ++ ++ layout->setSpacing(0); ++ layout->addLayout(grid); ++ layout->addSpacing(32); ++ layout->addLayout(buttonLayout); ++ ++ q->mainWidget()->setLayout(layout); ++ updateSize(); ++} ++ ++void KMessageBoxPrivate::updateSize() ++{ ++ Q_Q(KMessageBox); ++ ++ if(!q->isVisible()) ++ return; ++ ++ while (buttonBox->layout()->count() < buttonBox->buttons().count() + 1) { ++ QEvent event(QEvent::StyleChange); ++ QGuiApplication::sendEvent(buttonBox, &event); ++ } ++ ++ QSize minSize(424, 156); ++ QSize size; ++ QSize screenSize = QGuiApplication::screenAt(QCursor::pos())->availableGeometry().size(); ++ QSize maxSize(screenSize.width() * 0.8, screenSize.height() * 0.8); ++ ++ label->setWordWrap(false); ++ if (informativeLabel) { ++ informativeLabel->setWordWrap(false); ++ } ++ ++ q->mainWidget()->layout()->activate(); ++ ++ if (q->sizeHint().width() > qMax(buttonBox->sizeHint().width() + 24 + 24, 452)) { ++ label->setWordWrap(true); ++ if (informativeLabel) { ++ informativeLabel->setWordWrap(true); ++ } ++ } ++ ++ q->mainWidget()->layout()->activate(); ++ ++ q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); ++ size.setWidth(qMax(qMin(maxSize.width(), q->sizeHint().width()), minSize.width())); ++ size.setHeight(qMax(qMin(maxSize.height(), q->layout()->hasHeightForWidth() ? q->layout()->totalHeightForWidth(size.width()) ++ : q->layout()->totalMinimumSize().height()), minSize.height())); ++ ++ q->setFixedSize(size); ++ ++ QCoreApplication::removePostedEvents(q, QEvent::LayoutRequest); ++ ++} ++ ++void KMessageBoxPrivate::_q_buttonClicked(QAbstractButton *button) ++{ ++ Q_Q(KMessageBox); ++ setClickedButton(button); ++ ++ if (receiverToDisconnectOnClose) { ++ QObject::disconnect(q, signalToDisconnectOnClose, receiverToDisconnectOnClose, ++ memberToDisconnectOnClose); ++ receiverToDisconnectOnClose = nullptr; ++ } ++ signalToDisconnectOnClose.clear(); ++ memberToDisconnectOnClose.clear(); ++ ++} ++ ++void KMessageBoxPrivate::_q_clicked(QPlatformDialogHelper::StandardButton button, QPlatformDialogHelper::ButtonRole role) ++{ ++ Q_Q(KMessageBox); ++ if (button > QPlatformDialogHelper::LastButton) { ++ clickedButton = static_cast(options->customButton(button)->button); ++ Q_ASSERT(clickedButton); ++ clickedButton->click(); ++ q->done(role); ++ } else { ++ q->done(button); ++ } ++} ++ ++static int oldButton(int button) ++{ ++ switch (button & KMessageBox::ButtonMask) { ++ case KMessageBox::Ok: ++ return Old_Ok; ++ case KMessageBox::Cancel: ++ return Old_Cancel; ++ case KMessageBox::Yes: ++ return Old_Yes; ++ case KMessageBox::No: ++ return Old_No; ++ case KMessageBox::Abort: ++ return Old_Abort; ++ case KMessageBox::Retry: ++ return Old_Retry; ++ case KMessageBox::Ignore: ++ return Old_Ignore; ++ case KMessageBox::YesToAll: ++ return Old_YesAll; ++ case KMessageBox::NoToAll: ++ return Old_NoAll; ++ default: ++ return 0; ++ } ++} ++ ++void KMessageBoxPrivate::setClickedButton(QAbstractButton *button) ++{ ++ Q_Q(KMessageBox); ++ ++ clickedButton = button; ++ emit q->buttonClicked(clickedButton); ++ ++ int resultCode = execReturnCode(button); ++ q->hide(); ++ q->close(); ++ int dialogCode = dialogCodeForButton(button); ++ if (dialogCode == QDialog::Accepted) ++ emit q->accepted(); ++ else if (dialogCode == QDialog::Rejected) ++ emit q->rejected(); ++ emit q->finished(resultCode); ++} ++ ++int KMessageBoxPrivate::execReturnCode(QAbstractButton *button) ++{ ++ int ret = buttonBox->standardButton(button); ++ if (ret == KMessageBox::NoButton) { ++ ret = customButtonList.indexOf(button); // if button == 0, correctly sets ret = -1 ++ } else if (compatMode) { ++ ret = oldButton(ret); ++ } ++ return ret; ++} ++ ++int KMessageBoxPrivate::dialogCodeForButton(QAbstractButton *button) const ++{ ++ Q_Q(const KMessageBox); ++ ++ switch (q->buttonRole(button)) { ++ case KMessageBox::AcceptRole: ++ case KMessageBox::YesRole: ++ return KDialog::Accepted; ++ case KMessageBox::RejectRole: ++ case KMessageBox::NoRole: ++ return KDialog::Rejected; ++ default: ++ return -1; ++ } ++} ++ ++static KMessageBox::StandardButton newButton(int button) ++{ ++ // this is needed for source compatibility with Qt 4.0 and 4.1 ++ if (button == KMessageBox::NoButton || (button & NewButtonMask)) ++ return KMessageBox::StandardButton(button & KMessageBox::ButtonMask); ++ ++#if QT_VERSION < 0x050000 ++ // this is needed for binary compatibility with Qt 4.0 and 4.1 ++ switch (button & Old_ButtonMask) { ++ case Old_Ok: ++ return KMessageBox::Ok; ++ case Old_Cancel: ++ return KMessageBox::Cancel; ++ case Old_Yes: ++ return KMessageBox::Yes; ++ case Old_No: ++ return KMessageBox::No; ++ case Old_Abort: ++ return KMessageBox::Abort; ++ case Old_Retry: ++ return KMessageBox::Retry; ++ case Old_Ignore: ++ return KMessageBox::Ignore; ++ case Old_YesAll: ++ return KMessageBox::YesToAll; ++ case Old_NoAll: ++ return KMessageBox::NoToAll; ++ default: ++ return KMessageBox::NoButton; ++ } ++#else ++ return KMessageBox::NoButton; ++#endif ++} ++ ++static bool detectedCompat(int button0, int button1, int button2) ++{ ++ if (button0 != 0 && !(button0 & NewButtonMask)) ++ return true; ++ if (button1 != 0 && !(button1 & NewButtonMask)) ++ return true; ++ if (button2 != 0 && !(button2 & NewButtonMask)) ++ return true; ++ return false; ++} ++ ++void KMessageBoxPrivate::addOldButtons(int button0, int button1, int button2) ++{ ++ Q_Q(KMessageBox); ++ q->addButton(newButton(button0)); ++ q->addButton(newButton(button1)); ++ q->addButton(newButton(button2)); ++ q->setDefaultButton( ++ static_cast(findButton(button0, button1, button2, KMessageBox::Default))); ++ compatMode = detectedCompat(button0, button1, button2); ++} ++ ++QAbstractButton *KMessageBoxPrivate::findButton(int button0, int button1, int button2, int flags) ++{ ++ Q_Q(KMessageBox); ++ int button = 0; ++ ++ if (button0 & flags) { ++ button = button0; ++ } else if (button1 & flags) { ++ button = button1; ++ } else if (button2 & flags) { ++ button = button2; ++ } ++ return q->button(newButton(button)); ++} ++ ++void KMessageBoxPrivate::changeTheme() ++{ ++ Q_Q(KMessageBox); ++ q->setIconPixmap(QIcon::fromTheme(m_iconName).pixmap(24,24)); ++} ++ ++void KMessageBoxPrivate::initHelper(QPlatformDialogHelper *h) ++{ ++ Q_Q(KMessageBox); ++ QObject::connect(static_cast(h), SIGNAL(clicked(QPlatformDialogHelper::StandardButton,QPlatformDialogHelper::ButtonRole)), ++ this, SLOT(_q_clicked(QPlatformDialogHelper::StandardButton,QPlatformDialogHelper::ButtonRole))); ++ static_cast(h)->setOptions(options); ++} ++ ++static QMessageDialogOptions::Icon helperIcon(KMessageBox::Icon i) ++{ ++ switch (i) { ++ case KMessageBox::NoIcon: ++ return QMessageDialogOptions::NoIcon; ++ case KMessageBox::Information: ++ return QMessageDialogOptions::Information; ++ case KMessageBox::Warning: ++ return QMessageDialogOptions::Warning; ++ case KMessageBox::Critical: ++ return QMessageDialogOptions::Critical; ++ case KMessageBox::Question: ++ return QMessageDialogOptions::Question; ++ } ++ return QMessageDialogOptions::NoIcon; ++} ++ ++static QPlatformDialogHelper::StandardButtons helperStandardButtons(KMessageBox * q) ++{ ++ QPlatformDialogHelper::StandardButtons buttons(int(q->standardButtons())); ++ return buttons; ++} ++ ++void KMessageBoxPrivate::helperPrepareShow(QPlatformDialogHelper *) ++{ ++ Q_Q(KMessageBox); ++ options->setWindowTitle(q->windowTitle()); ++ options->setText(q->text()); ++ options->setInformativeText(q->informativeText()); ++ options->setIcon(helperIcon(q->icon())); ++ options->setStandardButtons(helperStandardButtons(q)); ++} ++ ++void KMessageBoxPrivate::helperDone(KDialog::DialogCode code, QPlatformDialogHelper *) ++{ ++ Q_Q(KMessageBox); ++ QAbstractButton *button = q->button(KMessageBox::StandardButton(code)); ++ if (button) ++ clickedButton = button; ++} ++ ++} ++ ++#include "moc_kmessagebox.cpp" ++#include "kmessagebox.moc" +diff --git a/kysdk-qtwidgets/src/kmessagebox.h b/kysdk-qtwidgets/src/kmessagebox.h +new file mode 100644 +index 0000000..abc90dd +--- /dev/null ++++ b/kysdk-qtwidgets/src/kmessagebox.h +@@ -0,0 +1,276 @@ ++#ifndef KMESSAGEBOX_H ++#define KMESSAGEBOX_H ++ ++#include ++#include ++#include "gui_g.h" ++#include "kdialog.h" ++#include ++ ++namespace kdk { ++ ++class KMessageBoxPrivate; ++ ++class GUI_EXPORT KMessageBox : public KDialog ++{ ++ Q_OBJECT ++public: ++ enum Icon { ++ // keep this in sync with QMessageDialogOptions::Icon ++ NoIcon = 0, ++ Information = 1, ++ Warning = 2, ++ Critical = 3, ++ Question = 4, ++ }; ++ Q_ENUM(Icon) ++ ++ enum ButtonRole { ++ InvalidRole = -1, ++ AcceptRole, ++ RejectRole, ++ DestructiveRole, ++ ActionRole, ++ HelpRole, ++ YesRole, ++ NoRole, ++ ResetRole, ++ ApplyRole, ++ NRoles ++ }; ++ ++ enum StandardButton { ++ // keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton ++ NoButton = 0x00000000, ++ Ok = 0x00000400, ++ Save = 0x00000800, ++ SaveAll = 0x00001000, ++ Open = 0x00002000, ++ Yes = 0x00004000, ++ YesToAll = 0x00008000, ++ No = 0x00010000, ++ NoToAll = 0x00020000, ++ Abort = 0x00040000, ++ Retry = 0x00080000, ++ Ignore = 0x00100000, ++ Close = 0x00200000, ++ Cancel = 0x00400000, ++ Discard = 0x00800000, ++ Help = 0x01000000, ++ Apply = 0x02000000, ++ Reset = 0x04000000, ++ RestoreDefaults = 0x08000000, ++ ++ FirstButton = Ok, // internal ++ LastButton = RestoreDefaults, // internal ++ ++ YesAll = YesToAll, // obsolete ++ NoAll = NoToAll, // obsolete ++ ++ Default = 0x00000100, // obsolete ++ Escape = 0x00000200, // obsolete ++ FlagMask = 0x00000300, // obsolete ++ ButtonMask = ~FlagMask // obsolete ++ }; ++ typedef StandardButton Button; ++ ++ Q_DECLARE_FLAGS(StandardButtons, StandardButton) ++ Q_FLAG(StandardButtons) ++ ++ KMessageBox(QWidget *parent = nullptr); ++ ~KMessageBox(); ++ ++ /** ++ * @brief 自定义KMessageBox的提示图标 ++ * @param icon ++ */ ++ void setCustomIcon(const QIcon&icon); ++ ++ /** ++ * @brief 添加一个自定义按钮 ++ * @param button ++ * @param role ++ */ ++ void addButton(QAbstractButton *button, ButtonRole role); ++ ++ /** ++ * @brief 添加设置好文本的按钮 ++ * @param text ++ * @param role ++ * @return ++ */ ++ QPushButton* addButton(const QString &text, ButtonRole role); ++ ++ /** ++ * @brief 添加一个标准按钮并且返回这个按钮 ++ * @param button ++ * @return ++ */ ++ QPushButton* addButton(StandardButton button); ++ ++ /** ++ * @brief 移除一个按钮 ++ * @param button ++ */ ++ void removeButton(QAbstractButton *button); ++ ++ /** ++ * @brief 返回与标准按钮对应的指针,如果此消息框中不存在标准按钮,则返回0。 ++ * @param which ++ * @return ++ */ ++ QAbstractButton* button (StandardButton which) const; ++ ++ /** ++ * @brief 返回已添加到消息框中的所有按钮的列表 ++ * @return ++ */ ++ QList buttons() const; ++ ++ /** ++ * @brief 返回指定按钮的按钮角色,如果按钮为0或尚未添加到消息框中,此函数将返回InvalidRole ++ * @param button ++ * @return ++ */ ++ KMessageBox::ButtonRole buttonRole(QAbstractButton *button) const; ++ ++ /** ++ * @brief 返回KMessageBox中显示的复选框 ++ * @return ++ */ ++ QCheckBox* checkBox() const; ++ ++ /** ++ * @brief 设置KMessageBox显示的复选框,未设置则为0 ++ * @param cb ++ */ ++ void setCheckBox(QCheckBox *cb); ++ ++ /** ++ * @brief 获取KMessageBox的文本 ++ * @return ++ */ ++ QString text() const; ++ ++ /** ++ * @brief 设置KMessageBox的文本 ++ * @param text ++ */ ++ void setText (const QString& text); ++ ++ /** ++ * @brief 获取KMessageBox信息性文本的描述 ++ * @return ++ */ ++ QString informativeText() const; ++ ++ /** ++ * @brief 设置KMessageBox信息性文本的描述 ++ * @param text ++ */ ++ void setInformativeText(const QString &text); ++ ++ /** ++ * @brief 获取KMessageBox的图标 ++ * @return ++ */ ++ Icon icon() const; ++ ++ /** ++ * @brief 设置KMessageBox的图标 ++ * @param icon ++ */ ++ void setIcon(Icon icon); ++ ++ /** ++ * @brief 返回当前KMessageBox的icon ++ * @return ++ */ ++ QPixmap iconPixmap() const; ++ ++ /** ++ * @brief 设置当前KMessageBox的icon ++ * @param pixmap ++ */ ++ void setIconPixmap(const QPixmap &pixmap); ++ ++ /** ++ * @brief KMessageBox中标准按钮的集合 ++ * @return ++ */ ++ KMessageBox::StandardButtons standardButtons() const; ++ ++ /** ++ * @brief 设置多个标准按钮 ++ * @param buttons ++ */ ++ void setStandardButtons(KMessageBox::StandardButtons buttons); ++ ++ /** ++ * @brief 返回与给定按钮对应的标准按钮枚举值,如果给定按钮不是标准按钮,则返回NoButton ++ * @param button ++ * @return ++ */ ++ KMessageBox::StandardButton standardButton(QAbstractButton *button) const; ++ ++ /** ++ * @brief 返回KMessageBox的默认按钮 ++ * @return ++ */ ++ QPushButton* defaultButton() const; ++ ++ /** ++ * @brief 设置KMessageBox的默认按钮 ++ * @param button ++ */ ++ void setDefaultButton(QPushButton *button); ++ ++ /** ++ * @brief 设置KMessageBox的默认按钮 ++ * @param button ++ */ ++ void setDefaultButton(KMessageBox::StandardButton button); ++ ++ /** ++ * @brief 返回被点击的按钮 ++ * @return ++ */ ++ QAbstractButton* clickedButton() const; ++ ++ /** ++ * @brief 返回用于标准图标的pixmap。 ++ * @param icon ++ * @return ++ */ ++ static QPixmap standardIcon(Icon icon); ++ ++ static StandardButton information(QWidget *parent, const QString &title, ++ const QString &text, StandardButtons buttons = Ok, ++ StandardButton defaultButton = NoButton); ++ static StandardButton question(QWidget *parent, const QString &title, ++ const QString &text, StandardButtons buttons = StandardButtons(Yes | No), ++ StandardButton defaultButton = NoButton); ++ static StandardButton warning(QWidget *parent, const QString &title, ++ const QString &text, StandardButtons buttons = Ok, ++ StandardButton defaultButton = NoButton); ++ static StandardButton critical(QWidget *parent, const QString &title, ++ const QString &text, StandardButtons buttons = Ok, ++ StandardButton defaultButton = NoButton); ++ static StandardButton success(QWidget *parent, const QString &title, ++ const QString &text, StandardButtons buttons = Ok, ++ StandardButton defaultButton = NoButton); ++ ++ ++Q_SIGNALS: ++ void buttonClicked(QAbstractButton *button); ++ ++protected: ++ bool event(QEvent *e) override; ++ ++private: ++ Q_DECLARE_PRIVATE(KMessageBox) ++ KMessageBoxPrivate* const d_ptr; ++}; ++ ++} ++#endif // KMESSAGEBOX_H +diff --git a/kysdk-qtwidgets/src/knavigationbar.cpp b/kysdk-qtwidgets/src/knavigationbar.cpp +index cc9b2b2..f3763a3 100644 +--- a/kysdk-qtwidgets/src/knavigationbar.cpp ++++ b/kysdk-qtwidgets/src/knavigationbar.cpp +@@ -93,6 +93,13 @@ KNavigationBar::KNavigationBar(QWidget* parent) + d->changeTheme(); + connect(d->m_pDelegate->m_gsetting,&QGSettings::changed,this,[=](){d->changeTheme();}); + //this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ++ connect(Parmscontroller::self(),&Parmscontroller::modeChanged,this,[=](){ ++// if(Parmscontroller::isTabletMode()) //解决导航栏滑动条切换主题为白条 ++// d->m_pView->setStyleSheet("QListView item {height : 48}"); ++// else ++// d->m_pView->setStyleSheet("QListView item {height : 36}"); ++ updateGeometry(); ++ }); + } + + void KNavigationBar::addItem(QStandardItem *item) +@@ -172,9 +179,11 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons + QLinearGradient m_linearGradient; + QRectF rect; + rect.setX(option.rect.x()); +- rect.setY(option.rect.y()); ++ rect.setY(option.rect.y()+1); + rect.setWidth(option.rect.width()); +- rect.setHeight(option.rect.height() - Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatInterval)); ++// rect.setHeight(option.rect.height()-2); ++ rect.setHeight(option.rect.height()-Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatInterval)); ++ + //QPainterPath画圆角矩形 + const qreal radius = 6; //圆角半径6px + QPainterPath path; +@@ -190,6 +199,9 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons + + int flag = index.model()->data(index,Qt::UserRole).toInt(); + painter->setRenderHint(QPainter::Antialiasing); ++ painter->setRenderHint(QPainter::HighQualityAntialiasing); ++ painter->setRenderHint(QPainter::TextAntialiasing); ++ painter->setRenderHint(QPainter::SmoothPixmapTransform); + QColor color; + m_linearGradient = QLinearGradient(rect.width()/2,rect.y(),rect.width()/2,rect.height()+rect.y()); + if(!(option.state & QStyle::State_Enabled)) +@@ -268,6 +280,7 @@ void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, cons + QRect iconRect=QRect(rect.x()+16,rect.y()+(rect.height()-16)/2,16,16); //图片大小16*16 左边距16 + auto *model =dynamic_cast(const_cast(index.model())); + auto icon = model->item(index.row())->icon(); ++ + if(ThemeController::themeMode() == DarkTheme) + icon = ThemeController::drawSymbolicColoredPixmap(icon.pixmap(16,16)); + if((m_listView->currentIndex() == index)|| (option.state & QStyle::State_Selected)) +@@ -366,10 +379,9 @@ QSize Delegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex & + size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatHeight)+12); + break; + default: +- size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatHeight) + Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatInterval)); ++ size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatHeight)+Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBatInterval)); + break; + } +-// size.setWidth(Parmscontroller::parm(Parmscontroller::Parm::PM_NavigationBarWidth)); + size.setWidth(option.rect.width()); + return size; + } +diff --git a/kysdk-qtwidgets/src/kpasswordedit.cpp b/kysdk-qtwidgets/src/kpasswordedit.cpp +index 2dee21b..2c7cc4f 100644 +--- a/kysdk-qtwidgets/src/kpasswordedit.cpp ++++ b/kysdk-qtwidgets/src/kpasswordedit.cpp +@@ -38,8 +38,8 @@ private: + QTimer *m_pTimer; + bool m_isLoading; + bool m_hasFocus; ++ bool m_useCustomPalette; + int m_flashState; +- QPalette m_palette; + }; + + KPasswordEdit::KPasswordEdit(QWidget*parent) +@@ -76,9 +76,9 @@ KPasswordEdit::KPasswordEdit(QWidget*parent) + }); + connect(d->m_gsetting,&QGSettings::changed,d,&KPasswordEditPrivate::changeTheme); + connect(Parmscontroller::self(),&Parmscontroller::modeChanged,this,[=](){ +- updateGeometry(); ++ updateGeometry(); + }); +- d->changeTheme(); ++ d->repaintIcon(); + installEventFilter(this); + setContextMenuPolicy(Qt::NoContextMenu); + setFocusPolicy(Qt::ClickFocus); +@@ -90,29 +90,29 @@ void KPasswordEdit::setState(LoginState state) + Q_D(KPasswordEdit); + d->m_state = state; + +- ++ auto palette = this->palette(); + switch (d->m_state) + { + case Ordinary: + if(ThemeController::widgetTheme() == FashionTheme) +- d->m_palette.setBrush(QPalette::Highlight,QColor("#3769DD")); ++ palette.setBrush(QPalette::Highlight,QColor("#3769DD")); + else +- d->m_palette.setBrush(QPalette::Highlight,QGuiApplication::palette().color(QPalette::Highlight)); +- setPalette(d->m_palette); ++ palette.setBrush(QPalette::Highlight,QGuiApplication::palette().color(QPalette::Highlight)); ++ setPalette(palette); + break; + case LoginSuccess: + if(ThemeController::widgetTheme() == FashionTheme) +- d->m_palette.setBrush(QPalette::Highlight,QColor("#3ECF20")); ++ palette.setBrush(QPalette::Highlight,QColor("#3ECF20")); + else +- d->m_palette.setBrush(QPalette::Highlight,QColor(15,206,117)); +- setPalette(d->m_palette); ++ palette.setBrush(QPalette::Highlight,QColor(15,206,117)); ++ setPalette(palette); + break; + case LoginFailed: + if(ThemeController::widgetTheme() == FashionTheme) +- d->m_palette.setBrush(QPalette::Highlight,QColor("#D2293F")); ++ palette.setBrush(QPalette::Highlight,QColor("#D2293F")); + else +- d->m_palette.setBrush(QPalette::Highlight,QColor(243,34,45)); +- setPalette(d->m_palette); ++ palette.setBrush(QPalette::Highlight,QColor(243,34,45)); ++ setPalette(palette); + break; + default: + break; +@@ -215,6 +215,12 @@ void KPasswordEdit::setEchoMode(QLineEdit::EchoMode mode) + d->repaintIcon(); + } + ++void KPasswordEdit::setUseCustomPalette(bool flag) ++{ ++ Q_D(KPasswordEdit); ++ d->m_useCustomPalette =flag; ++} ++ + void KPasswordEdit::resizeEvent(QResizeEvent *event) + { + Q_D(KPasswordEdit); +@@ -260,10 +266,9 @@ QSize KPasswordEdit::sizeHint() const + } + + KPasswordEditPrivate::KPasswordEditPrivate(KPasswordEdit *parent) +- :q_ptr(parent) ++ :q_ptr(parent),m_useCustomPalette(false) + { + Q_Q(KPasswordEdit); +- m_palette = q->palette(); + m_flashState = 0; + m_state = Ordinary; + m_hasFocus = q->hasFocus(); +@@ -282,6 +287,8 @@ KPasswordEditPrivate::KPasswordEditPrivate(KPasswordEdit *parent) + btnPalette.setBrush(QPalette::Disabled, QPalette::Highlight, Qt::transparent); + + m_pEchoModeBtn = new KToolButton(q); ++ m_pEchoModeBtn->setAutoFillBackground(true); ++ m_pEchoModeBtn->setPalette(btnPalette); + m_pEchoModeBtn->setType(KToolButtonType::Background); + m_pEchoModeBtn->setIconSize(QSize(16,16)); + m_pEchoModeBtn->setFixedSize(QSize(16,16)); +@@ -289,6 +296,8 @@ KPasswordEditPrivate::KPasswordEditPrivate(KPasswordEdit *parent) + m_pEchoModeBtn->setCursor(Qt::ArrowCursor); + m_pEchoModeBtn->setIcon(QIcon::fromTheme("ukui-eye-hidden-symbolic")); + m_pLoadingBtn = new KToolButton(q); ++ m_pLoadingBtn->setAutoFillBackground(true); ++ m_pLoadingBtn->setPalette(btnPalette); + m_pLoadingBtn->setType(KToolButtonType::Background); + m_pLoadingBtn->setIconSize(QSize(16,16)); + m_pLoadingBtn->setFixedSize(QSize(16,16)); +@@ -297,6 +306,8 @@ KPasswordEditPrivate::KPasswordEditPrivate(KPasswordEdit *parent) + m_pLoadingBtn->setIcon(QIcon::fromTheme("ukui-loading-0")); + m_pLoadingBtn->hide(); + m_pClearBtn = new KToolButton(q); ++ m_pClearBtn->setAutoFillBackground(true); ++ m_pClearBtn->setPalette(btnPalette); + m_pClearBtn->setType(KToolButtonType::Background); + m_pClearBtn->setIconSize(QSize(16,16)); + m_pClearBtn->setFixedSize(QSize(16,16)); +@@ -313,14 +324,6 @@ KPasswordEditPrivate::KPasswordEditPrivate(KPasswordEdit *parent) + m_pWidgetLayout->addWidget(m_pEchoModeBtn); + m_pWidgetLayout->addSpacing(5); + m_pWidget->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); +- +- +- m_pEchoModeBtn->setAutoFillBackground(true); +- m_pLoadingBtn->setAutoFillBackground(true); +- m_pClearBtn->setAutoFillBackground(true); +- m_pEchoModeBtn->setPalette(btnPalette); +- m_pLoadingBtn->setPalette(btnPalette); +- m_pClearBtn->setPalette(btnPalette); + setParent(parent); + } + +@@ -375,39 +378,41 @@ void KPasswordEditPrivate::changeTheme() + { + Q_Q(KPasswordEdit); + initThemeStyle(); ++ if(m_useCustomPalette) ++ return; + repaintIcon(); ++ QPalette palette = q->palette(); + if(q->hasFocus()) + { +- QPalette p = q->palette(); +- QColor color = p.color(QPalette::Base); +- m_palette.setBrush(QPalette::Button,color); ++ QColor color = q->palette().color(QPalette::Base); ++ palette.setBrush(QPalette::Button,color); + if(ThemeController::themeMode() == LightTheme) +- m_palette.setBrush(QPalette::Text, QColor(38,38,38)); ++ palette.setBrush(QPalette::Text, QColor(38,38,38)); + else +- m_palette.setBrush(QPalette::Active, QPalette::Text, QColor(255,255,255)); +- q->setPalette(m_palette); ++ palette.setBrush(QPalette::Active, QPalette::Text, QColor(255,255,255)); ++ q->setPalette(palette); + } + else + { + if(ThemeController::themeMode() == LightTheme) + { +- m_palette.setBrush(QPalette::Active, QPalette::Button, QColor(230,230,230)); +- m_palette.setBrush(QPalette::Inactive, QPalette::Button, QColor(230,230,230)); +- m_palette.setBrush(QPalette::Disabled, QPalette::Button, QColor(233,233,233)); +- m_palette.setBrush(QPalette::Active, QPalette::Text, QColor(140,140,140)); +- m_palette.setBrush(QPalette::Inactive, QPalette::Text, QColor(140,140,140)); +- m_palette.setBrush(QPalette::Disabled, QPalette::Text, QColor(179,179,179)); +- q->setPalette(m_palette); ++ palette.setBrush(QPalette::Active, QPalette::Button, QColor(230,230,230)); ++ palette.setBrush(QPalette::Inactive, QPalette::Button, QColor(230,230,230)); ++ palette.setBrush(QPalette::Disabled, QPalette::Button, QColor(233,233,233)); ++ palette.setBrush(QPalette::Active, QPalette::Text, QColor(140,140,140)); ++ palette.setBrush(QPalette::Inactive, QPalette::Text, QColor(140,140,140)); ++ palette.setBrush(QPalette::Disabled, QPalette::Text, QColor(179,179,179)); ++ q->setPalette(palette); + } + else + { +- m_palette.setBrush(QPalette::Active, QPalette::Button, QColor(55,55,59)); +- m_palette.setBrush(QPalette::Inactive, QPalette::Button, QColor(55,55,59)); +- m_palette.setBrush(QPalette::Disabled, QPalette::Button, QColor(46,46,48)); +- m_palette.setBrush(QPalette::Active, QPalette::Text, QColor(115,115,115)); +- m_palette.setBrush(QPalette::Inactive, QPalette::Text, QColor(115,115,115)); +- m_palette.setBrush(QPalette::Disabled, QPalette::Text, QColor(71,71,74)); +- q->setPalette(m_palette); ++ palette.setBrush(QPalette::Active, QPalette::Button, QColor(55,55,59)); ++ palette.setBrush(QPalette::Inactive, QPalette::Button, QColor(55,55,59)); ++ palette.setBrush(QPalette::Disabled, QPalette::Button, QColor(46,46,48)); ++ palette.setBrush(QPalette::Active, QPalette::Text, QColor(115,115,115)); ++ palette.setBrush(QPalette::Inactive, QPalette::Text, QColor(115,115,115)); ++ palette.setBrush(QPalette::Disabled, QPalette::Text, QColor(71,71,74)); ++ q->setPalette(palette); + } + } + } +diff --git a/kysdk-qtwidgets/src/kpasswordedit.h b/kysdk-qtwidgets/src/kpasswordedit.h +index 98979c3..a12461e 100644 +--- a/kysdk-qtwidgets/src/kpasswordedit.h ++++ b/kysdk-qtwidgets/src/kpasswordedit.h +@@ -115,6 +115,12 @@ public: + */ + void setEchoMode(EchoMode mode); + ++ /** ++ * @brief 设置是否走默认palette ++ * @param flag ++ */ ++ void setUseCustomPalette(bool flag); ++ + + protected: + void resizeEvent(QResizeEvent*event); +diff --git a/kysdk-qtwidgets/src/kpressbutton.cpp b/kysdk-qtwidgets/src/kpressbutton.cpp +index 34dc6a1..a1dcb71 100755 +--- a/kysdk-qtwidgets/src/kpressbutton.cpp ++++ b/kysdk-qtwidgets/src/kpressbutton.cpp +@@ -157,6 +157,9 @@ void KPressButton::paintEvent(QPaintEvent *event) + initStyleOption(&opt); + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing); ++ p.setRenderHint(QPainter::HighQualityAntialiasing); ++ p.setRenderHint(QPainter::TextAntialiasing); ++ p.setRenderHint(QPainter::SmoothPixmapTransform); + + if(d->m_pTranslucent) + { +diff --git a/kysdk-qtwidgets/src/kprogressbar.cpp b/kysdk-qtwidgets/src/kprogressbar.cpp +index 1686e64..1cb3eee 100644 +--- a/kysdk-qtwidgets/src/kprogressbar.cpp ++++ b/kysdk-qtwidgets/src/kprogressbar.cpp +@@ -32,6 +32,7 @@ private: + QRect m_textRect; + QRect m_contentRect; + QRect m_rect; ++ int m_bodyWidth; + }; + + KProgressBar::KProgressBar(QWidget *parent) +@@ -299,12 +300,21 @@ void KProgressBar::setOrientation(Qt::Orientation orientation) + QProgressBar::setOrientation(orientation); + } + ++void KProgressBar::setBodyWidth(int width) ++{ ++ Q_D(KProgressBar); ++ d->m_bodyWidth = width; ++ update(); ++} ++ ++ + KProgressBarPrivate::KProgressBarPrivate(KProgressBar *parent) + :q_ptr(parent) + { + m_contentMargin = 2; + m_state = NormalProgress; + setParent(parent); ++ m_bodyWidth = 0; + } + + void KProgressBarPrivate::calculateTextRect() +@@ -342,6 +352,8 @@ void KProgressBarPrivate::calculateRect() //背景矩形 + m_rect = q->rect(); + if(q->orientation() == Qt::Horizontal) + { ++ if(m_bodyWidth != 0) ++ m_rect.setHeight(m_bodyWidth); + if(!q->isTextVisible()) + return; + else +@@ -357,6 +369,8 @@ void KProgressBarPrivate::calculateRect() //背景矩形 + } + else + { ++ if(m_bodyWidth != 0) ++ m_rect.setWidth(m_bodyWidth); + if(!q->isTextVisible()) + return; + else +diff --git a/kysdk-qtwidgets/src/kprogressbar.h b/kysdk-qtwidgets/src/kprogressbar.h +index e7196c1..1a841aa 100644 +--- a/kysdk-qtwidgets/src/kprogressbar.h ++++ b/kysdk-qtwidgets/src/kprogressbar.h +@@ -55,6 +55,12 @@ public: + */ + void setOrientation(Qt::Orientation); + ++ /** ++ * @brief 设置进度条宽度 ++ * @param width ++ */ ++ void setBodyWidth(int width); ++ + protected: + void paintEvent(QPaintEvent *event) override; + QSize sizeHint() const; +diff --git a/kysdk-qtwidgets/src/kpushbutton.cpp b/kysdk-qtwidgets/src/kpushbutton.cpp +index 959c62a..52d514c 100644 +--- a/kysdk-qtwidgets/src/kpushbutton.cpp ++++ b/kysdk-qtwidgets/src/kpushbutton.cpp +@@ -63,6 +63,7 @@ KPushButton::~KPushButton() + void KPushButton::setBorderRadius(int radius) + { + Q_D(KPushButton); ++ d->m_hasOneParam = true; + d->m_radius = radius; + update(); + } +@@ -284,12 +285,14 @@ void KPushButton::paintEvent(QPaintEvent *event) + backgroundColor = highlight; + } + +- /*绘制背景色和rect*/ +- p.save(); +- p.setBrush(backgroundColor); + p.setRenderHint(QPainter::HighQualityAntialiasing); + p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::TextAntialiasing); ++ p.setRenderHint(QPainter::SmoothPixmapTransform); ++ ++ /*绘制背景色和rect*/ ++ p.save(); ++ p.setBrush(backgroundColor); + p.setPen(Qt::NoPen); + + switch(d->m_buttonType) +diff --git a/kysdk-qtwidgets/src/ksearchlineedit.cpp b/kysdk-qtwidgets/src/ksearchlineedit.cpp +index 45390b4..a8d4e41 100644 +--- a/kysdk-qtwidgets/src/ksearchlineedit.cpp ++++ b/kysdk-qtwidgets/src/ksearchlineedit.cpp +@@ -20,8 +20,8 @@ + #include + #include + #include +-#include "parmscontroller.h" + #include "kshadowhelper.h" ++#include "parmscontroller.h" + + namespace kdk + { +@@ -52,7 +52,6 @@ protected: + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; + }; + +- + static const int iconMargin = 6; + static const int buttonMargin = 6; + static const int icontextSpacing = 5; +@@ -274,7 +273,7 @@ bool KSearchLineEdit::eventFilter(QObject *watched, QEvent *event) + } + else if(event->type() == QEvent::HoverEnter) + { +- if(width()-icontextSpacing-d->m_pIconLabel->width() < fm.width(d->m_placeHolderText)) ++ if(width()-icontextSpacing-d->m_pIconLabel->width()m_placeHolderText)) + { + if(d->m_hasFocus) + setToolTip(d->m_placeHolderText); +@@ -440,6 +439,7 @@ void KSearchLineEditPrivate::changeTheme() + m_pCompleter->popup()->setPalette(palette); + m_pCompleter->popup()->setBackgroundRole(QPalette::Base); + m_pCompleter->popup()->setAutoFillBackground(true); ++ + } + else + { +@@ -450,6 +450,9 @@ void KSearchLineEditPrivate::changeTheme() + m_pCompleter->popup()->setPalette(palette); + m_pCompleter->popup()->setBackgroundRole(QPalette::Base); + m_pCompleter->popup()->setAutoFillBackground(true); ++ ++ QPalette pal=qApp->palette(); ++ m_pTextLabel->setPalette(pal); + } + } + +@@ -461,7 +464,6 @@ void KSearchLineEditPrivate::init() + m_pIconLabel = new QLabel; + m_pIconLabel->setScaledContents(true); + QPixmap pixmap = QIcon::fromTheme("search-symbolic").pixmap(QSize(16,16)); +- + m_pIconLabel->setPixmap(pixmap); + m_pIconLabel->setFixedSize(QSize(16,16)); + m_pWidget =new QWidget(q); +@@ -482,7 +484,6 @@ void KSearchLineEditPrivate::init() + q->setTextMargins(iconMargin + m_pIconLabel->width(),0,0,0); + } + +- + ListViewDelegate::ListViewDelegate(QObject *parent):QStyledItemDelegate(parent) + { + +@@ -584,9 +585,6 @@ QSize ListViewDelegate::sizeHint(const QStyleOptionViewItem &option, const QMode + return size; + } + +-#include "ksearchlineedit.moc" +-#include "moc_ksearchlineedit.cpp" +- + + void MyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const + { +@@ -628,4 +626,7 @@ QRect MyStyle::subElementRect(QStyle::SubElement element, const QStyleOption *op + } + + } ++ + } ++#include "ksearchlineedit.moc" ++#include "moc_ksearchlineedit.cpp" +diff --git a/kysdk-qtwidgets/src/kslider.cpp b/kysdk-qtwidgets/src/kslider.cpp +index 8a5efbf..cd9c8bb 100644 +--- a/kysdk-qtwidgets/src/kslider.cpp ++++ b/kysdk-qtwidgets/src/kslider.cpp +@@ -16,11 +16,10 @@ using namespace kdk; + namespace kdk { + + static const int node_radius = 5; +-static const int handle_radius = 8; ++static const int handle_radius = 10; + static const int spaceing = handle_radius+2; + static const int line_width = 4; + static const int line_border_radius = 2; +-static int select_node_radius; + + class KSliderPrivate :public QObject,public ThemeController + { +@@ -57,6 +56,7 @@ private: + QString m_pToolTipText; + QLinearGradient m_linearGradient; + bool m_isTranslucent; ++ int m_handleRadius; + + }; + +@@ -67,8 +67,14 @@ KSliderPrivate::KSliderPrivate(KSlider *parent) + m_isHovered(false), + m_valuePosition(0), + m_currentpos(QPoint(0,0)), +- m_nodeVisible(true) ++ m_nodeVisible(true), ++ m_handleRadius(0) + { ++ Q_Q(KSlider); ++ QStyleOptionSlider sliderOption; ++ //获取滑动块大小 ++ QRect handle = q->style()->proxy()->subControlRect(QStyle::CC_Slider, &sliderOption, QStyle::SC_SliderHandle, q); ++ m_handleRadius =handle.width()/2; + } + + KSliderPrivate::~KSliderPrivate() +@@ -117,7 +123,6 @@ void KSliderPrivate::drawSlider(QPainter*painter) + //获取滑动块大小 + // QRect handle = q->style()->proxy()->subControlRect(QStyle::CC_Slider, &sliderOption, QStyle::SC_SliderHandle, q); + int handle_radius = Parmscontroller::parm(Parmscontroller::Parm::PM_SliderHandleRadius)/2; +- + QPoint point; + if(q->orientation() == Qt::Horizontal) + { +@@ -347,15 +352,16 @@ void KSliderPrivate::updateColor() + { + QColor whiteColor("#FFFFFF"); + QColor darkColor("#000000"); ++ m_coverColor = highlightColor.darker(120); + if(m_isPressed) + { +- m_coverColor = highlightColor.darker(120).darker(120); ++// m_coverColor = highlightColor.darker(120).darker(120); //取消lineRect三态 + m_startColor = highlightColor.darker(120); + return; + } + else if(m_isHovered) + { +- m_coverColor = highlightColor.darker(120); ++// m_coverColor = highlightColor.darker(120);//取消lineRect三态 + if(ThemeController::widgetTheme() == FashionTheme) + { + m_startColor = ThemeController::mixColor(highlightColor,whiteColor,0.2); +@@ -370,22 +376,23 @@ void KSliderPrivate::updateColor() + } + else + { +- m_coverColor = highlightColor.darker(120); ++// m_coverColor = highlightColor.darker(120);//取消lineRect三态 + m_startColor = highlightColor; + } + } + else + { + QColor whiteColor("#FFFFFF"); ++ m_coverColor = highlightColor.lighter(120); + if(m_isPressed) + { +- m_coverColor = highlightColor.lighter(120).lighter(120); ++// m_coverColor = highlightColor.lighter(120).lighter(120);//取消lineRect三态 + m_startColor = highlightColor.lighter(120); + return; + } + else if(m_isHovered) + { +- m_coverColor = highlightColor.lighter(120); ++// m_coverColor = highlightColor.lighter(120);//取消lineRect三态 + if(ThemeController::widgetTheme() == FashionTheme) + { + m_startColor = ThemeController::mixColor(highlightColor,whiteColor,0.2); +@@ -400,7 +407,7 @@ void KSliderPrivate::updateColor() + } + else + { +- m_coverColor = highlightColor.lighter(120); ++// m_coverColor = highlightColor.lighter(120);//取消lineRect三态 + m_startColor = highlightColor; + } + } +@@ -427,7 +434,7 @@ QRect KSliderPrivate::baseLineRect() + } + else + { +- rect.setBottom(q->height() - spaceing -select_node_radius); ++ rect.setBottom(q->height() - spaceing -m_handleRadius); + rect.setTop(spaceing); + rect.setLeft(q->width()/2 - line_width/2); + rect.setRight(q->width()/2 + line_width/2); +@@ -448,7 +455,7 @@ QRect KSliderPrivate::coverLineRect() + } + else + { +- rect.setBottom(q->height() - spaceing -select_node_radius); ++ rect.setBottom(q->height() - spaceing -m_handleRadius); + rect.setTop(m_valuePosition); + rect.setLeft(q->width()/2 - line_width/2); + rect.setRight(q->width()/2 + line_width/2); +@@ -459,7 +466,6 @@ QRect KSliderPrivate::coverLineRect() + KSlider::KSlider(QWidget *parent) + :KSlider(Qt::Horizontal,parent) + { +- + } + + KSlider::KSlider(Qt::Orientation orientation, QWidget *parent) +@@ -473,6 +479,7 @@ KSlider::KSlider(Qt::Orientation orientation, QWidget *parent) + update(); + }); + installEventFilter(this); ++ setFocusPolicy(Qt::ClickFocus); + } + + void KSlider::setTickInterval(int interval) +@@ -580,7 +587,6 @@ void KSlider::paintEvent(QPaintEvent *event) + d->locateNode(); + d->updateValuePosition(); + QPainter p(this); +- + d->drawBasePath(&p); + if(d->m_sliderType != SingleSelectSlider) + d->drawCoverLine(&p); +@@ -680,6 +686,7 @@ QSize KSlider::sizeHint() const + size.setWidth(Parmscontroller::parm(Parmscontroller::Parm::PM_SliderHandleRadius)); + return size; + } ++ + } + //#include "kslider.moc" + #include "moc_kslider.cpp" +diff --git a/kysdk-qtwidgets/src/kslider.h b/kysdk-qtwidgets/src/kslider.h +index d0c62c2..b310465 100644 +--- a/kysdk-qtwidgets/src/kslider.h ++++ b/kysdk-qtwidgets/src/kslider.h +@@ -106,7 +106,7 @@ protected: + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent *event); + bool eventFilter(QObject *watched, QEvent *event); +- QSize sizeHint() const override; ++ QSize sizeHint() const override; + private: + KSliderPrivate *const d_ptr; + +diff --git a/kysdk-qtwidgets/src/ktabbar.cpp b/kysdk-qtwidgets/src/ktabbar.cpp +index 2a4aa8b..837810e 100644 +--- a/kysdk-qtwidgets/src/ktabbar.cpp ++++ b/kysdk-qtwidgets/src/ktabbar.cpp +@@ -2,7 +2,6 @@ + #include "themeController.h" + #include + #include +-#include + #include + #include + #include +@@ -10,6 +9,7 @@ + #include + #include + #include "parmscontroller.h" ++ + namespace kdk + { + class KTabBarPrivate:public QObject,public ThemeController +@@ -43,10 +43,11 @@ KTabBar::KTabBar(KTabBarStyle barStyle,QWidget* parent): + d->m_kTabBarStyle = barStyle; + d->m_useCustomColor = false; + ++ //this->setObjectName("KTabbar"); + d->changeTheme(); + connect(d->m_gsetting,&QGSettings::changed, d,&KTabBarPrivate::changeTheme); + connect(Parmscontroller::self(),&Parmscontroller::modeChanged,this,[=](bool flag){ +- updateGeometry(); ++ updateGeometry(); + }); + } + +@@ -96,7 +97,6 @@ QSize KTabBar::sizeHint() const + { + auto size = QTabBar::sizeHint(); + size.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_TabBarHeight)); +-// qDebug()<<"size hint:"<m_horizontalMargin,0,0,-d->m_topMargin); ++ rect.setHeight(Parmscontroller::parm(Parmscontroller::Parm::PM_PushButtonHeight)); + switch (d->m_kTabBarStyle) + { + case SegmentDark: +@@ -146,20 +152,16 @@ void KTabBar::paintEvent(QPaintEvent *event) + { + bkgrdColor = ThemeController::mixColor(bkgrdColor,mix,0.05); + } +- QRect rect = option.rect.adjusted(d->m_horizontalMargin,0,0,-d->m_topMargin); +- + if(option.position == QStyleOptionTab::Middle) + { + p.save(); + p.setBrush(bkgrdColor); + p.setPen(Qt::NoPen); +- p.setRenderHint(QPainter::Antialiasing); + //利用quadto绘制圆角矩形会出现一个像素的偏差,修正一下QRect底部高度 + p.drawRect(rect.adjusted(0,0,0,-1)); + p.restore(); + p.setBrush(Qt::NoBrush); + p.setPen(fontColor); +- p.setRenderHint(QPainter::Antialiasing); + QPoint point; + uint tf = Qt::AlignVCenter; + if (!option.icon.isNull()) { +@@ -223,7 +225,6 @@ void KTabBar::paintEvent(QPaintEvent *event) + p.save(); + p.setBrush(bkgrdColor); + p.setPen(Qt::NoPen); +- p.setRenderHint(QPainter::Antialiasing); + QPainterPath path; + auto tempRect = rect.adjusted(0,0,1,0); + path.moveTo(tempRect.topLeft() + QPointF(0, d->m_borderRadius)); +@@ -237,7 +238,6 @@ void KTabBar::paintEvent(QPaintEvent *event) + p.restore(); + p.setBrush(Qt::NoBrush); + p.setPen(fontColor); +- p.setRenderHint(QPainter::Antialiasing); + QPoint point; + uint tf = Qt::AlignVCenter; + if (!option.icon.isNull()) { +@@ -292,7 +292,6 @@ void KTabBar::paintEvent(QPaintEvent *event) + p.save(); + p.setBrush(bkgrdColor); + p.setPen(Qt::NoPen); +- p.setRenderHint(QPainter::Antialiasing); + QPainterPath path; + path.moveTo(rect.topLeft()); + path.lineTo(rect.bottomLeft()); +@@ -305,7 +304,6 @@ void KTabBar::paintEvent(QPaintEvent *event) + p.restore(); + p.setBrush(Qt::NoBrush); + p.setPen(fontColor); +- p.setRenderHint(QPainter::Antialiasing); + QPoint point; + uint tf = Qt::AlignVCenter; + if (!option.icon.isNull()) { +@@ -384,14 +382,12 @@ void KTabBar::paintEvent(QPaintEvent *event) + p.save(); + p.setBrush(bkgrdColor); + p.setPen(Qt::NoPen); +- p.setRenderHint(QPainter::Antialiasing); +- p.drawRoundedRect(option.rect.adjusted(d->m_horizontalMargin,0,0,-d->m_topMargin), ++ p.drawRoundedRect(/*option.rect.adjusted*/rect.adjusted(d->m_horizontalMargin,0,0,-d->m_topMargin), + d->m_borderRadius,d->m_borderRadius); + p.restore(); + p.setBrush(Qt::NoBrush); + p.setPen(fontColor); +- p.setRenderHint(QPainter::Antialiasing); +- QRect rect = option.rect.adjusted(d->m_horizontalMargin,0,0,-d->m_topMargin); ++ /*QRect*/ rect = /*option.*/rect.adjusted(d->m_horizontalMargin,0,0,-d->m_topMargin); + QPoint point; + uint tf = Qt::AlignVCenter; + if (!option.icon.isNull()) { +@@ -470,14 +466,12 @@ void KTabBar::paintEvent(QPaintEvent *event) + pen.setColor(bkgrdColor); + pen.setWidth(2); + p.setPen(pen); +- p.setRenderHint(QPainter::Antialiasing); +- QRect rect = option.rect.adjusted(d->m_horizontalMargin,0,0,-5); ++ /*QRect*/ rect = /*option.*/rect.adjusted(d->m_horizontalMargin,0,0,-5); + p.drawLine(rect.bottomLeft(),rect.bottomRight()); + p.restore(); + + p.setBrush(Qt::NoBrush); + p.setPen(fontColor); +- p.setRenderHint(QPainter::Antialiasing); + QPoint point; + uint tf = Qt::AlignVCenter; + if (!option.icon.isNull()) { +diff --git a/kysdk-qtwidgets/src/ktabbar.h b/kysdk-qtwidgets/src/ktabbar.h +index 7f7d71f..6eb4f01 100644 +--- a/kysdk-qtwidgets/src/ktabbar.h ++++ b/kysdk-qtwidgets/src/ktabbar.h +@@ -68,7 +68,7 @@ public: + protected: + QSize sizeHint() const; + QSize minimumTabSizeHint(int index) const; +- QSize tabSizeHint(int index) const; ++ QSize tabSizeHint(int index) const; + void paintEvent(QPaintEvent *event); + + private: +diff --git a/kysdk-qtwidgets/src/ktag.cpp b/kysdk-qtwidgets/src/ktag.cpp +index 1a7efd5..a659c0a 100644 +--- a/kysdk-qtwidgets/src/ktag.cpp ++++ b/kysdk-qtwidgets/src/ktag.cpp +@@ -36,7 +36,7 @@ KTag::KTag(QWidget *parent) + setClosable(false); + d->changeTheme(); + connect(Parmscontroller::self(),&Parmscontroller::modeChanged,this,[=](bool flag){ +- updateGeometry(); ++ updateGeometry(); + }); + } + +diff --git a/kysdk-qtwidgets/src/ktoolbutton.cpp b/kysdk-qtwidgets/src/ktoolbutton.cpp +index 8f1cf46..0e99df7 100644 +--- a/kysdk-qtwidgets/src/ktoolbutton.cpp ++++ b/kysdk-qtwidgets/src/ktoolbutton.cpp +@@ -202,7 +202,8 @@ bool KToolButton::eventFilter(QObject *watched, QEvent *event) + QSize KToolButton::sizeHint() const + { + Q_D(const KToolButton); +- QSize size(Parmscontroller::parm(Parmscontroller::Parm::PM_ToolButtonHeight),Parmscontroller::parm(Parmscontroller::Parm::PM_ToolButtonHeight)); ++ QSize size(Parmscontroller::parm(Parmscontroller::Parm::PM_ToolButtonHeight), ++ Parmscontroller::parm(Parmscontroller::Parm::PM_ToolButtonHeight)); + if(d->m_hasArrow) + size.setWidth(Parmscontroller::parm(Parmscontroller::Parm::PM_ToolButtonHeight)+24); + return size; +diff --git a/kysdk-qtwidgets/src/kwidget.cpp b/kysdk-qtwidgets/src/kwidget.cpp +index 57d8161..0e084da 100644 +--- a/kysdk-qtwidgets/src/kwidget.cpp ++++ b/kysdk-qtwidgets/src/kwidget.cpp +@@ -6,7 +6,10 @@ + #include + #include + #include "parmscontroller.h" ++ ++#include + #include "ukuistylehelper/ukui-decoration-manager.h" ++ + namespace kdk + { + class KWidgetPrivate:public QObject +@@ -32,6 +35,8 @@ private: + LayoutType m_layoutType; + + void adjustBackground(); ++ void adjustFlagsTitleStatus(Qt::WindowFlags type); ++ void adjustFlagTitleStatus(Qt::WindowFlags type); + }; + + KWidget::KWidget(QWidget *parent) +@@ -93,19 +98,19 @@ KWidget::KWidget(QWidget *parent) + d->m_pIconBar->setFixedWidth(Parmscontroller::parm(Parmscontroller::Parm::PM_Widget_SideWidget_Width)); + if(Parmscontroller::isTabletMode()) + { +- d->m_pWindowButtonBar->maximumButton()->hide(); ++ if(d->m_pWindowButtonBar->followMode()) ++ d->m_pWindowButtonBar->maximumButton()->hide(); + } + else + { +- d->m_pWindowButtonBar->maximumButton()->show(); ++ if(d->m_pWindowButtonBar->followMode()) ++ d->m_pWindowButtonBar->maximumButton()->show(); + } + updateGeometry(); + }); +- + changeTheme(); + connect(m_gsetting,&QGSettings::changed,this,[=](){changeTheme();}); + +- + QString platform = QGuiApplication::platformName(); + if(platform.startsWith(QLatin1String("xcb"),Qt::CaseInsensitive)) + { +@@ -115,6 +120,7 @@ KWidget::KWidget(QWidget *parent) + hints.decorations = MWM_DECOR_BORDER; + XAtomHelper::getInstance()->setWindowMotifHint(this->winId(), hints); + } ++ + installEventFilter(this); + resize(800,600); + } +@@ -144,6 +150,7 @@ void KWidget::setWidgetName(const QString &widgetName) + { + Q_D(KWidget); + d->m_pIconBar->setWidgetName(widgetName); ++ QWidget::setWindowTitle(widgetName); + } + + QWidget *KWidget::sideBar() +@@ -179,8 +186,9 @@ void KWidget::setLayoutType(LayoutType type) + + void KWidget::setWindowFlags(Qt::WindowFlags type) + { ++ Q_D(KWidget); + QWidget::setWindowFlags(type); +- ++ d->adjustFlagsTitleStatus(type); + QString platform = QGuiApplication::platformName(); + if(platform.startsWith(QLatin1String("xcb"),Qt::CaseInsensitive)) + { +@@ -195,8 +203,9 @@ void KWidget::setWindowFlags(Qt::WindowFlags type) + + void KWidget::setWindowFlag(Qt::WindowType flag, bool on) + { ++ Q_D(KWidget); + QWidget::setWindowFlag(flag,on); +- ++ d->adjustFlagTitleStatus(flag); + QString platform = QGuiApplication::platformName(); + if(platform.startsWith(QLatin1String("xcb"),Qt::CaseInsensitive)) + { +@@ -226,7 +235,6 @@ bool KWidget::eventFilter(QObject *target, QEvent *event) + UKUIDecorationManager::getInstance()->removeHeaderBar(this->windowHandle()); + } + } +- + return QWidget::eventFilter(target, event); + } + +@@ -242,46 +250,6 @@ void KWidget::changeTheme() + Q_D(KWidget); + initThemeStyle(); + d->adjustBackground(); +- auto baseColor = this->palette().brush(QPalette::Base).color(); +- auto sideColor = this->palette().brush(QPalette::Window).color(); +- sideColor.setAlphaF(d->tranSparency); +- QPalette basePalette = this->palette(); +- basePalette.setColor(QPalette::Window,baseColor); +- d->m_pWindowButtonBar->setAutoFillBackground(true); +- d->m_pWindowButtonBar->setPalette(basePalette); +- d->m_pBaseWidget->setAutoFillBackground(true); +- d->m_pBaseWidget->setPalette(basePalette); +- +- QPalette sidePalette = this->palette(); +- switch (d->m_layoutType) +- { +- case VerticalType: +- sidePalette.setColor(QPalette::Window,sideColor); +- d->m_pIconBar->setAutoFillBackground(true); +- d->m_pIconBar->setPalette(basePalette); +- d->m_pSideWidget->hide(); +- break; +- case HorizontalType: +- sidePalette.setColor(QPalette::Window,sideColor); +- d->m_pSideWidget->setAutoFillBackground(true); +- d->m_pSideWidget->setPalette(sidePalette); +- d->m_pIconBar->setAutoFillBackground(true); +- d->m_pIconBar->setPalette(sidePalette); +- d->m_pIconBar->setFixedWidth(Parmscontroller::parm(Parmscontroller::Parm::PM_Widget_SideWidget_Width)); +- d->m_pSideWidget->show(); +- break; +- case MixedType: +- sidePalette.setColor(QPalette::Window,sideColor); +- d->m_pSideWidget->setAutoFillBackground(true); +- d->m_pSideWidget->setPalette(sidePalette); +- d->m_pSideWidget->show(); +- d->m_pIconBar->setAutoFillBackground(true); +- d->m_pIconBar->setPalette(basePalette); +- break; +- default: +- break; +- } +- + } + + KWidgetPrivate::KWidgetPrivate(KWidget *parent) +@@ -361,6 +329,141 @@ void KWidgetPrivate::adjustBackground() + break; + } + } ++ ++void KWidgetPrivate::adjustFlagsTitleStatus(Qt::WindowFlags type) ++{ ++ Q_Q(KWidget); ++ m_pWindowButtonBar->menuButton()->hide(); ++ switch (type) ++ { ++ case Qt::Drawer: ++ m_pWindowButtonBar->minimumButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Tool: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::ToolTip: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::SplashScreen: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Dialog: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Sheet: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Popup: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Desktop: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++// m_pWindowButtonBar->menuButton()->hide(); ++ q->deleteLater(); ++ break; ++ case Qt::ForeignWindow: ++// m_pWindowButtonBar->menuButton()->hide(); ++// break; ++ case Qt::CoverWindow: ++// m_pWindowButtonBar->menuButton()->hide(); ++// break; ++ case Qt::Window: ++// m_pWindowButtonBar->menuButton()->hide(); ++// break; ++ case Qt::Widget: ++// m_pWindowButtonBar->menuButton()->hide(); ++// break; ++ case Qt::SubWindow: ++// m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ default: ++ break; ++ } ++} ++ ++void KWidgetPrivate::adjustFlagTitleStatus(Qt::WindowFlags type) ++{ ++ Q_Q(KWidget); ++ switch (type) ++ { ++ case Qt::Drawer: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Tool: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::ToolTip: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::SplashScreen: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Dialog: ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Sheet: ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Popup: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Desktop: ++ m_pWindowButtonBar->minimumButton()->hide(); ++ m_pWindowButtonBar->maximumButton()->hide(); ++ m_pWindowButtonBar->closeButton()->hide(); ++ m_pWindowButtonBar->menuButton()->hide(); ++ q->deleteLater(); ++ break; ++ case Qt::ForeignWindow: ++ q->setWindowFlags(Qt::WindowMinMaxButtonsHint); //为窗口添加最大化和最小化按钮 ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::CoverWindow: ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Window: ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::Widget: ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ case Qt::SubWindow: ++ m_pWindowButtonBar->menuButton()->hide(); ++ break; ++ default: ++ break; ++ } ++} + } + + #include "kwidget.moc" +diff --git a/kysdk-qtwidgets/src/kwindowbuttonbar.cpp b/kysdk-qtwidgets/src/kwindowbuttonbar.cpp +index 9e465f7..7a81ef9 100644 +--- a/kysdk-qtwidgets/src/kwindowbuttonbar.cpp ++++ b/kysdk-qtwidgets/src/kwindowbuttonbar.cpp +@@ -28,6 +28,7 @@ private: + MaximumButtonState m_maximumButtonState; + QWidget*m_pParentWidget; + QColor m_pixColor; ++ bool m_followMode; + }; + + KWindowButtonBar::KWindowButtonBar(QWidget *parent) +@@ -92,6 +93,18 @@ void KWindowButtonBar::setMaximumButtonState(MaximumButtonState state) + d->changeTheme(); + } + ++void KWindowButtonBar::setFollowMode(bool flag) ++{ ++ Q_D(KWindowButtonBar); ++ d->m_followMode=flag; ++} ++ ++bool KWindowButtonBar::followMode() ++{ ++ Q_D(KWindowButtonBar); ++ return d->m_followMode; ++} ++ + void KWindowButtonBar::mouseDoubleClickEvent(QMouseEvent *event) + { + Q_D(KWindowButtonBar); +@@ -163,7 +176,7 @@ QSize KWindowButtonBar::sizeHint() const + } + + KWindowButtonBarPrivate::KWindowButtonBarPrivate(KWindowButtonBar *parent) +- :q_ptr(parent) ++ :q_ptr(parent),m_followMode(true) + { + Q_Q(KWindowButtonBar); + QHBoxLayout *hLayout = new QHBoxLayout(); +@@ -179,11 +192,9 @@ KWindowButtonBarPrivate::KWindowButtonBarPrivate(KWindowButtonBar *parent) + m_pMinimumBtn->setToolTip(tr("minimize")); + m_pMinimumBtn->setFixedSize(Parmscontroller::parm(Parmscontroller::Parm::PM_WindowButtonBarSize),Parmscontroller::parm(Parmscontroller::Parm::PM_WindowButtonBarSize)); + +- + m_pmaximumBtn = new QPushButton(q); + m_pmaximumBtn->setFixedSize(Parmscontroller::parm(Parmscontroller::Parm::PM_WindowButtonBarSize),Parmscontroller::parm(Parmscontroller::Parm::PM_WindowButtonBarSize)); + +- + m_pCloseBtn = new QPushButton(q); + m_pCloseBtn->setObjectName("CloseButton"); + m_pCloseBtn->setFixedSize(Parmscontroller::parm(Parmscontroller::Parm::PM_WindowButtonBarSize),Parmscontroller::parm(Parmscontroller::Parm::PM_WindowButtonBarSize)); +diff --git a/kysdk-qtwidgets/src/kwindowbuttonbar.h b/kysdk-qtwidgets/src/kwindowbuttonbar.h +index dde21cb..e54826b 100644 +--- a/kysdk-qtwidgets/src/kwindowbuttonbar.h ++++ b/kysdk-qtwidgets/src/kwindowbuttonbar.h +@@ -69,6 +69,17 @@ public: + */ + void setMaximumButtonState(MaximumButtonState state); + ++ /** ++ * @brief 设置是否遵循模式 since 1.2.0.4-table4 ++ * @param flag ++ */ ++ void setFollowMode(bool flag); ++ ++ /** ++ * @brief 返回是否遵循模式 since 1.2.0.4-table4 ++ * @return ++ */ ++ bool followMode(); + + + Q_SIGNALS: +diff --git a/kysdk-qtwidgets/src/parmscontroller.cpp b/kysdk-qtwidgets/src/parmscontroller.cpp +index 2e0969d..775deca 100644 +--- a/kysdk-qtwidgets/src/parmscontroller.cpp ++++ b/kysdk-qtwidgets/src/parmscontroller.cpp +@@ -12,6 +12,7 @@ namespace kdk + + static Parmscontroller *g_parmscontroller; + static QDBusInterface *g_statusManagerDBus; ++static bool g_isTablet; + const static QString DBUS_STATUS_MANAGER = "com.kylin.statusmanager.interface"; + + const static int TABLET_CONTROL_HEIGHT = 48; +@@ -70,8 +71,13 @@ Parmscontroller::Parmscontroller(QObject *parent) : QObject(parent) + if (g_statusManagerDBus->isValid()) { + //平板模式切换 + connect(g_statusManagerDBus, SIGNAL(mode_change_signal(bool)), this, SIGNAL(modeChanged(bool))); ++ connect(this,&Parmscontroller::modeChanged,this,[=](bool flag) ++ { ++ g_isTablet = flag; ++ }); + } + } ++ g_isTablet = isTabletMode(); + } + + Parmscontroller::~Parmscontroller() +@@ -82,7 +88,7 @@ Parmscontroller::~Parmscontroller() + + bool Parmscontroller::isTabletMode() + { +- if (g_statusManagerDBus) ++ if (g_statusManagerDBus && g_statusManagerDBus->isValid()) + { + QDBusReply message = g_statusManagerDBus->call("get_current_tabletmode"); + if (message.isValid()) +@@ -96,7 +102,7 @@ bool Parmscontroller::isTabletMode() + + int Parmscontroller::parm(Parmscontroller::Parm p) + { +- if(Parmscontroller::isTabletMode()) ++ if(g_isTablet) + { + switch (p) { + case PM_TabBarHeight: +@@ -129,7 +135,7 @@ int Parmscontroller::parm(Parmscontroller::Parm p) + case PM_InputDialog_Height: + return TABLET_INPUTDIALOG_HEIGHT; + case PM_InputDialog_Width: +- return TABLET_INPUTDIALOG_WIDTH; ++ return TABLET_INPUTDIALOG_WIDTH; + case PM_InputDialog_Label_Spacing: + return TABLET_INPUTDIALOG_LABEL_SPACING; + case PM_InputDialog_Widget_Spacing: +diff --git a/kysdk-qtwidgets/test/test.pro b/kysdk-qtwidgets/test/test.pro +index 57e43a9..ae9d015 100644 +--- a/kysdk-qtwidgets/test/test.pro ++++ b/kysdk-qtwidgets/test/test.pro +@@ -20,11 +20,16 @@ SUBDIRS += \ + testtabbar \ + testTag \ + testtoolbutton \ +- testWidget \ ++ testWidget \ + testListWidget \ + testListView \ + testkpressbutton\ + testKPushButton\ + testKTranslucentFloor\ + testTranslucent\ +- testKBubbleWidget ++ testKBubbleWidget\ ++ testkcolorcombobox\ ++ testKButtonBox\ ++ testkbackground\ ++ testcolorbutton\ ++ testKMessageBox +diff --git a/kysdk-qtwidgets/test/testDialog/main.cpp b/kysdk-qtwidgets/test/testDialog/main.cpp +index 77af6b9..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testDialog/main.cpp ++++ b/kysdk-qtwidgets/test/testDialog/main.cpp +@@ -2,10 +2,11 @@ + + #include + #include +-#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); + QTranslator trans; + QString locale = QLocale::system().name(); +@@ -16,6 +17,13 @@ int main(int argc, char *argv[]) + a.installTranslator(&trans); + } + } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testDialog/testDialog.pro b/kysdk-qtwidgets/test/testDialog/testDialog.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testDialog/testDialog.pro ++++ b/kysdk-qtwidgets/test/testDialog/testDialog.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testKBubbleWidget/main.cpp b/kysdk-qtwidgets/test/testKBubbleWidget/main.cpp +new file mode 100644 +index 0000000..b0a4ec2 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKBubbleWidget/main.cpp +@@ -0,0 +1,11 @@ ++#include "widget.h" ++ ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testKBubbleWidget/testKBubbleWidget.pro b/kysdk-qtwidgets/test/testKBubbleWidget/testKBubbleWidget.pro +new file mode 100644 +index 0000000..d37043d +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKBubbleWidget/testKBubbleWidget.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++ ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-qtwidgets ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testKBubbleWidget/widget.cpp b/kysdk-qtwidgets/test/testKBubbleWidget/widget.cpp +new file mode 100644 +index 0000000..836a575 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKBubbleWidget/widget.cpp +@@ -0,0 +1,65 @@ ++#include "widget.h" ++#include ++#include ++#include ++#include ++#include "kbubblewidget.h" ++#include "kwidget.h" ++#include ++using namespace kdk; ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QPushButton* btn1 = new QPushButton(this); ++ btn1->setText("常规"); ++ ++ QPushButton* btn2 = new QPushButton(this); ++ btn2->setText("毛玻璃"); ++ ++ btn2->move(100,0); ++ ++ KBubbleWidget* w =new KBubbleWidget(); ++ w->setTailPosition(TailDirection::TopDirection); ++ w->setTailSize(QSize(16,8)); ++ w->setBorderRadius(12); ++ w->setOpacity(0.4); ++ w->setEnableBlur(false); ++ w->setFixedSize(320,320); ++ QHBoxLayout* layout = new QHBoxLayout(w); ++ QPushButton* button = new QPushButton(w); ++ button->setText("关闭"); ++ layout->addWidget(button); ++ connect(button,&QPushButton::clicked,this,[=](){ ++ w->hide(); ++ }); ++ ++ KBubbleWidget* w2 =new KBubbleWidget(); ++ w2->setTailPosition(TailDirection::TopDirection); ++ w2->setTailSize(QSize(16,8)); ++ w2->setBorderRadius(12); ++ w2->setOpacity(0.4); ++ w2->setEnableBlur(true); ++ w2->setFixedSize(320,320); ++ QPushButton* button2 = new QPushButton(w2); ++ button2->setText("关闭"); ++ QHBoxLayout* layout2 = new QHBoxLayout(w2); ++ layout2->addWidget(button2); ++ ++ connect(button2,&QPushButton::clicked,this,[=](){ ++ w2->hide(); ++ }); ++ ++ connect(btn1,&QPushButton::clicked,this,[=](){ ++ w->show(); ++ }); ++ connect(btn2,&QPushButton::clicked,this,[=](){ ++ w2->show(); ++ }); ++ ++} ++ ++Widget::~Widget() ++{ ++} ++ +diff --git a/kysdk-qtwidgets/test/testKBubbleWidget/widget.h b/kysdk-qtwidgets/test/testKBubbleWidget/widget.h +new file mode 100644 +index 0000000..47b6270 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKBubbleWidget/widget.h +@@ -0,0 +1,14 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++ ++#include ++ ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testKButtonBox/main.cpp b/kysdk-qtwidgets/test/testKButtonBox/main.cpp +new file mode 100644 +index 0000000..b0a4ec2 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKButtonBox/main.cpp +@@ -0,0 +1,11 @@ ++#include "widget.h" ++ ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testKButtonBox/testKButtonBox.pro b/kysdk-qtwidgets/test/testKButtonBox/testKButtonBox.pro +new file mode 100644 +index 0000000..cdead9a +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKButtonBox/testKButtonBox.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-qtwidgets ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testKButtonBox/widget.cpp b/kysdk-qtwidgets/test/testKButtonBox/widget.cpp +new file mode 100644 +index 0000000..ee247ee +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKButtonBox/widget.cpp +@@ -0,0 +1,87 @@ ++#include "widget.h" ++#include "kbuttonbox.h" ++#include ++#include "kpushbutton.h" ++#include ++#include ++#include ++#include ++ ++using namespace kdk; ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QVBoxLayout *layout = new QVBoxLayout(this); ++ ++ QHBoxLayout *layout1 = new QHBoxLayout; ++ KButtonBox *box1 = new KButtonBox(this); ++ KPushButton *btn1 = new KPushButton; ++ btn1->setIcon(QIcon::fromTheme("list-add-symbolic")); ++ btn1->setFixedSize(48,48); ++ btn1->setIconSize(QSize(32,32)); ++ KPushButton *btn2 = new KPushButton; ++ btn2->setIcon(QIcon::fromTheme("list-remove-symbolic")); ++ btn2->setFixedSize(48,48); ++ btn2->setIconSize(QSize(32,32)); ++ box1->addButton(btn1); ++ box1->addButton(btn2); ++ ++ KButtonBox *box2 = new KButtonBox(this); ++ KPushButton *btn3 = new KPushButton; ++ btn3->setIcon(QIcon::fromTheme("list-add-symbolic")); ++ btn3->setFixedSize(48,48); ++ btn3->setIconSize(QSize(32,32)); ++ KPushButton *btn4 = new KPushButton; ++ btn4->setIcon(QIcon::fromTheme("list-remove-symbolic")); ++ btn4->setFixedSize(48,48); ++ btn4->setIconSize(QSize(32,32)); ++ btn4->setEnabled(false); ++ box2->addButton(btn3); ++ box2->addButton(btn4); ++ ++ QHBoxLayout *layout2 = new QHBoxLayout; ++ KButtonBox *box3 = new KButtonBox(this); ++ KPushButton *btn5 = new KPushButton(this); ++ btn5->setIcon(QIcon::fromTheme("system-computer-symbolic")); ++ KPushButton *btn6 = new KPushButton(this); ++ btn6->setIcon(QIcon::fromTheme("format-text-italic-symbolic")); ++ KPushButton *btn7 = new KPushButton(this); ++ btn7->setIcon(QIcon::fromTheme("format-text-underline-symbolic")); ++ KPushButton *btn8 = new KPushButton(this); ++ btn8->setIcon(QIcon::fromTheme("format-text-strikethrough-symbolic")); ++ QList list; ++ list.insert(0,btn5); ++ list.insert(1,btn6); ++ list.insert(2,btn7); ++ list.insert(3,btn8); ++ ++ box3->setButtonList(list); ++ box3->setCheckable(true); ++ box3->setExclusive(false); ++ ++ KPushButton *btn = new KPushButton; ++ btn->setText("New Button"); ++ ++ connect(box1,&KButtonBox::buttonClicked,this,[=](QAbstractButton *button){ ++ if(btn1 == button) ++ box3->addButton(btn); ++ if(btn2 == button) ++ box3->removeButton(btn); ++ }); ++ ++ layout1->addWidget(box1); ++ layout1->addWidget(box2); ++ layout2->addWidget(box3); ++ layout->addLayout(layout1); ++ layout->addLayout(layout2); ++ this->setLayout(layout); ++ this->setFixedSize(500,400); ++ ++ ++} ++ ++Widget::~Widget() ++{ ++} ++ +diff --git a/kysdk-qtwidgets/test/testKButtonBox/widget.h b/kysdk-qtwidgets/test/testKButtonBox/widget.h +new file mode 100644 +index 0000000..47b6270 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKButtonBox/widget.h +@@ -0,0 +1,14 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++ ++#include ++ ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testKMessageBox/main.cpp b/kysdk-qtwidgets/test/testKMessageBox/main.cpp +new file mode 100644 +index 0000000..5ef19b2 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKMessageBox/main.cpp +@@ -0,0 +1,29 @@ ++#include "widget.h" ++#include "kwidgetutils.h" ++#include ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ kdk::KWidgetUtils::highDpiScaling(); ++ QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testKMessageBox/testKMessageBox.pro b/kysdk-qtwidgets/test/testKMessageBox/testKMessageBox.pro +new file mode 100644 +index 0000000..0bc0fdc +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKMessageBox/testKMessageBox.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-widgetutils kysdk-qtwidgets ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testKMessageBox/widget.cpp b/kysdk-qtwidgets/test/testKMessageBox/widget.cpp +new file mode 100644 +index 0000000..a489a29 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKMessageBox/widget.cpp +@@ -0,0 +1,53 @@ ++#include "widget.h" ++#include ++#include ++#include "kmessagebox.h" ++ ++using namespace kdk; ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QVBoxLayout *layout = new QVBoxLayout; ++ ++ QPushButton *btn_1 = new QPushButton(this); ++ btn_1->setText("TestDemoOne"); ++ QObject::connect(btn_1,&QPushButton::clicked,this,[=](){ ++ KMessageBox w; ++ w.setCustomIcon(QIcon::fromTheme("dialog-error")); ++ w.setText("打印测试失败,建议修改驱动后重试"); ++ ++ QPushButton *btn1 = new QPushButton("修改驱动"); ++ QPushButton *btn2 = new QPushButton("取消"); ++ w.addButton(btn1,KMessageBox::YesRole); ++ w.addButton(btn2,KMessageBox::NoRole); ++ ++ w.exec(); ++ }); ++ ++ QPushButton *btn_2 = new QPushButton(this); ++ btn_2->setText("TestDemoTwo"); ++ QObject::connect(btn_2,&QPushButton::clicked,this,[=](){ ++ KMessageBox w; ++ w.setCustomIcon(QIcon::fromTheme("ukui-dialog-success")); ++ w.setText("添加成功,是否打印测试页?"); ++ ++ QPushButton *btn1 = new QPushButton("打印测试页"); ++ QPushButton *btn2 = new QPushButton("查看设备"); ++ w.addButton(btn1,KMessageBox::YesRole); ++ w.addButton(btn2,KMessageBox::NoRole); ++ ++ w.exec(); ++ }); ++ ++ layout->addWidget(btn_1); ++ layout->addWidget(btn_2); ++ ++ this->setLayout(layout); ++ this->setFixedSize(300,200); ++} ++ ++Widget::~Widget() ++{ ++} ++ +diff --git a/kysdk-qtwidgets/test/testKMessageBox/widget.h b/kysdk-qtwidgets/test/testKMessageBox/widget.h +new file mode 100644 +index 0000000..47b6270 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testKMessageBox/widget.h +@@ -0,0 +1,14 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++ ++#include ++ ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testKPushButton/main.cpp b/kysdk-qtwidgets/test/testKPushButton/main.cpp +index 4bf59fb..6bc2dbc 100644 +--- a/kysdk-qtwidgets/test/testKPushButton/main.cpp ++++ b/kysdk-qtwidgets/test/testKPushButton/main.cpp +@@ -3,10 +3,29 @@ + #include + #include + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.setAttribute(Qt::WA_TranslucentBackground,true); + KWindowEffects::enableBlurBehind(w.winId(),true); +diff --git a/kysdk-qtwidgets/test/testKPushButton/testKPushButton.pro b/kysdk-qtwidgets/test/testKPushButton/testKPushButton.pro +index ce010e9..b6c23a6 100644 +--- a/kysdk-qtwidgets/test/testKPushButton/testKPushButton.pro ++++ b/kysdk-qtwidgets/test/testKPushButton/testKPushButton.pro +@@ -11,7 +11,7 @@ CONFIG += c++11 + DEFINES += QT_DEPRECATED_WARNINGS + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + + # You can also make your code fail to compile if it uses deprecated APIs. +diff --git a/kysdk-qtwidgets/test/testKTranslucentFloor/main.cpp b/kysdk-qtwidgets/test/testKTranslucentFloor/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testKTranslucentFloor/main.cpp ++++ b/kysdk-qtwidgets/test/testKTranslucentFloor/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testKTranslucentFloor/testKTranslucentFloor.pro b/kysdk-qtwidgets/test/testKTranslucentFloor/testKTranslucentFloor.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testKTranslucentFloor/testKTranslucentFloor.pro ++++ b/kysdk-qtwidgets/test/testKTranslucentFloor/testKTranslucentFloor.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testListView/main.cpp b/kysdk-qtwidgets/test/testListView/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testListView/main.cpp ++++ b/kysdk-qtwidgets/test/testListView/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testListView/testListView.pro b/kysdk-qtwidgets/test/testListView/testListView.pro +index a93f398..6c73866 100644 +--- a/kysdk-qtwidgets/test/testListView/testListView.pro ++++ b/kysdk-qtwidgets/test/testListView/testListView.pro +@@ -4,7 +4,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + CONFIG += c++11 + +diff --git a/kysdk-qtwidgets/test/testListWidget/main.cpp b/kysdk-qtwidgets/test/testListWidget/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testListWidget/main.cpp ++++ b/kysdk-qtwidgets/test/testListWidget/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testListWidget/testListWidget.pro b/kysdk-qtwidgets/test/testListWidget/testListWidget.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testListWidget/testListWidget.pro ++++ b/kysdk-qtwidgets/test/testListWidget/testListWidget.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testProgressCircle/main.cpp b/kysdk-qtwidgets/test/testProgressCircle/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testProgressCircle/main.cpp ++++ b/kysdk-qtwidgets/test/testProgressCircle/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testProgressCircle/testProgressCircle.pro b/kysdk-qtwidgets/test/testProgressCircle/testProgressCircle.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testProgressCircle/testProgressCircle.pro ++++ b/kysdk-qtwidgets/test/testProgressCircle/testProgressCircle.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testPushbutton/main.cpp b/kysdk-qtwidgets/test/testPushbutton/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testPushbutton/main.cpp ++++ b/kysdk-qtwidgets/test/testPushbutton/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testPushbutton/testPushbutton.pro b/kysdk-qtwidgets/test/testPushbutton/testPushbutton.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testPushbutton/testPushbutton.pro ++++ b/kysdk-qtwidgets/test/testPushbutton/testPushbutton.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testSwitchButton/main.cpp b/kysdk-qtwidgets/test/testSwitchButton/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testSwitchButton/main.cpp ++++ b/kysdk-qtwidgets/test/testSwitchButton/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testSwitchButton/testSwitchButton.pro b/kysdk-qtwidgets/test/testSwitchButton/testSwitchButton.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testSwitchButton/testSwitchButton.pro ++++ b/kysdk-qtwidgets/test/testSwitchButton/testSwitchButton.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testTag/main.cpp b/kysdk-qtwidgets/test/testTag/main.cpp +index 91d8b13..0682a8b 100644 +--- a/kysdk-qtwidgets/test/testTag/main.cpp ++++ b/kysdk-qtwidgets/test/testTag/main.cpp +@@ -1,9 +1,28 @@ + #include "widget.h" + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testTag/testTag.pro b/kysdk-qtwidgets/test/testTag/testTag.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testTag/testTag.pro ++++ b/kysdk-qtwidgets/test/testTag/testTag.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testTranslucent/main.cpp b/kysdk-qtwidgets/test/testTranslucent/main.cpp +new file mode 100644 +index 0000000..d684805 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testTranslucent/main.cpp +@@ -0,0 +1,15 @@ ++#include "widget.h" ++ ++#include ++#include ++//#include ++ ++int main(int argc, char *argv[]) ++{ ++// kdk::KWidgetUtils::highDpiScaling(); ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ KWindowEffects::enableBlurBehind(w.winId(),true); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testTranslucent/testTranslucent.pro b/kysdk-qtwidgets/test/testTranslucent/testTranslucent.pro +new file mode 100644 +index 0000000..1131058 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testTranslucent/testTranslucent.pro +@@ -0,0 +1,30 @@ ++QT += core gui KWindowSystem ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 link_pkgconfig ++PKGCONFIG += kysdk-qtwidgets ++ ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testTranslucent/widget.cpp b/kysdk-qtwidgets/test/testTranslucent/widget.cpp +new file mode 100644 +index 0000000..4c4dbeb +--- /dev/null ++++ b/kysdk-qtwidgets/test/testTranslucent/widget.cpp +@@ -0,0 +1,117 @@ ++#include "widget.h" ++#include "kslider.h" ++#include "kswitchbutton.h" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "ksearchlineedit.h" ++#include "kpressbutton.h" ++#include "kpushbutton.h" ++ ++using namespace kdk; ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ setAttribute(Qt::WA_TranslucentBackground); ++ ++ QVBoxLayout* mainLayout = new QVBoxLayout(this); ++ QWidget *mainWidget = new QWidget(this); ++ mainWidget->setFocusPolicy(Qt::FocusPolicy::ClickFocus); ++ mainWidget->installEventFilter(this); ++ QLabel* label1 = new QLabel("KSlider",this); ++ label1->move(50,100); ++ KSlider* slider = new KSlider(mainWidget); ++ slider->setToolTip("this is a tool tip"); ++ slider->setRange(0,100); ++ //测试接口 ++ slider->setTranslucent(true); ++ slider->setTickInterval(20); ++ slider->setFixedWidth(300); ++ slider->move(200,100); ++ ++ QLabel* label2 = new QLabel("KSwitchButton",this); ++ label2->setFixedWidth(150); ++ label2->move(50,200); ++ KSwitchButton* switchbutton = new KSwitchButton(mainWidget); ++ //测试接口 ++ switchbutton->setTranslucent(true); ++ switchbutton->move(200,200); ++ ++ QLabel* label3 = new QLabel("KSearchLineEdit",this); ++ label3->move(50,300); ++ KSearchLineEdit* lineEdit = new KSearchLineEdit(mainWidget); ++ lineEdit->move(200,300); ++ //测试接口 ++ lineEdit->setTranslucent(true); ++ ++ QLabel* label4 = new QLabel("KPressButton",this); ++ label4->move(50,400); ++ KPressButton* pressBtn1 = new KPressButton(this); ++ pressBtn1->setButtonType(KPressButton::CircleType); ++ pressBtn1->setFixedSize(40,40); ++ pressBtn1->setIcon(QIcon::fromTheme("ukui-alarm-symbolic")); ++ //测试接口 ++ pressBtn1->setTranslucent(true); ++ pressBtn1->move(200,400); ++ ++ KPressButton* pressBtn2 = new KPressButton(this); ++ pressBtn2->setFixedSize(40,40); ++ pressBtn2->setIcon(QIcon::fromTheme("ukui-alarm-symbolic")); ++ //测试接口 ++ pressBtn2->setTranslucent(true); ++ pressBtn2->move(250,400); ++ ++ QLabel* label5 = new QLabel("KPushButton",this); ++ label5->move(50,500); ++ ++ ++ KPushButton* pushbtn1 = new KPushButton(this); ++ pushbtn1->setButtonType(KPushButton::CircleType); ++ pushbtn1->setFixedSize(40,40); ++ pushbtn1->setIcon(QIcon::fromTheme("ukui-alarm-symbolic")); ++ pushbtn1->setTranslucent(true); ++ pushbtn1->move(200,500); ++ ++ KPushButton* pushbtn2 = new KPushButton(this); ++ pushbtn2->setFixedSize(40,40); ++ pushbtn2->setIcon(QIcon::fromTheme("ukui-alarm-symbolic")); ++ pushbtn2->setIconColor(QColor(255,0,0)); ++ //测试接口 ++ pushbtn2->setTranslucent(true); ++ pushbtn2->move(250,500); ++ ++ ++ mainLayout->addWidget(mainWidget); ++ mainLayout->setMargin(0); ++ setFixedSize(800,600); ++} ++ ++Widget::~Widget() ++{ ++} ++ ++bool Widget::eventFilter(QObject *watched, QEvent *event) ++{ ++ if(event->type() == QEvent::Paint) ++ { ++ auto widget = qobject_cast(watched); ++ if(widget) ++ { ++ widget->setAutoFillBackground(true); ++ ++ QPalette palette = this->palette(); ++ auto color = this->palette().color(QPalette::Window); ++ color.setAlphaF(0.39); ++ palette.setColor(QPalette::Window,color); ++ widget->setPalette(palette); ++ widget->setBackgroundRole(QPalette::Window); ++ } ++ } ++ return QObject::eventFilter(watched,event); ++} ++ +diff --git a/kysdk-qtwidgets/test/testTranslucent/widget.h b/kysdk-qtwidgets/test/testTranslucent/widget.h +new file mode 100644 +index 0000000..0729603 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testTranslucent/widget.h +@@ -0,0 +1,17 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++ ++#include ++ ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++ ++protected: ++ bool eventFilter(QObject *watched, QEvent *event); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testWidget/main.cpp b/kysdk-qtwidgets/test/testWidget/main.cpp +index acd64e0..8e5b1a1 100644 +--- a/kysdk-qtwidgets/test/testWidget/main.cpp ++++ b/kysdk-qtwidgets/test/testWidget/main.cpp +@@ -6,10 +6,12 @@ + #include "kwidget.h" + #include "kprogressdialog.h" + #include "kdialog.h" ++#include "kwidgetutils.h" + + using namespace kdk; + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); + QTranslator trans; + QString locale = QLocale::system().name(); +@@ -20,6 +22,13 @@ int main(int argc, char *argv[]) + a.installTranslator(&trans); + } + } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + TestWidget widget; + widget.setWidgetName("TestWidget"); + widget.setIcon("kylin-music"); +diff --git a/kysdk-qtwidgets/test/testWidget/testWidget.pro b/kysdk-qtwidgets/test/testWidget/testWidget.pro +index 7170f21..f474949 100644 +--- a/kysdk-qtwidgets/test/testWidget/testWidget.pro ++++ b/kysdk-qtwidgets/test/testWidget/testWidget.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testbadge/main.cpp b/kysdk-qtwidgets/test/testbadge/main.cpp +index b0a4ec2..5ef19b2 100644 +--- a/kysdk-qtwidgets/test/testbadge/main.cpp ++++ b/kysdk-qtwidgets/test/testbadge/main.cpp +@@ -1,10 +1,28 @@ + #include "widget.h" +- ++#include "kwidgetutils.h" + #include ++#include + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testbadge/testbadge.pro b/kysdk-qtwidgets/test/testbadge/testbadge.pro +index 9559e38..2313afe 100644 +--- a/kysdk-qtwidgets/test/testbadge/testbadge.pro ++++ b/kysdk-qtwidgets/test/testbadge/testbadge.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + + # The following define makes your compiler emit warnings if you use +diff --git a/kysdk-qtwidgets/test/testballontip/main.cpp b/kysdk-qtwidgets/test/testballontip/main.cpp +index b0a4ec2..5ef19b2 100644 +--- a/kysdk-qtwidgets/test/testballontip/main.cpp ++++ b/kysdk-qtwidgets/test/testballontip/main.cpp +@@ -1,10 +1,28 @@ + #include "widget.h" +- ++#include "kwidgetutils.h" + #include ++#include + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testballontip/testballontip.pro b/kysdk-qtwidgets/test/testballontip/testballontip.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testballontip/testballontip.pro ++++ b/kysdk-qtwidgets/test/testballontip/testballontip.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testbreadcrumb/main.cpp b/kysdk-qtwidgets/test/testbreadcrumb/main.cpp +index b0a4ec2..5ef19b2 100644 +--- a/kysdk-qtwidgets/test/testbreadcrumb/main.cpp ++++ b/kysdk-qtwidgets/test/testbreadcrumb/main.cpp +@@ -1,10 +1,28 @@ + #include "widget.h" +- ++#include "kwidgetutils.h" + #include ++#include + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testbreadcrumb/testbreadcrumb.pro b/kysdk-qtwidgets/test/testbreadcrumb/testbreadcrumb.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testbreadcrumb/testbreadcrumb.pro ++++ b/kysdk-qtwidgets/test/testbreadcrumb/testbreadcrumb.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testcolorbutton/main.cpp b/kysdk-qtwidgets/test/testcolorbutton/main.cpp +new file mode 100644 +index 0000000..b0a4ec2 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testcolorbutton/main.cpp +@@ -0,0 +1,11 @@ ++#include "widget.h" ++ ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testcolorbutton/testcolorbutton.pro b/kysdk-qtwidgets/test/testcolorbutton/testcolorbutton.pro +new file mode 100644 +index 0000000..cdead9a +--- /dev/null ++++ b/kysdk-qtwidgets/test/testcolorbutton/testcolorbutton.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-qtwidgets ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testcolorbutton/widget.cpp b/kysdk-qtwidgets/test/testcolorbutton/widget.cpp +new file mode 100644 +index 0000000..3782d0a +--- /dev/null ++++ b/kysdk-qtwidgets/test/testcolorbutton/widget.cpp +@@ -0,0 +1,106 @@ ++#include "widget.h" ++#include "kcolorbutton.h" ++#include ++#include ++#include ++ ++using namespace kdk; ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QVBoxLayout* vlayout = new QVBoxLayout(this); ++ ++ QHBoxLayout* hlayout = new QHBoxLayout(); ++ QHBoxLayout* hlayout1 = new QHBoxLayout(); ++ ++ KColorButton* btn1 = new KColorButton(); ++ KColorButton* btn2 = new KColorButton(); ++ btn2->setBackgroundColor(Qt::cyan); ++ KColorButton* btn3 = new KColorButton(); ++ btn3->setBackgroundColor(Qt::darkYellow); ++ KColorButton* btn4 = new KColorButton(); ++ btn4->setBackgroundColor(Qt::red); ++ KColorButton* btn5 = new KColorButton(); ++ btn5->setBackgroundColor(Qt::gray); ++ btn5->setButtonType(KColorButton::CheckedRect); ++ KColorButton* btn6 = new KColorButton(); ++ btn6->setBackgroundColor(Qt::green); ++ btn6->setButtonType(KColorButton::CheckedRect); ++ KColorButton* btn7 = new KColorButton(); ++ btn7->setBackgroundColor(Qt::darkCyan); ++ btn7->setButtonType(KColorButton::CheckedRect); ++ KColorButton* btn8 = new KColorButton(); ++ btn8->setBackgroundColor(Qt::darkRed); ++ btn8->setButtonType(KColorButton::CheckedRect); ++ ++ QButtonGroup* group = new QButtonGroup(this); ++ group->addButton(btn1); ++ group->addButton(btn2); ++ group->addButton(btn3); ++ group->addButton(btn4); ++ group->addButton(btn5); ++ group->addButton(btn6); ++ group->addButton(btn7); ++ group->addButton(btn8); ++ group->setExclusive(false); //方形按钮是否可以多选 false为可以多选 ++ ++ //方形第一行 ++ hlayout->addStretch(); ++ hlayout->setSpacing(10); ++ hlayout->addWidget(btn1); ++ hlayout->addWidget(btn2); ++ hlayout->addWidget(btn3); ++ hlayout->addWidget(btn4); ++ hlayout->addStretch(); ++ ++ //方形第二行 ++ hlayout1->addStretch(); ++ hlayout1->setSpacing(10); ++ hlayout1->addWidget(btn5); ++ hlayout1->addWidget(btn6); ++ hlayout1->addWidget(btn7); ++ hlayout1->addWidget(btn8); ++ hlayout1->addStretch(); ++ ++ //圆形 ++ KColorButton* btn9 = new KColorButton(); ++ btn9->setBackgroundColor(Qt::gray); ++ btn9->setButtonType(KColorButton::Circle); ++ KColorButton* btn10 = new KColorButton(); ++ btn10->setBackgroundColor(Qt::green); ++ btn10->setButtonType(KColorButton::Circle); ++ KColorButton* btn11 = new KColorButton(); ++ btn11->setBackgroundColor(Qt::darkCyan); ++ btn11->setButtonType(KColorButton::Circle); ++ KColorButton* btn12 = new KColorButton(); ++ btn12->setBackgroundColor(Qt::darkRed); ++ btn12->setButtonType(KColorButton::Circle); ++ ++ QButtonGroup* group1 = new QButtonGroup(this); ++ group1->addButton(btn9); ++ group1->addButton(btn10); ++ group1->addButton(btn11); ++ group1->addButton(btn12); ++ group1->setExclusive(false); //圆形形按钮是否可以多选 false为可以多选 ++ ++ QHBoxLayout* hlayout2 = new QHBoxLayout(); ++ hlayout2->addStretch(); ++ hlayout2->addWidget(btn9); ++ hlayout2->addWidget(btn10); ++ hlayout2->addWidget(btn11); ++ hlayout2->addWidget(btn12); ++ hlayout2->addStretch(); ++ ++ vlayout->addLayout(hlayout); ++ vlayout->addLayout(hlayout1); ++ vlayout->addLayout(hlayout2); ++// vlayout->setSizeConstraint(QLayout::SizeConstraint::SetFixedSize); ++ this->setFixedSize(300,240); ++ ++} ++ ++Widget::~Widget() ++{ ++} ++ +diff --git a/kysdk-qtwidgets/test/testcolorbutton/widget.h b/kysdk-qtwidgets/test/testcolorbutton/widget.h +new file mode 100644 +index 0000000..167311d +--- /dev/null ++++ b/kysdk-qtwidgets/test/testcolorbutton/widget.h +@@ -0,0 +1,14 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++#include "kwidget.h" ++#include ++using namespace kdk; ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testinputdialog/main.cpp b/kysdk-qtwidgets/test/testinputdialog/main.cpp +index 57c360b..41d0d86 100644 +--- a/kysdk-qtwidgets/test/testinputdialog/main.cpp ++++ b/kysdk-qtwidgets/test/testinputdialog/main.cpp +@@ -2,9 +2,11 @@ + + #include + #include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); + Widget w; + QTranslator trans; +@@ -16,6 +18,13 @@ int main(int argc, char *argv[]) + a.installTranslator(&trans); + } + } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + w.show(); + return a.exec(); + } +diff --git a/kysdk-qtwidgets/test/testinputdialog/testinputdialog.pro b/kysdk-qtwidgets/test/testinputdialog/testinputdialog.pro +index 41a4d79..4222e17 100644 +--- a/kysdk-qtwidgets/test/testinputdialog/testinputdialog.pro ++++ b/kysdk-qtwidgets/test/testinputdialog/testinputdialog.pro +@@ -3,7 +3,7 @@ QT += core gui + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + CONFIG += c++11 + +diff --git a/kysdk-qtwidgets/test/testkbackground/main.cpp b/kysdk-qtwidgets/test/testkbackground/main.cpp +new file mode 100644 +index 0000000..b0a4ec2 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkbackground/main.cpp +@@ -0,0 +1,11 @@ ++#include "widget.h" ++ ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testkbackground/testkbackground.pro b/kysdk-qtwidgets/test/testkbackground/testkbackground.pro +new file mode 100644 +index 0000000..d37043d +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkbackground/testkbackground.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++ ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-qtwidgets ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testkbackground/widget.cpp b/kysdk-qtwidgets/test/testkbackground/widget.cpp +new file mode 100644 +index 0000000..56d67e6 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkbackground/widget.cpp +@@ -0,0 +1,172 @@ ++#include "widget.h" ++#include ++#include "kbackgroundgroup.h" ++#include ++#include "klineframe.h" ++#include "kpushbutton.h" ++#include ++#include ++#include "kswitchbutton.h" ++#include "kborderlessbutton.h" ++#include "ktoolbutton.h" ++#include ++ ++using namespace kdk; ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QVBoxLayout* vmainLayout=new QVBoxLayout(this); ++ ++ QLabel *networkLabel = new QLabel(); ++ networkLabel->setText("有线网络"); ++ networkLabel->setContentsMargins(20,0,0,0); ++ ++ QWidget *widget1 = new QWidget(); ++ ++ QLabel* widget1Label = new QLabel(); ++ widget1Label->setText("开启"); ++ ++ KSwitchButton *widget1Switch = new KSwitchButton(); ++ ++ QHBoxLayout* widget1Layout = new QHBoxLayout(widget1); ++ widget1Layout->setContentsMargins(16,0,16,0); ++ widget1Layout->addWidget(widget1Label); ++ widget1Layout->addStretch(); ++ widget1Layout->addWidget(widget1Switch); ++ ++ KBackgroundGroup *back = new KBackgroundGroup(); ++ back->addWidget(widget1); ++ ++ QWidget *widget2 = new QWidget(); ++// widget2->setFixedHeight(100); ++ ++ QLabel *widget2label = new QLabel(); ++ widget2label->setText("网卡:wwwwwww"); ++ ++ KBorderlessButton *less = new KBorderlessButton(); ++ less->setIcon(QIcon::fromTheme("system-computer-symbolic")); ++ less->setAttribute(Qt::WA_TranslucentBackground); ++ ++ KSwitchButton *widget2Switch = new KSwitchButton(); ++ widget2Switch->setAttribute(Qt::WA_TranslucentBackground); ++ ++ QHBoxLayout *widget2Layout = new QHBoxLayout(widget2); ++ widget2Layout->setContentsMargins(16,0,16,0); ++ widget2Layout->addWidget(widget2label); ++ widget2Layout->addStretch(); ++ widget2Layout->addWidget(less); ++ widget2Layout->addWidget(widget2Switch); ++ ++ QWidget *widget3 = new QWidget(); ++// QPushButton *widget3 = new QPushButton(); ++ widget3->setProperty("isWindowButton",0x01); ++ ++ QLabel *widget3Label1 = new QLabel(); ++ widget3Label1->setPixmap(QIcon::fromTheme("system-computer-symbolic").pixmap(16,16)); ++ QLabel *widget3Label2 = new QLabel(); ++ widget3Label2->setText("网络名称"); ++ ++ QLabel *widget3Label3 = new QLabel(); ++ widget3Label3->setText("连接"); ++ ++ KBorderlessButton *widget3btn = new KBorderlessButton(this); ++ widget3btn->setIcon(QIcon::fromTheme("stock-people-symbolic")); ++ widget3btn->setAttribute(Qt::WA_TranslucentBackground); ++ ++ QHBoxLayout *widget3Layout= new QHBoxLayout(widget3); ++ widget3Layout->setContentsMargins(16,0,16,0); ++ widget3Layout->addWidget(widget3Label1); ++ widget3Layout->addWidget(widget3Label2); ++ widget3Layout->addStretch(); ++ widget3Layout->addWidget(widget3Label3); ++ widget3Layout->addWidget(widget3btn); ++ ++ QWidget *widget4=new QWidget(); ++ ++ QLabel *widget4Label1 = new QLabel(); ++ widget4Label1->setText("点击添加"); ++ ++ QLabel *widget4Label2 = new QLabel(); ++ widget4Label2->setPixmap(QIcon::fromTheme("system-computer-symbolic").pixmap(16,16)); ++ ++ QHBoxLayout *widget4Layout = new QHBoxLayout(widget4); ++ widget4Layout->addStretch(); ++ widget4Layout->addWidget(widget4Label2); ++ widget4Layout->addWidget(widget4Label1); ++ widget4Layout->addStretch(); ++ ++ QList list; ++ list.append(widget2); ++ list.append(widget3); ++ list.append(widget4); ++ ++ KBackgroundGroup *back1 = new KBackgroundGroup(); ++ back1->addWidgetList(list); ++ back1->setStateEnable(widget3,true); ++ back1->setStateEnable(widget4,true); ++ ++ ++ QWidget *widget5 = new QWidget(); ++ widget5->hide(); ++ ++ QWidget *widget6 =new QWidget(); ++ widget6->setWindowIcon(QIcon::fromTheme("kylin-music")); ++ widget6->hide(); ++ ++ connect(widget1Switch,&KSwitchButton::clicked,this,[=](){ ++ if(back1->isVisible()) ++ back1->hide(); ++ else ++ back1->show(); ++ }); ++ ++ //插入删除 ++ connect(widget2Switch,&KSwitchButton::clicked,this,[=](){ ++ if(back1->widgetList().contains(widget3)) ++ back1->removeWidget(widget3); ++ else ++ back1->insertWidgetAt(back1->widgetList().count()-1,widget3); ++ back1->setStateEnable(widget3,true); ++ }); ++ ++ connect(less,&KBorderlessButton::clicked,this,[=](){ ++ if(back1->widgetList().contains(widget3)) ++ back1->removeWidget(widget3); ++ else ++ back1->insertWidgetAt(back1->widgetList().count()-1,widget3); ++ back1->setStateEnable(widget3,true); ++ }); ++ ++ connect(back1,&KBackgroundGroup::clicked,this,[=](QWidget* widget){ ++ if(widget == widget3 ) ++ { ++ if(widget3Label3->isVisible()) ++ widget3Label3->hide(); ++ else ++ widget3Label3->show(); ++ } ++ if(widget == widget4 ) ++ { ++ if(widget6->isVisible()) ++ widget6->hide(); ++ else ++ widget6->show(); ++ } ++ }); ++ ++ connect(widget3btn,&KBorderlessButton::clicked,this,[=](){ ++ if(widget5->isVisible()) ++ widget5->hide(); ++ else ++ widget5->show(); ++ }); ++ vmainLayout->addWidget(networkLabel); ++ vmainLayout->addWidget(back); ++ vmainLayout->addWidget(back1); ++ vmainLayout->addStretch(); ++} ++ ++Widget::~Widget() ++{ ++} ++ +diff --git a/kysdk-qtwidgets/test/testkbackground/widget.h b/kysdk-qtwidgets/test/testkbackground/widget.h +new file mode 100644 +index 0000000..60542d7 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkbackground/widget.h +@@ -0,0 +1,16 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++ ++#include ++#include "kwidget.h" ++using namespace kdk; ++ ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testkcolorcombobox/main.cpp b/kysdk-qtwidgets/test/testkcolorcombobox/main.cpp +new file mode 100644 +index 0000000..b0a4ec2 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkcolorcombobox/main.cpp +@@ -0,0 +1,11 @@ ++#include "widget.h" ++ ++#include ++ ++int main(int argc, char *argv[]) ++{ ++ QApplication a(argc, argv); ++ Widget w; ++ w.show(); ++ return a.exec(); ++} +diff --git a/kysdk-qtwidgets/test/testkcolorcombobox/testkcolorcombobox.pro b/kysdk-qtwidgets/test/testkcolorcombobox/testkcolorcombobox.pro +new file mode 100644 +index 0000000..969b81d +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkcolorcombobox/testkcolorcombobox.pro +@@ -0,0 +1,31 @@ ++QT += core gui ++ ++greaterThan(QT_MAJOR_VERSION, 4): QT += widgets ++ ++CONFIG += c++11 ++CONFIG += link_pkgconfig ++PKGCONFIG += kysdk-qtwidgets ++ ++ ++# The following define makes your compiler emit warnings if you use ++# 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 ++ ++# 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 += \ ++ main.cpp \ ++ widget.cpp ++ ++HEADERS += \ ++ widget.h ++ ++# Default rules for deployment. ++qnx: target.path = /tmp/$${TARGET}/bin ++else: unix:!android: target.path = /opt/$${TARGET}/bin ++!isEmpty(target.path): INSTALLS += target +diff --git a/kysdk-qtwidgets/test/testkcolorcombobox/widget.cpp b/kysdk-qtwidgets/test/testkcolorcombobox/widget.cpp +new file mode 100644 +index 0000000..e3359fa +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkcolorcombobox/widget.cpp +@@ -0,0 +1,57 @@ ++#include "widget.h" ++#include ++#include ++#include ++#include "kcolorcombobox.h" ++#include ++using namespace kdk; ++ ++Widget::Widget(QWidget *parent) ++ : QWidget(parent) ++{ ++ QHBoxLayout *hLayout = new QHBoxLayout(this); ++ KColorComboBox *comboBoxCircle = new KColorComboBox(this); ++ comboBoxCircle->setComboType(KColorComboBox::Circle); ++ connect(comboBoxCircle,&KColorComboBox::currentColorChanged,this,[=](){ ++ qDebug()<<"currentColorChanged"; ++ }); ++ connect(comboBoxCircle,&KColorComboBox::activated,this,[=](){ ++ qDebug()<<"activatedChanged"; ++ }); ++ connect(comboBoxCircle,&KColorComboBox::highlighted,this,[=](){ ++ qDebug()<<"highlightChanged"; ++ }); ++ hLayout->addWidget(comboBoxCircle); ++ comboBoxCircle->setFixedSize(36,36); ++ KColorComboBox *comboBoxRect = new KColorComboBox(this); ++ connect(comboBoxRect,&KColorComboBox::currentColorChanged,this,[=](){ ++ qDebug()<<"currentColorChanged"; ++ }); ++ connect(comboBoxRect,&KColorComboBox::activated,this,[=](){ ++ qDebug()<<"activatedChanged"; ++ }); ++ connect(comboBoxRect,&KColorComboBox::highlighted,this,[=](){ ++ qDebug()<<"highlightChanged"; ++ }); ++ comboBoxRect->setComboType(KColorComboBox::RoundedRect); ++ hLayout->addWidget(comboBoxRect); ++ comboBoxRect->setFixedSize(36,36); ++ ++// 1.列表插入 ++ QList list; ++ list.append(QColor(255,0,0)); ++ list.append(QColor(0,255,0)); ++ list.append(QColor(255,255,0)); ++ comboBoxCircle->setColorList(list); ++// 2.逐个插入 ++ comboBoxRect->addColor(QColor(255,0,0)); ++ comboBoxRect->addColor(QColor(0,255,0)); ++ comboBoxRect->addColor(QColor(255,255,0)); ++ setGeometry(400,400,400,400); ++ comboBoxCircle->setCurrentIndex(1); ++} ++ ++Widget::~Widget() ++{ ++} ++ +diff --git a/kysdk-qtwidgets/test/testkcolorcombobox/widget.h b/kysdk-qtwidgets/test/testkcolorcombobox/widget.h +new file mode 100644 +index 0000000..47b6270 +--- /dev/null ++++ b/kysdk-qtwidgets/test/testkcolorcombobox/widget.h +@@ -0,0 +1,14 @@ ++#ifndef WIDGET_H ++#define WIDGET_H ++ ++#include ++ ++class Widget : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ Widget(QWidget *parent = nullptr); ++ ~Widget(); ++}; ++#endif // WIDGET_H +diff --git a/kysdk-qtwidgets/test/testkpressbutton/main.cpp b/kysdk-qtwidgets/test/testkpressbutton/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testkpressbutton/main.cpp ++++ b/kysdk-qtwidgets/test/testkpressbutton/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testkpressbutton/testkpressbutton.pro b/kysdk-qtwidgets/test/testkpressbutton/testkpressbutton.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testkpressbutton/testkpressbutton.pro ++++ b/kysdk-qtwidgets/test/testkpressbutton/testkpressbutton.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testnavigationbar/main.cpp b/kysdk-qtwidgets/test/testnavigationbar/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testnavigationbar/main.cpp ++++ b/kysdk-qtwidgets/test/testnavigationbar/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testnavigationbar/testnavigationbar.pro b/kysdk-qtwidgets/test/testnavigationbar/testnavigationbar.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testnavigationbar/testnavigationbar.pro ++++ b/kysdk-qtwidgets/test/testnavigationbar/testnavigationbar.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/test/testpasswordedit/main.cpp b/kysdk-qtwidgets/test/testpasswordedit/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testpasswordedit/main.cpp ++++ b/kysdk-qtwidgets/test/testpasswordedit/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testpasswordedit/testpasswordedit.pro b/kysdk-qtwidgets/test/testpasswordedit/testpasswordedit.pro +index a93f398..6c73866 100644 +--- a/kysdk-qtwidgets/test/testpasswordedit/testpasswordedit.pro ++++ b/kysdk-qtwidgets/test/testpasswordedit/testpasswordedit.pro +@@ -4,7 +4,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + CONFIG += c++11 + +diff --git a/kysdk-qtwidgets/test/testprogressbar/main.cpp b/kysdk-qtwidgets/test/testprogressbar/main.cpp +index b0a4ec2..e20d7f9 100644 +--- a/kysdk-qtwidgets/test/testprogressbar/main.cpp ++++ b/kysdk-qtwidgets/test/testprogressbar/main.cpp +@@ -1,10 +1,27 @@ + #include "widget.h" + + #include ++#include + + int main(int argc, char *argv[]) + { + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testprogressbar/testprogressbar.pro b/kysdk-qtwidgets/test/testprogressbar/testprogressbar.pro +index f68ecbb..bbd3ac9 100644 +--- a/kysdk-qtwidgets/test/testprogressbar/testprogressbar.pro ++++ b/kysdk-qtwidgets/test/testprogressbar/testprogressbar.pro +@@ -3,7 +3,7 @@ QT += core gui + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + + CONFIG += c++11 +diff --git a/kysdk-qtwidgets/test/testprogressdialog/main.cpp b/kysdk-qtwidgets/test/testprogressdialog/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testprogressdialog/main.cpp ++++ b/kysdk-qtwidgets/test/testprogressdialog/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testprogressdialog/testprogressdialog.pro b/kysdk-qtwidgets/test/testprogressdialog/testprogressdialog.pro +index 41a4d79..4222e17 100644 +--- a/kysdk-qtwidgets/test/testprogressdialog/testprogressdialog.pro ++++ b/kysdk-qtwidgets/test/testprogressdialog/testprogressdialog.pro +@@ -3,7 +3,7 @@ QT += core gui + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + CONFIG += c++11 + +diff --git a/kysdk-qtwidgets/test/testsearchlinedit/main.cpp b/kysdk-qtwidgets/test/testsearchlinedit/main.cpp +index 1af2e22..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testsearchlinedit/main.cpp ++++ b/kysdk-qtwidgets/test/testsearchlinedit/main.cpp +@@ -2,9 +2,11 @@ + + #include + #include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); + QTranslator trans; + QString locale = QLocale::system().name(); +@@ -15,6 +17,13 @@ int main(int argc, char *argv[]) + a.installTranslator(&trans); + } + } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testsearchlinedit/testsearchlinedit.pro b/kysdk-qtwidgets/test/testsearchlinedit/testsearchlinedit.pro +index 843c8ef..2c035b6 100644 +--- a/kysdk-qtwidgets/test/testsearchlinedit/testsearchlinedit.pro ++++ b/kysdk-qtwidgets/test/testsearchlinedit/testsearchlinedit.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + + +diff --git a/kysdk-qtwidgets/test/testsecuritylevelbar/main.cpp b/kysdk-qtwidgets/test/testsecuritylevelbar/main.cpp +index 1af2e22..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testsecuritylevelbar/main.cpp ++++ b/kysdk-qtwidgets/test/testsecuritylevelbar/main.cpp +@@ -2,9 +2,11 @@ + + #include + #include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); + QTranslator trans; + QString locale = QLocale::system().name(); +@@ -15,6 +17,13 @@ int main(int argc, char *argv[]) + a.installTranslator(&trans); + } + } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testsecuritylevelbar/testsecuritylevelbar.pro b/kysdk-qtwidgets/test/testsecuritylevelbar/testsecuritylevelbar.pro +index 41a4d79..4222e17 100644 +--- a/kysdk-qtwidgets/test/testsecuritylevelbar/testsecuritylevelbar.pro ++++ b/kysdk-qtwidgets/test/testsecuritylevelbar/testsecuritylevelbar.pro +@@ -3,7 +3,7 @@ QT += core gui + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + CONFIG += c++11 + +diff --git a/kysdk-qtwidgets/test/testslider/main.cpp b/kysdk-qtwidgets/test/testslider/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testslider/main.cpp ++++ b/kysdk-qtwidgets/test/testslider/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testslider/testslider.pro b/kysdk-qtwidgets/test/testslider/testslider.pro +index 41a4d79..4222e17 100644 +--- a/kysdk-qtwidgets/test/testslider/testslider.pro ++++ b/kysdk-qtwidgets/test/testslider/testslider.pro +@@ -3,7 +3,7 @@ QT += core gui + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + CONFIG += c++11 + +diff --git a/kysdk-qtwidgets/test/testtabbar/main.cpp b/kysdk-qtwidgets/test/testtabbar/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testtabbar/main.cpp ++++ b/kysdk-qtwidgets/test/testtabbar/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testtabbar/testtabbar.pro b/kysdk-qtwidgets/test/testtabbar/testtabbar.pro +index 9559e38..2313afe 100644 +--- a/kysdk-qtwidgets/test/testtabbar/testtabbar.pro ++++ b/kysdk-qtwidgets/test/testtabbar/testtabbar.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + + # The following define makes your compiler emit warnings if you use +diff --git a/kysdk-qtwidgets/test/testtoolbutton/main.cpp b/kysdk-qtwidgets/test/testtoolbutton/main.cpp +index b0a4ec2..136b8eb 100644 +--- a/kysdk-qtwidgets/test/testtoolbutton/main.cpp ++++ b/kysdk-qtwidgets/test/testtoolbutton/main.cpp +@@ -1,10 +1,29 @@ + #include "widget.h" + + #include ++#include ++#include "kwidgetutils.h" + + int main(int argc, char *argv[]) + { ++ kdk::KWidgetUtils::highDpiScaling(); + QApplication a(argc, argv); ++ QTranslator trans; ++ QString locale = QLocale::system().name(); ++ if(locale == "zh_CN") ++ { ++ if(trans.load(":/translations/gui_zh_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } ++ if(locale == "bo_CN") ++ { ++ if(trans.load(":/translations/gui_bo_CN.qm")) ++ { ++ a.installTranslator(&trans); ++ } ++ } + Widget w; + w.show(); + return a.exec(); +diff --git a/kysdk-qtwidgets/test/testtoolbutton/testtoolbutton.pro b/kysdk-qtwidgets/test/testtoolbutton/testtoolbutton.pro +index d37043d..b7027d7 100644 +--- a/kysdk-qtwidgets/test/testtoolbutton/testtoolbutton.pro ++++ b/kysdk-qtwidgets/test/testtoolbutton/testtoolbutton.pro +@@ -5,7 +5,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + CONFIG += c++11 + + CONFIG += link_pkgconfig +-PKGCONFIG += kysdk-qtwidgets ++PKGCONFIG += kysdk-qtwidgets kysdk-widgetutils + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-qtwidgets/translations/gui_bo_CN.qm b/kysdk-qtwidgets/translations/gui_bo_CN.qm +index 5961308..d870988 100644 +--- a/kysdk-qtwidgets/translations/gui_bo_CN.qm ++++ b/kysdk-qtwidgets/translations/gui_bo_CN.qm +@@ -1,8 +1,7 @@ +- + kdk::KAboutDialog + +- ++ + No mail applicaiton accessible in your system. + ཁྱེད་རང་གི་མ་ལག་ལ་སྦྲག་རྫས་ཉེར་སྤྱོད་གོ་རིམ་གང་ཡང་སྒྲིག་སྦྱོར་བྱས་མེད་། + + +- ++ + Unable to open mail application + སྦྲག་རྫས་ཉེར་སྤྱོད་བྱ་རིམ་ཁ་ཕྱེ་མི་ཐུབ་། + + +- +- ++ ++ + Service & Support: + ཞབས་ཞུ་དང་རྒྱབ་སྐྱོར་ཚོགས་པ་ + + +- +- ++ ++ + Privacy statement + 《གསང་བའི་གསལ་བསྒྲགས། 》 + +@@ -29,7 +29,7 @@ + + kdk::KInputDialog + +- ++ + Enter a value: + ཁྱོད་ཀྱིས་གྲངས་ཀ་ནང་འཇུག་གནང་རོགས། + +@@ -37,12 +37,12 @@ + + kdk::KInputDialogPrivate + +- ++ + ok + དངོས་སུ་ཁས་ལེན་པ། + + +- ++ + cancel + མེད་པར་བཟོ་དགོས། + +@@ -50,47 +50,51 @@ + + kdk::KMenuButton + +- + more +- དེ་བས་ཀྱང་མང་ ++ དེ་བས་ཀྱང་མང་ + + + ++ option ++ འདེམས་ཚན་ ++ ++ ++ + Setting + བཀོད་སྒྲིག་བཅས་བྱ་དགོས། + + +- ++ + Theme + ཕྱི་ཚུལ། + + +- ++ + Assist + རོགས་རམ་བྱེད་དགོས། + + +- ++ + About + དེའི་སྐོར། + + +- ++ + Quit + ཕྱིར་འཐེན་བྱ་དགོས། + + +- ++ + Auto + མ་ལག་གི་རྗེས་སུ་འབྲང་བ + + +- ++ + Light + མདོག་སྨུག་པོ། + + +- ++ + Dark + ཚོས་གཞི་ཟབ་པ། + +@@ -98,7 +102,7 @@ + + kdk::KProgressDialog + +- ++ + cancel + མེད་པར་བཟོ་དགོས། + +@@ -106,12 +110,12 @@ + + kdk::KSearchLineEditPrivate + +- ++ + search + འཚོལ་ཞིབ་བྱེད་པ། + + +- ++ + Search + འཚོལ་ཞིབ་བྱེད་པ། + +@@ -177,22 +181,22 @@ + + kdk::KWindowButtonBarPrivate + +- ++ + minimize + ཆེས་ཆུང་བ་ཡིན། + + +- ++ + maximize + ཆེས་ཆེ་བ་བཅས་སུ་འགྱུར་བར་ + + +- ++ + restore + སླར་གསོ་བྱེད་དགོས། + + +- ++ + close + སྒོ་རྒྱག་པ། + +diff --git a/kysdk-qtwidgets/translations/gui_zh_CN.qm b/kysdk-qtwidgets/translations/gui_zh_CN.qm +index e33838e..df95b6e 100644 +--- a/kysdk-qtwidgets/translations/gui_zh_CN.qm ++++ b/kysdk-qtwidgets/translations/gui_zh_CN.qm +@@ -1,4 +1,4 @@ +- + kdk::KAboutDialog + +- ++ + No mail applicaiton accessible in your system. + 您的系统未安装任何电子邮件应用 + + +- ++ + Unable to open mail application + 无法打开邮件客户端 + + +- +- ++ ++ + Service & Support: + 服务与支持团队: + 服务与支持团队: + + +- +- ++ ++ + Privacy statement + 《隐私声明》 + +@@ -58,7 +58,7 @@ + + kdk::KInputDialog + +- ++ + Enter a value: + 请输入数值: + +@@ -66,12 +66,12 @@ + + kdk::KInputDialogPrivate + +- ++ + ok + 确认 + + +- ++ + cancel + 取消 + +@@ -79,48 +79,52 @@ + + kdk::KMenuButton + +- + more +- 更多 ++ 更多 + + + ++ option ++ 选项 ++ ++ ++ + Setting + 设置 + 设置 + + +- ++ + Theme + 外观 + + +- ++ + Assist + 帮助 + + +- ++ + About + 关于 + + +- ++ + Quit + 退出 + + +- ++ + Auto + 跟随系统 + + +- ++ + Light + 浅色 + + +- ++ + Dark + 深色 + +@@ -128,7 +132,7 @@ + + kdk::KProgressDialog + +- ++ + cancel + 取消 + +@@ -153,12 +157,12 @@ + + kdk::KSearchLineEditPrivate + +- ++ + search + 搜索 + + +- ++ + Search + 搜索 + +@@ -256,22 +260,22 @@ + + kdk::KWindowButtonBarPrivate + +- ++ + minimize + 最小化 + + +- ++ + maximize + 最大化 + + +- ++ + restore + 还原 + + +- ++ + close + 关闭 + +diff --git a/kysdk-waylandhelper/src/ukuistylehelper/ukui-decoration-manager.cpp b/kysdk-waylandhelper/src/ukuistylehelper/ukui-decoration-manager.cpp +index f5ef2b5..38b8769 100644 +--- a/kysdk-waylandhelper/src/ukuistylehelper/ukui-decoration-manager.cpp ++++ b/kysdk-waylandhelper/src/ukuistylehelper/ukui-decoration-manager.cpp +@@ -64,8 +64,8 @@ bool UKUIDecorationManager::removeHeaderBar(QWindow *windowHandle) + auto nativeInterface = qApp->platformNativeInterface(); + + if(!windowHandle) +- return false; +- ++ return false; ++ + wl_surface *surface = reinterpret_cast(nativeInterface->nativeResourceForWindow(QByteArrayLiteral("surface"), windowHandle)); + if (!surface) + return false; +diff --git a/kysdk-waylandhelper/src/ukuistylehelper/ukuistylehelper.cpp b/kysdk-waylandhelper/src/ukuistylehelper/ukuistylehelper.cpp +index 9cd055b..89f3f3e 100644 +--- a/kysdk-waylandhelper/src/ukuistylehelper/ukuistylehelper.cpp ++++ b/kysdk-waylandhelper/src/ukuistylehelper/ukuistylehelper.cpp +@@ -4,8 +4,8 @@ + #include "xatom-helper.h" + #include + #include +-#include + #include ++ + namespace kdk { + + static UkuiStyleHelper *global_instance = nullptr; +diff --git a/kysdk-widgetutils/kysdk-widgetutils.pro b/kysdk-widgetutils/kysdk-widgetutils.pro +index 7aaad6c..52cbd2d 100644 +--- a/kysdk-widgetutils/kysdk-widgetutils.pro ++++ b/kysdk-widgetutils/kysdk-widgetutils.pro +@@ -1,9 +1,10 @@ +-QT += widgets gui ++QT += widgets gui dbus + + TEMPLATE = lib + DEFINES += KYSDKWIDGETUTILS_LIBRARY + +-CONFIG += c++11 ++CONFIG += c++11 link_pkgconfig ++PKGCONFIG += gsettings-qt + + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings +diff --git a/kysdk-widgetutils/src/kwidgetutils.cpp b/kysdk-widgetutils/src/kwidgetutils.cpp +index 9f6cce8..4343a4b 100644 +--- a/kysdk-widgetutils/src/kwidgetutils.cpp ++++ b/kysdk-widgetutils/src/kwidgetutils.cpp +@@ -2,7 +2,14 @@ + #include + #include + #include ++#include ++#include ++#include ++#include + ++#define KWIN_SERVICE "org.ukui.KWin" ++#define KWIN_PATH "/Compositor" ++#define KWIN_INTERFACE "org.ukui.kwin.Compositing" + using namespace kdk; + + KWidgetUtils::KWidgetUtils() +@@ -22,3 +29,43 @@ void KWidgetUtils::highDpiScaling() + qDebug()<<"setHighDpiScaleFactorRoundingPolicy success"; + #endif + } ++ ++bool KWidgetUtils::checkCompositorRunning() ++{ ++ QDBusInterface dbus_iface (KWIN_SERVICE, KWIN_PATH, KWIN_INTERFACE, QDBusConnection::sessionBus()); ++ QVariant reply = dbus_iface.property ("active"); ++ bool isfoundCompositingManger = false; ++ if (reply.toBool()) { ++ isfoundCompositingManger = true; ++ } ++ ++ if(!isfoundCompositingManger) ++ { ++ if(QGSettings::isSchemaInstalled("org.gnome.metacity")) ++ { ++ QProcess process; ++ process.start("sh -c \"ps -e |grep metacity\""); ++ if(process.waitForStarted(100)&&process.waitForFinished(100) && process.readAllStandardOutput().contains("metacity")) ++ { ++ QGSettings metacityGSettings("org.gnome.metacity", "/org/gnome/metacity/"); ++ isfoundCompositingManger = metacityGSettings.get("compositing-manager").toBool(); ++ } ++ } ++ } ++ ++ if(!isfoundCompositingManger) ++ { ++ if(QGSettings::isSchemaInstalled("org.mate.Marco.general")) ++ { ++ QProcess process; ++ process.start("sh -c \"ps -e |grep marco\""); ++ if(process.waitForStarted(100)&&process.waitForFinished(100) && process.readAllStandardOutput().contains("marco")) ++ { ++ QGSettings marcoGSettings("org.mate.Marco.general", "/org/mate/marco/general/"); ++ isfoundCompositingManger = marcoGSettings.get("compositing-manager").toBool(); ++ } ++ } ++ } ++ ++ return isfoundCompositingManger; ++} +diff --git a/kysdk-widgetutils/src/kwidgetutils.h b/kysdk-widgetutils/src/kwidgetutils.h +index c3bdf43..646e282 100644 +--- a/kysdk-widgetutils/src/kwidgetutils.h ++++ b/kysdk-widgetutils/src/kwidgetutils.h +@@ -15,6 +15,17 @@ public: + * QApplication a(argc, argv); + */ + static void highDpiScaling(); ++ ++ ++ /** ++ * @brief 判断合成器是否开启 ++ * ++ * @param 无 ++ * ++ * @retval true 开启 ++ * @retval false 没开启 ++ */ ++ static bool checkCompositorRunning(void); + }; + } + +diff --git a/kysdk-widgetutils/test/testWidgetutils/testWidgetutils.pro b/kysdk-widgetutils/test/testWidgetutils/testWidgetutils.pro +index d6f84e6..e574409 100644 +--- a/kysdk-widgetutils/test/testWidgetutils/testWidgetutils.pro ++++ b/kysdk-widgetutils/test/testWidgetutils/testWidgetutils.pro +@@ -1,10 +1,13 @@ +-QT += core gui ++QT += core gui widgets + + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + + CONFIG += c++11 link_pkgconfig +-PKGCONFIG += kysdk-widgetutils ++PKGCONFIG += kysdk-widgetutils gsettings-qt + ++ ++CONFIG += c++11 link_pkgconfig ++PKGCONFIG += gsettings-qt + # The following define makes your compiler emit warnings if you use + # any Qt feature that has been marked deprecated (the exact warnings + # depend on your compiler). Please consult the documentation of the diff --git a/libkysdk-applications.spec b/libkysdk-applications.spec index a24c50c..6b7cfe0 100644 --- a/libkysdk-applications.spec +++ b/libkysdk-applications.spec @@ -1,12 +1,12 @@ Name: libkysdk-applications Version: 2.0.0.0 -Release: 1 +Release: 2 Summary: Kylin Software Development Kit - Applications Layer Kit License: GPL-2+ URL: http://www.ukui.org Source0: %{name}-%{version}.tar.xz Patch01: 0001-fix-compile-error-of-libkysdk-applications.patch - +Patch02: 0011-update-changelog.patch BuildRequires: freeimage-devel BuildRequires: giflib-devel BuildRequires: glib2-devel @@ -31,7 +31,7 @@ BuildRequires: qtchooser BuildRequires: qt5-qttools-devel BuildRequires: chrpath -Requires: libkysdk-alm libkysdk-kabase libkysdk-qtwidgets libkysdk-ukenv libkysdk-waylandhelper libkysdk-widgetutils +Requires: libkysdk-alm libkysdk-kabase libkysdk-qtwidgets libkysdk-ukenv libkysdk-waylandhelper libkysdk-widgetutils libkysdk-notification %description Kylin Software Development Kit - Applications Layer Kit @@ -46,7 +46,7 @@ To install ld.so.conf file. %package -n libkysdk-applications-devel Summary: libdevel -Requires: libkysdk-alm-devel libkysdk-kabase-devel libkysdk-qtwidgets-devel libkysdk-ukenv-devel libkysdk-waylandhelper-devel libkysdk-widgetutils-devel +Requires: libkysdk-alm-devel libkysdk-kabase-devel libkysdk-qtwidgets-devel libkysdk-ukenv-devel libkysdk-waylandhelper-devel libkysdk-widgetutils-devel libkysdk-notification-devel %description -n libkysdk-applications-devel libkysdk-applications development @@ -146,9 +146,26 @@ Requires: libkysdk-ukenv kysdk-ukenv head file +%package -n libkysdk-notification +Summary: kysdk-notification shared library +Requires: libkysdk-appcommon + +%description -n libkysdk-notification +%{summary}. + + +%package -n libkysdk-notification-devel +Summary: kysdk-notification head file +Requires: libkysdk-notification + +%description -n libkysdk-notification-devel +%{summary}. + + %prep %setup -q %patch01 -p1 +%patch02 -p1 %build mkdir build && cd build @@ -265,7 +282,23 @@ rm -rf $RPM_BUILD_ROOT %{_includedir}/kysdk/applications/gsettingmonitor.h %{_includedir}/kysdk/applications/usermanual.h +%files -n libkysdk-notification +%{_prefix}/lib/kysdk/applications/libkysdk-notification.so* + +%files -n libkysdk-notification-devel +%{_datadir}/pkgconfig/kysdk-notification.pc +%{_includedir}/kysdk/applications/kbackgroundgroup.h +%{_includedir}/kysdk/applications/kbuttonbox.h +%{_includedir}/kysdk/applications/kcolorbutton.h +%{_includedir}/kysdk/applications/kcolorcombobox.h +%{_includedir}/kysdk/applications/klineframe.h +%{_includedir}/kysdk/applications/kmessagebox.h +%{_includedir}/kysdk/applications/knotifier.h + %changelog +* Wed Apr 24 2024 peijiankang - 2.0.0.0-2 +- add 0011-update-changelog.patch + * Fri May 26 2023 peijiankang - 2.0.0.0-1 - update version to 2.0.0.0