From d2a26b7f65eb7f75f2216a3a0897a70d91113661 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Wed, 3 Feb 2021 17:35:55 +0800 Subject: [PATCH 01/31] =?UTF-8?q?Bug37940=20=E4=BD=BF=E7=94=A8IP=E8=BF=9E?= =?UTF-8?q?=E9=80=9A=E5=90=8E=E5=8F=AA=E6=98=BE=E7=A4=BAIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatwidget.cpp | 2 +- debian/changelog | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/chatwidget.cpp b/chatwidget.cpp index 168ccc7..4512aca 100644 --- a/chatwidget.cpp +++ b/chatwidget.cpp @@ -306,7 +306,7 @@ void ChatWidget::onSendCompleted(){ this->ui->le_ip->hide(); // this->ui->lb_name->setText("对方的 IP Mac"); this->ui->lb_name->setText(tr("Show Remote IP Addr")); - this->ui->lb_machine->setText(this->ip); + this->ui->lb_machine->setText(this->ip.split(" ")[0]); this->ui->lb_machine->show(); this->setWindowTitle(tr("Kylin Ipmsg") + this->ip); // this->setWindowTitle("麒麟传书" + this->ip); diff --git a/debian/changelog b/debian/changelog index 55ba272..8b8994a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +kylin-ipmsg (1.1.20kord1~rc4) v101; urgency=medium + + * 【麒麟传书】#Bug37940 : 使用IP时,显示两个IP地址且第二个显示不全. + + -- caoliang Wed, 03 Feb 2021 17:32:42 +0800 + kylin-ipmsg (1.1.20kord1~rc3) v101; urgency=medium * 【麒麟传书】#Bug36066 : 固定麒麟传书窗口大小,不响应全屏放大操作. From 1350c7013f36b80e73e2da907d5e31302784d417 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Wed, 24 Feb 2021 17:30:19 +0800 Subject: [PATCH 02/31] =?UTF-8?q?Fix=20Bug=2039210=20=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E8=BE=B9=E6=A1=86=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ chatwidget.cpp | 4 ++-- debian/changelog | 6 ++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e8f9be9..9a0a9f5 100755 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,9 @@ compile_commands.json # QtCreator local machine specific files for imported projects *creator.user* +#vscode +.vscode + # build build build-* diff --git a/chatwidget.cpp b/chatwidget.cpp index 4512aca..0bf8255 100644 --- a/chatwidget.cpp +++ b/chatwidget.cpp @@ -584,7 +584,7 @@ void ChatWidget::on_pb_sendfile_clicked(){ if(this->isIpExists() == false){ this->sendType = ChatWidget::Files; - fileToSend = QFileDialog::getOpenFileNames(this, tr("pls choose files to send")); + fileToSend = QFileDialog::getOpenFileNames(nullptr, tr("pls choose files to send")); // fileToSend = QFileDialog::getOpenFileNames(this, "请选择要发送的文件"); if (fileToSend.count() != 0) { @@ -610,7 +610,7 @@ void ChatWidget::on_pb_senddir_clicked(){ if(this->isIpExists() == false){ this->sendType = ChatWidget::Dir; - dirToSend = QFileDialog::getExistingDirectory(this, tr("pls choose dir to send"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); + dirToSend = QFileDialog::getExistingDirectory(nullptr, tr("pls choose dir to send"), ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); // dirToSend = QFileDialog::getExistingDirectory(this, "请选择要发送的文件夹", ".", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (dirToSend != "") { diff --git a/debian/changelog b/debian/changelog index 8b8994a..bd04274 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +kylin-ipmsg (1.1.20kord1~rc5) v101; urgency=medium + + * 【麒麟传书】#Bug39210 : 选择传输文件的模态窗口出现应用内主题颜色的边框. + + -- caoliang Wed, 24 Feb 2021 11:58:01 +0800 + kylin-ipmsg (1.1.20kord1~rc4) v101; urgency=medium * 【麒麟传书】#Bug37940 : 使用IP时,显示两个IP地址且第二个显示不全. From 31008295fd5bee2dbac5fd6cfb577e37a4c565d7 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Fri, 5 Mar 2021 10:11:04 +0800 Subject: [PATCH 03/31] =?UTF-8?q?Update:=20=E5=9C=A8pro=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E5=AF=B9=E7=94=A8=E6=88=B7=E6=89=8B=E5=86=8C=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=A4=84=E7=90=86=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debian/changelog | 6 ++++++ kylin-ipmsg.pro | 9 +++++++-- main.cpp | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index bd04274..b0883c3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +kylin-ipmsg (1.1.21kord1) v101; urgency=medium + + * 在pro文件中对用户手册进行处理,兼容V10 + + -- caoliang Thu, 04 Mar 2021 17:07:17 +0800 + kylin-ipmsg (1.1.20kord1~rc5) v101; urgency=medium * 【麒麟传书】#Bug39210 : 选择传输文件的模态窗口出现应用内主题颜色的边框. diff --git a/kylin-ipmsg.pro b/kylin-ipmsg.pro index 2ee03f3..b0d46c2 100644 --- a/kylin-ipmsg.pro +++ b/kylin-ipmsg.pro @@ -42,8 +42,13 @@ icon.path = /usr/share/pixmaps icon.files = kylin-ipmsg.png desktop.path = /usr/share/applications/ desktop.files = kylin-ipmsg.desktop -guide.path = /usr/share/kylin-user-guide/data/guide/ -guide.files = data/guide/kylin-ipmsg/ + +# V10Pro使用自定义用户手册 +greaterThan(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 9) { + # message("QT_VERSION ("$$QT_VERSION")") + guide.path = /usr/share/kylin-user-guide/data/guide/ + guide.files = data/guide/kylin-ipmsg/ +} INSTALLS += target \ icon \ diff --git a/main.cpp b/main.cpp index 8c2a7ca..14edaf9 100644 --- a/main.cpp +++ b/main.cpp @@ -51,7 +51,7 @@ int main(int argc, char *argv[]) /*lock file*/ QtSingleApplication app(id, argc, argv); - app.setApplicationVersion("1.1.20"); + app.setApplicationVersion("1.1.21"); // QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); From 5c642d332641fa65ea2eacb3638b08eed3011eb4 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Fri, 5 Mar 2021 10:12:45 +0800 Subject: [PATCH 04/31] Add build ignore --- debian/source/local-options | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100755 debian/source/local-options diff --git a/debian/source/local-options b/debian/source/local-options new file mode 100755 index 0000000..b7128a3 --- /dev/null +++ b/debian/source/local-options @@ -0,0 +1,6 @@ +tar-ignore = build +tar-ignore = build-* +tar-ignore = .vscode +tar-ignore = .git +tar-ignore = run +tar-ignore = *.md \ No newline at end of file From 2d0f615d96d317d990801222e59ad438890d1781 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Thu, 11 Mar 2021 10:09:28 +0800 Subject: [PATCH 05/31] =?UTF-8?q?Update:=20=E4=BF=AE=E5=A4=8Dbug=2040482?= =?UTF-8?q?=2041910?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/guide/kylin-ipmsg/zh_CN/index.md | 2 +- debian/changelog | 7 +++++++ duktowindow.cpp | 4 ++-- kylin-ipmsg.pro | 19 ++++++++++++------- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/data/guide/kylin-ipmsg/zh_CN/index.md b/data/guide/kylin-ipmsg/zh_CN/index.md index aefb1dd..bd84254 100644 --- a/data/guide/kylin-ipmsg/zh_CN/index.md +++ b/data/guide/kylin-ipmsg/zh_CN/index.md @@ -37,4 +37,4 @@ ### 最近和关于 在主界面有三个标签页,点击“最近”,则切换到最近交谈消息管理页面。点击列表记录中的某条记录,则弹出与该用户通信的消息对话框,并显示之前的交谈记录。 -点击“关于”,可查看关于麒麟传输信息。 +点击“关于”,可查看麒麟传书关于信息。 diff --git a/debian/changelog b/debian/changelog index b0883c3..0764b47 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +kylin-ipmsg (1.1.21kord2) v101; urgency=medium + + * 修复禅道bug#40482 : 【麒麟传书】打开后主界面会黑一下. + * 修复禅道bug#41910 : 【用户手册】【麒麟传书】只有麒麟传书图标,没有应用名,点进去显示undefined. + + -- caoliang Tue, 09 Mar 2021 14:01:08 +0800 + kylin-ipmsg (1.1.21kord1) v101; urgency=medium * 在pro文件中对用户手册进行处理,兼容V10 diff --git a/duktowindow.cpp b/duktowindow.cpp index f1c48ee..ac1877c 100644 --- a/duktowindow.cpp +++ b/duktowindow.cpp @@ -51,8 +51,8 @@ DuktoWindow::DuktoWindow(QWindow *parent) : setOrientation(QmlApplicationViewer::ScreenOrientationLockPortrait); // 固定窗口大小 - int fixedWidth = 330; - int fixedHeight = 600; + int fixedWidth = 335; + int fixedHeight = 605; setMaximumWidth(fixedWidth); setMinimumWidth(fixedWidth); setMaximumHeight(fixedHeight); diff --git a/kylin-ipmsg.pro b/kylin-ipmsg.pro index b0d46c2..6df290c 100644 --- a/kylin-ipmsg.pro +++ b/kylin-ipmsg.pro @@ -42,19 +42,24 @@ icon.path = /usr/share/pixmaps icon.files = kylin-ipmsg.png desktop.path = /usr/share/applications/ desktop.files = kylin-ipmsg.desktop - -# V10Pro使用自定义用户手册 -greaterThan(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 9) { - # message("QT_VERSION ("$$QT_VERSION")") - guide.path = /usr/share/kylin-user-guide/data/guide/ - guide.files = data/guide/kylin-ipmsg/ -} +guide.path = /usr/share/kylin-user-guide/data/guide/ +guide.files = data/guide/kylin-ipmsg/ INSTALLS += target \ icon \ desktop \ guide +# v10禁用窗管和自定义用户手册 +lessThan(QT_MAJOR_VERSION, 5) | lessThan(QT_MINOR_VERSION, 9) { + # message("QT_VERSION ("$$QT_VERSION")") + DEFINES += __V10__ + INSTALLS -= guide + # QT -= x11extras + # LIBS -= -lpthread + # LIBS -= -lX11 +} + SOURCES += main.cpp \ guibehind.cpp \ platform.cpp \ From 3ce7416d8ef0edf59a7a0631f09556836caa62c0 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Mon, 15 Mar 2021 11:39:58 +0800 Subject: [PATCH 06/31] =?UTF-8?q?Fix=20bug=2042491:=20=E8=A7=A3=E5=86=B3?= =?UTF-8?q?=E6=B7=B1=E8=89=B2=E6=A8=A1=E5=BC=8F=E4=B8=8B=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E6=A1=86=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BB=A5=E5=8F=8A=E7=94=A8=E6=88=B7=E6=89=8B=E5=86=8C?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatwidget.cpp | 8 ++++---- debian/changelog | 7 +++++++ debian/source/local-options | 4 +--- kylin-ipmsg.pro | 21 ++++++++++++++------- main.cpp | 12 ++++++++---- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/chatwidget.cpp b/chatwidget.cpp index 0bf8255..edc348b 100644 --- a/chatwidget.cpp +++ b/chatwidget.cpp @@ -228,9 +228,9 @@ void ChatWidget::firstStyle(){ void ChatWidget::showme(){ this->setStyleSheet("QDialog{border:2px solid " + this->theme->color3() + "; background-color: white;}"); this->ui->lb_title->setStyleSheet("QLabel{color: " + this->theme->color2() + ";font-size:24px;}"); - this->ui->le_ip->setStyleSheet("QLineEdit{color: " + this->theme->color4() + "; border: 1px solid " + this->theme->color3() + ";font-size:18px;}"); - this->ui->te_chatlog->setStyleSheet("QTextBrowser{border: " + this->theme->color3() + ";font-size:18px;}"); - this->ui->te_chat->setStyleSheet("QTextEdit{border: 1px solid " + this->theme->color3() + ";font-size:18px;}"); + this->ui->le_ip->setStyleSheet("QLineEdit{color: " + this->theme->color4() + "; border: 1px solid " + this->theme->color3() + ";font-size:18px;background-color: white;}"); + this->ui->te_chatlog->setStyleSheet("QTextBrowser{border: " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}"); + this->ui->te_chat->setStyleSheet("QTextEdit{border: 1px solid " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}"); this->ui->pb_sendmsg->setStyleSheet( "QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); this->ui->pb_sendfile->setStyleSheet("QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); this->ui->pb_senddir->setStyleSheet( "QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); @@ -256,7 +256,7 @@ void ChatWidget::showme(){ // coaliang this->ui->pb_addname->setStyleSheet("QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); - this->ui->le_nickname->setStyleSheet("QLineEdit{color: " + this->theme->color4() + "; border: 1px solid " + this->theme->color3() + ";font-size:18px;}"); + this->ui->le_nickname->setStyleSheet("QLineEdit{color: " + this->theme->color4() + "; border: 1px solid " + this->theme->color3() + ";font-size:18px;background-color: white;}"); this->ui->pb_checkname->setStyleSheet("QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); // this->show(); diff --git a/debian/changelog b/debian/changelog index 0764b47..1b694cb 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +kylin-ipmsg (1.1.21kord3) v101; urgency=medium + + * 修复禅道bug#42491 : 【麒麟传书】夜间模式下麒麟传书的窗口显示异常. + * 适配分数缩放. + + -- caoliang Mon, 15 Mar 2021 09:46:15 +0800 + kylin-ipmsg (1.1.21kord2) v101; urgency=medium * 修复禅道bug#40482 : 【麒麟传书】打开后主界面会黑一下. diff --git a/debian/source/local-options b/debian/source/local-options index b7128a3..7751078 100755 --- a/debian/source/local-options +++ b/debian/source/local-options @@ -1,6 +1,4 @@ tar-ignore = build tar-ignore = build-* tar-ignore = .vscode -tar-ignore = .git -tar-ignore = run -tar-ignore = *.md \ No newline at end of file +tar-ignore = .git \ No newline at end of file diff --git a/kylin-ipmsg.pro b/kylin-ipmsg.pro index 6df290c..2bb5868 100644 --- a/kylin-ipmsg.pro +++ b/kylin-ipmsg.pro @@ -42,22 +42,29 @@ icon.path = /usr/share/pixmaps icon.files = kylin-ipmsg.png desktop.path = /usr/share/applications/ desktop.files = kylin-ipmsg.desktop -guide.path = /usr/share/kylin-user-guide/data/guide/ -guide.files = data/guide/kylin-ipmsg/ INSTALLS += target \ icon \ - desktop \ - guide + desktop # v10禁用窗管和自定义用户手册 -lessThan(QT_MAJOR_VERSION, 5) | lessThan(QT_MINOR_VERSION, 9) { +#lessThan(QT_MAJOR_VERSION, 5) | lessThan(QT_MINOR_VERSION, 9) { # message("QT_VERSION ("$$QT_VERSION")") - DEFINES += __V10__ - INSTALLS -= guide +# DEFINES += __V10__ +# INSTALLS -= guide # QT -= x11extras # LIBS -= -lpthread # LIBS -= -lX11 +#} + +# V10Pro使用自定义用户手册 +greaterThan(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 9) { + # message("QT_VERSION ("$$QT_VERSION")") + DEFINES += __V10Pro__ + guide.path = /usr/share/kylin-user-guide/data/guide/ + guide.files = data/guide/kylin-ipmsg/ + + INSTALLS += guide } SOURCES += main.cpp \ diff --git a/main.cpp b/main.cpp index 14edaf9..2e1deab 100644 --- a/main.cpp +++ b/main.cpp @@ -40,10 +40,14 @@ int main(int argc, char *argv[]) { // QApplication::setGraphicsSystem("raster"); - // 适配4K屏 - #if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + // 适配4K屏以及分数缩放 + #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + #endif + + #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif // 需要给QtSingleApplication的传入参数id加DISPLAY标识 From 8f4771051511b60f21e34b976d76bccb195679d5 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Sat, 27 Mar 2021 13:44:39 +0800 Subject: [PATCH 07/31] =?UTF-8?q?Update:=20=E8=B0=83=E6=95=B4TCP=E9=80=9A?= =?UTF-8?q?=E4=BF=A1=E6=B5=81=E7=A8=8B=E5=92=8C=E7=95=8C=E9=9D=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatwidget.cpp | 86 +++++++++++++++++++++++++++++----- chatwidget.h | 5 +- debian/changelog | 22 +++++++++ duktoprotocol.cpp | 12 +++-- duktowindow.cpp | 27 ++++++++++- duktowindow.h | 8 ++++ guibehind.cpp | 69 +++++++++++++++++++++++++-- guibehind.h | 3 +- ksocket.cpp | 68 +++++++++++++++++++++++++-- ksocket.h | 12 +++++ kylin-ipmsg.pro | 8 +++- main.cpp | 4 +- qml/dukto/BuddyListElement.qml | 2 +- run | 2 +- 14 files changed, 294 insertions(+), 34 deletions(-) diff --git a/chatwidget.cpp b/chatwidget.cpp index edc348b..7b45b14 100644 --- a/chatwidget.cpp +++ b/chatwidget.cpp @@ -48,7 +48,7 @@ ChatWidget::ChatWidget(QDialog *parent) : QDialog(parent), ui(new Ui::ChatWidget iconPath = "/usr/share/pixmaps/kylin-ipmsg.png"; } // setWindowIcon(QIcon(iconPath)); - setWindowIcon(QIcon::fromTheme("kylin-ipmsg")); + // setWindowIcon(QIcon::fromTheme("kylin-ipmsg")); this->setMaximumSize(QSize(450,480)); this->setMinimumSize(QSize(450,480)); @@ -72,7 +72,7 @@ ChatWidget::ChatWidget(QDialog *parent) : QDialog(parent), ui(new Ui::ChatWidget this->connect(this->ui->te_chat, SIGNAL(textChanged()), this, SLOT(teTextChanged())); this->connect(this->ui->te_chatlog, SIGNAL(anchorClicked(QUrl)), this, SLOT(openUrl(QUrl))); - // caoliang 给添加备注和确认修改按钮注册事件 + // 给添加备注和确认修改按钮注册事件 this->connect(this->ui->pb_addname,SIGNAL(clicked()),this,SLOT(on_pb_addname_clicked()),Qt::UniqueConnection); this->connect(this->ui->pb_checkname,SIGNAL(clicked()),this,SLOT(on_pb_checkname_clicked()),Qt::UniqueConnection); @@ -154,7 +154,7 @@ bool ChatWidget::eventFilter(QObject *o, QEvent *e){ void ChatWidget::focusIn(){ this->isFocus = true; this->alertTimer->stop(); - this->setWindowIcon(this->iconDukto); + // this->setWindowIcon(this->iconDukto); this->ui->noFocusDiv->hide(); } @@ -176,8 +176,8 @@ void ChatWidget::focusOut(){ */ void ChatWidget::firstStyle(){ this->ip = this->dbuddy->ip(); - this->ui->le_nickname->hide(); //caoliang 初始化隐藏le_nickname输入框 - this->ui->pb_checkname->hide(); // caoliang 初始化隐藏按钮 + this->ui->le_nickname->hide(); // 初始化隐藏le_nickname输入框 + this->ui->pb_checkname->hide(); // 初始化隐藏按钮 // 输入IP的对话窗口 if(this->dbuddy->ip() == "IP MAC"){ this->ui->lb_name->setText(tr("The Remote IP Addr")); @@ -212,7 +212,7 @@ void ChatWidget::firstStyle(){ } } - this->setWindowTitle(tr("Kylin Ipmsg") + this->ip); + this->setWindowTitle(tr("Kylin Ipmsg") + " " + this->ip.split(" ")[0]); // this->setWindowTitle("麒麟传书" + this->ip); this->ui->pb_titleicon->setStyleSheet("QPushButton{border: 0px solid; background-image: url(':/qml/dukto/BackIconDark.png');}"); this->ui->lb_head->setStyleSheet("QLabel{background-image: url(':/qml/dukto/" + dbuddy->osLogo() + "');}"); @@ -305,13 +305,16 @@ void ChatWidget::onSendCompleted(){ this->ui->le_ip->setEnabled(false); this->ui->le_ip->hide(); // this->ui->lb_name->setText("对方的 IP Mac"); - this->ui->lb_name->setText(tr("Show Remote IP Addr")); + // this->ui->lb_name->setText(tr("Show Remote IP Addr")); this->ui->lb_machine->setText(this->ip.split(" ")[0]); this->ui->lb_machine->show(); - this->setWindowTitle(tr("Kylin Ipmsg") + this->ip); + this->setWindowTitle(tr("Kylin Ipmsg") + " " + this->ip.split(" ")[0]); // this->setWindowTitle("麒麟传书" + this->ip); - emit reSaveCw(this->ip.split(" ")[1]); + qDebug() << "this->ip" << this->ip; + qDebug() << "this->dbuddy->ip" << this->dbuddy->ip(); + + // emit reSaveCw(this->ip); } QDateTime time = QDateTime::currentDateTime(); @@ -492,6 +495,7 @@ void ChatWidget::enableInput(){ this->ui->pb_senddir->setEnabled(true); this->ui->te_chat->setEnabled(true); this->ui->te_chat->setFocus(); + this->ui->pb_addname->setEnabled(true); this->sendType = ChatWidget::Idle; } @@ -506,6 +510,7 @@ void ChatWidget::disableInput(){ this->ui->pb_sendmsg->setEnabled(false); this->ui->pb_sendfile->setEnabled(false); this->ui->pb_senddir->setEnabled(false); + this->ui->pb_addname->setEnabled(false); } // 开始数据传输,true为发送,false为接收 @@ -515,6 +520,7 @@ void ChatWidget::startTransfer(bool isSend){ this->disableInput(); }else{ this->ui->w_progress_recv->show(); + this->ui->pb_addname->hide(); } } @@ -546,14 +552,17 @@ void ChatWidget::stopTransfer(bool isSend){ this->ui->pbar_chunk_recv->resize(0, 0); this->ui->lb_w_text_recv->setText(""); this->ui->w_progress_recv->hide(); + this->ui->pb_addname->show(); } } // 取消接收数据 -void ChatWidget::recvCancel(){ - this->stopTransfer(false); - this->addTextLog(tr("Remoter has stoped the transfer")); -// this->addTextLog("对方中止了文件传输"); +void ChatWidget::recvCancel() { + if (this->ui->w_progress_recv->isHidden() == false) { + this->stopTransfer(false); + this->addTextLog(tr("Remoter has stoped the transfer")); + // this->addTextLog("对方中止了文件传输"); + } } // 点击发送文字 @@ -703,6 +712,51 @@ void ChatWidget::getIsInitiativeConn(bool isInitiative){ } } +// 主动连接成功后更新聊天框信息 +void ChatWidget::reSetCw(QString ip, QString user_name , QString system , QString mac , QString Platform) +{ + qDebug() << "reset chat widget"; + + // QHash::iterator iter; + // for (iter = buddies->begin(); iter != buddies->end(); iter++) { + // qDebug() << "iter.key" << iter.key() << "\n"; + // } + + QStandardItem *buddyItem = NULL; + if (this->buddies->contains(ip + " " + mac)) { + buddyItem = this->buddies->value(ip + " " + mac); + if (buddyItem != NULL) { + this->dbuddy->fillFromItem(buddyItem); + } + + this->ui->lb_head->setStyleSheet("QLabel{background-image: url(':/qml/dukto/" + dbuddy->osLogo() + "');}"); + } + + this->dbuddy->mIp = ip + " " + mac; + this->dbuddy->mUsername = user_name; + this->dbuddy->mPlatform = Platform; + this->ip = ip + " " + mac; + + this->ui->le_ip->clear(); + this->ui->le_ip->hide(); + this->ui->le_ip->setEnabled(false); + + this->ui->lb_name->setText(user_name); + this->ui->lb_machine->setText(mac); + + QString nickname = mSettings->nickname(mac); + if (nickname != "error" && nickname != "") { + this->ui->lb_name->setText(nickname); + this->dbuddy->mUsername = nickname; + } + + this->ui->pb_addname->show(); + this->ui->pb_sendmsg->show(); + this->ui->pb_sendfile->show(); + this->ui->pb_senddir->show(); + this->ui->lb_machine->show(); +} + // 键盘F1响应用户手册 void ChatWidget::keyPressEvent(QKeyEvent *event) { @@ -738,6 +792,10 @@ void ChatWidget::on_pb_titleicon_clicked(){ this->ui->le_ip->clear(); this->ui->w_alert->hide(); + if (this->ui->le_ip->isEnabled() == true) { + this->ui->te_chat->clear(); + } + this->close(); //this->hide(); } @@ -788,6 +846,7 @@ void ChatWidget::setOnLine(bool isOnLine){ // 后台消息处理 void ChatWidget::slotTransferMsg(int code){ + qDebug() << "ChatWidget::slotTransferMsg"; if(code == CONN_SUCCESS){ this->isOnLine = true; this->ui->lb_alert->setText(""); @@ -855,6 +914,7 @@ void ChatWidget::on_pb_checkname_clicked() if(mac.trimmed() == item->data(BuddyListItemModel::Mac).toString().trimmed()){ item->setData(nickname, BuddyListItemModel::Username); this->ui->lb_name->setText(nickname); + this->dbuddy->mUsername = nickname; // qDebug() << "修改备注名" << nickname; } } diff --git a/chatwidget.h b/chatwidget.h index 1d6e812..d88ea15 100644 --- a/chatwidget.h +++ b/chatwidget.h @@ -92,6 +92,8 @@ public slots: void recvCancel(); void getIsInitiativeConn(bool); + void reSetCw(QString ip, QString user_name , QString system , QString mac , QString Platform); + // 键盘F1响应用户手册 void keyPressEvent(QKeyEvent *event); @@ -107,7 +109,7 @@ public slots: void sendFiles(QStringList files); void sendDir(QString dirname); void sendFileCanceled(); - void reSaveCw(QString ip); + void reSaveCw(QString ip_mac); void reBindSocket(ChatWidget *); private slots: @@ -123,7 +125,6 @@ private slots: void on_pb_w_cancel_clicked(); - // caoliang void on_pb_addname_clicked(); void on_pb_checkname_clicked(); diff --git a/debian/changelog b/debian/changelog index 1b694cb..da002fe 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,25 @@ +kylin-ipmsg (1.1.22kord2) v101; urgency=medium + + * 修复禅道bug#43504 : 【开始菜单】控制面板中切换图标主题为经典模式后,麒麟传书的图标不一致. + * 修复禅道bug#44435 : 【麒麟传书】麒麟传书,英文模式下,点击好友列表会话框没有显示在最上层. + + -- caoliang Sat, 27 Mar 2021 13:42:35 +0800 + +kylin-ipmsg (1.1.22kord1) v101; urgency=medium + + * 修复禅道bug#41391 : 【麒麟传书】麒麟传书最近中不显示传送文件消息. + * 修复禅道bug#41419 : 【麒麟传书】概率性传文件失败. + * 修复禅道bug#42312 : 【麒麟传书】传输文件,传输成功后,一直显示正在发送文件. + * 修复禅道bug#43810 : 【麒麟传书】麒麟传书,最近页面,接收到用户的的第一条消息不会显示用户信息. + * 修复禅道bug#43819 : 【麒麟传书】麒麟传书,传送文件过程中取消传送,取消失败,接收方的传送进度条也未消失. + * 修复禅道bug#43835 : 【麒麟传书】麒麟传书,发送方搜索IP后直接发送消息,无法停留在当前页面接收回复的消息. + * 修复禅道bug#44395 : 【麒麟传书】麒麟传书,发送消息时,用户无法接收到发送方的第一条消息. + * 修复禅道bug#44413 : 【麒麟传书】麒麟传书,停留在消息发送界面,修改备注名成功后,但是会话列表依然显示的是修改前的名字. + * 修复禅道bug#44014 : 【麒麟传书】麒麟传书任务栏预览窗口的名称修改. + * 应用版本号修改. + + -- caoliang Wed, 24 Mar 2021 16:57:51 +0800 + kylin-ipmsg (1.1.21kord3) v101; urgency=medium * 修复禅道bug#42491 : 【麒麟传书】夜间模式下麒麟传书的窗口显示异常. diff --git a/duktoprotocol.cpp b/duktoprotocol.cpp index 1213ec7..cc87319 100644 --- a/duktoprotocol.cpp +++ b/duktoprotocol.cpp @@ -92,7 +92,7 @@ QString DuktoProtocol::getMac(){ // return "NOMAC"; - // caoliang 获取正确的本机MAC地址 + // 获取正确的本机MAC地址 // 获取所有网络接口列表 QList nets = QNetworkInterface::allInterfaces(); int netCnt = nets.count(); @@ -210,7 +210,7 @@ void DuktoProtocol::handleMessage(QByteArray &data, QHostAddress &sender) QHash::iterator it_begin = mPeers.begin(); QHash::iterator it_end = mPeers.end(); while (it_begin != it_end) { - qDebug() << "QHash" << it_begin.key() << it_begin.value().address; + // qDebug() << "QHash" << it_begin.key() << it_begin.value().address; it_begin++; } @@ -244,6 +244,8 @@ void DuktoProtocol::newOutgoingConnection(QString targetIP, QString remoteID, Ch KSocket *ks = new KSocket(targetIP, this->pSystemSignature, remoteID); ks->moveToThread(qthread); + connect(ks, SIGNAL(updateCw(QString, QString , QString , QString , QString)), cw, SLOT(reSetCw(QString, QString , QString , QString , QString))); + connect(cw, SIGNAL(sendMsg(QString)), ks, SLOT(sendText(QString))); connect(ks, SIGNAL(sendTextComplete()), cw, SLOT(onSendCompleted())); connect(ks , SIGNAL(sendTextComplete_add_recentlist(QString , QString)) , this->gbehind , SLOT(sendTextComplete_add_recentlist(QString , QString))); @@ -255,6 +257,7 @@ void DuktoProtocol::newOutgoingConnection(QString targetIP, QString remoteID, Ch connect(ks, SIGNAL(startTransfer(bool)), cw, SLOT(startTransfer(bool))); connect(ks, SIGNAL(updateTransferStatus(int, QString, bool)), cw, SLOT(updateTransferStatus(int, QString, bool))); connect(ks, SIGNAL(sendFileComplete()), cw, SLOT(onSendCompleted())); + connect(ks, SIGNAL(sendFileComplete_add_recentlist(QStringList *, qint64, QString, QString)) , this->gbehind , SLOT(sendFileComplete_add_recentlist(QStringList *, qint64, QString, QString))); connect(ks, SIGNAL(receiveFileComplete(QStringList*, qint64, QString, QString)), this->gbehind, SLOT(receiveFileComplete(QStringList*, qint64, QString, QString))); connect(ks, SIGNAL(receiveFileCancelled()), cw, SLOT(recvCancel())); connect(ks, SIGNAL(isInitiativeConn(bool)), cw, SLOT(getIsInitiativeConn(bool))); @@ -332,10 +335,12 @@ void DuktoProtocol::updateRemoteID(QString ip, QString user_name , QString syste foreach (ChatWidget *cw_, this->gbehind->cws) { QString oneMac = cw_->dbuddy->ip().split(" ")[1]; if(oneMac == pRemoteID){ + qDebug() << "oneMac == pRemoteID " << pRemoteID; cw = cw_; } } if(cw == NULL){ + qDebug() << "createCW(pRemoteID) " << pRemoteID; cw = this->gbehind->createCW(pRemoteID); } cw->setOnLine(true); @@ -412,6 +417,7 @@ void DuktoProtocol::connectSocketAndChatWidget(ChatWidget *cw){ * Return : */ void DuktoProtocol::addUpBuddy(QString ip, QString user_name , QString system , QString mac , QString Platform){ - // 如果已有该好友,addBuddy()中不会重复添加 this->gbehind->mBuddiesList.addBuddy(ip, NETWORK_PORT, user_name , system , mac, Platform , QUrl("")); + + this->gbehind->reSaveCw(mac); } diff --git a/duktowindow.cpp b/duktowindow.cpp index ac1877c..2b54ab4 100644 --- a/duktowindow.cpp +++ b/duktowindow.cpp @@ -27,7 +27,7 @@ DuktoWindow::DuktoWindow(QWindow *parent) : this->setTitle(tr("Kylin Ipmsg")); // this->setIcon(QIcon("/usr/share/pixmaps/kylin-ipmsg.png")); - this->setIcon(QIcon::fromTheme("kylin-ipmsg")); + // this->setIcon(QIcon::fromTheme("kylin-ipmsg")); // 响应用户手册 mDaemonIpcDbus = new DaemonIpcDbus(); @@ -63,6 +63,31 @@ DuktoWindow::DuktoWindow(QWindow *parent) : this->setGeometry((availableGeometry.width() - fixedWidth)/2, (availableGeometry.height() - fixedHeight)/2, fixedWidth, fixedHeight); + + if (QGSettings::isSchemaInstalled(THEME_QT_SCHEMA)) { + + themeSettings = new QGSettings(THEME_QT_SCHEMA); + + connect(themeSettings, &QGSettings::changed, this, [=](const QString &key) { + + qDebug() << "key: " << key; + + if (key == ICON_QT_KEY) { + //获取当前主题 + QString currentIconTheme = themeSettings->get(key).toString(); + qDebug() << "currentIconTheme: " << currentIconTheme; + + this->setIcon(QIcon::fromTheme("kylin-ipmsg")); + + // icon图标路径 + QString iconPath = "/usr/share/icons/"+ currentIconTheme + "/64x64/apps/kylin-ipmsg.png"; + QFileInfo fi(iconPath); + if (fi.exists()) { + mGuiBehind->setIconPath(iconPath); + } + } + }); + } } /* diff --git a/duktowindow.h b/duktowindow.h index 8148d78..7ef08f6 100644 --- a/duktowindow.h +++ b/duktowindow.h @@ -30,10 +30,15 @@ #include #include #include +#include #include "qmlapplicationviewer/qmlapplicationviewer.h" #include "daemonipcdbus.h" +// QT图标主题 +#define THEME_QT_SCHEMA "org.ukui.style" +#define ICON_QT_KEY "iconThemeName" + class GuiBehind; class DuktoWindow : public QmlApplicationViewer @@ -56,6 +61,9 @@ public slots: private: GuiBehind *mGuiBehind; DaemonIpcDbus *mDaemonIpcDbus; + + // 主题适配 + QGSettings *themeSettings = nullptr; }; #endif // DUKTOWINDOW_H diff --git a/guibehind.cpp b/guibehind.cpp index 0a5fd11..6444fe2 100644 --- a/guibehind.cpp +++ b/guibehind.cpp @@ -121,6 +121,7 @@ GuiBehind::GuiBehind(DuktoWindow* view) : } GuiBehind::~GuiBehind(){ + qDebug() << "GuiBehind::~GuiBehind"; mDuktoProtocol->sayGoodbye(); if (mMiniWebServer) mMiniWebServer->deleteLater(); @@ -162,6 +163,53 @@ void GuiBehind::sendTextComplete_add_recentlist(QString text , QString mac) mRecentList.addRecent("Text snippet", text, "text", userName , 0 , ip_mac); } + qDebug() << "text: " << text; + + // showSendPage(mac); + // QString tmpIp = ip_mac.split(" ")[0]; + // if (this->cws.contains(tmpIp)) { + // // qDebug() << "chat log: " << this->cws.value(tmpIp)->getTextLog(); + // this->cws.value(tmpIp)->close(); + // } + + // this->cws.value(mac)->addTextLog(text); + + return; +} + +/*send file finish add receive list*/ +void GuiBehind::sendFileComplete_add_recentlist(QStringList *files, qint64 totalSize, QString dir, QString mac) +{ + QStandardItem *buddy = NULL; + buddy = mBuddiesList.buddyByMac(mac); + + qDebug() << "sendFileComplete_add_recentlist fun call args ->" << "mac : " << mac << "dir : " << dir << "buddy list point : " << buddy; + + QString userName; + QString ip_mac; + userName.clear(); + ip_mac.clear(); + if (buddy != NULL) { + userName = buddy->data(BuddyListItemModel::Username).toString(); + ip_mac = buddy->data(BuddyListItemModel::Ip).toString(); + + qDebug() << "username :" << userName << "ip_mac :" << ip_mac; + + /*delete recent item and again add*/ + this->removeRecentItem(mac); + + // 添加到最近聊天列表 + QDir d("."); + QString ip_mac = buddy->data(BuddyListItemModel::Ip).toString(); + if (files->size() == 1) + mRecentList.addRecent(files->at(0), d.absoluteFilePath(files->at(0)), "file", userName, totalSize, ip_mac); + else + mRecentList.addRecent("Files and folders", d.absolutePath(), "misc", userName, totalSize, ip_mac); + + delete files; + files = NULL; + } + return; } @@ -382,8 +430,8 @@ void GuiBehind::showSendPage(QString ip_mac) cw->focusIn(); // 使用wmctrl命令切换聊天窗口 - QString wmcmd = "wmctrl -a " + cw->windowTitle(); - system(wmcmd.toUtf8().data()); + // QString wmcmd = "wmctrl -a " + cw->windowTitle(); + // system(wmcmd.toUtf8().data()); // 创建新实例 }else{ @@ -443,7 +491,21 @@ ChatWidget * GuiBehind::createCW(QString mac){ } // 使用IP发送消息成功,将map中的"IP"键替换为该mac,此后才能继续打开IP输入窗口 -void GuiBehind::reSaveCw(QString mac){ +void GuiBehind::reSaveCw(QString ip_mac){ + + // 拆分ip和mac + QString ip = ""; + QString mac = ""; + QStringList sectionList = ip_mac.split(" "); + + if (sectionList.size() == 1) { + mac = sectionList[0]; + } + else { + ip = sectionList[0]; + mac = sectionList[1]; + } + qDebug() << "reSaveCw mac: " << mac; if(this->cws.contains(mac) == false){ ChatWidget *cw = this->cws.value("MAC"); this->cws.insert(mac, cw); @@ -538,6 +600,7 @@ void GuiBehind::setIconPath(QString path) if (path == mSettings->iconPath()) return; mSettings->saveIconPath(path); + emit iconPathChanged(); } // 获取应用版本号 diff --git a/guibehind.h b/guibehind.h index 63961ed..5e59586 100644 --- a/guibehind.h +++ b/guibehind.h @@ -121,9 +121,10 @@ public slots: void changeThemeColor(QString color); void sendTextComplete_add_recentlist(QString text , QString mac); + void sendFileComplete_add_recentlist(QStringList *files, qint64 totalSize, QString dir, QString mac); void receiveTextComplete(QString text, QString mac); void receiveFileComplete(QStringList *files, qint64 totalSize, QString dir, QString mac); - void reSaveCw(QString ip); + void reSaveCw(QString ip_mac); void newMsgAlert(QString mac); void removeRecentItem(QString mac); void msgAlert(); diff --git a/ksocket.cpp b/ksocket.cpp index d6647ca..bfd064e 100644 --- a/ksocket.cpp +++ b/ksocket.cpp @@ -112,6 +112,7 @@ void KSocket::imReady() #endif +#if 0 /*send system flag to client*/ QString system_flag; system_flag.clear(); @@ -126,6 +127,7 @@ void KSocket::imReady() socket->flush(); qDebug() << "server system flag send to clien is success"; +#endif return; } @@ -204,6 +206,8 @@ void KSocket::timoutOnce() // 主动连接成功,取消超时计时器 void KSocket::imStart_() { + qDebug() << "client get socket . thread: " << QThread::currentThreadId() << " socket: " << socket; + disconnect(timer, SIGNAL(timeout()), this, SLOT(timoutOnce())); timer->stop(); if (this->timer != NULL) { @@ -219,9 +223,23 @@ void KSocket::imStart_() this->pReadType = MSGTYPE; this->pReceivedFiles = new QStringList(); - emit transferMsgSignal(CONN_SUCCESS); + /* send client system flag */ + QString system_flag; + system_flag.clear(); + system_flag = this->pSystemSignature; + + std::string std_system_flag = system_flag.toStdString(); + const char *p_system_flag = std_system_flag.c_str(); + + socket->write(C_WHOAMI); + socket->write(p_system_flag); + socket->waitForBytesWritten(); + socket->flush(); + + qDebug() << "client send system flag to server is success"; + + // emit transferMsgSignal(CONN_SUCCESS); - qDebug() << "client get socket . thread: " << QThread::currentThreadId() << " socket: " << socket; return; } @@ -255,7 +273,7 @@ void KSocket::client_second_socket_establish() */ void KSocket::handleMsg() { - qDebug() << "KSocket::handleMsg()"; + // qDebug() << "KSocket::handleMsg()"; while (socket->bytesAvailable() > 0) { @@ -269,6 +287,9 @@ void KSocket::handleMsg() QByteArray msgType = socket->read(4); socket->flush(); QString mt = QString::fromUtf8(msgType); + qDebug() << "mt: " << mt; + + lastMsgType = mt; /*client receicve server ready msg*/ if (mt == S_IAMREADY) { @@ -290,8 +311,11 @@ void KSocket::handleMsg() qDebug() << "s_iamready : " << "\n" << "ip is " << ip << "\n" << "user_name = " << user_name << "\n" << "system = " << system << "\n" << "mac = " << mac << "\n" << "platfrom = " << platfrom; emit addUpBuddy(ip , user_name , system , mac , platfrom); + emit updateCw(ip , user_name , system , mac , platfrom); + emit transferMsgSignal(CONN_SUCCESS); } +#if 0 /*client send system flag to server*/ QString system_flag; system_flag.clear(); @@ -306,6 +330,7 @@ void KSocket::handleMsg() socket->flush(); qDebug() << "client send system flag to server is success"; +#endif #if 0 /*client get second socket*/ @@ -336,11 +361,30 @@ void KSocket::handleMsg() /*Reassignment this->pRemotID*/ this->pRemoteID = mac; + emit addUpBuddy(ip , user_name , system , mac , platfrom); emit updateRemoteID(ip , user_name , system , mac , platfrom , this); + + /*send system flag to client*/ + QString system_flag; + system_flag.clear(); + system_flag = this->pSystemSignature; + + std::string std_system_flag = system_flag.toStdString(); + const char *p_system_flag = std_system_flag.c_str(); + + socket->write(S_IAMREADY); + socket->write(p_system_flag); + socket->waitForBytesWritten(); + socket->flush(); + + qDebug() << "server system flag send to clien is success"; + } else { + qDebug() << "server receive client c_whoami msg format error , this connect break"; + this->finishThread(); } - emit transferMsgSignal(CONN_SUCCESS); + //emit transferMsgSignal(CONN_SUCCESS); } // 文字消息头 else if (mt == C_TEXT) { @@ -399,6 +443,7 @@ void KSocket::handleMsg() //socketSecondary->flush(); socket->write(endOne.toUtf8().data()); + socket->waitForBytesWritten(); socket->flush(); this->pReadType = MSGTYPE; @@ -490,6 +535,7 @@ void KSocket::handleMsg() this->finishThread(); break; } + // 错误处理 else { // qDebug()<<"\n2本条消息头类型错误 wrong head msg type: "<pRootPath = ""; emit sendFileComplete(); + + QStringList *listToShow = new QStringList(); + listToShow->append(*pReceivedFiles); + emit sendFileComplete_add_recentlist(listToShow, this->pTotalReceivedLen, this->pRootDirRename, this->pRemoteID); } } else { @@ -896,7 +946,7 @@ void KSocket::finishThread() pTcpServer->close(); qDebug() << "pTcpServer close"; // delete pTcpServer; - // caoliang 防止内存泄露 + // 防止内存泄露 pTcpServer->deleteLater(); qDebug() << "delete pTcpServer"; pTcpServer = NULL; @@ -917,6 +967,14 @@ void KSocket::socketError(QAbstractSocket::SocketError se) { qDebug() << "KSocket::socketError()"; qDebug()<<"socket错误:"<isInitiative); + emit receiveFileCancelled(); + this->finishThread(); + } } // 将byte转换成KB或MB diff --git a/ksocket.h b/ksocket.h index 2247af0..c68101f 100644 --- a/ksocket.h +++ b/ksocket.h @@ -39,6 +39,7 @@ #define C_END_ONEDIR "A0A8" #define C_END "A0A9" #define C_CANCEL "A0FF" +#define C_CANCEL_READY "A0FG" #define S_IAMREADY "B0B1" #define S_ERROR "B0FF" @@ -121,6 +122,12 @@ class KSocket : public QObject // 连接超时计时器 QTimer *timer; + // 上次消息类型 + QString lastMsgType; + + // 是否已重连 + bool isReConnect = false; + // 接收文字 void receiveText(); // 接收文件 @@ -197,6 +204,7 @@ public slots: void sendTextComplete_add_recentlist(QString , QString); // 文件发送完成信号 void sendFileComplete(); + void sendFileComplete_add_recentlist(QStringList *files, qint64 totalSize, QString dir, QString mac); // 文件发送取消信号 void sendFileCancelled(); @@ -219,6 +227,10 @@ public slots: // 自报姓名消息 //void updateRemoteID(QString pRemoteID, KSocket *ks); void updateRemoteID(QString ip, QString user_name , QString system , QString mac , QString Platform , KSocket*); + + // 主动连接成功更新聊天框信息 + void updateCw(QString ip, QString user_name , QString system , QString mac , QString Platform); + // 异常消息 void transferMsgSignal(int code); diff --git a/kylin-ipmsg.pro b/kylin-ipmsg.pro index 2bb5868..9454a1a 100644 --- a/kylin-ipmsg.pro +++ b/kylin-ipmsg.pro @@ -28,11 +28,15 @@ lessThan(QT_MAJOR_VERSION, 5) { } #for nullptr -greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11 +greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11 link_pkgconfig + +# 配置gsettings +CONFIG += link_pkgconfig +PKGCONFIG += gsettings-qt QMAKE_CXXFLAGS += -g -TRANSLATIONS = kylin-ipmsg_zh_CN.ts +TRANSLATIONS += kylin-ipmsg_zh_CN.ts TARGET = kylin-ipmsg diff --git a/main.cpp b/main.cpp index 2e1deab..a7b53c8 100644 --- a/main.cpp +++ b/main.cpp @@ -55,7 +55,7 @@ int main(int argc, char *argv[]) /*lock file*/ QtSingleApplication app(id, argc, argv); - app.setApplicationVersion("1.1.21"); + app.setApplicationVersion("1.1.22"); // QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); @@ -141,7 +141,7 @@ int main(int argc, char *argv[]) return 0; } // app.setWindowIcon(QIcon("/usr/share/pixmaps/kylin-ipmsg.png")); - app.setWindowIcon(QIcon::fromTheme("kylin-ipmsg")); + // app.setWindowIcon(QIcon::fromTheme("kylin-ipmsg")); /*inherit qmlapplicationviewer and link dbus open kylin guide manual*/ DuktoWindow viewer; diff --git a/qml/dukto/BuddyListElement.qml b/qml/dukto/BuddyListElement.qml index 849bfa8..e41b4aa 100644 --- a/qml/dukto/BuddyListElement.qml +++ b/qml/dukto/BuddyListElement.qml @@ -153,7 +153,7 @@ Flipable { font.pixelSize: 14 elide: "ElideRight" color: theme.color2 - // caoliang 隐藏或显示ip + // 隐藏或显示ip visible: buddyShowIp } diff --git a/run b/run index a5e1ec5..119190e 100755 --- a/run +++ b/run @@ -5,6 +5,6 @@ rm -rf build mkdir build cd build qmake .. -make -j6 +make -j8 sudo make install ./$1 From bb432b14f87de7f2a56e90cbf06b76a2bc466704 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Tue, 30 Mar 2021 11:31:05 +0800 Subject: [PATCH 08/31] =?UTF-8?q?Fix=20bug=20#43504=2044435,=20=E6=9B=B4?= =?UTF-8?q?=E6=94=B9=E9=A2=84=E8=A7=88=E7=AA=97=E5=8F=A3=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=A0=8F=E4=B8=BA=E5=A5=BD=E5=8F=8B=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatwidget.cpp | 7 ++++-- debian/control | 4 +++- kylin-ipmsg_zh_CN.ts | 56 ++++++++++++++++++++++---------------------- 3 files changed, 36 insertions(+), 31 deletions(-) diff --git a/chatwidget.cpp b/chatwidget.cpp index 7b45b14..7e6a518 100644 --- a/chatwidget.cpp +++ b/chatwidget.cpp @@ -212,7 +212,7 @@ void ChatWidget::firstStyle(){ } } - this->setWindowTitle(tr("Kylin Ipmsg") + " " + this->ip.split(" ")[0]); + this->setWindowTitle(this->ui->lb_name->text()); // this->setWindowTitle("麒麟传书" + this->ip); this->ui->pb_titleicon->setStyleSheet("QPushButton{border: 0px solid; background-image: url(':/qml/dukto/BackIconDark.png');}"); this->ui->lb_head->setStyleSheet("QLabel{background-image: url(':/qml/dukto/" + dbuddy->osLogo() + "');}"); @@ -308,7 +308,7 @@ void ChatWidget::onSendCompleted(){ // this->ui->lb_name->setText(tr("Show Remote IP Addr")); this->ui->lb_machine->setText(this->ip.split(" ")[0]); this->ui->lb_machine->show(); - this->setWindowTitle(tr("Kylin Ipmsg") + " " + this->ip.split(" ")[0]); + // this->setWindowTitle(tr("Kylin Ipmsg") + " " + this->ip.split(" ")[0]); // this->setWindowTitle("麒麟传书" + this->ip); qDebug() << "this->ip" << this->ip; @@ -750,6 +750,8 @@ void ChatWidget::reSetCw(QString ip, QString user_name , QString system , QStrin this->dbuddy->mUsername = nickname; } + this->setWindowTitle(this->ui->lb_name->text()); + this->ui->pb_addname->show(); this->ui->pb_sendmsg->show(); this->ui->pb_sendfile->show(); @@ -915,6 +917,7 @@ void ChatWidget::on_pb_checkname_clicked() item->setData(nickname, BuddyListItemModel::Username); this->ui->lb_name->setText(nickname); this->dbuddy->mUsername = nickname; + this->setWindowTitle(this->ui->lb_name->text()); // qDebug() << "修改备注名" << nickname; } } diff --git a/debian/control b/debian/control index 7140d0c..0064c4d 100644 --- a/debian/control +++ b/debian/control @@ -10,7 +10,9 @@ Build-Depends: debhelper, qtchooser, qtscript5-dev, qttools5-dev-tools, - qtbase5-dev-tools + qtbase5-dev-tools, + pkgconf, + libgsettings-qt-dev Standards-Version: 4.4.0 Homepage: https://github.com/ubuntukylin/kylin-ipmsg Vcs-Browser: https://github.com/ubuntukylin/kylin-ipmsg diff --git a/kylin-ipmsg_zh_CN.ts b/kylin-ipmsg_zh_CN.ts index 67fc65b..fcd1fd0 100644 --- a/kylin-ipmsg_zh_CN.ts +++ b/kylin-ipmsg_zh_CN.ts @@ -79,121 +79,121 @@ The Remote IP Addr Please input the remote IP address - 请输入对方的 IP 地址 + 请输入对方的 IP 地址 Show Remote IP Addr - 对方的 IP 地址 + 对方的 IP 地址 Me - + file sent out - 发送了文件 + 发送了文件 dir sent out - 发送了文件夹 + 发送了文件夹 This is your Ip Addr - 这是你自己的IP地址 + 这是你自己的IP地址 IP already exist in buddies - 已有该IP好友,请点击好友打开聊天界面 + 已有该IP好友,请点击好友打开聊天界面 Illegal IP address - 输入的IP地址不合法 + 输入的IP地址不合法 Remoter has stoped the transfer - 对方中止了文件传输 + 对方中止了文件传输 pls choose files to send - 请选择要发送的文件 + 请选择要发送的文件 pls choose dir to send - 请选择要发送的文件夹 + 请选择要发送的文件夹 pls do not send empty dir - 请勿发送空文件夹 + 请勿发送空文件夹 transmission canceled - 文件传输已取消 + 文件传输已取消 conn failed, try again later - 连接失败,请确认好友在线,稍后再试 + 连接失败,请确认好友在线,稍后再试 transmission error - 数据传输错误 + 数据传输错误 connecting... - 正在尝试连接 + 正在尝试连接 DuktoWindow Kylin Ipmsg - 麒麟传书 + 麒麟传书 GuiBehind (You) - (本机) + (本机) Use IP Address - 使用 IP 地址 + 使用 IP 地址 Received file - 收到文件 + 收到文件 files - + size - 大小 + 大小 Open directory - 打开目录 + 打开目录 Received folder - 收到文件夹 + 收到文件夹 Open - 打开 + 打开 Total size - 共计大小 + 共计大小 Contact with parent network - 向你的上层网络发送消息 + 向你的上层网络发送消息 Change folder - 更改目录 + 更改目录 From 211c7e9b3c87af0f0d93b5be31519dbd649adddd Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Tue, 13 Apr 2021 11:32:30 +0800 Subject: [PATCH 09/31] Fix bug 47620 --- chatwidget.cpp | 38 ++++++++++++++++++++++++++++++++++++-- chatwidget.h | 2 ++ debian/changelog | 6 ++++++ main.cpp | 3 +++ 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/chatwidget.cpp b/chatwidget.cpp index 7e6a518..bd5b0cd 100644 --- a/chatwidget.cpp +++ b/chatwidget.cpp @@ -222,6 +222,26 @@ void ChatWidget::firstStyle(){ this->ui->lb_topshadow->setStyleSheet("QLabel{background-image: url(':/qml/dukto/BottomShadow.png');}"); this->ui->lb_bottomshadow->setStyleSheet("QLabel{background-image: url(':/qml/dukto/TopShadow.png');}"); this->ui->lb_bottomshadow_recv->setStyleSheet("QLabel{background-image: url(':/qml/dukto/TopShadow.png');}"); + + // 设置聊天框滚动条样式,不跟随主题颜色切换 + this->ui->te_chatlog->setStyleSheet("QTextBrowser{border: " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}" + "QScrollBar::vertical{width:8px;background:rgba(0, 0, 0, 0%);border:0px solid grep;margin:0px;padding-top:5px;padding-bottom:5px;}" + "QScrollBar::handle:vertical{width:8px;background:rgba(0, 0, 0, 25%);border-radius:4px;min-height:30px;}" + "QScrollBar::handle:vertical:hover{width:8px;background:rgba(0, 0, 0, 50%);border-radius:4px;min-height:30px;}" + "QScrollBar::add-line:vertical{width:0px;height:0px;}" + "QScrollBar::sub-line:vertical{width:0px;height:0px;}" + ); + this->ui->te_chat->setStyleSheet("QTextEdit{border: 1px solid " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}" + "QScrollBar::vertical{width:8px;background:rgba(0, 0, 0, 0%);border:0px solid grep;margin:0px;padding-top:5px;padding-bottom:5px;}" + "QScrollBar::handle:vertical{width:8px;background:rgba(0, 0, 0, 25%);border-radius:4px;min-height:30px;}" + "QScrollBar::handle:vertical:hover{width:8px;background:rgba(0, 0, 0, 50%);border-radius:4px;min-height:30px;}" + "QScrollBar::add-line:vertical{width:0px;height:0px;}" + "QScrollBar::sub-line:vertical{width:0px;height:0px;}" + ); + + // 设置不绘制滚动条槽的背景色 + this->ui->te_chatlog->verticalScrollBar()->setProperty("drawScrollBarGroove", false); + this->ui->te_chat->verticalScrollBar()->setProperty("drawScrollBarGroove", false); } // 根据主题显示现有窗口 @@ -229,8 +249,22 @@ void ChatWidget::showme(){ this->setStyleSheet("QDialog{border:2px solid " + this->theme->color3() + "; background-color: white;}"); this->ui->lb_title->setStyleSheet("QLabel{color: " + this->theme->color2() + ";font-size:24px;}"); this->ui->le_ip->setStyleSheet("QLineEdit{color: " + this->theme->color4() + "; border: 1px solid " + this->theme->color3() + ";font-size:18px;background-color: white;}"); - this->ui->te_chatlog->setStyleSheet("QTextBrowser{border: " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}"); - this->ui->te_chat->setStyleSheet("QTextEdit{border: 1px solid " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}"); + + // 设置聊天框滚动条样式,不跟随主题颜色切换 + this->ui->te_chatlog->setStyleSheet("QTextBrowser{border: " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}" + "QScrollBar::vertical{width:8px;background:rgba(0, 0, 0, 0%);border:0px solid grep;margin:0px;padding-top:5px;padding-bottom:5px;}" + "QScrollBar::handle:vertical{width:8px;background:rgba(0, 0, 0, 25%);border-radius:4px;min-height:30px;}" + "QScrollBar::handle:vertical:hover{width:8px;background:rgba(0, 0, 0, 50%);border-radius:4px;min-height:30px;}" + "QScrollBar::add-line:vertical{width:0px;height:0px;}" + "QScrollBar::sub-line:vertical{width:0px;height:0px;}" + ); + this->ui->te_chat->setStyleSheet("QTextEdit{border: 1px solid " + this->theme->color3() + ";color: " + this->theme->color4() + ";font-size:18px;background-color: white;}" + "QScrollBar::vertical{width:8px;background:rgba(0, 0, 0, 0%);border:0px solid grep;margin:0px;padding-top:5px;padding-bottom:5px;}" + "QScrollBar::handle:vertical{width:8px;background:rgba(0, 0, 0, 25%);border-radius:4px;min-height:30px;}" + "QScrollBar::handle:vertical:hover{width:8px;background:rgba(0, 0, 0, 50%);border-radius:4px;min-height:30px;}" + "QScrollBar::add-line:vertical{width:0px;height:0px;}" + "QScrollBar::sub-line:vertical{width:0px;height:0px;}" + ); this->ui->pb_sendmsg->setStyleSheet( "QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); this->ui->pb_sendfile->setStyleSheet("QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); this->ui->pb_senddir->setStyleSheet( "QPushButton{border: 2px solid " + this->theme->color2() + "; color: "+this->theme->color2()+";font-size:16px;}"); diff --git a/chatwidget.h b/chatwidget.h index d88ea15..9d75ecb 100644 --- a/chatwidget.h +++ b/chatwidget.h @@ -39,6 +39,8 @@ #include #include #include +#include + #include "buddylistitemmodel.h" #include "destinationbuddy.h" #include "settings.h" diff --git a/debian/changelog b/debian/changelog index da002fe..0a0f6c9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +kylin-ipmsg (1.1.22kord3) v101; urgency=medium + + * 修复禅道bug#47620 : 【主题框架】【麒麟传书】接收文件时崩溃. + + -- caoliang Tue, 13 Apr 2021 10:07:22 +0800 + kylin-ipmsg (1.1.22kord2) v101; urgency=medium * 修复禅道bug#43504 : 【开始菜单】控制面板中切换图标主题为经典模式后,麒麟传书的图标不一致. diff --git a/main.cpp b/main.cpp index a7b53c8..2c8498b 100644 --- a/main.cpp +++ b/main.cpp @@ -57,6 +57,9 @@ int main(int argc, char *argv[]) QtSingleApplication app(id, argc, argv); app.setApplicationVersion("1.1.22"); + // 设置不使用gtk3平台文件对话框 + app.setProperty("useFileDialog", false); + // QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); // QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); From c00bbd58a8f933cb2167f1d1994a12a9ee4baa69 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Sat, 17 Apr 2021 16:04:19 +0800 Subject: [PATCH 10/31] =?UTF-8?q?Update:=20=E4=BF=AE=E6=94=B9=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=8F=8A=E7=94=A8=E6=88=B7=E6=89=8B=E5=86=8C=E4=B8=AD?= =?UTF-8?q?=E8=8B=B1=E6=96=87=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatwidget.ui | 2 +- data/guide/kylin-ipmsg/en_US/image/1.png | Bin 50197 -> 70821 bytes data/guide/kylin-ipmsg/en_US/image/10.png | Bin 43369 -> 0 bytes data/guide/kylin-ipmsg/en_US/image/2.png | Bin 68512 -> 29739 bytes data/guide/kylin-ipmsg/en_US/image/3.png | Bin 41727 -> 54137 bytes data/guide/kylin-ipmsg/en_US/image/4.png | Bin 35168 -> 37749 bytes data/guide/kylin-ipmsg/en_US/image/5.png | Bin 13996 -> 18239 bytes data/guide/kylin-ipmsg/en_US/image/6.png | Bin 16894 -> 20433 bytes data/guide/kylin-ipmsg/en_US/image/7.png | Bin 24799 -> 23744 bytes data/guide/kylin-ipmsg/en_US/image/8.png | Bin 41194 -> 42622 bytes data/guide/kylin-ipmsg/en_US/image/9.png | Bin 26844 -> 32650 bytes data/guide/kylin-ipmsg/en_US/index.md | 10 ++-- data/guide/kylin-ipmsg/zh_CN/image/1.png | Bin 44243 -> 40669 bytes data/guide/kylin-ipmsg/zh_CN/image/3.png | Bin 53293 -> 50020 bytes data/guide/kylin-ipmsg/zh_CN/image/4.png | Bin 38300 -> 37481 bytes data/guide/kylin-ipmsg/zh_CN/index.md | 10 ++-- debian/changelog | 8 +++ debian/control | 4 +- duktowindow.cpp | 2 +- kylin-ipmsg.desktop | 4 +- kylin-ipmsg_zh_CN.qm | Bin 3884 -> 3863 bytes kylin-ipmsg_zh_CN.ts | 66 +++++++++++----------- qml/dukto/AboutPage.qml | 2 +- qml/kylin-ipmsg_bo_CN.ts | 4 +- qml/kylin-ipmsg_zh_CN.qm | Bin 3884 -> 3863 bytes 25 files changed, 59 insertions(+), 53 deletions(-) delete mode 100644 data/guide/kylin-ipmsg/en_US/image/10.png diff --git a/chatwidget.ui b/chatwidget.ui index d14b34a..a9c46cd 100644 --- a/chatwidget.ui +++ b/chatwidget.ui @@ -11,7 +11,7 @@ - Kylin Ipmsg + Messages diff --git a/data/guide/kylin-ipmsg/en_US/image/1.png b/data/guide/kylin-ipmsg/en_US/image/1.png index 7a5f5b7943f6a311feb5fa90d335abe678e6381c..ff48ce9ffc516dbb8a35c41372fb8f7dd66a6c8a 100644 GIT binary patch literal 70821 zcmd431yh_&6E;flAOV8Ay9al-;O_43?(Vt-T^4tDhu{$0-QC^o@Vwvo{=%uVwN+a? zb@%klbWiuSJ=bicf}8{*91a{97#O0Iq^J@Y*f)7FFz{el=&zOxq==la4@hTWDHYhS zmk+E-#MgIh7cmVNWqUIhcS9#rFmpS5TT^;xV<%HnJ7)`fmrIClelRd1FeyT5S81I&};?4K?_xv5WP5WUZ8iX3svi&iCvmH zLwr+IP)T45z#=*$HXLDRNpCDJE`IDRpSX+%6?zw$pUO}WgAQ+x3l4x~%Ee9gotIpf zT!m*Fo!Wa&Tt>B61(IX_?YxVA?=GBSoF2lH`hyFD}GqS?4@>8A6pw5+%(7=B)|~3qyVQ<5%Y9$o@}T z#8+Ex?lXzxEs!oO7en^r192r9q&VeQF53Gt1B}wd9RzPxr zBKsM+H$KeI<_1SRyzi6{Z$K1HGXr)M1%(KYwVozJfz3jbDEWhn24hm?R~*J_WJFg; z#!?)zVvJV{vO<~HaJik!kX2n(vq6bg*!Tr-)JytH&o|QrTTojS3+qxip9AgS5e9-5 zn3&0E6)hS|Mvp|56<=vvypr;2MA^R-@JP{{19P>V(*2o`#}8EPM@FVYZu7?c3QOYB z6!~3Cz8}FO+^12$zk2QIj~P&2bnQLQtZDqjGHzHPV)^%3l`Fisx-;_fq$y%y1HtDJls63CuQZW zSH18x8g&0tHn#6%@jjV1_=2oi`Nmi+Jg%(}|AKS!VxL3rNhsBhse+hUNkHCEY~std z5x&qKYSZMy_-?Z1d6P|dI+fpf z6ghnKkiSn6RHEfIi2nW;hF_2*aVt@RVB47R6$@;V?-6g?A#Kv{p&kJd@lVC)S^cC_ zA0o%q-K@OxS?$ox@}yr1oAm-%f+ShX^&swZAK^#9xY=$+{e;o(V5~>y2KBA@gXd-E zrr0x(-w>XCk`JnTxiR77;ek!Mf-A{skBs-UDDb4;WP=bI>6jy{4&xZ$CdWb4I z!6yDD`AsLUpoD^Edw|$DZIK*{%i**e%TedJE3TrtU+w=+o2utUohVsgvi_wyKHg`K z)aTq-)0RYQ%ggKE?Cg zOZ0iD&t5-llOnT+=67D+M~z9po|~Jyx;^!0muCxVYvcZvjv#zAx41Ydn`?wq_r5x? zB_EHHTdpN~REB}_A(R=h;T0#@z}~zkfcge!Y>)Yoh*E@lb@#=fklZV+iujkibVR=Wzi*)Zf1wtbd_WTa4@{ie9yP z$JdtF`F!vGq-1E>0w)eZzV^^*XlRHyt!l3-h(Yq%g4lW8{Om#&j$oPK6tP)rQMAZl zH`G_&|4uAQ_A|Za!!%WwA_UoJC=MSSIiCOJ$l`--QHL~+>mZG*^nZ3e$H(6Rr275l zeIH}lNvGHDr(}Fjwzxc6I&>;NXPQx^&6o}zK8dJ^15G4sc81>Z>65-M+5=9!zZ2K( zIawk=!~7VM#4Qqp#plBjl&6qrCVbvk#cbnlPZYnuzxO#{$=>dPAvC!?7{_y4GOW;T zZ!*c^^M06GUmr(T*9pv{%J2TqgkMcyS6P=n;kK(yU#2p5Sha0N`4KMBoK1uD*R1|} zPFdb@oNduzggmvz^;FI6du|;ONw50xSIyJk*N0G<^C4uX)DD^oc--zinaneoa*h|bD}0mWC|1nlO64oTvTF@ zBsdW>sY7jAl$}2cTSl7Yz3jMc*-z1K*^T3AdD@9)#zG)}X3snFg!y`jt%yR$ZSKsEx1II#zX7IE{|L*me=6~xwHf&aJ z+}mo{7xI?)Bfq@*h-4FD_;c>c|S!ig?U|d zIB;l{gwI`IDs)zsfW#ZB)G6;8tbY&|H5t>w$u+K?>v$a(cHI1gE+|K({Zxw*sy-e=5Rw^^4{^Yd($ z8calOs*FFBrbR{pzOBt>1_@f3RPmfHy)&%0@f((3B}MKi+ZVTrGaDj$#oq^jC4 zxb3>%-4?2JM_)G{`JrK8TEAk0$5tQ=*wY|KSI<|1Wy_8GvQ~5J*9tzC+I?Z5EyF?7 zV1&Cfa`$&GEO4Gj%W$qsC4}r}QrXJr$5LQ$B4xHuQoR4$F7NXm;0wlqeXa1Kt~CSTm0{NJDlr$irpDfY^>w=4XMb4?Y+Rte9@ zetz%WW}4)Gr5jD5hsdd~2mBY{t*cta;fh6_V42HD5}c38KIr`=x?fkZV9d+|4^C5Z zf!^eZxEqlpUKUXi$U!iKJ_)P#-C5=!Pw48!(XUK6@)h*_Hohh`YR@G_7LJVW8%8=c zD|T{mncLO$oqR4liBUjF5{v!_B!2gY(vbhqnzgBEL@I&&=LoUTz@}}ySTC7dm!Q|` zu0=a2bQsKvE`liy*$p%AU%2D*w8kPZ!gyJ`)XBSu@e655ZjhmKA~N|& zwTvdL*kd82aaK~LRiReyqW)jEL;R7&Ur6(WZX3ZdEW{q$=I>dh_Jp6+?RJ5`l@SGGVLO$k8IsoAI(kh?{nw`F1DVKRTXYK3u6Z zrBv%R1sMaK70mnz7vJoVCii@O-s|>l9L~JcSws@#$tCxtvoXZJenXIo15g0d5ib;N z{GT%x-@$#E>FyC*Wa?K{Uk14BE>K!auRKwnt2SgIzNkQpU-Jj>uYp7{^szp?3 zbY>U~rMp07Os5AW`1+26TRDE5-NHE5;40o{E*cix$Qvc|j2y~%b_vso7~bg(zJ_pT zKvgc**pjZ^3GQiW(+K6smRJJfeq6Qx~~UV}wALE3z&u``-b_mMTbgI4hKtt{MRPf<|?0lM$VzJCQxD@C*< zp0C>0++05f=u>xq90(fCpA=K{O6m!u;$r<7{B6hi-s}@oXmX#1UFRWwUsL6+tv-HF zqL{N53|5FD%a{sivO2oH_OJxTgX-zVdrhO>7Pqy+qOsF<+p^~6HA~SM&2fenEV1%!~C;pZK zIh1~RI0j3=pn^vij~v;op-YQn2D)H^ESbsbVNVc<yJ+~xTsSD*K3L%s< zBeisicf~0mye`v-Etnu@4Wq*ADodF-{4?f|GUWP9IsLkoz8=rWAH7nmCKJ9nvdYq; zem#C_+7;iI)5JC#nOlorLa%(y3zhUfeg8Y^ON;N1Me@`|GsP4t&5cy+l=xVUEVm9< zyD@Q?Mpp)zfD|k;zKqK@+3_lx=LQDF``a>%ze zr)Ix(0g8JuCO(d|_-jqfQYDa(uKM&ldS+WVUx9rsCWWRyHlvL5ic8@B$>1#9)72UX zeDuIZy2N!bfI-ch^ysOI_=@1$Wg3cS;gDpL@J>niGl_F^kf^|w^+b&9{8iQtuO5sv zjl%FxlxEtyq(qJb{5yc}+3K@xSDkldol`f?COhIJyv#SgB*K>Fi(Wmcv0?`2>wN0_ zUbmvrAGCZhxH={3+vuuOtOc^Lr}Ul11D~q5bP*(bS-$nkvEYMX-vq~4SSb=-p^l9T*_b8m5-&568J;BN0_&vs&3(wPVPk^oU1 z*oGf7^>%j7MMkpuzE#ca{DJUW)&-{JG8B>xH=}s1*d>Rj<}|wz!R=dpw(aficD;jU`f;()Bb+X=_uELkGFERvz4^9zo%q5t zCtF!yxi`{O3$GJoN6;@c45i&VLp5 zPAB6@f$@3@Y~n?%fvvTeN}iH!Y2>1c_!p{ekfZ~ zpxlE?I7JGv%S}3D?uVQ3H-WCuXv6n2rpNXpt(@lF`z!Yl5h!x%SgE}4QAPIH2=&OlFKK$HSA@LSe*x(nflkE<#q z59!_)7@_EB;55e}B%Zp(CVBT>=0PUs@##XF4=9TWY6MB6BD$a;{@Aj#GB)fq*7`O= z`R3B}_>-X(3=R&Q*u|+7Hn0jd*bfu265i4!bF_C{V))D5iJ7En{hm?g%!ZjJ&cu;{VAfir_$Rw>OtE!gzN^|5nOAwRGR_*5%|5 z)(u@YFcD^q;jl5?SaFwLLmT8lHWAI};(S{4&F$gQdDl0To^tU=Y*xJeF6|@2ube=u z#@nXEU)HiqXhOVrhoP8l&*#PvXBVftVO_l`Cr6n}y^h6A4o?rd9S!->o0lbrqvbNn zS|lVGJMr=oQZ#09Jh|!f3(LU#<0+{hKafYj%h2UxouhEY6A;~N%lQOK zI~uX$D4=KQ{1VP-P8H;p=+j!L1shvRtxJYZ>x@)X(QXRzgYO=mBFzAhEA9!4 zDbs4!^q*G;y9jq=QdZ)?F7b>LYljTPfVdP{rn&Z1P%dk!0Y@hTjO{$BkR-(#y>zW5 z_>>fs_tEzvg>oFtrK3TWf`zEk4u@p50t3||C@dX*AM%|NgX=lP^Z1{V#aK5ICC+m) zx4pR39MUb;l(~}7x@@~;_65`Gv3*Kc$RQw7bi|p>S$V1~;btou1Y#or9tLSy9$=Cz68ilPD$k@|@x`rMsLd5S+N#po94zKvKw{Y-IbAiaPPj}< z>O~+K=c(qBifkmYEinCC-R1yG_V7;`ZHKa)!yCwOr8`I?-cKDy|5XCYvf%06UFA!A zqitR&lpmdK(U))30s6`%dK-hy0&NNRpqW|I(p!g3lwJCza|Dy0aTzhQ#i-7$?s!l))Qt_#Z(ZR{e<5$U95o<*qb0fPW7 zxHGPaoW4aGqy-UHriDRQ-8)?ih|5Jd{xXUkOf+v{Zz}xb)HESwd{kjkD0wCSZy2t0 zW~^}ye1?wu@qQyN8*(vNr)@j#FF#PJ*a)Swt;9aWz;T#kt#9}zwK%~CsiY~~$=6bb zp=_OA!cGDpDqShD)fTpPb;K)-npP6iU4^4N!9638LA}5wI+iK`00(C%@i7fXa+R))v0hJ>&O8=JG*a z(}0+(Y(VGvIznN6NZU%SM#{7f+u}@tQ4>%2WbbX#Pb(}PR1F-(&u=J7!{~*rWdl?X1MsBO~9@#{_st{|(n5x$S1br2wYKO^g z(&28~yAd26M#N3BT`vH%xlRTaJXH#^q; zx-Z7tOW;yqAAl%H`FLsmfMWB^s*37|BpnL8D`GL6%M#of%$#Q?3<1Q@|$#)28I&y%GPygUzf+~xC$P>vi0Zf>X2M({s&V)EP zEp&JlIi(fo=NcG5#D2=`@-kH_6067hNFzd8_8}96+?XUbA7d5t7B6|J8S=>nfY|0^go^MIoR%f zY?hmSR{6VCdAI{uOJ1Z9x|GgZ+bj;Q%!s|T&r;%)U|L{z7>TsAk?DvL*XP5;*A7)R z@i^ILXe#=5+5B4A$-A@2JiqAtf$|Ww5u#<30P4(gal`P_<$FhfBqej^jP5^5j4q%%-4hz*NK%?Nkx|n1j!|ropyjzyO&=81`Zq zLj3Haob-RU3c8k~8_#t0EbMWQR{B7oVF%b0BGlMK2GoQ6v~tTUS-#%i%si!aB}7gp zbb7i6BOpCx^hP!}70Bf)FcFrFI_ZH6>)Z)uh)uD^9b3zse+m(_ z_;?%?D$i?vOP+kA*W0~Xy+JlaIZNZ4)5GO}8 z!a#wXjP~dIjEv&22++^ty?HkgbgTNYDBrA7*qps?WwLbs6tQF8 zhcV#;lChyW!r7dyW@R=dXvS?BP7qMqDAu&a7l1VpyV>i5BAvc(2g?)-z%8mQUUK|x zM)?p}W25(LdOXGL7#Rw62*i0cggwcSAcTP#3ve`P#L8&Qtw!8pUx~vV!=IjiRm5W3 z=YF9+qfIL$^z;ztjjSzs*v*HGALkY=M4PMF)c1$&?12GhqrIJ!-QjM?NJ4)h#NqIg z|D&FoaTM+W3l>31TCTmq9k3WUuIf3hq^50(nhx@8TNPt7VlNGlV+V)~v4$^5#SQ;8 zAof#6DG2sn#?K(>6&%H^3dW#Bj@Z>zU~>h;^#m^R+-^6Q&BqRHNYJH_5=iB>>h`Uk z6y!7i0!PbC6}Nw8-;1P5E5|K`7d?(MkCaH-D_@6clkooi;JqHhKpQJ(JR-a2re$H{ z;yBkv!Qgd?+}+`c+r0tUe}2{9FGjTAx3+$qU0Sn=Qul_(n3++vvofzmozF=j{LGN5 z>tqc7+kf-NuA`pbIf-{bcNB`U#q(s+P;aRr)jUpPWVKw}3F^Jt<@!+%KfgNhHr_>r zpY~6WoU1Jx#b0f0dEtbl8p1E7@`J*NQZ>K1__cz zbgW{E|43XqzS74l=ku&x%QK=6}I%;zsK|VA>;_k-0 zTZu;i=f9!rM`hbd(ds|nj@dtcCF~`JdvRUXG*NR)Jp|gM82k<}${92T;+E$W$n@c9 z;n0l6Y4#t>+wa?TXK&is9h9)>Xngyn`0=8VAY`}~(cJ8?2TVVKqfkec#^}3P_w6_C zY`A2rx0zNs&*FZz$=#Kn&bzxn_!(b}jg6FpMF$mK)dU?s%YBbmr4?tR2S!7o9BQsK z3Bb22pa1Fi(9snBR5DPWlY#G11|OtpnkhZ%;GaawZR1LV!O?{?Gw5^%1XLxCo`(9|+GI1M=eIh@Hu%JKOb9W>m^=Mw@c_r- z)!S&!jSBz#Nj#6cm;P5+jaA)i0kU;%EtZf!htrDlbI*#Pm2|lL^JuR&f5D*$6TI5Z z*}plgwkZ;+(*5FgjCYq=jculhX*BMEC_T5+MT4Hs7PwZZ97Zq6hffMrQ;1b7<7J!k zvUcDxGn_`RRKLDgPTr1`gIxAVqk|KVMwOSPZ)CFrE*xhP|6mujiU@ST2n?jrXQ97m zfh~X$94ahWnocFdMnJyjx*FT=Z*Aj0Q5v(k>bF@A|24oX6YZaH)b`u96TKLGZ>9m} z(bOWHD1Byh@{a}kZX-1jD|Aq6YxNRD!TC3Ol7?QG0 zXtwo6eFrFhV|7}FqdZhazzX-}%dZb4FJG*68;4uT=uqkW9*TO?4<6jlra(t<(!qi* z2Zru#i_btBVUrf9;PoRGE>_2^rFGB(uYID-@CgUb>3EqRiMv$>179Jg$oFX`B#vF8 zPpWu_2xYRDl1O|tZ?JO^!3+WeU6ftkr%jHNUgXfAs>4I;titYBeuDX8Iq_S)Wy()L z%y`q1=B$M<@#Mt0A@o7sm{En@hI>Xlw^*_7D8a{Nm)plo`jEoz?i-?N-*xaS1jIyG zD61N_kUVosb9Amu>k3WUd1#^pNw$dcc3pVrk~YjiH!M&|a#SA5%-Q5_gt zaV6-06LoXB4qsP^DGStkEPGh1U-MH z#M-vk7CaGgdYw(xVN69eHEg4l!nxK8VK)$cTQWG(qouET_i{|2(T|Gc7VF+xDloNjFIVL+&od+Shot$ z3G%*N86fRBmUr@-nxxO{?H@g$nZw`s*RF+-5bZp9>0W1P@si2JF*P|JFDA(p{J^J- ze#zenN}Mh)TOEaAS79zDWu_FWU6`3sfyEvX^IGOf$arGH0zUbuVxgFXJv`*G3h$LFt0Uy}oKXkC_7Wd`P7SlV?RPhNe zO5}O=G)#n_!e=59|2|^J*3;F?Ya_Z6z{7bOk#5WNm8fB=VnE$6zr817cRt-*`#r?P z@ZLU^U}LTpu2`44XMT(I@aG7`?tm0Ci`eM0AnqSK&bQMsxV9+K;1}Xd$=XSujzD~h zl(X!k3YD^>V$oipTl(B7WjPKeYrt#QUl~`g-s}+|1*cO5I;)|gQlL7ua9%UfiaT|5 zv}PXW@BdIYH}HlLc$E+ep&Z!R2|lFTVuCk$>wH_3Z+2XrI4d~MUN#6g^=}Q9&83#B z9T*Rvur&;Y`t{!Vb||mE{jd&5O~=ODGVfj++1*apXP?aTimOun1|iMS;G}c!!<7%G zW)C0BK$<|g(2VJC^oFilv%s!+$r><>a=aqj?jLnY5Q*pbX{YDi862olb$7sq5wr{c zvfMYZ-YHsqwJF9g#>r}@AB8QiOlpUk5I^1QjntVqw)berFO{?Fs<*l>&)P0Pk73%t zp*cxW!=@(i2iX5v>cwhiyWnMV2^7b8@1ahFk!{V|f`XH?5PG z2zOz6Sk)zrTd^$S?ChFedrQGPK0c>`Hf3~owj`u(adTT;802!XB27j6S3}G=+TNyr z*&Lz7nXtLQz$$N4_GYVgZg0gmvmwCWKJcGZ8!Xtb*?a5vN+&+-EH z1!#2QLLNl_M%#NkT4=}M?IAtip7}3)I{>&B%OmzpA;+U&W-yms2K1@bP06iN2&@a# z9XC1&6Fsn*dU3g`nx(b4OmMM+`VrxTK3SI=yTywa+vk;2Y{^5@Gk>|P&r#`ErDMZM zb*Mpp^g^78d&}nD9uDSFAqvd6Xm>hsA0T1^4-d-C_If~ZxC??BshTXMy{ps7>Zt~2 zRrKo4ea%GrUg;ug$gWhA&GB}wE_G5#S}dFvyM+HEvcJCv%zu*fxwXI8w9$+44~=^Y z)(^lx7uMfwoPiDHDe~Ey|NebpHOL>kw`pnh!h$|y;RS+vMD8E=swGk(x{ac$041Ajv|rZ zkQr`@;#950{z!h6U?OHTia)Y|VX8EGXtdl!S#j8~8LacBAny#s*>!ZHLRyV7Z4CwO z$Wc8PPZ^9kl?VrJ33mHlKCcP%7 z%@jsu+FAphuBh$vwlSXS39DMEer}+hHHAMtgI{WQ9qy|T) z_r2KHq8ITh5BG@bH^+dkEu!W(s|0N<&z!KuYmevtP}@11jX{9&f^^}%ZF%d)?iP%@ z%Z-adzPmXi$NAZQ(f500OP$WNNxZ~^10Jss{_;|cp4J8;k zlDQ6w`c|Lr+Q>N8H>4MnU7_ljFTCl7a}+e|y8i51A9TZuHa=TaA=TD%1Y#gfu^bsn z=^jH=rtvi}=!X^72X8n)^Pw8oP!1Zjf}^9#eO0d6)KjtD?fREnLiP_BR@#He8tG~U zIcf!4g9Mq&VRgeDtHF#_Sw__~-~e(3tWMWNzF+VCe@si)O>}vMZgCXq>38B)MXg-I zbaV>f8Z3x==9HbpK@=AMZ}{cahm_6P;f|8mYGTY;SMHHgoxhk3e#sG z*ouQ`^DvPBeiXzNQ7vV;ZM69jV`ghj!i7&%IpCXPv1TmFG;l}LL|)dg``wLG=y}$L z3kb0MO{qegjuBKwvvH%fmG%Yt?tshb8wp(=?e&OLUTDF@Nzs-oG+Qx$-d375bup=# z(ebDq?3nUz{P&=?4e{ni&t@jj!{^7DGB9AvTKBC{TEx-IbJNj|1}{=mNgmKA+X#;F zD0BF!;`pRxG5jQzspA0ztZ|D|-bH5tUY_tWyGDvugk6`l=Vedh*o`x4iHDg`I= z3>#{|pjS;bwt7NBc7E(IMzwODPGh@>0f!73iwsRZegmnjCuDxRXi#0Ea+Eu`h8^8| z-AIjFGn=@Zh?$Q=z|B>f7ZDBYXRl92J_7kJ`fGqJ-Avd)C7t!RfOZA$!ZkV+PZ) zI9cd4k6@F(6Gy_dRV+Ix#4wd1Km{wN?_Nd_`k0Elx!oQ<@J8i_-NxN^jD(oFbeRQP&-fQas>M~Pmm&4V z!wf>33{La#MsmL#BR;d6;H$-%46I5JCBYVpI_!x89gN7nHyom8EH*l61$U@?3558N zASor`udiKeVHi5!f>5nW_@~g5B+1AnuX(XhG@I<&mp1#EQGSl(M*Y9kfMcZpU$O}P$6E;Sd?tAs(O(KFqoM+X3pFiF;ArDb z`auOp)ps1)J(Pm2r-rUTMTSw`H~fHL&yu00f%W0c>dQ+?XoQjPADzTYEJ!rCfSQB( zQ(_j1$VKr<|L^)HpPjy3_7{8gug}{H=)2`D321;@l};;vlvJ2ALygR3mmLdzdivaq z0tg3yHmioVqoV1+Ahf#idlKdlSGm{ zT~|k&xKe5%M_cdrSGXx@-MP2v7#B!wGl|d?N%Bb5_9Zn3Fpf(cFuoTC{h}FUv9kE{ z#e3#HU{ooM2}_>+Q@3EQXymD$tyB&u4Rx+)?i!QFKE78M7xU@}pxr%T*;vUsTl!*Z z<@UX~VKHYJ$gy%!HcJjw3@HiG)2XYcYi=kF%$QN~$A_wjlVXj};L2R@#38?weCjp? zCobhBy5tfi2UY9YIHuIIOCv=nF6w%nfAu!f5l$0ZC~KD?yS*+C5&&ATmvwyhW61H; z87iIHU$r2(^KFdNdiRna8?|IPtBC%Y{`|e>Zt4+kY@2J$ce$(UZW;KSES%z&ySD^r zkYeqRH?EwPrcPmNvTVY7H4d-t^r8rWrxdJQ?WLU58~Ybp#mvz;{D<(E4ySUH4zfn) zFzw4>?l_71Sc+#-sc(yr^#dO9H^+LthGI?(6wn#?>k*?zm=-X!@F)ga9_0Q-duj$| z_tbvzayU3(+-zQxg}KD^uvP0a5P@zg?-g#B4cJ_6uIFh?7>{qM$C25N?`Ep-U*v7G zy@YhEy{iGcn6PESi41nkGHzx)w13eJE~Df>zjt8wJHyq|Ojtdv(9m?1TJTUu-v*~F zN?O;)h#+$x$B3(K3b-aonvM1_f|L=asVB4)%n4;_zlaC$thzF=_)c6hOLSq=%Lzrx zg(lfjx6Qchx6?eq{bsd)VDGOR?FA<7y`$%pVV$_L&YtxBc3e{=4>COCZ-LbL!QTJ& zzccsvvS-3w296-8s%EWK*;Lfl)l>3wSL$5*{X6$A@UzEg=#V3Ts;`~$;`z926<&04 zGNRazs^whu6@>JD>P2#^kyReNfFV{m)p{PmOs!c_SyE@9L@oil$2cHdAGU^1sVG?{=}`aX_9{B~ z?Dts1FqymlC(?$qFNZF74rR-3o4>=v=ff0FxP5?&J7xCkf?3zSOVZmKIuE^Y?JX!C ze?V4WYjRwlJBl#tcu;4CEa&o-|ny{mt&Sz-l@h}kZ!UzJ)%f1bL0h_nYiDg zDJEH&4k(=b+jZndM$BblvdqBZ>(t#>bbnXB%CxbaiZ*qRvD-KC({H{1Rp1(9gSkGU zVp}Pio)2O)-p)9G=P&Q-iL5wH|9ErLY`YWsr#lb=Fg&~Z$AC%T8j@-cdnQmOgJXp> zZ4^j0U}Aa$wdjW;L}{Dph_uZ2+=pz85nzNgxqV##FwroG^>SIc z#%bm5>%KTueE^%gRc&8pVc)ha9ey=hMmtDHKTEGgZ?`FuV$ zedcHaKnK$T9mAilG947g^;g|Jhx#;x&<7f|z)XQzVP%_y&(;UmrUE$a6L7tjYwQc* zo|(3^Qvs_qP4rl~jaLxH#|OZz%D*Xvkigg*mGwdThue=Oo|X;^jO1Dk!l4j%Bb=D; zHdQfySd_)XO_cOFqr*Ee-RTsQ_3CsODwXb7GcPfn_ zGS)f{MH#!2l+(ALDZMP9LIdq*8o?{lb_ z?xpDG*#t{0IC(WG(9!SD2UF~ONAF`u?VuIABEcK@F*Ib@=#=a)|DiVs~$}y97-0<#cTZBDuh*WH=ztfE~LA>$c-T zD~1ys0lI<$0s|1`Se9Nnl&`_{LWLCf@r~dFIH{&NlKb!5z23h_IZfi9VuU)hj`>3i z_ntHyO?LJNo6M*qeaApij@q-wW+EKYyCc%1%5@jYkqRc(vosIl7)zc!?vapm@ zPRc9M7p(&))hwb#(Efd8;grhTr;X<*6_u&$C-x6x<(TBWod#SgO4*_!uL&#VrTd_4 z{N+U1S>8{j5FcxZVurMV{mL7s2kzC9=qeR14NYSr^l{|OGvqtEEC?<-Hq{0hHgRIy z-MCfvn>u?Gea`h@_&_Et&h0Z(VABzwCh6OZR=5a;50L$vvB zkdGQ^bd+hBY{nHEA{XXRwS@|4T(-T}d zISGLerLGbZ?%~mFu%F1kVn#&+h7q6DwsYYwHekh|;STr#J>vw4`c-JaJ~S!Tm%g6D zuXb?m&Xm`m`gfD(TQZ@=(4GVJ*tGckk{y&BP4+VptlL|B_iFw}g>dfq6S`0T_90C3 zV+~6Nc~wS9(?remph>T}`Y?qP*>Sq7TKHtZ)xMJ?>XufVo=km*w3F}W?3Ue#jHYV>>(*SbMcqd{b$brS3z*azz4)88IAYKyim?LBFY2aq*z2`8WZw(3 zE)O~SWAmo#Yr;zdEe|rp|j}@ORDgHB@2F@v$c_X&JJe)Bg6UsER9jYe~ z?K%lpg7gn+i8urW*OFvi{Frvh%y7cLou%=l{iG@KK;*u_OJO4ME=01h*ZFYcRD`nL zQ~{SI;CQCz+cy8k67FvHDzx;fN_wC}isdPgc6YG0CHB&fsmI)Ib)4g}=H?duv=rC( z99z@b1>ZK)+jFl}?=1_OT}Mge9`D@yHv$FDI`pq;R$@e-z5{cE(^H@01--WNljog7 zHHY6m9NABvNWS@pvN`pD>Morp?ON~W6ZJ(Wk?7#dx3Vn%Ps6l$pBq?yP2~aR%d1+) zNEC8TyUk;&PY*tcQz?cHQ(DTS)f*a)Wu)B)gdBwaPz)+53b1Kx<3Ot+CMcx06V{h7)oAdJ_;sxsjP8AoOik(QU}^ z`6_~HbEVMdG>_Y6)Y^jin-N#@hlM7wa>4Uy?4)C+H#&#!aJ2DLFHQ_xS#hj&x9Sj! zw`!c0S+69jI*_YlnX?vmZKKclJLYGTS6#qkuPBpv-x4jC0Gg@!+TS2GZz+vGqDtRy z=L}g}Px&nwT@w{zH5>;Ru97Gyi}9D44qe$w;67^|*-mQyRGikMPJCB8w0U<64w9l@ z{ID=tZ~t)!FOjzNeC6i%WMeg^%FfC8Y{BtcCV!v)z5?fPkftnZndyFW|78_THEXbw zt;XX|_=`$%@k;b6Y7Ct=9~}@ZDrlqx!;b#VjAoX>nCPbO*CETTgz0YAeXais5Ocl>YgF*sJ>LKg7kvCe$J^2gM z1Meeq=5X*IuAvMRwlXoRR_wD|9ads|PWYssmigL$i`F|Ju%J%-tC0JHZeDd5I7^uh z_0M3pB07E_0be1C$1<#VwcgX?a$2>}cmbW~vir?r0u?T_RT*~8{p@Yie#^iEavm&>@0(ueKOXm8yOl}!aE)a>Gk4cO$0qo^l_OBaeTrwXD#6ju z)`IC;((7_8Bvhfq>^9cuadsr|V+iwHcG{Sx@^u^OViDNkq9Y^CC;DS3L}z!4rz@Yn z^dL3e1lzLHvCnDy+I%8Gcu@FnLx_wSLypgSyP{xSS&>N&-Kc;HYjFScE2esp$;`L) zaka|CH{~V6<>aM2#L@nK-nbc=k!EV=yhI@Me|4pFzqq+>HJ#PPgeaHO>Di}vJ+tGF z&V*;E*>TX+xZft#L}8g?)#LiMx>LC3q)ID79XM|}$Y#S0qj#|d;>R`DXJ2?GOFVgbN(E+FF|5Z-+hjDHb?7p~PL;tB#u+{q6J!Kfz_2sg7gF#QUSmm6KOnqb!}S?&Qem`Iy;-|G>7%`?j8% zrwUV=<&6x(sd#yMo7HHEL)0*sKsSfv{rA!3788t~>YpQMW6C8;rAXQZk$}P9a!E<$mw^BNL ziF?!iHQ_5N6AkI|ZpgM|#_c|8Kc}ue1ewG<4UBY{SSOPGx>(J`EWgS0lPb?+ZNKIUA-k(w@QJGqxS@$Hn^zK_KaSR%9Cm0B-&o&xbWBBFRF5;Ne9u_I87 zEceZbeY0>>6zk{_Rc=zrCAxVw3E}zmI|W6St_Dfs*tc7b@|l`@YVqy^H7qGs5=pAx zJyRid7#1}3pZ!Ex^Ium>5CC_3ui-PObmO(3lwpkM-FRlEzT(*jnEI{Rg`d}?3>w_g z(x|=}`ab)Ybno$mPC|X`ey^383XGj8lLTzhm#C>kl8^jDo1ZtZljk?6lch`6s~YYz z%N?gnVw|e5yq>5We3pC3^1d;M`H9b5ZtwSpZ+?%z_@YZ-`%%%JtCFJ$ z7zcm6?f0v_GdLe_ZaFK)lHE(yKZhAV8X#Vo33q1zxWyoNwhx5vwg;4#e?APN8b5Zk zhKfCpwtrBx_st(Dx8C)s+PsXccYtV>!&b(QvsZ={VQ3~E^^-k;NpV32Kj1A4qgs_7 zeSdw^ZSEJTw`bo~G?U{lPh5mlyWMLxwxbRGzg&RN@~r7!LYGE&Em1sSgYbtP?pR!L zd$R(3c!p(nKKsYMdsY?w!Jp zKN>6Io9M6Z^v}j@ZzI?8SqI#{Z^xD zj9q)Iz4uyc&w0&jDz^Khse;p+EBOsfCbB9WCeFJ7valeDOdQV!(T!j&)WV~-^_h^% zUspu1(=+v$wKbNm%1&QdSv^y`y8sbs?9$G9v2?5Ck>9dk1BbBIGn!$4 z*EWUo@`U>_DNnF;%*=+k=8^s}fNkxu0Na8Vn;k~6#}}k+`;8dm2V~T5imhp`s+~Bq z?U}Och|Y$fh~tWTwQ*=U1s1|+c$eWNZdaQ6bgK5(z+r*%pE!64+THB0_w*zzEaom7 z#O;f#(Zgw-;RhWE%0lIS0<($q>0X$WIQ#99Otv(g=aoVHmviHaunPS@5~C#TPT%34 zvxZfD!M^V7p6IkCm6xY9+|gv#S?u{`%{Qj`e0oT7hCQ^)mKoiP3{D>BDZP)ik1ji6 z@t~SJz8flaQ|a(7dK4`R27W?Cm2Ldb{TRqyY9-ZvL(P>}zTTk}v#2d6L4o)0= z)Q*_L5g_M%m`#{Ub@)0drnlHLJ1Uy&ua;16WgcbZn;cdTu0R!reZxLt102TD+O}+V zh*MsFDYkS1nT>d}-2HpIyENog8M~ux>jicqD$Sf8w^~a~2F1TjT`_W5YcJ1{(mqe| zI#{gY zeA){I*I(NMi&y-z?M$TlL8nFo1G}8x}>lYnz zAi2t`XyJYfkCrjw?7vn5OzZG_wy@)D$KvBAYg9QzLAkDT)2&0rUg98;VhwD!eVb-O z+1y>!V%;tFnH~RlRc65AbAU2;8#ftQP+VdE>Iql!_jS$C?D!rcOGWzhiylJNRf&4& z?%dmNDoOn#a@{^%W(@dvQNl*OE#i4=DC7BgGHcYbAk(}XY?5qeAY6)NVXzz$Scrva zK2QUsTwktTNAy6dbu`Av3Pl>Wa5qx7r9-slK7G3$4sw~Zm0eh3pH-Ou6Q3*?ex)U? z1v$FKZFPa0YSXZgLMcKWoB(T~#hp{>_LX3#-6J*RV3l(dq1qT66XZ<@cl!Jq{l`}=dNo@XXR;9B0gQTG?tsm2ihms zO~&}!{3mvV*&mPo?_um{DRO61Yq~()34|X?_ND}3=UXkO+q^vGnN-ib1EQV2R|b1M z^QkMRj+pcedlM1fGc}%6+6hBW!#gI7E77z3!n@sKHE6w-FkAA%hEMBvl=Yq<#K|J56%ZP70 zIz2jZORQQti%LrRA~>%2MbIpT<&7&|t0&eKhX37CXJFY9+3r=J8f)X*lXa;ZuRqgL zo)5knw;O@Q!xb~pzv6Uh>kSRm^N?5})ja;Tok^FyV2!%;71=BcXI^?$dnU_~$=jQW7 zEe$T6N&d8(NHp5fW=KQUiBz-7_ov*OLdc0w?BV(5@XZ(9wEEbL73wHVr9-C8 zXBsn8p!rc{kyUIMAv-C{QJ$U#F6N*J@%>Zvr-4$?C;AY(e8=gQ@Ck2ssiCRdO=i+i9ZRe#|n`?z6u>+ERb?m4*Nd ztX6dvWoxG2@qVWMBP7z-J{fTROI~MD;Jd;p`!4I7FMEP04GUKTT|}6`rQ}B?hex*M z^UYkt4eRm0-2=a_Ag*%;)16e-9uc$aJRrg$qVj7IFih!0AfIq=vyoO?Q&Ksn{v-!B zR<1iww?wlexluDzf|@slKkQq7>+9=si>7)Y<+`N#bn`{I0}IpUGi&x(Cwi+>+8kXH zZ6)5)*JVKoO50n1ej^m3LPD~xiU|HnA zfOP;@+T&ce#`V_?6_+umZ%}B|_5^_Pi*?AI=j|xOc4ttBXK*6ETVNC~;z{}VF5i+M zz3jPmuVDG*8k0eClt`N0_lEMV?YYKDnN2qY=^>&*2p}jtQn51D)@k>Kc#Y-!Qv%Gyl>^^6bvv}z^ zx3cnYbGJ7Fj29Yorvh??#8iG*tJn8LH?9eMs@G**MqLn3v>8})n^ zn1&Fp7hZQZ!E}(ScK5XQrl_JkLAME6D~jz4nto|BgKmbm8xm3BW_nEdirMrBLb-o^ z*wThWHQuA!wc2xMVf->BUH*FF&3+$;w|kw7JiCqO-qX73tPoJkwY*>7xPK7BouKa9 zAJXOx)SpygeC)^^Hq(&_(EF97GbD346?zRyvW@iE{g9&E_KsyR=k3E9#1*>VnQgjz zxV%T%aw*>Qg=>0+I%PgJgA_poDsVfFSwi^SEV);7I*}&8M~%;T&oNVn_j(r_Fw3Oi z6Rw#u9fWni(pNc!gZbVoy{uo0#U(Fzg*LQpE$*dGeoII8=*U;y7q`aStXNSStp8fY z{=9gaK#A_45N95~czulaJw(#%Y} zdcutmGY)P>W2Tzxx#599ll*7Rl0b(5rK0-v$-}~`WcZ3bE;U{#o^6P{TaUx88Z?6< zp1+{zVcAUv4H|{_Pd@CGl;_2nFwddpKg-SOur4g^*A~TP7e?$_fsR8r)~7CmNo$5N zcs@iX(`D@M*?hD<%Hq+9rN4gLsdx2{zyYKckR=aVj>z}6?^{2%4z)_X_LdJ?wQ7;J zG|{YH4=g_0V)^z%uNhCa(ZKSU&6aE^f+z<$+58((u7At|I}F8dv2cvgaXfVjh0aZ3 zFDIX8ON+aj=EA?~W>;pzy6i*xs>w7dJNs?IHcO3j3}VY-%Sj%ENOStBLtD4(vR1#gM4$iy* zGy`)*J~jk;W~IGPbGSUp0lI9h%-g9sYAFAA8;bE}0>lW40h)C2;VSpq{qC6CK6h7_ zETFZYyPW$gQM^Pn3q_{K6}8>Y7ys($p>kV7x(WHL6){yW{<2zs`pu=j-uzB}!vjj_K+jHmF4TVo_ zEXnZLj&;t_qjijwDM%_p>ChKO(bHTm_3EZd^-U6n-0Ohc@#%yf{xU&Ot}Q9kCBt60 z6`I;wcjN9u$_j7OkcoXT_oA>5|EkOBS1BYBSbKke{A8%-Tfc2DT_|`^goTGuqQ%%s zm&lwU7tx?{%;v7?`(H0N{0ebFBEHqWSAg4L14`D2R3l_cB@Nfb&g+*AptzSKKpXkY z6yaZvo)DH@g@M8}D}DA#6zSI!K{~R^V(W|7D$&;Kc9#L)_dXqmEQ7Oq5fQ!i>N3(e ziM3!fJznr1LrP1mZ65wtep@;1+slDvU|<^rbd<@!sHjijTo>1uFUYaZr$xJ_i)z!o zSbQgDn~D{!!OTU|1=f~)Q3l#AOU8N$^`ny^9#Fg}Y($bI`#TtM8RgEMhp$j+(47xj zl8D7cHgs5NSM)bH4wX6wVbhw5T|QSF#ehW@f`4&ToNv@!RPbBv`7T_Df(LT{MC{5mPc5NMYy4oB6O; zN+BiTOYytqd`qh{!3ZQDAwE?AeYtjMH{=>qj|lRPz|0s9vS2D9gHCjIr-eZh#3GSW zkX+W4#e>`=F06%z|1p->{#RAf@cn-rC3BGfwVL4lS7-8n=|}E|t28wK`^{Us01@Ia zgWGL6fh}21>Jfw;kkPLYL84g~YYpoxT*LG)AXAL?FG-M0K(XcXWLXlVLpy4uape$b~DikRXh z&z{;S{POjz#G1;*z$LPItGo#?q6)wgg(>+RG@u6^)a}DKnnNEa!A)>Uo=tSC>|)tw zoW+GxC*exwLX1ngBW>tVXC-o0qy6=YybRQ6M9L@GW;8V2td&?yx(5Yn* z#}-EH#AL-aM9n<2uT(?@yF~iMRQWdRWk6H$!*MDWql`twxb52Tzt|I^WP96X2$MLt z^vp;lN4V=ySu@!#E9Uuc8?+$eJ`q*}RmihB?Lxub1rYRvioV|hRtcJI3JX3%sBtX* z#Z_Tz<+O?yy)N4*8!qydOiD5Ocu+3O-$JTYIc^?EQrQa?j~I-NFiu=jf9Gwao`0EVGFFUG-%k=+udM(S}aq%v-c5%+#nA(aLQ@gAv?wb9%v`Xp&9`V5> z@1NfN%xmB~^cX2c$q#y-x#=&jnuPC{H0nJe_jn4;xy>`@(&9c@m@*<6fYBFgD-E61jn2%fzY;u?0w>F!E}r< zvpe+Qj}6i)(1zB~ms!hKTU8Z%Q6QmD@6?C)>(_V_{u2yIkWo_GA5)F%)+*mx7sVm& zbr>QC&mSe!YV(Se6mbm!`!w0&JyFLGW(F|}BxU_pimgYH*(&ze zF_qd^MHa(`O>89xNF#>7rCeZU6{holx@}Nd%HYTTyToo3k=J!3qmk+)b)P(1;AQzm zxvkwBQf8sNo@_$Wtxf$}YPEs(BYmt)L+K!-5Pb+qj+|@iyx}hJCB3fwUReXIs$>7Yk9F*G?VP=8E=O z&tK+u$0lru!E*OI0Nd!svjHMFycA`&7yp+7&AV8%i4IQ~p!orrp+k3kML+U*fmff0 zhU3a`C{s)&0>*iV4i%R^=6AmcaKvw-rI-g?%O*DzLBM8z))Z01iJs+(!928jNs$z?i z7XP$Q3!R6wB)-Pn%j+iKroN*m7vXRF=+s^7x`)#gA}}>^K%jaeUz4taXCehp2OfVJ z!_<{a-`2@ttrW&lEA+NY@eUyg-&aoK7GCa(X>7i9{Yx$R?zE2>pT2sR_*d6m*ITkZ z*Tj);Bd^1xL7h^iq3NA-!bx(LgksU=4S$>^#lom3R1#Z}Uo~HIPx}xlC8DF7>oQ&o5Lr|yNn~cGp%Gg;M zb05u^J#+7Iu)?L-VL$OogJ#^rR+Q^~=xCmYnZ2}iwe9SezMWO>l1YJqh&%lRTM2Wt zQ+7Bkzuw{>GJzDuEm(dnP5GghzZ={Gu+X^Ui1(9quuDm;L{xExByCQ>Sd(~Hh6D#L zjry{n!S_p*R#j%_`84Jx7Lq!d-mi6!F$p=n=xd`9NZ5tUMZk5#tyO^k#KvUz(FI`i z)VB7m$5A*TRK05@c)dV0iExX7gtFl;9N4-0kX44E)`d9d8#I=*fYvBm^@W*X@Gr8( zNI*wq_m?kD_e)7UwLg>mD-rPJ!09SSS5#PwnNPXHCbc~d@2exMnkHXAf~3!ch@n5| z$VK_st~e9$w{`qn;r)P#jUiaFU|#V#`NmdJ#5*Vgg0SMC=^3%E*R;qR(k7=p?)`{; zM^Q^(Zm_qn73#%s|9kewvR^U=Pl+qI1-?dIoORAx&pHq9fr}(@zv5(jHN$a8voz)1 zS4P;IRJOMn)$>GIp$1Dr8s$p27go2o5gCJx+n}zPlasR!tvrc*2iNrm<@ICrlY-tp zG+yCV#&>i_{LFF!+-6Oc)q$yeNLa6;;Kj5AJ2+SXa-V_^_$8B-F|Va~)*E$~&br9g z{m{)_8WoU3#lhg#%#4=CSkjXn%f*TL_wO4N@!~Iu2XDHvxxWO0#olZKhv@M zL}+T(Dxp5i)|8+EXVfLe(lx+WAEq9uEV6|@w2GQC*fTP_HSIci(ZP0_7VOjXYR_m( z@9>xXnS@?D@%(aLAy?|>l2o<>46Nw+7*$z-BuZiuH2v43h+n$>Q&emT_dtZcTHg)W zR!bgSmg=_kYkd;l>#KLWhp7gpe5TRhM`l!|_& zA5%QdZtjD()Dml)rG>ivudG=j<^;>w9Uw`S2Yy^MJo6tXCNQwGC`wTkK&IUn#A4wJ zS*h?@cGqT{KcC@URSaO+6;^R~wxp7!u zqs2&kdfEoX&h~)EN89%9`dLZS%4Dobhx4pPQUqsP%+DcTc{L*{cDK>WE?TOi`KsR*z!1| zqmzyio^NIkB0#8D;;c6h^PLq+gvg~u)*6-1C4m1KGITGIt_{ndWg7TkWr0IohLMxG z{^+Q=XcQ?mb33kr#P+VOfusyKWk$wODiS9yTM2GmG#`e5@+G-a;oiotZ}MFj!1M?& zi2DBCJjm~*l^-JQ=N|Xf5uVb|L(o0x=|gGi2z$|Ck^{JERAn@;M)eULD4vn!W~AUlU14$~LUJ?|^YXw%b%Qv2jG*_l&dI#DI>^q1M9nd1{O zp3vmG_XaQP@JK`83a3PuVQO!%l)#4nF2)i6V5K5@n?1k0O6{}U@I(i4+@y*P-=caD z(+v#@p?N@*6!)NIP;q*r=R{WQWekR<*4HL3FB2Y^I)kAx;17|^D=Bv3+T|I@*2HF` z-XG`2YMT^yG#le`s^*^u zpff#6bkwGRwXY9K5O&SKOQ^%*lBm6wskWT*L^37|(cJ&8SLT(HE5*~9h?MvZ_3(OW z&{^Qd#!kt0XY`zEOTQRt;=rk27;bgwYSeQ(u7Bb6$+uHzEYButw+XX$c;_Rm^@4|bABz_si@qo|FYRTWN5zg+n(J>G$EU$y?Hnpx}K8d zE3@}9vLg1>tVGv!=i9ET5WY;9-c+9Zhwpp7;vd^hPirWr=nmBH5;Dq%Nmv%HWYO8# zbmKt4HG%%)F+M0nMmHHSNOr>0D!}1x-OH;oae(!(!vVqf5;aq@qC4PxeYLlUgvj_2 zy#>!WtSRO+H&=xy;>;xD+m%OyueYEuAhaB+bG_3l2aiTaJ_J7&ZZ(#krP`Zn!P{rK zVwRN)>r1jHRCK&U+ZHC~r=cZlYtnRNavQ*mm>Qp^5F3P3qrSvw?+MW^L}XxdilgJD zhUH};7jD&&$~;dsf{t!mePpoG^F#1<3U(>E-Lgvg!(zVX9eEqG9G+l4>t6130tZFl zIA;OZ_BAx;ba3Op6Ht@yOi~K(A488 z=U8xMgBnIYD$B_n-_#`ZT~hwt1slhuDk#FJp`OMi zxG%b(qI1MM_{x$p7p#h#FDK}qma-;9Nj|4dHq%_*{n-3-`?z_DaR|Zx!ZH_ zELlIA+urdn3rDCwns*kk6PW>OQT}x0<<#Gh)&Bk6Mjfmn$9X-tETU`T6!F zebWL6B{e#=lYbuKe7=GXCJ3cHy~XR8l_4&$J~Ro}0UTDBxQy?Y6(AfS%kr78@RG$D zyI)hwPVbB>KMoB4%|gNGqVs)PFJ9Pryc}9IELt)HomR@ZybiZORqf^x5lJ`H)l|o; zLWzASaysumM5=4+!r-n&$In|=o_dR~r+zy5HnS`?HDmlT#l>jW+m+PofuPwVODfF~Nov~%@qD*2ZtjTl@65geBs3|dBEXC5%CZ(Kio-cAPC zyPUuPo3fqK268pA$+<&r7(qR!4>LP63O1O`sK$vHxCjV#7wJ+`;lYI-Z*)OD1+Qjk zrBWj4l9pNTd)-qUOLeOO9-V)>GP^J37G=EZU|4c3yX?hO_0{nY;j8EKTKN{(y>7K8 zOa@NAq3JP1$r4-;1Q(*iQ9%apQIT+QSqh9Rn-k$`r@rM$gAsiMPzFuk-Rl1WD>fe~ zfln{&ePltPota95+3=strQF?UXilz9Nfv4U!q&*8gElv*xF6|GLbs7rvzhhPh7`rH zfx)zywayVqRF;%%G^{aDu6NBK5nZCJtaQb}8bEiQK4~f!JHry^>OX&Y#bimtne^vH zPY6pySFW!%wcy< za4R@J=oJu~PuXc_-S8E^jrxRl`30f#GJ#Hmq^JDbYyej3ef)y=ewY0MaUVkTSD~lZ zEPUZGN#@*Hq69blB}uj)5zGK3M)$8XRn!HM^N#Z6Y*SEG6gbM!$|WQO0QhD#reEDY6E8=>_*2Q z;9UU!foUjG@w)0p&pe^c;1xV=D*kL2wiFifz~N&l&g_uAx?JFCo41=UojJ04mS> zpXh*j4Kh_pe|`Mz1&3 z*S*o&?$knVWR&JY2Vd0gzlHuE{wrGYT_YQ)zZ-zfSIKOnE9ZZ#Xn`=541rFBtsnc- z&AwWl(OOed;TsBe1qtq|Ue;r2J!{}`+l#q$A626=@o8#J z2+$%Q*HLjp#r{4HdUJMx3J*O493qmSq+t=I_cBlZ@Bg;b!=qlHJU?ecO-zjBNgFOv z(!o&*<$hz&z=`1MK&r@J!XbC@>a~$u5lM6k(asS{Sy<*494^e-cv9$?&)I2a zw_Ng#5&s=%*99h*0ws%Pc%M8UPYd1MB9yy@iD}Mw!W!Vz`theMK1CW zGybe-jt+z+ce? z+W(y9=l8$h*VDyptOAbyz1eeWxgj8-5OH30#J|5z!cFeD`zAlRv0cT3n0eBW<8dZR zmReGOrbU&jRcP?a5-1%1K?y5^9skqTFyJ;OPE_iIzc*MYXzEOqq6ejKbq$fk{*)K! zwcPn}`A&T|q(7pnu0Ql3NS(3epU7kGgW9wymQkubC5_ZEb{0ZXUFP;W&ifIwh_9%+ z^jGKWV|;^am7_M#>NbM+?#L_unS&3eG<~=pscX{gxVEGtpw%Bp^0nnBL!Hv_n}-2j zXd!Xp_jSA9GlwsdPX#t5a%3Q^P=7|3j?%7hX)$0Lk(oW4nzOc z$u(1QZx!2wzAtpBHxJwqHxBC>MM-*dT)b z8pI=~H+k~8#e;mOb0y5mRq4uf+3s3p>}`&pXgi!W0m18eU#Zy(6{*uhP9r$Hah3p= zewDgp2sm}e8knZZ9O3yM$;k7f9A=&2so?RI6xLXj(?MG8+Kjh>tH@O5w1A5q@pRT5mfXt97R_US!uC&0%gwjTf@!z)qUV#xb8i!HHd!z*N>mx>VP4iH=rRV+^4Tc93P46rBhE4DZoJUW{8_|t*>}Y>Q0g`$#Z!ck#UMWj`Gi1YF=@7+5fO|>vS$+p0$cYNb(*uQ>}@O!E5Bkc3WGq*HS zhJ?%YPQvij-f1ft=NV0DiDln;MNvmZI{9ZkIbdJoQ=ea7^=Ms2R;A``Jk96!ke2o}FI_`LAN#A$k9=!=vg2ZTFMcE1k0hbo}vp1iB4-lnuB z;&e1geTwmao#62UhplNVRG8K|?oV^B4@WfzJ-*A&(h_vFLwT;6ebocvwZ zod1@q*z|#B=KqCp4RmLNqCRt&8!2`t+`Bq9SGJiXQoiT=+SmWtgHRHc@w&Ia>hl(( z{&Iy(+TzY~9xQP4vEjsO{`0VijkA%wY<#TLQ3SH5Gm-W+)xPU9Reeiex^q$JGX2@} zBaTCJ8+ylR8;j-Tvw*N(*d)%D>S!J7>Ims;O9)NQN=mBK*^*T?N%_*X=Ct6erewuF zc*(}#Xd-Rm&5AAwtVeisZ2H9{Dv(v1>C5|#p1{)|JbJ-K>C)QsxR=M{sGXVhH;v}l zu>Ry;x4qv`8+d4G%)jfF2($ZTz?KK?F#UI0DeOx=mlRjRJhgPfQMGhY7wyRI$=AiLVkO0OzRW^L z6Bb{|bNe8W^4GEk;v3o~dFF6Q(sn(QA+Nd)PXOt&n;NyO3c1{V+I9@ZPm7D?kt~Kv zWAn{4m*@>BNmYfj@LC!FXdXFPsLV*2ju?tA?UAnfD$+v*624-cam(dQNkSS%uFx_b zev?x~o&qtdR2kgEqScM(1wMFbu*(^B-n*;_s^_VlBO=M3SDCY0+UJjV>7|?}>kukf zDO;4Y1@qU>7nj_>{Ibt?Ye$_eQ>kN~1!|1u*0=!RgI0)WlsIS+VkJ(F{1Hl^ZF_4t5g-v zTo2ND_wM?osR!Jh6a{c+t(&LoyUpJ%ym(S zDMODtVcw5Jn1+Dy*;R^1wLV};0Shr_3g%C@7?YD zjyi79cIAH{2bg|Eg6+C5_lqvLC&b!>*uJA|rmtK^+OX_idH&KB@Kx6DYOHF%@t8qJ zE5>a4XFKi(z{2ALhC>x8A>Vz{Ru>RFy7O#wUb79j%^~vIlTX4jumhJC#3m(|3^(kP{Y39ysf?Jy(3b(5+IptsDgvFBe*JTP4v$gt4_e| z0COlqeg?Yye+(baZRLo`ouzl1wNx+Gt4R%JkJg*EdL7kiwP(ohaYeEF%)th zS2{4l1vb?kf3vx&0pw%?pQFp;W|s$0Cx2(_v1;dKrM5+xh-_ieX0|7fhh|C@>%DKh zzwV`}ud*De*_|dy)_Lgyz&JSaQv)TTzFfy_>}JY%-YhLaQIi}fk|SRe5;cL)cK+#d^x9En6tgEm_2 z*_~B>I!knM^s=uj0$V*^*MdsoGJy6$8Cx~(;t*;pU1UbWEH*aQ)wxj_R$w1S$w9Us zl)RqOG#*mNfHdK=@z5f;-@?-I?J46N3Rlo*4H`@zPrS=dmfop?o<=YmwWJ6N*TbfW zcc-luURv_S6hK~i%`0Kv=@ki>Htczbgy;rK8wrgUNh@Y8;!a;Vg@M)+tbA9~pUy_P z4n2;ix+ovuN6zas&_)g?N!|%a6*;mt{lTSeiTuaHWcXtce*$}o>Xj}6kY7f51!c#E|5a0XyG$HUYFE{yT{{PHupyME;xR(WDhv~Gl`cIX`PeL zTKmNZq1_I{o%VHAU5CY#WiW$_zdH*ak&MpR!}SH;fm;7*f%gms3@6xgwVyelWFD`?KoXNd7ldK~)Lz(=^8Fo3*-b>OQc++q*f4PX@ug&OYa@(V8F<=doEdcO% z3>*9bQ)zkE18@{Bhga&$iuTVzzSvP}>da?5OmE-BH9YMYaeRVM-3Vdh< z4Q$yqy!-@1p?}|ahxcz z5O?~#raxrx_fFoPY&Jrn-$*8q`8u40mml<)X(@wz4wOGtmaxCYWcYeg!~D2lBH(1< z_^?%!h4dbNSD&nX*st5x6CZ`Ec6?^o?kV$fpyG;b2hx)tQRY6HY7j=b>jU|^wS2&1 zHd&&!f;TCF=iF_ZE)fi3nQJLTtJSwly@nrE`gPTwp62)E+E2F=Jnqit-DnCM^fI0a zt%p^kCg6*(iaGG2Fnr2RyNe%Z@majUvvYXA4@C0g0W^X$56XPiV#W2;myGK@Y5-*( zQk+p@u{IoOO=>Ob$KkmD!;p~N&v-P|=L?LYkHhZum=i9ewo7g--ELj+9@s1peQDd0 z5wfl)@0)-nEyZ2R4&E%=QoFn~TSyw0oh-pPQ2J`5P98x<`J?ZAh)zc16Al0^kA~oe zpe@C$h7r^rw+6}3w4j1I2@8#c7z&j@*Gq^u@36Eyvm^V9kB`cQ;YW6{7jEMZrG!ez zs>q&mw|!MQ4e+Sh4Ng9=gw^nBt}f8jbO{B1-Uh)nE8#*cl->! zg%X0st9#eUJ*^W3T?lxnu52lP#EK&zvtDlMk6g-qjc zuy}3I+G%$TDhkghlcSJE_V-ArDPxOZNUZmpYFn%mecYwxm22!(0TN2LN)0U1#HC1s zw>c7#dH=bmK|vK-$x{Z>|xViJP!i^xXN z5<}YxbGG0OeIm?KBpQ3}ID;1DCvh1>Mq?{8>=CJMmg2IwK+df1WEkjxxCf~T5-}cX z+BceXL$~sS8&At?@giE0xn)M-EjdPgsEb_Y#6)!CoLwba5=-h;>9t}HdQ`>#rUnff zVG2!g7Rt10#GvzynnIfAclZU^vR zvMGD@q&MzJt@~1DWNH0(5e=;dwzBg9tHDcBak;*kocld%I&Uo0(KsieaPw~{RLO6e z!f!6!JPd!D&92FKCdV`j+JBtC_&72VPBXwhEeYEou%Ytw%kKUYW-W3ez$$c*S_?$e z;w4&xg~%605AdXK9!mJy8q3(eDAJZA2IUe}mfnuu*#%HohCZX#^2h(VOpA(SyR4JN zM~}iVWPg8{XNnSGWmTOwk4h$RQ}9|r;b+|X;vg6&m3rvYc{%YgE408}0=0VOhNp<~ zfP~JOCvZ9j_cRoeDv>eyDY(Zd{>XPE1{W+b3&JLSGF|p?e)+hPZEm;*iv9-6H?weL zCvll|-YAeSGyugI<>a((;d2RFs+z@oEwQJ}?MJOS76ieYb@f5*+Fl(U=OO^vlthnN z-*&6KtsmvWi$FMHp>P-=TVs5z(F{8RT`EijH3E?)yEZm}GEO2IQecki^FMu!O&Z3_ zq(C3$W@D58)A{ZH2Tu9dEp46ua*9v^gREt^t&Fl4f;(XNugiybMJ=&r~;i$qa)t;16-% z5){VYOF^*H@PK^%I86{WO1b8)N|x0Fk&swo)6dMEg#cT~Q2p44(;!3=L}wF$fTE?t zrNF85TlhTWja?b`f{9S(?mxP-2}tTl^!4N*78#4E zwUQGosp$U?%;8#{aM0D^Hk6(sx_>5%NpQ$z4^F=?QayjsE>)b1#M+`QMinUJLqydT0GlwrejT5B(OAz z;?@!LLoB*yrdgT(epY#NmCjQRi2~VO`(5b~f7%&cMq4%HepR*$8rUfQ(xv>@vowTq zJJr*Pu<4Zbzck{NaFUQ^t!%wn$NS1FP^4V*FuZh=>pqd5sj?fS^5M_c9~k0eGd%4h zJcbW1LH$5G>Y@SSg&5`KWj{+S>uTlxC;qN$j*SCTtoXr{3P8>>kHzF{N|ohx*)*5} z$yYhQJI&c{I0+I$KFh$ho^q@6&uF6C=+pd|DRGtoU0>el@rQ|{hoaREvjMD~yV1>) zRW7b7_EeSNjH%P8Nh8=np~wEhfB)Q#Xpcg`2#4!IjEB7H735R+ zo2{zN@{+79h7xiT*pGZ)kbJj}&DE-voKGHnxN`C}Ujk=3pob(Iv7T{chW|8Gw$eYd zZ_Bd8>cK;i5%bjeJQWdD{IQMssH)OL-MB+_?e*aruJze&InmGrn5vDKxEEL&ga%ftl~j)vkq-t#aDgPb$HtdUBz~7yx{uMShbL|?Q+7$ zp3eQlT0k3h{sd3orBA;cI*Pt$;7@I5tDgz;Qo({%*uk(wJCdpuTi$ETq}k($ENrph z16jI%5{W8;d*6IK9qF13E4!x)4b{)aCBmN_vLDym=N@+DY0~xtz12{f>+}y+V8-N! zEJqei^2DzwPJQ9#4o)$O*~p4l^^1Ef`NlY9Ww_dQcXg;Mnj6SEYI6RB1>R6=%k&nA zelHF`{kL+RwxUR0Hj&Gxbsd&i%mpE!Xis%m*)rq|V~$N81B5G_NtsQhv^;#b$dhR) zP1`{+DCN45#S7X@^&vTJ@|38?T3<^PXE&Z3axx|#7kBy-a~{Vp5F@)ka_hQ|fL_8? zUfoKMD2=z5^?fd$R`J{s(vHj}z-ocLzk$73M8Epm#`S%CB37i)f20T5{=oFW;X#so0@${g`Js@PoK7~0C!+(wmN%j z4SD&(1@DM6L)G3i-lq7jC1@fTc0`%>5T(q%>xJNp{$+5Aheb%ADHJ5_y5iVD>_tjl z)~W#<^ditKb6lGibGjb+A!7(3gC2P*<6oI=zs#1O(sFkRYD7uyymsQE1s_G7Tc*(7 zp4kt8KhEjK?dw!W+zsAFG_wj1JftZvb34nRo!VYTMIVy*xA@Fvq=jkkmhL?WzI_e`GbGR;z6}xM@@JU(k{G;A|FxQ zPdP1owqHS^#U{9L0Kc(zrAHB{1F7PFGDZUw)Z+@` zQQX!K!@J4baquisvdknwzpceMqj+NAi%5%V{+9(<3%+$MX9PIz+xEA1F@|Q?VUM_2 zvsHJr28z1Qit=E%nEI3j4$@ecfR8mL*Go?BY#2&b`Z>pZDbR%-9PGBZVdI2F=OM#v zhFBZgxs=!dB1f|0UPi~|9$GK+J$K>lt}xvQ`jZ5NtYsge9A!0iTb@Jo9xADh!kVAz zH!&0$$rA2EDU@o964@HvFe|G_EFB2;S)wn1Ae!BCO_f(W+z?mGX;Qh2jCdR3HI+yE25yR?-+}|M; zGiJ1M;N{Bpe1w~fc|yyzfoYCjuxvEVccH6|E3U0gSGt@4z)(0u=t@G`IG69?h)mdl z#=KoJK#@Ya5E_?2T!+F1=euAAcm6y|^YtASpU^WhG5xO1)ET@CIXVI4QGfEcKzkddlW#NkpAFZ?QG5KX0CcjjOnM6>; z_=v>QEZu=S+iPIxYz;4BFVQJ^m(2g!6);lnw>P=#G0OvuRunaXw!1^HTW@9zxmYj% zMK1cdvyi*E4s-aqnSf%@f5q=7|1oExll{;`P(T;D2m3J?vE+E4;&9GK(!%P~7T3)} ztDVNoVQ9tXjos?8&aCur# zki(D8wqEC}_Tk{1+srq|gB*2($a4N&qlH*+%eBfB}hH7*H4S=l#TVF#KT9FkkheGyCY41 z>B&-MiY+sP-A0Msk93)L`wzH4v8&ulMIZGQS1T8zK6OoFXNQLODcN~&Z~ zUbh?Y9>FGoQim=>MF1S4OYu!GBhY|0-jV5MgI@ioe^#cfdTni|1ZtasWtGx=g{&7N@VbQv=@;Oq&?^HydlEmXeg z3!i2;JjNVIp8|2s6$S9%00&S0eL6~#d*6uSKe-ygd(aT#M~C_^A%lXKDuRvx-|F^H zf^TbV4FYM_zk()bpfd3*@%v~(R7sz&rvW=O5PWJouZ2&4)zD-#gMzH-bEF%0nmE zyY{r%QY&fuB5kYCdROk_eHi^=PQ-f?UeA9#1ZkZ0`-uP6{9>{SMgvM_DiLtA*9|15 z_{Sr;>R>ds)A+u#kGrA;Q?4y2J8L>y4LV~LuwSUyw9D!VAClBdv$#32ERd&rT%tEP zhT3Jce1TUV)hXBcrZd4b7UfUm0KeJwfjw$F`!p{PLifSzO2~V@y#0WH1uHV?K>IKY z>wJILk~b~P^<5!Dk|v%E*9Pt;;=CATk^%-K>lU4JR^&xCloURX6;l@Ycziq5ABj4> zpG7%SBwXI@fYa|!KMyF*(UCV00V-up)UQ2Tr>SOAypebQJ~D&>nmshW-hyJ!&t$= zQhOYi`Dj1oN54VXNdcL0KSih6-$#psozMD2eij@8j2)r)ue4|H7m!&#?J=)e%~?Ix zDDM&|RJLGULtkr^=2pFS-U)gb&NaBkL?R?4)8WbKs|lmdnB=GTAJ7T$?)0d4F75r< zs#^aKI?6a=3L=Zz=#N?J zY`uQ56gk>7oc;m*LgfdhvrY4Rck#=;weFholc3z;zPEcUu?UMJZZrQzd2V4koo-DV z74BC>E*EGOKLX6VCV z3#2(an@;Tr;LZ7(_cC03;P$&MLF?(|n2yU=XpAuDgJ)4Uk1F8#Dch6r z-}|>BX82;`*B~qcsc(PxYM$pDbflGEj^B13WO0**K7p6*yQ|cff*+l;wG^v2a%bE% zb&pxUrA0&n{|Q8s$r%%Q{z6eM5~v~(C_-bND3U9bdsa;&EhREcGA391NTgsg*w{`k z3u@aW)}cDKl?~+%_u8n^%$s%bm=y4c7ku&0zP$A%KH7wQ?LmICTgM&&xg%AkniaiY z)uqmK22RS98OZ>4lv=S!Q5R&-4A89^IyVFoD6e# zi3~>b)M2GhdD6DU85hc_^Vj!mS{^cpv;sf$8P2pnJr-=8SX!9*JTj5$2C#lGH$R}i1*a>6e7!h7)tzR(BxB{G-ilod+L9@ojCn*ns zjaFi@&vToikjJO!h2D$UGH3e7+GsUzwQcw0Ro3{rqx=L*oj4_`#JoHrKIfSCmaz_p z5)WQNH?}4dWpztONjV??q`T9)9%;)xIZ8^txc*tHyZ`5&WwBD1FF{kI-t>ei4DH+E zmg!}(!|nEs%A3$ev##e!4IN}JypR9~2Lg6jpVBX+INvjaJ8a?#?jT~pd2?{)2O%{a zojeR-TSI?`DI3N21g+)4wdBL@V;pAE0nNpcq}z>jLsfJ=G$x-thi11Ik{i5hQarn? z04l@whwp-F(j@zA*AG;lj^43X?^ao~r5)I3F++#>i4429iLCDuv1W5A26F+Q&}I7L zt?gS-`ThCKH5Wd%|G>kCx{mG?-L@(JPKY?Bo-|ctuh92*M|f{DtM&FV&xk}BSg>&R z%fh=Dp~aMB!R4*eZse0rE-fjpENq<#o=*+*56{B{!f-YrCgY3|g06??4!`S;EA95~ z*X)ccImQnb2)1|A#AD&3<9hL=jJVfy!62~x z;S@%_kqHcWp~5GIJH*gl?SPloFzx0KeuD@bwP zk1-y;PFup-hw`!07q3?QbF6f^eG74cXlb(ba#6`=CUK3EoBgJ5veN;(mcava)`#2i zg^GFX0SYlG*=eSvCAvXm3W1yQ`&ki`>%g3S{iF@q4m4>=hk7g##C>vs|;y4CQlZE);m0;WD`j7}RKzRu(Ae$J@K=pQqRv?O^Xi{}y ztvL7e^kj^PHO}}_pkEfOksZhF_}#>0)}ui;v32vMQ=rbvsc}p@fIkz(Vu`3sf|8C# z8VYCzj}q_!w@CksF}ZfYY1Oc*C?En?SLQ7HXQ<64C8u3g4%nsmyVvzI{M)`~Q;p@e z0m7iZXbp6=tLfU1?MM3+{zI%_Sg1D>R7J2U*ky+0i(Sd{X`qnuPJmzkvwQ7q`5#T6 zbj)!_uihORW0wL_A8RK%v>U937oC$gnu5X=DL1XFw)LkUzaP&kD*Av>#@GddoUxw+EVU!4wojHvjU4$WKc?* z`AMwqn@2`|XSNg!4mRM4&*zMnbnSLp5yrVCfyi}h2H$0V;tyYqUYK#`%-e58zY_14 z#ID>9-Bo%nGHs1Cb^qi4m7oow~YXya_YSq*u04VJZx2GEGK4T3mN}SA9lUu5{6_f3*@$S42-sc~HDDhf4WuBhS(=Yj4Q)Vf z`}ml#J1ZS6Z0;Z{;$Y-tNb3V`o)3s3cs-~jP55VPmyKLo;gtdfHyO1=?F?{uPv|we zK%u3jrOg2i23YknoQxUZD=u@1l-vWli7PuJxfV3@^Hkc*vDv!r*q-JB%?{+YVgf!Q zaSS}aKV1^90cf)C{F85&1R;C1>+WSOCbhdmjT9p`btUcW7&x-JJ%q34lyr3?SCf~3 zIZ2h<0WN^uwsj&Yo5>kN?0ZIN!|VPNUT40BL8mKSz^8ED=TpLw%2Hrn z9%)2G#L-kGU;e;-&OsZKmVV-uBop@+o}wh+FD*oNZRv!@*g+HxmoTbl+n_k`RSA*t#T7yOzYUeK)m0iKAuA>+} zbacfWg$Z$ZugvXduP1(har@CFuqk_%F9+9!cTfO7AQ&2(u69Rs6t7#HOEEW+;v2Jy z$My7k*Zyuw8vDFl>?rYm)~wNF{A0>|BjK(DrZHXCSkUuK~UQ=sji> zW&nZb$4@haJJ>MbGm-YNB%4i(=U*sq)$tpgi>>8C4$G%&x~m8M#oI>fyw&|!=S%Y6 zNrj zF0&6iD9bM`Md{)|2I|P{5vcc^-f}(lQKj2y$ql%bZs_Q77?dBUa?>NXy{B!41>wpb z>CH=aKpYsYa&)0q<#Br3b(w`{5Jzs`&R)&87CV<|&9X^14fiy9DqA*JQdUuLZ}TwH zPoky4tn(Id$#Q>Toh|ol|M(dsH1CF>AZfB#;zV~wU$UK@Z4VsXI59HKH`ozpdn(c% z7A8l07|RHKC6TA$jvnY7u_%Y>A}qqBLPkln+sf!>w9(tlF{{}fW3f!N9Y_=U_>#|S zUKU(#OJ>7%utJHboSkCZV-dZvskI=oY-`t^J#wWjrA3gs_m^FfRom)pb#|`-ii&?Q z(G$XUT~ppXI(e*q57aD;4j&0hGYUBDaYmi=txvq^!wa&1dhD}(om;K?lvRhRFpvQ}I0J2%RshW2G1bY3u z{9tt|6XWUWdtgCp<16Gi=0}aMtu%dy-fCt?BM`}!!di;vQ=Kn2&puMtKK60(&u3~A zou1+^Y8*X5an&Zp$YrWE_kWv5Pka?aI9>>0B&VOAZ1@KZKpZ);upn7F*a)%OGlpwJJ_chX2>|&#v z$=^cOEFuVBmDw_QmVQn3N90&sNx&5eUES{e#F|8VNd>4l`ul20eIKzyC0w1WHWwvi zcU--9Lx2j(#-VEWJPF5`>Bc8naZ}W|{HX=rtEH0&-s#bT@3f9lE=qz1CsMC-Z43AP z7x-a8LULVLa8N-OQ>456&=7$+4d3Y%1BFN|VMPA3i3@j)`R`$pzpCI1(*n`{KOAIW zZSs4oK#VIiG9U}@c4ror^yE`hVAl1m=Dz~e$~)?!nE#38fgxQ!fV}@X0)d~~PJ&DU z7p~vTVEs38~)#V_AxApnTg0EAgH(NQDL$BdR0DpO0h8wzR-d@m)HO zjXW5mmlO}c#IpUzQj0l%1QqZG5-5% zGf-xIy-sj7Z?yyaq|`{cNgj!@su`CraZ+R`i`dLbNM}>?XwZkFE6J0caQO0HYm|VS z(62sf)qaafQa9r|$tX%eA`@uoMoFEaA{P=z!3X}kun9z#jt_dz_)4b+{Ka|HDXE>^ zdxZ(7L&0#;i2v|kW@!i%y$9cBz=ZH*6-s_4PmJA6J@j9r6ytx5Qhs7;x00pK-GhJ1 zpSk=0!zo1s?37|zmM{>)hF-z-L=}?vp`uk_3auAmrC8puI@JLW6|^84$<#O9Y&4Lb zfvj8b^^`?N3365YSfjN`5oBYG=atI2cJCjf=EdXqcf6DVtJwHc*CTLhDNm_|GB+fN zGv@dbNq=>UVX@_+*9Hephl&B9Mx(M&ZME>rWAp06D0iNo%}&pU5_#BR>V*zpebOiL zvBq7}T&)HB><}rk7}G!8d9!c}n#?aZZpf$nl#yNu+zn^)*rKAKW{W>r+7(ItvxT)S zS4}vb9w|Dw?JWCx;eVgjJB@2+9;;`3b((dn^rhCqv^PYDu*4+5fP<=tHDwj3WAU?c zH6+_Xbo@vWiCE=Dw+@z0YQDKsSfVeIGA#B_!DM;Q{1(}g+fC)j1a7v!2TK!n4rhUTKq;?E36T$$gAN#uVWt58JI<&WPo{#>zI2zs;eZrNcK643BacQVww1)#50k(== zkt1gTC8O7$8s@h%13i_a?cLPXry_}_QPp9a%X4!NdszPfdq!<^lGSg#rN1I2%x4d@ z=(>ci*z)@ay(ncoonxl~@{umt6-nKfLZYFi^jzhP(91No>xLK#bfB)7=?2krKH38A zmb<)(x2rqOtS9R9i{$$6nkrg6Knyn2<(8w+38V(tSakv4M{{`m;jO3|o;@4;P6OZH z<4JN8_;I}p4v#DWZLs}WBR{?qa<`?+KL*;UoePdpZ4w&mMvDn2`%d6*Z*9%ImlwM@ zp8Vv*Opx>2DsyHDkcO8K$8;atFOTzbt%1$%5NvsY3ffIIebwhs8j{LG&hKl0 z84S}&o8H7F?XwRb9mG|Ul&30|z%DV?uG2;D)>sPUo2=McN!9ht)5YT|yxey%T$r`F zF=D(ln;|R#D}mSBDcp>AnhAch%PgF4Lu%(*ynof8wYr;NQ|@#Vj16%4&7p~W*!e}{ zpAij*y;e;bM{^)cZChqA9Vd&a8w%MwY-)wO$xaEmy5V`u`P$Q({R3~^w^hFAvlpGD zNy9-&!$X(N@ebTesJ*|Z7;rHjG2xzg@MigW%R|@Sg~1t48A<})+jI4nID*!E%3tjo zBV_6YTd11s^(P>+D-VA)z-Y$W^Rogv!aL>RwILQ``UpCWn3*y&B5FW^p5|vcU=y1)k!8QyACITh z3)xtQ+Ha>FqFh~!#6%G~4E}NSgXp~QRZAT~{QdSABPKcZn6K#f7m1TKF+U^InZ*33w@!m7g~*Hp%XHy5d2mTQfsKL_ za5DwOq^{bZ1;M^~c5o4|aMA|+EYc}O~lpM2FDDc_ckx~yAXi>1oh8jXTG=w>4iz$RccO=jk7EY7NT6o3Z zf61Xe(`(CC)NEVwD#)U(ir9Hny$DvTz`ciu8suTXv0DsRTw@ePoTb*v-;8N|^OvjU zS+|#%WuKGyIm_*7HpLj#lu+ngxW952eIfHR zv{>q8rxrzADai#W$VZT$!x5z?FTcgbK=YKu(aW;aXKeSc=WTFpjeNrGtI?s{?6pyN zzTEA2n6gs;X>&PE+J7^Cpxij-{Vj{ZB8cB(%a%Y|qP9r=RP(iR{IIYQz1 zv&sKTiP;@(Qht<_U08!}=ipv!&VYpbi`BGKmi+y{h&Ecw&A4VJ$1W)_Jb{GpMg{T< zS-nsuJOao#-8BDpxU^Vhbnw#F9PA^_!jLV3+dXnbv(7`;5wW3DhD{XZR91+kJv`3R=*sxvKN(k;vL4XLHiw zqO>^9SgqIlxD0}Demp;@a-l7@YK|`&9y-7guv4pCok)nJT|O)YK89xUvro!4p&S%Q zGA^+a*2^j{HJ>o!+q}*BoM?AA3dGtru;oRIxmgh=`XhfuM6ajR8M|ResQnv}v+X|S zm1Zv~H8p@d_Bwse7hoGU#KF$+ecN{I1nFE#Ld>S|e5Yp8W{7Y(0Uvg0=LI^mqxGtd z#r+|mBP5v<=FM0-sph2JQ#y(Hg)p44iPc_*xblLc?kyov&vmnD?aGRfDswUX1G^&b zHfpr+%-13#U2$Q;?(N{BKg0d7>CGxQ*d|~;#N`!~Yqv2b{^+nZnkKeNg+}lxm8ML- zM`iI=A^d$D@ZVej#9&$7ALNqp4q{cFxY~?l?S!>-CPXdzOG6}d-Ss?*ZOK3G9TUMM^SEZ;Ib03!mkw4%VdJ%iG-qGnFxw znR9S2*VLJ~i8`i>T8(j9CtJv{k1aZ;?-4@ZT?IY94c}PA948MB0a|z;^<`zaO<#Ev zKGfsM$BHC=vUx@gV}8Yzj=?67X2s4ab`C%$?&^#$%UP}BVkYI7n8Zd8=eEV(`3D6y#Rr-BqRg60ICBl>QwADQU|KTDe0wV z#&q1-UA8;#W+KqlWVF*7MctG1TtNvu&-+1?9Eh%pmk(ROdYh=f_Th<~@B-Q`E-@L7 zAUhi!ISgdM{Usd_A-r3!)J@%5#p-TY%+H&G>EL(5Fwb~Clfq8^N##%m4pts(0Yg0; ztLhv)+fjAAvHn$3bwlTy3CR~{gB1Gm1RLr-F9;aHil?J=O^+tF12y)ULXK~?(KyLB=q9SRxKCiWCjslQHBhoHEi2I4D%cKGa6E{s+8S);9cL zV7e)vErVWrRtQnSUr~%Z#Qi@H5ZMT80AY=e@3jaUD>B&sz=U#|Dqng&SZHFy=*P#m zE5??=4~2)NVC?mu)8&!Sv5cuU{9+pw@}cV`!%VrH+w3%C#7M$_S&;V9z|g_}`>k-v zs}zk0=;5Sf95)L6w|wu6p0|8*G@ZO<+2_&VdxzuuREoiT`ll+%)AKazPDzMHG5J+C zCYoxrR0}4yn(3E@)foMm*Xl%gN3I;=w)b~?W#Hs`Alq_6lzqkSk z=sEpML2J8P&vz|3)*=|v=dck0r#xJ*dDMmooQZ;RMRWYm_t&=as#yE5k|P|w$Fd%= z)s6Y`tY;<*;*-8Ad+tn=K9p~Q`!<66i zaneQ4l*@hETkTBZ`8!Q=95Rltp4$OnoiAusy?C8h6*)m;w z425zPN|r;oRl%=(lia#~QGUatSqKdivRl$OXFk#w)Da?vio~8MpjRx63D)((ybnyb@o>?QJ)QQPUR8M(Qg8tw*mRp#`0;kbz7gl8JIk8cu{?!*WhN?fWD ztNS!MFZuIgv`Hi}$I02T_|M=awl(e$`g{>};ZQSVkbEdVc$eJV6$}A7-|8nblaO5@ z>9;K^PuuYBM#$&96!X-FI2d%qdTr|WWd{gmaYjdTx;X3wFCNrdR6&F2PqRkt3$9g< zlD~Q}I=f4(xqNY~3W$FFyn)R0cjMr?AJ4IVr)s}je5GzVSN?Fwfh?ryjQMIu%AC}dB)3l14iDhUw-g!?jB#<7yZkjEJpj{g(?Ofv`N+`+%NcEK$chanO z*rm^Ux#FlD{7h=AA`*^Kn$nO&q=NZw;xy2Fi41S)o)(=By6?6I@NNP;I&tW|POI$mEIl<#-NhMq_^KoN zZDN0~dk_R8+Gss5H&L5b9M` zoL_x9Sv`M>lwhs|;=wMI=eK*Jd%WclL!&EsegXNpQDs-HhdCH=p)h=;U`@ERT&}QD zvqEOp4IgVtCzb!BRBQd!hVB-Zy^+bQrz*3=2o9)l9NIH~P4Ex1GWQ*l0_rELp2&HT z$MbF9`zRms{u1%B2oKbEr2`TbP%7b>^ z$Y^``6Vz%ekO=ri_}a8E9S0z!c(4@^>Nv<!hTQmas4a--Sm068F0~(^ zwLrp5X_Od!R_dRXP2_I=>cr$3{}Ewx4r&K@AYPaqnu--Z$2;EfCyy$Oo16wwoTKdmt4xH)6|AHP+VPxF_PEY$u8f#kI(f2tbNM&Shiyh zamlo;td)V1%BTqY9A`X7p+=!?Ck>zb{i2jg9csiIqZcw%hi~rQj)WfJoCy~P{qU>{ zO8ai7DbJT!uC04t6h>ACSoPnn{Rr*X%6&gP#!vw`H2GYI>)wcm?(!k^+iO>ABqd=Ey;*X39Yd%e?D;Fa6fC@D2<%u3vVk;h(=UsW5>y>VGjS$nL`M2wV zYs{32yXL2=_JXvU5ix(rH~%;PkYbKf3XB5@0aE<)R-Cw6OH^3v+{n5(QD`cHLGqvL ze|}7)tVBO}!DK#428y*os@PFZ;IC(?uLecl5B##Q!%1PN*X=R?q5MD(d~-wer23vfk3w)Kat zo(DU|7RI*fK$rE!^lzlsRUKEfwFXaMP_el_sFttl^~~-3O(6F{z1+^394=n_y(hKQ zrnr|!69-T{S-9G{B;M_R_Vc{Tcu;;9=P29U*;f~rYb%8FkcPkaN5$JJ;~o31No2<> zzc*szMpb~x`f?WM>%57#K&)}BkExDdw&9b&5t4k9tSb=@-)(j0b%A2w>4Dp4PfIdy zojabh?JA92Ke1vAMb_rqT~0_b7dsyD+M~oVl`9Rp6 zxsZun3k}6ERD;hSUh^Yuocz2rY#@$OHd+@9GpM1A)VY_RX|S-7ByvXRP=u z>qD9e?~mfJ8a(KivPi6r!FW5jkoSHn>>icgLku!=da4#nuRNDRtw1lOeq#B$s8$gw z3TspCK1`aY$;rxU*ZfFOq;nxTn8)5(>8h-Fg({?aO@mjvJm-kkogov-Hp^@@m*c5X zWqi@=w};XaH36S`6@(FPN}GkoloMentKb9&r%|z*?dtCJKk&46*Cqb8#cOH{6o_bPVf*FLes?2jtdB~r*X?woSR!*{SA z&rw9)5O*4js-wbK3|YFZYQKomOxR}*$FU6&tfTG|6Eg$#a3(ITK-S}W*!GI~kM$^8 zO4QoV&}Act-#Bvxy`@^>dpf^Anne+!5F3Hti> zl5~5F$CXAqm5n=}f4tG#&eaKYd{o7a5L;EP+D*%hz3OGqyslLji9<|rd?(C^r}{$H z@)BC{cHa`#@}T-#IgTJR#dFtzry&~36WoBWzG>@8HB=!3@!ndu*_$r!Ha)1rW@MmO zt;&Es2#JQpXskpv_W)nP#ZOIyruq1dK;y2KbUFoR2)xb?!<&i0=QZAof+yIo{PIbV z`m`nQOxpvu9|Na@P!U;p8Cp ztQIR~+=svG$7opKfppL|REYz*zlwsxe@^|>^ti~GD7}TnySsft92K-eHgni=RB{b( z2q~nxrq*J8y$V+M*KwT5lmgmI;Ul$Cj-pGq)YZ)DI7Tw>ee{}7$O$HpcF$!EVO zHQc)XA$1L9UxbvrOHtL6V&@iRyJPOz^0?dj?(4MS2yu@9e?_cB4!{@+6>iBvb4__^ z6O3jws*MgM$~t+t(5jpkJu5n1=}sS$b~XDP4zce=F4$snT#KGExTY>>;jfdiSLhV` z(Zcr*Z7^0zwdmiyr^19PtyFd7MQ>982joC$s7_{d%E*S{FWd3M zB7MXOQOoE7Wbw-}Y=a~>q|htaku(&+84{szqYLb{wdvOBKW!U10VJ(~hm4l%1e!bW z)oz9yi5v#3v+4sD( zSq`p~9XkKSidXCA$3!eWbX6bX@+#=tW4!>s4X*R$=LpW+FAg6t3Q`Q=I#=>4t8s=U!af-GF$@-Zo|N1^Ew_Wx7<|g&euE!P4$wjfLK-9ETgOw- z)pY*bx68(*s*UlDF8?d;EAGY6;(XixVB5?QdDeLQ>IN189zQwX6Kcx zg8I)e?AwHfCSYjriyi@AqydU@&XBV{UOr7sL#)3A?NnA{&hP?#04{b#)EOpjvr+kWI z6=ycKy<6XXLwGd8A*9-H6_G{^U_Ke-2LuW^63me9;C6gV?`gERLY9um_>P-_hCO}d z6%G#)>kGo2U${~s68?^iZJ7ob&xDG{P9$bmDxgayC-;-E06%@H<#M?UZy+KLNA;T0 z84GV_w9a5LPcLqxi0MxT>u_X-cs(9h$MPQ%H=!^ZxwE~)DZ%1B&fp7QELpCjeq|TX z&Dx!g4gV4^D`+CTL&hlSVnBBqjFXI~|0#G$GS8)8WUfk2pItTEAWS=u$8;8c1fZVOJuA{JPnS_;Ua| zWP}5rp}yWpE&zD65^CQv;f7=IZx6D%&XtL)4VABxXnzfTghi~dNVVEsVY8C*4_+`_ zF81EgZI5l>qs<>_FcJi6i4|VS{&{7DX8LxF7%jG8s_$VO_@Cv$Ok*?h6p8oPZ9nwu zSELb>&JNH|W7 zK9{@*rLfoAsU$1PaB>{7vXp+TC>`flBte6+ z4yR| zHD7EOYCdi+4VOqbidro(YP6Gsz4b*7|<%R(ji#A?gdhNI(Z+B$=9cNw9w9Fi0A@#?x6t%Qu6c&&N@ak4!o#J{J?O zZ=uyO>|fjGC~!aRZ{~;B9x->WB3x^${W+hI5oKB6vq&yH|Dd8b8+LOuT%z?)#Q~fm ze?zGDEoya(A<#P&(nGDOD2tl<-*Vl{5cn1^4rk{X-HA#- zBV~C{?|)uN)S;@O1Wk1m_=6*ot4HmXikW6$qaj4rd}q!NsJYgqxTAw5r>g=Rzd2Av zblow3uAhmjqF#ewQ6#svx`L+4Z?p+G+)^{ zQT!8>F;`p@j|>m=bZRPoL~gzruN_fqWTZ3hNb7mV!JOu@&;k{x-G2D^q&Bsu-A+#A zY87K!=xOfyrTgtv_WzJ^I zeLDW=DyKId|BDogyIu>kF@vCyWOX-$D$wlBdHImT?R<15wu8pArehwg^n{<^cm)1sSPcGO3_fbJXhyu>*d8tS1(xZ z{$0_UoHX^P>61BsZ;Jjg8g-pw6gS>2?XxYvR=q3%-uK?~*UnG;;zXY>bW?lb_$x-y zGZ}|n#~&TU|B|CDvS4u)jk%T!{r=_zdF$``3QqD2Y~a&(dQXpr2byXCEhT$NOTC^f ztSIJrS~BKW7mSGQ-6!3nhWUCIM`IkTyD+4a!ZYhjip<$sn$re}KH|}dpVY$}{aPJ2 z{}9Xs4@%WW%^O932aEaOm_+Zv}#!C*GIr53~Wo!Q>p1%h!!6-B{|El=F2y5HXwzopE~ke20O=wA>snv zsLB;ykIS6ShQBxNC#TzfBJMej+Pm63ZLtPoDvh)2jPJXb{2!ar>=PZqCHewgGE?$5 zfFMAcvY*}p58mIuehDdmsk68F{M({{$@uYuW!eNf5;;q!pZ8=oy~9C@zgN^*LYd2E zL%~nB#wxaDLkews9q#W}WG3;2SE%x$hfI~J(Ee;nOV5k_HGcEbP_MSZkJ?r0i=V5P7;!}v%74_@82r<^D(?q8$A~VzHHl; zzk{oUX%(&RQ-nn#7>AR36%QC zbym!)SIo@2Xr z@AIEHRLYT216QisMvSJ~{Of-J;IJ7ohPAV>d|%&!+tpZqSm785cLE{n3<7>jo)YhE z)bSd*J8VUVeGJ_6(#Un?A>LFndA>TJDtQf(=`B+|JX`)@^bTq>Tv4nlnQf^}56{f* z8jgIt6!p48m9vFZyD({E4ZVc{Led&60v7x}2t52cBQ^zm2}Pq?Q_D1OW;zt>N>)Sk zUeX`b{9ZY$`0tPoy4HKXxe%?xqWm(5(V_#+mt%R_B|Wv0C*BaQUd3egcAusA6>%=H z=UDSFt-T_xdMg~x*dUZVoiG^q9cj}Cv}I1$ob0XlgrN!!=~*Flz3np%m8}k~HDzyq zpeIT?08-_obA4CceL)$0KbBnN?RMg2AdA)UpPrTjZoCSyP!5>oJ~^&^xa-~UvxHS~ zHz;dGWhQwVBZJ{}eqtN;QQQ9Cuy75-|05Qr%E-BRjn}4|ed>SjI*3xhHu{I~Pv+Z4 z-?MF&CsqjE!Ik+soWIYx8Vui$!1Ze4&S0RRZjYCr#4h*$35-`0>nyzBTR`ujr=SNi ztfNh^-!=nNwR2r$xE%y>N7783a>C$mT-!dL{F|pfeMGIA)xO{UG@g%Dd!ugqdw2MQ zIqsAwzRxVOgolok_rRHHB-iopAVqNbOjMpW!34_3#dT#YI)f*SL{X;0gN>3L_3GnM z^RtFWle21+9_Taj8Sg0Ih!k0&#xmEXsRsAtey7c3&JdF81SJUk*HQ~1G+ZiPUNHuo zTI%HXU;vtnQ%$_@V#!%kLB1btt@l=3zIQV|4kIBMFy$XY6=j&Mg&8#L%XY3)Ok4f^ z*2NnV@_(y`cd`|h0BVjRsKOu~~rZYT8-O<)LnPZBpIJR3?jul6q z`k>|%M(OwZTmO0*X@R zshusut)tPaL4ktb5#|S9gX&zqKxZcY^5K`^x^SMV36p$Xi2sALcM7lUi@pV`f=Z=g z+pgHQZQHhW;-q5RHY(1EDz@>_ zLP+15zo|y+oyu|<1^1u?|1~Gw-ft{_`zVF|lFKfAF&4LwzQN6VPnUS zT8-%wbKyvDjQ_K8V!VV4x!Gc?-xb#7HTMRtV)UF@yW{^3-F9vR+xA%SJr8(HDtm@1 zRO`>H)2pnR!@b`iUU|MZl8kvi>EnFo&l&wVU)Pl%k~ViRQxvcr&!*p>Q7<9Vmfd!D ztecnC8uYpBbcD0Z6j4owdE2gReLGa9n%7rbndnF#8_9O!@5|2b=1~h~)+ouV!Q!8LBU)djfk%y1Rv)`;c)M*GG^h88=QEYOpSHynUuMb4^ zv3j6E(l#-hkGDogzM8VM!YAjsI>-RcGLWaSl-p=A;TcZ$w) zE6{AQ^`>s&5FJOp%cM*MJ9YSkF z_xkdW+Fi4=8r)03DW_MFl*bcbw9n5cd#M|1_-e?EDBbuByz%#=-Ex1x=|yG_5NUqt|hk@!=Ec(+jwkV z$@#|gvMZ5Gp~b1s>xog@H50kn5*;3cImV_`ZFc(uzBCh*y(o6zC)0bvS@IwL|N;KSBJHe`%R=dfNID+|<81z+m%t3Dy0e0Pr%r4r$hNIbhE(U^;zL z0$i)@9Qmd3`zCV)O388??Cg2_yxG@zi8*dKOU_tD9x#4vWy*j^U3PaG(`aqU(`TO2 zXm7eRlsZb`J+24zvdPtXm1)lh==hl~@W~3^b4SrptEa2|y6U*yb(dT2{q4<$#94<1 zG%5EhVav66Arj$@&JcG3-w69#x*d7HG<1rrPzg7tZ1nZwVwIuCt#l_!y2*dqJH05s z=iZ-D;SyI+Uzk+w%~r&cYd*LWhB2WzS%a#os>=M*E!9k%>F^?F%W7Q|3A%D3TXG?8d!f<5Nj%xN_5E^P}n11{-ap4VPwPasYclF29c2ll-!?pxKiY79W z)hFa`2Op;S_5KB`curKo1v{dk4*mvU^<1E}GA>n*pHpDz8*_!Q7wmpDBi7)KH8aV? z8_(>-POZoXx?c}eEi8vdm+FU#eAfMSq1NxG(8ueqwDdp#Oi;j3pSX=W+>%`Z=*7bNT zNP_IYejQGv4@H3gij%ui{Fq4r^q<42mOVRGXATA0x_Ld)|3Y|Bgts?OrHGBWFe0AT zBE!L$+-bOa66vo~WIARB5{$Zo=u&0Y-+K*%ZStkrnNZeLJJ3g*CSFHG?K%}^KU9PDgAy3 z`(~dmpnRgDVBxWhLXYf5)>H6bH`7zNxs|8o#PvFf-Xh9np!`mXbkNKx8%pctDjv`6 z`&H|!DoloafkE%XI%k)x0hZAd`eEk{Z%}*gsKS<=S`C-PMLxpI+yjAFP5#J!t}B9H zTPvOfvTLROZnL#s3=fJmy6)gszwX>y92n)L?6|Kn8Htyy$}<+;MFAGp?DAum8}OGy779d0)Z89;>^-`%!-qrY-#;>xy(eb>2Y&@~o*S>8IQ0 zvF^Q53{z6LD$k(S^To(;95-qUR|zeq5=CY#*1gE!m_$;Ly#|@t;m8YnjS_IPU$#=`+(KFzOB*Hu-<&S^vJ?Z{Gg~0*bC;x9Q@aaWH7KO@qGnr#)M7=@x7_uLGuWnja)Dw`?$ukXn<3T; zJWM(pa|~=`eqrcGebf~F-0IGuh%*A{VvZG1?uj}v)0Aw=l8kyzsAMCGd9HxF|LOJp zyz*pwr?h2m*QxScoXqe?R~TRLry>*#5+WkUox^H8#Xs-dob66|`ET3949a@D+r14x zm@Q54McddSoG#K>nt!l1x4qobFU~EVDAJQIQF8kkA#HX1O|XH(5LAy%jdf?anZs}o zi^YW(lr1>z$DBnSry_J1+-)S4Cj)xPMbe&(Pd_p^ei z)hV)sSUzSHrO)kq05eMIf=xS;1hRx6cB7Vz1i8SE*d+pTX-UaMY-+=#(BpSW(eX?L z5yhNrc{kR(&(Oq1w^n0G`Gc$ZWz8Z=lhnKgx4=U<}p0NKT%W|p3VOd z9#9g8{4BQ=QC<(cP9aZb^oQjdQUPHj@qk+}1q=*qhNEy;IeeL@Wpa8W5B57~kcg8Sw^2}n ze?SLM{!t-FQVX{dz5$^rrcgpfaP|NCF!dms-a1O$YV zKjHt@VFp6)wJA>nEOIK$B?;ndPRu-#cg`d^1}z^3-fQ05^lfux$^su1tUn@|2*c3D zkbJ?rf&DOu$i5Dlr|-m^$Wfd+a`3oY0mQmLOuBLT6z>+qj~&&QNk`!sQ&gTxt|3aaU0CgW#r_g5BjFebb$GNG@@a|n>3>u%P8^ud z3{+`!goF-eVc9Fp+4kxW(txa)nngQZ(N%3U2 zm6G^o7VSE$Q9$-~X4oEbI7Tt68o}E7kH57Ng7cZ2YG!Pv$(#|+Mm<_NxqO(JzbvUK z&y@Anz78AOiufU99Vv8DAB@Yj$}zfyWu@(`QG*GLRBQ)5Zuoco3RKBR`;3#Q%e^Bg z6kBwZCEDM6?^r>5T7J=YUY;+7*v)u0s>Nf1{N`yO{+7RDrybRXVHYNPyh9veBLwm{ zp@W%`fIFroQc21eV-^KcW@$Y7t4&jy=keliIu2?+M=;cb)t6gSlJbh-aM(FC;g@L> zMU8IKp9DZJ-PN_94-R$RbWS%ih@>19hXE&>a-`2^vj&mQ58Ss z8b@>zx8ZamL1r??DRr}Nr&B!Lx2#hNofv;Hhm)%CG%pD`g%(9JQki_W9`DClq^F{N zCE%;g)wB2b%-m^QN&ysZ>x|`;qA5jq{uuAzoPverA ztSt=9q;{pz9^^U)DCasp5M%kg)8q?BX66R8r|fn=k7DYWnZpzZJ5U76olIQ6n+;B4 z_gu`?*A+`zgWdy@A3o(uvwzP0<|lsBI|k1YHb?Md9t@i(A@n-eSDCC%xVU+v#V5^{ z_YPU18du>@*a@$n>dpry-c2gQr7yEaeNk)zc7$pppVV0# z<}=37B7ae->FUwrsLlUvqeu*aah|{R+3@Muh47YX(*f4`Bl}@cr{BB~eWu8x}B2=N> zV3|`|6roc8;YVMozcL=n7jkExIm%A4M#7)AAt))%JJsQvb^xbH+st-1%a8E4aYL@0 zSE_FR=(>cYqpk@C!5_j^JNEiC=krYdWrR&0yGHE)dc%n1 z3rS6id^qyN32;*aTyLy)lT2AvEBSE9X1eOiwkCk=&DS5SfXOaf?5&KH08Q0@2qsOsINIn|w-S-xs?(7J`lX)@Dpc{wFm%FlD1D9?-0D9^dI>VJn<`hX9# zjrTiD5D=3pAg>qd8;;GEp2J!$$>%6Bdht+NqJs#41Np9OLuwUoiCWhAt2H6Q^gaUH zqa9N^AQ_5W7-s|rcwGwoZUPeW8+(pPEw@Tj7+mJsH9XF^=YiyV$4ZC}8yPc?NNRmU z*>8rqjm^k2m%HyUKeK*tnD)8ZI)y(_j4FN&`oIHjJe2)8Mi9sO^cf&k@1V6mTAFI~3W+&g%E3gKlrj6D) z>W(-m73I36$(d{j-#(rpJb(S{H`pFl7UW~p%;2eD)hv9kYJPvMAE#V16ihLF=jt!# z^(@NASj|lgBn#ud%IUp8iEKTKkwRb7dfw1~tgqm0wzzp#Iy8Bz^YW#>_&1{aV8edk zcw-_y%YRv}UqMEAz0yOK%`i)hCrg}w231oYIul<%;5oxgGRRoOz|3Hi`Vh|S)0%ne zot5uHP|d159d1pBIo@)KIa#)-1$e(ldTcHH#dX)_B1I0zEnoMyI#Ly9)lmh`P)=`a z6$24*ddNS)oS2}bgsjwfVFXFcQ~@A1>XnRP{)0R!4x9-NxwK?*rs2*~gC&F22_kk= zA@F1SJHFQq=|crlM@V>s6z0rAFO>DE$JL+o6=s;>E9Xj3c=p0fgC>a{L1U#Fgm*I) zC0aPbw5B)U3|;gr39L7QLJ2zxg=R7eIn~I*Rx6$LlB>;BC~#3jtD zqP9KO_vonX93`T;;*Qhr6et>*miPq9`SMUmLZBN6=i1HkTBFwHaNhI^eTIS-G1X4rBA)-lx zu9YfMx$73z>m>xOksPH-&Vj#ZWRkjiOy$su360Q9dO%Rn_;zKR3Y~pM5=0Z?{us;; z1rwa3e(-c{&RNGGnXo+>8KxYUy}2yluFDhH$x0{Jd@pj(CXuCOE$}v1Wxwnj#qQR= z+;~IEEkow>RZrYc3W}fq4E)KX=DS9ZI~0IkOjL`nDq0nVQrTJj#ty5lteK?vUA|x? z+vyhoKc{{yW7o$*_5P)Wk(fSS6V>S5RD_tLtaX636bQEc0=M=Yb-G5C5=bC1FSgdm z9WJX@OPzabLjr+7 zS=gv4Wi|PK7PL+XsdLx96%_W{XG>87=_}nG{MI^#4oC4qnI_@Ps@9C9q&?S|h zA7?$CsxV}X-|>F_s+TbfO+SSW`KYNR?depHhCkbT8lyro|Ee|p4{M@f=9NjEGFGKL zU|qbaz(gxnlk6RYO*AQPj>+jb?h5G zPnM>pfMJcSt*ucON5}!_JTs$zfkZ>dMm~P#WeEv&^-MH6oc6~8WjI0Mea?M738q;4 z+lTHX{Zy^W|1GEdCz_!?q3a~?$J?E5DOKoJyE&Y7zNbHu7QB@pp@<(2#+h+={5(c3 ztpnlZNf}rR1H=Vb?!SHRO|BK>)1$Xp8u{SCf-hJ|fuuqiVtCHp_f1Vm zHQTP3BzSs!Q%6JYP6uv#t^`y?9|g)Ppu_!(p(6}ijo?ZN#^w3ETjgjF!#` zm|EZQ0Cav%k|W0n+EnH?!o?vPf-nEl&-$3hOL)o!zISszM_mMWPaphnIClS!7C=*`^V+M+;X`zMn0t^Pa6`EDxhKXl z`3Ib9`Td@R=QAKSo&5u+MPFmI$K0>KHkF+S{37?0e#`efw=t?Mi~F)Qq9Vrc=D845 zPD-toU_)hgK2If+!^3&YUJko8qqXi1f zPLRKW+Qz#Ud!9$@N1R9@Z)Ri)>DlS+`7~nhJmtqXaQga8zu4Tz?T9A#>zMOzLjGf7 z)$`rc^CC*6#jnnLErf>B%3#Sv3TDq;jZtT><-1r4k8A3!{U>Xj8NPX7Hk_YNT5k8+ z;Blng0jTkV@$ug!k8^SQ`gZn;sSLH777Vp|=PgMuD2t#lfiGi!@F2v$9EG7*JFU)& z=oSHUlk7E>{bnZwIaikt@wtRm8?upMGcy+lg|u+NW&CDPDkhSG5&h8HMrX6ts9U%C zIv(3pfWO?o+nq_ip5C5LssaAFUqhPvp*ek?NA(`B_Ai%LUz6N0L(Y4{YRy&aLc%*L zlj%%9=fcrCfUAQ8TkT=e;#vVxQW1kQY1RYcFxq_U!G4#iFRvJ8@!&F8wxv6n@;8&E z>dcmgd=u>{f4j&N|1LOVD)OY?(PvjFRAj?-e|@hu-{@fG%9ARFjLd)r|Gcmn5CpkA-v8D;4(FVtc~CLG0}|_1Vf2V{UIA^@cs2 z@nSKC60+6#BHd%hz47N;IR%#1CqpV6>s*&Rq&2*BR9dJ1-*b}*J)8yi%?Y>$u$`*G zqs4}co$B+dC*~R+R8L^Ms(g3<2%|F9#J8ioS+U&lCuW z#RbkIxJyHjX!ANZROvM2(d1=Dc}fy zWN_17W`9c7;_}nb${D`20ypNOwh-eQU%Th4^POq}8{6H^GrrsI_Yv@{RP+>_7ALj7 zhb242`Ox8!24^kBR%t%<23K>^xz;96)DcgYJLP(aHK=VTwA=*yn4QX*C3ORs7WhGM zJ0r-xUHF;UeK&i$I*dfdcs;wZ5SgSa(zO{-nGiHuX?L_9=u4yRh>5Vx-xfm#Y93Vt zyFa;8+5Jv%nS&M%e(csXXFJ)Sj^tHkg003gkuYd=*;*8++%PSd*Uhlq!0B3E#qm%wNSOCP^D{_h1E|@no{mXeR4f4Ek5MP zZrj7sEJJ(Tzzu)3!y19(e_>uqv(dPoQQHd6%ItfK^$DuRLobRUUu7N)l9`?Lvq%2~#%>uP{`11H`6YpHD9V`>`> z+DFYnie}2<%e)ctwaI!=LGAq5eHQ|@9h~XHtR_bvou`lz(U7Xho|IOJ?;+otXZX2; zk0BH8-2&Mx6R%wq?A^nQ$K`@Q_%0>)ZobxULfP+`vnBb$aKyRNk~Eeoa;g`28T-Cl zEB#{9_e;-fxAwdlEp$YKX$_L`k8?7qD7^2GE^keObci`$jssSG-$u@U4HC z)#Aj$KA&lR-dne#`-NK%nh`#zUuy;^hblLJicf*zm3^G)<;sLkJR4LP)dhi-Mw_K- zcW(2?G+}A&=i;Z0P)!c4stw)9VH!Voz%jdp;YrVs9!5?4LQE`9YA}o4eo=o^Sn_2{ zEcFW)|Ef$Pv#;K+HWroPII=pd`2x2;IzZgwur@stU#pvX{f&~e=L%eDut6L0!E5|F zKcj&udG+RLRiiWCI&fD)GwpG+@yy}3#~yTjLMVKDcJ%V)9riEn%t^EzNID)zd)2lo zyBIGhSVn4*QCooY+1V9DQo39oR{naS{=DCTz;DwiCGnlWt-K($mO*k<9WL9=fa)G& z6}Xydc^>KO-nK91-^)1czV;gO>0+6Zyt~;OrVX%mYRTO<5#tMTn)UXH`uA@y3IDoU zG!Gp{QadZ(wP>WEa7{XAE~C`|aiGnu%l!?a>t-$5FjBJ|oU%%G;I`N$-{2iq>{V|& zNEOr?LapTWX1@fD=jJXJ(`U?gokg+@XH2B0E}sLKVR-==n0j{S6+e-(-Q$4FshaBe zR74Gy-r4T)T8tm6!yVkZX|{yFcy-JCO5L~6zq>jJb;gx;A7bygwqNxJy_4JHv0MKr z=weBcRd}SC@AQeFxU@aToL~)G?(F1T+jqsof!?tsdb#x2v3>I+x-b8&#!N=LPjY#?1xxM)K>z#{}f;of~Sg6My z^ShA9)SKhG*c<7~gBs_d1p9|sHw#v2z!!TnN6k)!Bj+}6&!H&}rzTJKT?zakCjiNO z1u$}Ee^qcg_?tlOJB(>aa zE?>Yq?*y*S8}?L3EBqbj);=)&yOG^iLzXI(!F)$UIn89g?OwajF3#99{bb4TY5q>) zljc_1P}Gj;c-MLAxSCEv?IT>**GBaC$IMfk%XN8rDVhYm9H*xcO#r#HB{`LYihb=6 z!NHZ30{wtD$DG|Fne3k`Y>5c|_Ll1-`_G6bJmlw2kNs57W9r)N)KJGgWB&cyS=hnN zdtUsJH<)g}gYK7C7-aNBg4!&}mv!xzPmC$^Rx#mQII?VHH zAjmMP7q+$~V+pcyCB1;#g*vkrfYXsrkR)UNPp7m-i(e`FG^Q8fRwV@5J(0BthXJC_ zMsGxvvnCO(Dx@P*`RW9RIZHw8e@3JxuUFO|`!YH08<{l*q(4gSueGiw#x+^k6sGp~ z{!wr3<*1Xu98`1mr8z$duLIQBroqWkayqB(vgx}K>5Rv4CbQZB{TP#2g2xZr_8L>v z^keI)zHG^wb8R18)}Fgd-Fu&YU%YCd&B&)D7apD*=lV6gH&8oPWXd;Pz)JB*IW6xf zJ;&cxp+ZL`k)yD8_eb7J689MRvf%Rv4&++Rm?64p_8vwgs|jq+?ypBK%>Z2{sb1D4 zMt|_(o5cH%+TPWVFl~Bbr}hSLOp&A$f=7&mi!08H+xtXQhk{8c!ekSuMKdjUm7Vdkqd#pnCE%@5^y~Rkae1F_iFdlkGwbgSLiqe1nw*YXf%dn_*d(7Osuu@8P{)R)e4O9{&1W`AU(( z5~QD?U18E|(}bmsK&d%AJ{ij#Ph?oXY9u*gLPlNdPgDInt&Z!KayrdDeq7B6IB(K} z{*jX)qhW-s8dw(!X*sNNY@}EXl>qw`Y0^wZ-WIixIIadO%FUw5TC*Y}CTHlgRacP3 z8a^WV9}$P<33guTIJ3G#K9&A%Q}lmGl8z99YvdHRh&m8gtcfnr;Uw1rTXms^b`Q)jF9KEAJznQ?H z9$9oia(VE0@eoJh_jPoC9^OHmC#{f+B9iUN0s}Lrk(0hvDX1J8$|nRdDwx}Ef&9T_se(~Z7@I?3P-JpW}E=h0MsJE%7I`LFq3PK55xMT zB$o0fIGuPlKP99)a#Y16^P@!FiH`0a(rUa*jalUvZdNyRs!@@nTEOjkQH>&qp1B{g zwD%MvY5cFW_2L2Yk5a@wBzoB}QeaZyFe>Xw_4?}YXm#{XeTMCCCZnIqH-a+A&_8_u z*Xblvh`kVKu%B4O5}XkdL_$^>+8nNb=rSNoqv-<~AR+j2pT`r-e~xB@`Zj}BoDzbp zHVDbGjinliP^_UBQt6LhLqN&FsQX zDf}Pn8O)r*vnPmH06NG;D1`bG^egiJu6aZSB1;`g1T}I%Hv^**hy&%l`~`j??*I3H z9N2%UY|x3{1pl`V8wfl$=idEel2Kx)i5J;+W)Kj6cBafWXnZ#C+VI(CJ>TRkTw}j9XtC$(L8i zRW8? zie6=-+R89hV?}@3Xu@DeS#VJWhW^vDQ{!r^r8H+b&KnvP#|#cX{{!d7cM^G$eq#-_ zg#Pks`Jy-^c*!Ea--{)NoKy*JToTGxK$p8+bF!MOhz^!s32oq1=3_N6D_5tby8NvP85-p%-bzf*G;(>>o6%VXt}rl&raEfwycPd3OGz6N#)3 zTieHEmbXZT#2rw=)EnE9db6)ql{IClKuQ#vS*YlQd?uh-XbJ)hZ@TlM6vc5+k)ixC z`k6g3g~;+aUs3!_tLc?qO}sk6(Zp&oR$}_lgvw4d9KyA*;_T0?s0+8)SArD@G#*N` zVck@eN_eewRg%eNp@t#M+s?q&ZNK;s<@p+ZXs^y*q zm{H86-2C)hi~G`!ALXx=(r>o$K1}=U)BWWmRFaLg4}C|R)iRhl(uN=vJuc463fng= z9lH!&JCLLU1VzQH!^E}43an%1YT`3_Hw!bPip$@whsGi@QM6gv$D|hOaBrP$_PK5M zIjg@lx_MZfILysnnmx_9t#a`~7d_G^cp4y2=9MaN>Sg1GCEuWNqC#AC`k2pu962@I zIdI!%+X>5Jr6;p9k>t+O0L4B*IqbvRQze;%V46NC91!rua1Xh=>aIzUHba2cj{DMa z&(iPeps1R4x2xIhI0=d?65xqoS6jN>uY6;vWxc8DTKDUFG#QasU$m6T5^Zxsm!~$o z3??3g8yig8c0Elsbt7>7>t>EJ#}rz7Ff`ap zMK+GFE@0{zlmEHqT$SC_p7COFCz%oWkvguxmu%>x|B*M~=|-2UjSc7`g`Ui01hop} z>HYgkCl$%m*N-*YZSshy_kK+|lnKOA+ueT0iZ@Lsm)spa&F{GGQN&*JO2qH&^N0K) zDFB!`aLwiWs0SC#(!@fy<0;LmJWMrg`O!gOSDQ=wrp=+Xg$7uYMyvy?w}qv4WH5EX z2j%-Q_2c`hk5sQ;Pqp+uk1?}(H-l|Y_04V4yW-6Jkjec?`o>xB##&wEsG1GFJUal* zcvgia`H_q8pvV>g#Z7M!l7hya#zLGrdTaB0tf6h^-06?fQyEzf zDyN!X0%JV+ETpHcDf|#zkOm}A?9aLh>F6wxyW@HwBzi#bBzLAK=hcyyQu{(YLR%V@bWZ$$w$jar+e0f|3Cvm8Egp4LlrytHd)%m81h^PIY!M?U! zS|Y1lE7P}`C6QFN(|dbYQ@GXgh9N5*-2_X`-rD5h@kcYRO`-aXpO(-$8;Y{nA)~z! z(gI3EtJkN(WG>?$j8wdX4SBhKTjqF33rsDHMT9f1rm8N5;z)CZ9W&9d>ea=66}Hhf zeA5-cuSS#qhJuwm6bMp9<*JOkMvk^REE?qKdjpo1k-J3fc6KyZ>?_;GmO4KH+90VJ-le2llu4yAfS63s5|jDdSH(1)NA~p!OoA= z?gBNgv9_MxHL;FsPB2R?G90S5cE4nxuTERmW_hhQHfLi*+xoQ3^1Syf(e(`6!T!!g0ku)5wWkpkJE zA+7akbVjG44mNY4KLxy+r^|%>3gDErT7vHb(A59AeK#`C>e}F@j&kPC&P>T4WJm^I z5<6n90Qiyl)Ut~p);+r*F7-)I2aBFEeaYV0rJT~DCFAo@F{6WV-aYZA{jw6-?qR;+ zXob^$^RgfO^k<1ed2M-Oh&!YANq>M4%3Kwlp^PvQ4*IgYC>js^DJMQ&O}#djr!<+- zbVcG7zoDwfX(DP4d*;2ONb!;G-OZa0C+;XFt}XXV;4(-WdDRSp`mE z#f5r|XKZ zdfu;Ow*q;*RA;Shv71;Do0yVER^X|(+S(#O-x1K;_xQlFg0TH{}<#~Lcr zp3Xa@^L{_D!T7PH&tTF+PKipdu1QO=?6((cI=67PH=_O&QeEL;ivM+&4QcX%Z=hf@dJbVBvHd|yk8*!MN*4N`j$D3yDRRYJ+s{QJf@t#h#`?vHKb}| zK}1)Dj|rA`)a0-gjBj(Me_k5hIqb0X%lfUMCMe!B+qo z*(#yo7}QsSV4XAGv9BI<@r3cz)oz;D7nP|zX3kjP$iTO%<<);NeYU`fR5VVHT{Uz4(6f_!=g?dHj;@3i)sT5MH|H&T zw%O^`%(@yi0MBmlzq;K*+6NVR8l!zg3NlZus+E-_^xY_STp0~UInK@<(<(3ICyGL{ zg&G{iX&|xKK1Ws6`rN_n zWFZyNGT$7JP$KjD`6ec_-O5-EZ=?bxHL`t)CKW#a^M#Ebn7X`tU3X!$A3|CAw;%^S z0i~tMV~Yrie3n=D^|ga&`X!;Tw7XF?`JxUpkWHgxw;JSPI=#W=KLiS}Q z#9z9*`tVa#Jw?t;VsoG&)M28R3Fzhf4r1STibaW%&`fWqtM}S`?5OU@(eFUZeJ(E_ zpPOAIljZSmCZ=hg#;&x&znDDErIk6{UkU$n8~?!$Zjwr#bv=G<_(sRc#)N+#O9zJf zvf@#rGhSA@DL@$lOos2TpSZur2Km6f>R(O66qT6weUB}8cV$$TB}&arHCjIck-mXG z=F4jZ-h4eOMDw3Rr|r)R)Bz!#Em``4YN4XqW`UXgaZM|+MbH5U671Q`u>M;eUG#(E zXtdJ57XLyKc#)m6F>9tD2KTFhoRP9U1UlcA!y^OkqlV@Pp{CLWbNp|RjMsT?*WjzO zng0A#0Ub{zu4lR4hR{HD(|N$6CWjw2jJG~+(6GhfA&}{^&50$1Ga%#+WEZTYT%v%=g5-++ePK__4f;t;z z-WoatPIzkL(X1?+ll+o=?y5fKD}1BV&bihCpo-&{Hd!=)opbq!mSp)E~RS=z%@6wa4iE@;uLfXUI6Dgj-FZqSVNua`H8xSSg{@i8Bf z)META-Qu}Tk(UtC9RXiQ;>XnOBnT-!?0?zK})k0c$9f;n5`Y35-s30iD!6DJntfPzH zfgPDi2CeqPeiIa>I)DXiH8mMq#;9^R9Lhu!h#=(gEg%~&d{k^Tkz-|jY_u9qMRi{x z4aMU)bJcsrwJ1Arf>-k6pS2r{B5(emhTkw;I4&S90Lqf2h@eUW#gxZ|1&@6AFbjVC zY5eiHW56d&dt{(c1qC`2`SBh|qRxnJ?p+$z-RYhd{ifCX-2$}hms!-v(IZS~Vj|kl z<^)6L%F`IyF|*HpBQ-ngpNTTZ2fU>f0)jb26HqY%iGsb&Dk0(4zT}hP^k8ke>YYpF?Piv#` zlrT5?n}e!7Isk*P6Xc*3T6>R$3~o#kV0ZY75 zjwImJfH3UpwElI`eAR4C-o26;E9^FSr!9>%eBuqTAP09ZK5syu-P=#E95m&e)L8F34o3K?t0B6t->c{Nym*d!{EF z(8rZ<{4AI`yJ`4v$om>hHXp)BEAW}ceb(+%2a4RPDqkScCs@)%~mbkL>G{$ZmXe(YsMc zl^B4@^&u{pH;v1)BzpeG@aep8W7@RCP1@jWQCyc7x_P~W*`R)m${gZ!zJT!${*C_f zmv`$pvjQ(7baHLj(g0E9-??A2<*1M+9-BI=eacqf3fx@q(138wb z>qYD)oZXctguT;S()Vax-2lT*WP5mm%ApR zm%N=jK3&Qiene5V!#kj*xLB%LSRY|1q7!{c#v%?A^%$7XS;=oNUeG;Ut_M%G+;Ht+ zmh7RQ^!Gm_@z}&$FbPVno^y1#2YqraiR5{iPRBCE=_|Xd&9VD3sEmos#J9oB7=j_Pm?94#0 zHbXaH4j$A}j8U+`SbuZSyfg9IPYmr6WraMy5Z`$4&bLG)XG8||WORmPL)pZ&q<99< zFMv{tlxtBik~frko^KRKQc|#Cbr^{eo7Ytwrmnsyq6&}7CW#D)#(BzsG)>xHc{ytj zJAUZ@@r_eq2`SMG;--eotW8m+=h!u18VZ?p`Y7X%QLso+vO?BP0b?~8@ieK(2?lS- zqWRX6C;7~PCCLV$kt^Uj@D%Jo;Q(ad?|5Lstts%}ksb2jyGd~t$~5ucIeh99`zW}L z_c@qo{=-3y?w)5#R%Q;xyZ+U6HU}kZFG%0@ z(xv6WNH6~Vg@RO8VS;>bQuFOTOAr&EX&*KlBZ@okpnPKya+TT$DFZaBC9%cEnOn@AlV21 zE1ucONs^11LMeJqvr)nhp$B?*=_9w&4e2@#VSitBBpQD_6R}!Ko^8L zdLXefT*o57pK_hND*=9F_?`W=>EpavIp+2B-5>thYk-Qd^AVTFNfO&<({!rByI#Xi z;tL$~L{cMrAZ%v3B#CqUf&W6jE|Xe$5s(XVH!8VYZryi0gr={5r){~q1QP(Fggo9a z%ipJX=e}VwazvJPF$O`|mB}o3Kk4g_*k5J#T=!^x;{iOW03MU6_RY18|BTzQGUgLQ zX@>GfOartepz_Iu3;rgP5V#Y-J#PJ3zm6m#Eg)PQM7YerY?$U9GCcS^8!Urn`2_+o zTdj6B9;u2y=fsX~_UPq)iR=7g#k~5ARMfqTMl7}I1%~!xPWKq#NH$`9a6g9g%(0Et ztcgW<`YPl#_4QpA(%GP+fNV-p6K59elFRiQA#f?=sf_xhf8YDswXO~{O|0Wn76s~rO1|(w3B7zaoJTbwjcPX(#)DFpAjs33fhWs& zzy<6;eKLHBmQrg`XZHOp`uF+j8sT8~!KovU?uCQPw=p*k0`Z4(l>2kM6FrAY_VkLX zv`kstU5Ng0-r9{7!Dp64D+UA^^<=iWWqSQN3caP?8Ccq&{ilM7RYl%exv|?!CJ_f= z;cT{ay4rF=5+nN<6+qP_>)r!(+SnRA)ezPU41bu;i6K(NzVA2$G6GNa ztl$4v01gZB^wQBesro+qZQ{rv(l=q0F0)y$i2)e0hw$O%dTu>`I145h@zSy^4j%7R zUB}5IzqH^Yr zFXGMBwH&RFbLLJ0q19Ee-tP?E}2{;Za5nb#k(~2U(8j zGJJ3r^ClMQ-hW9=)Fe|@hZOsR1T_>eH0$24v+ahE8XxxCkUfN^wqD*?UCRw;m-BCz zjO3v|Z&T&3+ttLakF5>+nDqAE>JgEv%d0xFID|Vc8i6FiTWcb*Jd<+W^y6?n5phZc zCK%pXcbqHd4dv$ZhVzr>cO|8pAs2y8otw@bh9tpz>rcc?wk6U-b171=?Y@v`G6dS( z5$V5M&a2?R|8G~g?b^m}Y8wNwH?tj9&YoJL-?#=APb=ZY50BE`> z`D^WnO^cVOMVxcS7cy;h9v$6Y{vN$}JdUz`u{!n2rb3({yt%rTj&3iLN9Kk@)JYN? zZ|bJAC)QOFvhKCo47GdccxOz#&K@r(TOyY2jIsGl8j(w9x0kmSd%%tQF7cnb^JjUA(wej52Be)eC2izV%&%J+yZHFRJldKjK zqlY>*^_){x$kaslUz}@-%GIrFSWcQom8niD#mgFS%d=nno&ChtojqQjeeW>$Ts4{p zudn3(hA!P;A$?U%k^)OZ?z?s@0MCDLgsvdTq|NF~FkIJ_n*?zJbi4h$^3gHwyl4df zam6T(|21GS)wlNY|NgiwX1{q|lg4qxQBog!eivm?OQ2d@?yz+jW$n&J9=&T41vxhM)wopWmWT8zE6(I=*Ng$+ z`45in5I+-#mk5$_mRc98ty1jh3v7Wl7 zZkBv_G(1T(es~V0g@KpM_Csx~+TKVO{kME` zJQYZ5! z6tU?*t7_?nvaJ3!#8(d-Pl@(|5gF7cOq%f1+M_v4U$sT;FP**x6m?joXRnDo}#B$n_XFN+rD^K5gjZYRa zV&age-!HRvR}&M4=Q6U?$+^=9QPa@Pv0$vjzLMwM@r8WvjtLZG+t_`yogY89OZ6Zm zv>tWZ&?Vh|wmL&{{Ibl(eJzYF&!%EfU==}KQxA1b-G+!W8qsMp#^&?D^_Ao~ZS1Rc z@x&{8Rp+~>1M$dPmDWcBRm+ONFUx$ox0!L}IaCbJV&UXs>YBR4@jkWWG_>`yVQ&i? z_O^tHGhX4@RfYW5E#rgtpNpS7zl-kP)cY@0-=eO+ioULEJ?gZP zs?`}QCw^hQ-zi#-)okM5E*-&w;QGOB2ithz!y_E6k9`Sg>KOHXSc!uh&l$$V5xGF% zyq~|ka|o}`uWQL^A<aq#GNBQdXM90dCBt%!UnoNA@@{uf@9O%ET2U>Y<=@E{c z?9|Xfr~P2U@WEN!cERxQ!ujQ!>-pWA2klrt0sEsrwlt&k!!FF6FlK0;gvBWtml58(Fcnfld2c>Gj077$qsN<#OuiJQhqU zX8xpNBq`vxdVc8<{<-dW99`loYS`+GDv~V!iQea~5)fF{-uqn=Z*d$?uNRuJZMB-ErvkpOp zzFaVKFgKhX>Ay8Q8~J!gBU|>jhWjrbDcNl%ri{pC-o#?6Cl(<|flV4Oet493J~^&S z!l{#|x^yx`ACEkv%bxM%nd)RwAU_Uy>JqT=VN_D2D+P|>xPDPNSIrw5p4D^*4?H{8 z&_#>OLu)9yP_~WyY%Ar(4kib;yg^_I$(tY7@yd!Cx_k9}fbkVIOr8TUWH(Bl09hGk zF0UTSg);|-`@`e)v-3zhb&cJ$b$V!31TxOevQk=@$@q$#@X{Q&*Ux*Op5W~@b@aGn zV|p63J+&TyWC?Vjtj|z_!*1q^`9ry6_7GM7Z9mjTO=CB$9qw=>sX+hPC@aon(umwh z|9SlUV{IL;uBuUm_0zKq(a}w>KLmM(J`XT?4)jcW!g`ADMLBlPnOee}@r8^VmYs08 zD9bW?j=5O7tC^2B*GCq>8-0-sFnOjrWH;*X%g?qkZ$c3>#^y76Xm-MSvJCs{Tx{Ie z!kQgTnxW>B8?Y;6Yql5v@fZl}Q-_0qK)lWQlZu&HS-_YwWBs?c#>M*GO|013Ky$lW zp9FOjJ>$tUs!c(jabUQfj#ZYQZDo8#E(JL@3bJjHSct)e@y#wbI}f)7gM8==p>_K6 zv*Pbe#mdjgvQk-|O}^7guG2R}@|2J<6*x})_I3dQEesTK#>nnlb%mUCNm2=opEa<}eXe1} zhpEh&zT*i51U{=shNz9!6F76>Glbb%m87 zIb!%O@Yz8!en?~T(%)8JL!QMEDsT#6H~DdTn~=mOXW!dyiI#yzGP|AB^-{~zm6>8*zu*-8FcLCmyjcBR iSbAD8*&KL0GXEc(20{oo->-ZC0000||`xy~ly3u4ZPJPhx1x)&Q+xu!h^{VJPBk8I43lBU{fZ$h5 z6okQJd@tAE!(UKfL73A6eZBb0F6cr8zo6XELm0q80tw{*OT#|-!uUNuZyxNmhP*-N zB+)M!;LKCH00VZijnQy%gdz`%@xGTEd~!vi-Z*z}KkvzD&&%gv z>$$Nqc}njolC$J+6|qtWa>z>^*! zl)qwv8ylVExIbNTz3wEvygHLlD;lTJeB;mvWdyS+c9*SwpU z)?UA+IG9Q}F&n`MWq^SU-S~V-spb0+7ZLShCXxFmdd+cTYVTF`{vt(PpBsL{o-1I< zA0*6UQ5Mm$^}NzeyYB2>%kz&i$A5-WWAW|I+|TaHYYP+O!~Sw@ynS@HsO?GWi50|KP-0zu)7jhUaeUp64^3 zy29Eoe07yOl);<<+LG^U&6wxsi$W*;%QhV(poQIOZ&e3X{{`f`_e;S>5>X1(ch?7D zUZ+2qzU}Ta)OjAF^*#@gS0&qp#kKRJk$pyQ;C8gO9}cI3X7D^#{pLlRS7%)#m@97| zJMJK4-)I!y`2#5hzbWE++krkyz9U!kwzAK0r2xly31+I=!16&9kGCzlsP~Ii&T_7Q zqUV<9l_Ra^fzOwJ8+KEG8lf7;V+ozpg`b=1Njg^=(<4@Y`wjCDy=Q`$9Z#wN%!7r; zqBE4$Q-AJb4VOy=>=eonCjY{qSL5mT?B8eFTFw*9D=vS$u=WU*5^=|QBygY00d$L= zJ?U0aV2I37AF38xy!(rr?HNI$1M(>rmSr5*4WXCaESsB;6w%NOZiy3W zb7OO2Zpc3Y5GrJqR5A4p*zTy6&#wrpwLW3^xs3rWWqMPlY5Fsq;mbw|1oiv0D{ruz z4-ck{nsP)!At=&?SYL=3wJlB;Z8?6c}W&m!m5K4lkr72 zP5w77O?kO(xdzFH5;Iy>csm^=@ZeSnMNIp;XZj^-z)Vtca3nQ&w2DOIWNOf|fe;5T zjA6q%uNQ19eD0v(-uTB8`$rAehqDW4;Dtzq%}{=SMeBi1B;b-mOEBMbc~PK55Pq>`vFd_BVIIc?Mi>*fw%3hNqvpM9PazF_43*I>1|k9h8Q>QNib^gC}WL|31Oq#q1Mdqc+vLm>IBN~XbI zZFqaHEwG%v0|%&+EoWwSAI9k6>{u55r|uso%M{@sUq-)A19{%!n4nvDCiV3r>n+A< zXy)m*Kg%H>AQg-h3L109T#o?`XSC+d9gk$az50Z_*V~huav0_^J)6vb_i4oULyz^x zG#}+8l;L#HWe_Tj)V|Ir?LKY%Yri&1aGq|Bv$cziuh{)29NF_mqleQR)(2MBdNZwN z+HbA!`cC9}y%#BQ{J*QmDU-J+yV~?;a%_Q@NGCb=kJQ^A8zGwar|6bGk!H7i$XDIK zfS@-&j9`L*Iud_J@oX?vhPt_MSWUQgz;Uw1@M1&6r>a~n>3%qF0BXvM!ay%kFS)H^5{ zt5@u1R<_$ouft;WE!*j)?iwAb)Bp?>zb4OSu;jM!DEIn?dv%@1=QXGz@vs@mWYhTh zhRZoaT{&i^D@WB`e-b+r?c?>vh;VY2Qz$)X3#{#K6&B!p{yTEdw|DSb{{?gu^>TM2 z!MC~AFMH?nT-dD>t$(UISpM+He`m^*bFD z=LZX*7>G}oG~u5e){KW}5cOx<nu8De^}k0}!X2`DO*cENQq3Z?H075IO$ z)xJJ%;<#&b>!KL7jgKkUix-4oTsZ#2A2k<#dagH~^y1Uq2~+oJ9f>uQnn8BDUG-+W zjU&JBk`<~^RkonZFI^bihLz&5sYP0hS#1xhs!3bMB`nVz_cS9G`Yx5Xd@|dis&GA# z4b`|LP5GTMKmGE&cP~7&JQLRn3|A?1lzNgd;!ur@(Z7ojFv4Sb_|C(?I;cX_eC5zY zo9>+!&v$-ws@_&eMSHxduic;Vh=uee2P(x9vUAvf?KHP+SkhUL>(pc>!(L{9tPu3z z{(u6`lf(NGZN(6UZ8DL8WmsyEsXd)$Hflm4ZtAm5fQw7F(h3d*ArnO(L}x`=_R)T!Oze zfZ*)1a1z}g`K)A7bpR*JL;lXNdzA-U*>8CAId|BU8vc(Q&SSgB?&;&!M=v5c;`4VO zF3#(I$JDBvD>T2jMXUx5pq&8)Rar|jwy!SLmi99QYGHFJ%Crt*=(B^GA|&V1#{P`V zB2Qj%UIPK1ac-9&TP6YX;)K|sMu46u3TZ9WIyV>-WvOcVw;Z26zh964R)Q}s&o*+- zwvex#qA^89S;GjbHx_Pw5j}yIx;r$czCEH|2BW_C`i^j!Hn0lD)b0D99oaVVEqr3; zFYDZBOkx=z6)ps>$|xA1!D@RL(0f1wXhyTQTqMF9+RaeBglAf_|( zRU=hk5eFBzU&zd|fz91q$mM z;euzROe^SGrx!)9Jw`B~N2X(}QtWGIi9dbBgeV{IJHh{<{BodDQ)dI63~AY`i?yrT7>n(}m_XyECH z*Kx4F!El{h9^Jr1FcMU_5KWlT({aNIUB--Omxkuyplv!sTb_p}ru?9PbsrwMZ^4Y0 z4JC_4O&S!H)Z`K^J@lMdf~tW;BFVPM#3MwAEc1jVYsQ^)iP}3mp@A%<%Ns2dfs8dt zk8*$WNF{8`p&vTi>~|#=0cXeQy}jjld%qv(h#=U7K{sI2@0zzuRl>T_T-eASg zz$BlV3y7|L*>B7Q344B}c<_CpJm%jE+w=N*T~rLI2=P4MUjEQ$PO0Vy5I47^9P2ES zS?wgV^QjMI&7I;g$@Z1g^Zz@3UT1GUKOw4ioR8H7C`}ORH(h98;Yzih03&X^0POCjRuBZ7oa~Gi%hy{fj%HWqpw1k32^z>0u%H zFQ*&rfip3?F7ttx)z}j9%f%SY+4@=ljobV$-I;+Laq6bXi`cdhieEa+>zR#4JLH1*iY- zPH0zObk2y9*>r7zMBZhoDin8XL%}j6I2w(X%@D($CNZ3yzI+pUvnlM_WU=7Jur(hR zvvj&sg1i1{J|qzA==7qjY*rw$>AiKH)9@nb%f4jjatTh?keqQwT#!WikAvO*(nrkd zR%GjLjk7K#kWX!iv9Gl;dz|EB>suOvgrqZjr2t8R?CfxNg;H?5iDYHD7^DCtrN zpDM)#y*NxOZK3J z<}?&{l{t1lf z{;sA4^P71S4?PBF5Pc^1@I>U+&2<-4VY7mYPNGB2Y6|TT1LyMPcK+{WN%0Ji(E*zX znEdE(uCAW3fZ{eqEv=B{V)3e^NHE`ah_{o=XC(NpleNY~fj=N;mmQE3;=Z~zn_F?@ zc+(YdYEn@)>F``jBG8aLa9lWWZ$)FhdYSAmP*c{$6Fh91hr@Kb_wyNygK&rlHwVes z?fc1Vwn}~;#G`R-RGeg}Ui{nrs?ZJVQtclf;MvUl#GSnDVRd;}29J~Huj`Y+FOBAG z1D=%@9EFLg_P!I=Uv^hMMY*7IOhuEP+Z0(l7Dp(U^{WoI+g&%I#P28D^GMWvCZ&ZU zdG}$8gTc)tBA?H+W)m`PDy8|#?~CA}eU zoGqy4V#I3P!-vaDuaGC0O9snkv&3-uk>Zko7>bHY2z_~G?Tu`aKc6i2>;^gs#_4iP z;rP(TqQtSPp_Fx10U*K9(SM^1@5MHJ6(QW*6zytar`43TGrDH|B4r#{YfR4rVmdwe zq|c^_+2KPWEZm2#K7tyhV3@B|B=v<-YmzU6nRa^-AgHk^@oHdzeqk2(U<*Xov<7OH z96dab8x+o|Nr{FAw_b8Pfc<%3w;ipw;6wXU=%FwO+H4~`rX(-v3(7hi=HfZJQz!5( zm+AJfr{3*iXDig^K}SmL3mYG<+kW)Qa5#9Ow>qfLa~pV`NTFw+u);>3=N6U(E0;o} z-H$KV(m>rZ?vtq7v-PHcXcw@cW!Kf22h1*I6J1T=!KeVwR@+%@fP7PA@UW(ZY6Dix47H+8bFGUu6-iAyQ zxnco*rLkXN7;P5!?Ks_r)?33AEndSB(_*@lp;ueW{l8Wux4Cr=vkLG{5|Q&iiI#rm z-1gwWFt0}?&dyP^k;P`)6X4m8JBXep1e*vbIb~5B^ej#bmGQ4_U3vUHX9xAnwir#> z?xS6@-RKZBsydDGcuiPaveoY-ru3vGi8w&4q06yTl(b{Gx?yjp4ntPp8%gU+W~rv# zA%ygHeW>q^U__ujFIH2iBRl62Rmr*Ow3PPcn1Xu6L>EMgA{84-PN#|1LL(){6P?`*5?6*||Q^VNEJCWjFSO*3E ze*G0~cBU=XNuv!RJ>AV*YDlekTVs}Jo_Yv587K&2^EkZFo>CCl=-C#+@DIH`sp#)v z`sl;#{rr0IIqvi5<_+pkxiwQo5n@Hc-${)shV`lneGc?k%G`{NIQVXy5jFdUg^f-g z+?mL?`xonyizD)yO?J%FIlm%)x3{OVFAEMxd0JDKq%d-Lp?kXd)=tA zRZiZ;+L6LURZ*@C-CbPYU#m%D%6W!xzK`{EFi$Q?DBL{3-Pu6vehBW) zT(dXUIXW3Vm2ZxRg92e8@XZBLUK5kTm0n=}fmKBwx^7-3{MQ-a!B|0{De8330cdL&n zgpd-VaYmTu=kbLH1G_U^hRtEwu0=;tG-@-J#Azmia`;N|P*0Zg-f1QVd+hBayRu+HM*EE(dB>tHbh8Xn549yF${I^T;zc>IVkj4p4aFyfh?OpB;!Fjq#nh^&Z* z)!=>OpbXoh6O1-&OFd@NrFK#1RLv(``J80NZTLH_zwieHSUK!+QFD4nu|Wb;07;5;C{DUsnwSje(P zMg7M_3|7uMD4Zeu$kfq#{4=8JN@0SQu!Zg3o2Tv^C(osBSyl`iKlg1mY?3*>c1E`E zqXm89KE%6^7_SK)8<56|62r%0SaXs#d(r+1l}IQTx|o!K-jCN;%jqzPQB_3)KLT+O zNkSnSp_Z|X66FpK$q*1d{JMX=I^(n3s{H3sm$6JvvtK@Vt3R(JYbZs6h3`gWn4M3} zi0O$uTjw#ZGehm}px>4TnR|JdB0Wh7K=tCY+w)}4r{7N!hVzVBo(i0hc+K_{VYe?_ zye_lWW_}ZO7CX67lvpY^HD}h&7B*eZxRjK{y0eH@Ik4#NEE6ihy4KB4fV%3g(Z;Z% zS~dF5;-c%dWtrV$XUoHDUy?+W40*lTe;=b;QUiCg*P55O|RrWfGjLl?>7qsxcbwPp7(YLCD( zWt>=97i@cJ*SLd>%w^1zyPUef(3V??4EyHzU{|zaI0r=W!aH!Q%Ptws=m)&?zjhtB#2mBC-yFoF`-if7bXVReD^L3H`5$}QC!tY#cvXW%geHQ zUp#c0cw5MIg2(ajw~kIt3DW&*r7RNk+-<%=v<)ZFGgFjQXNlJmK-rYYCKY}ti>UkbF)dmd~N4@fR@w9x2dlX@2YA$`U&qox`InN?IRLzdv>|X2ge6ASR z_x}Yhb8c6Rk1>NTW_!`)Py@qUQRKHe?;?eA9*xDLvmRBh4`pK-8i-SaY67U0GNdTu zt`}EVWRH9^u`}}76OcQs7}7@Sw9C_SJ_{V-rW5DT(?*W)C*|DSj-q0k@ zFvj3=Q2BjvZwXbwOH|^lUA>`mYNCv21tNOo%r}nZR1M;M`3mK{vOWEhMYfvTIE?0t zTGQ_aAKn$r>Eq**kheAmMK`qHqkN08Kt(}V_yjC=+x3}#~S1Xq;al}Tc z52Qp~eV4B&I@T%M~#kK8~HJ_eY0s|UP z4=B(55LWNqXpRer#f8uNh0_F+R7E4IZ;U{MG=z-FE;sKW@pe8PlDN@WAG==`VrCyV#=Y zqUtjyzojFpvwe^x-I@yr6Tb-3=2osV;{y2IK(iHln}XG3Q9h?%?)KDKE4IbMNEm+3 zk`NQ->Z4%^lzd$5wnpN0?A`}N;SSHOjh@QhVk%Xo^`(JMyaK4|n-FX)uKO?ueJuwG zkfSp-KCQixc=|3$Mbgl^-ShId@NhNADR=v37Eu+=mxFMGBrs9bk+l8$WnI*yg8&!Q zWz`Y02+^Eon=KjX_~@z0LJ?37Z>_avJJ_7oeo5+ES7u)Fo8bW(wl#okES z=^l@!ZbPZ1_##(kY^{A(abq;+$|f3&!WIRq$iFw+InyrYnwCP`xif;>FLQ$07;yJyj!|8q;#|&Y;|$hpZF+dSm3__g)dH&cTPy&$uo? zH!&k7+BdaM+DvFN2`w9zr_1!#2jjkeMfJt6O#3!l!l%c2u~215P(g9QkY+DL20+T?yG}vXtD2FtQym?6s%S#jw=cY;^VdP=cWPp^hsSSidvSHDy)d7Js1c_gA5S1{=usY>%Xj7I@jUD5H5>NB1t*O0iXj(mZ zIa)$-U^kG;{QgujXwF8?C(b$YrV;R>o2{vGbu#&Vsj{D!C$O}XRcM}$ogb2((xot1 z$JMQr&i|tpK<(gVS(>&rQz`~~^L89>gT2i|Qy0`&K2>!-%Yx`L zR7;P|s!mxFG-S62k?2&8HdATGg)%?F;-O)%buliCMrU`feXh#%HZfe{yz0vBrhVA! zZVzoWqS#t@Y3#K1!gB?u0U>*y>QI?`bBq#2PQ{z3Df`gsa(YziI^D#a*cyx+I_0p1-!<7T!B%RhKL<7s( zqIaGuIO?okNPz=6E%*D4s37#aBR4buG&1;#Q>8UkgSjq>qL6Wg;Q$fwCAXIGIkgz5 z2LvcwACncF=;2z^LxO}Bwks^U^4h$Rbz3;pFK7=32&U&HB@H!MSye{Pv=fzz5!A;+ zEO9Ed6o#(tKSxJ?LW1bNx|HleCOD3w<&4?5zLun+y4()bcwF8esLL4p`e4Xh-n`Mj zGcE1U^H)(IOa_5>>fPL0D$*-6t)!-l>Ovz&WR^dM)48-QFI|v{r22UU`g1yp5Ts3U zo2aUZ5w4?rEydP*dtmEuhS}$W>5XGUg9zlktqW&tNsQ|vBg@BlXITz|B3JPu#S!f1TrAi#7)3Z zhvO9K`0|ClwyUOoN}Si!;V>Hdk_*JtahY!z2@-kOrWss3Bf6lcX^ zs9FhQYhfZ-JHN6wW&by}ct!<7pr@EG&&%d>dl&B1JI&!dtWvWTCEDxH;yvVX-!^W z#fW0e{3uaq?OJ^0j1t3?pbf`i&jIe=9RyUEsY1oPW@X0DzRX2u^3j9KF{t%GM(t+Z zsyc&4FJd#z5lA<2I zzd`~&F6xv?WClWZ*SiCouFi%c6Qlinexa+)8_P^DOotCwUUT$`_(WSA8HQj#Yq(5|xu7!D&g?c4>R?{}qbFThlq&NV;v9OEEWLH*aT z1`$J{ao6Csp` zUNrEeQWBJwlupvD+Lav1qle_uky}YJ)Yf|#dv`J96j4kr-9&*bB(jtlDM@sa5>ZKC zLEs<*c9SX4%z~9mOp65JGK8{8<4`P=YYmf3n6_qPG^FV`$i+!K7U?W#$g`vhs3|XB zn4ZDG5m+GgZ4P1iz*{N?kM*+3aHgWTui+da>lZohBxl2#<~CujHg&=OxAI%q2PN z)d`r(M_#r+kMpx><_3ef6gHmLQ5;Wr;gCyYDgO-FqzZJYX=U+BN2Ke8L__n^7?ZY2 z##fMp+N5Z#4#668`bywAa))qzH7-+;?W|I4xCTjvDj&RGZ<5a>@&v%X&Mgq zG}Yp^>#}{ZE-jYU5m(NaPF$@fF1()d^oKCRS8v9j1am#haKpJ#C$%Nln2jYAx;Jv3 zIHX&6v>$oQQ*{Y`UAW17>)at7atyLb7S>MvlwQ#N6W7-q1BQ+IiBYksQipnD-Ta)s zh!8YYvXx}zIo;#pO1mf0+$EV3*FToJX!`E@wiXEyH&X&bAY(WQxLS-^RFWeFw#jFIeQNo+X!Tbx83C>0H*m#H4gaf6IrjjJmjbIk<%*p z@{-kPURH6N!&BO^^R3e7Q1kehpc-#yY|DsME$>K>AV_LMgnf=~*!uE}y`CGA#NWT` z)3)-6$Q5?~#KW=HL(`bxT57Vdb8HH(FJnLYT785a0txut5DkwA`P1m9p4b^H#gW;_SRH`-R5Z{_ujUsJ0zzJj0IpGttUHP4rXL%25D z-IJ$2jLjQ{5+qXVuX*FGe^*)RwL2!#V9U1Ykgf^^5*vq{}r})3I%3$cB_oI#lD;xcPJw` z%IE_ub5+6*S+X!zQF~dfqNS;AQ!t|*^PR)c;96y4apNTvGd<~E2hXg@?uxrO+kbYq z`6ru~T2+@mIuM$n*d%hg&3aK4cXze<3D+TL_8!jrV0gGx@;1Loxo@oaN054lyDjc> z(nX`jERL%cz$x-#(!)<%DNVe0+#^d^PGNjne;3$Uo^&qPkk4Yjzq0JR^*tx&MYH^I z;(;v&P1J+?ar;Sd59@wdWwCxKO3$%DN@Wrp zWvm&RS^qYs`LY*1i_<_5iF740kyN0fhJbQ%Ns>R|mP6k$ZZq32x5FNH7QRxz@osH% zraA|sa?q%^TS4~6EZgp*?oi$yhl>Pf9jrK3lYN##+*L7RpL5PF^8w&D9mMP2oxnnT zE1dl*ni7&~%vI&QE`;c+qMDyKWm`KnhilHq^>s)B1M3UoC{zGEi$9rIJlfHmjmRLh z2pfZ*eIX=oO4Mj$%`IRUqq`u2YNa~q>s-buNP7*{KjjgZs`iF{w!2`dG$R*M&Y3jH z^QKO&k4tA>6UJd>@eiGMgi5?wU4F0Nb{q2In?L+{KOC4SgIiMTNmnsQ6Yt-xtDuR| z@+~`r>V>}t(i0=g;hF5&1C{H?T4FK&BRHl?zf$4!-@sy4=O<3q6rjuzvECL5?C*b+ z?e9VXfV07v_(Cn=ROp*G$Jm9iO!(OG0C)$k!9R5w0t|AcEmFC<6n{1$Q)Bvoz`0n> zarC%%O&haXPF&9n8)bONGjf&qNGJDgER6^IGt5_-;!6V1j%jwQ(2%yjR(~8YDc411 z2DTMPt}#Ro;io=&5g^t!AEc8xd@Xi%-cV`eLwF>64z}ZMa4F%BU)9;qQx>8{ zE5Sue2E7HEm~v0?V0&6bD&31@4@7Q2iC0h|K!8E4yc5PLWwa7O8!do7+bHKS9#&4x zd_+50Z8~$In)l0DYVG&*J^%$K@@j1aG1q}1J*lR(I*DFYc(e?(o%YbD!mjY>CMIZR zOmFz#rNcgkczAPXdy+kV>1fjtbFFt{P8&O7{hL4S*28g)jp}Cm4H&kWzyi9H2kpx$ z`~8|3e{e6sCg0zgy6q^Vi6r}c_XIhWrR7s{7lZD9_tQVYowm7TCseq)$zs@3F`rug zSYcLk<8Q2%F)6%6Q@{xmt5ohyE3@SEhjH4?eh3(}`9`;F&->=FdU#U`&jLb+trdpmO!iZd+N8t~7TAS@-s5tDo0U##D zizk_Ci7Pa^`@YyG^WXX>e|86uSPZipRBz_?E_ z71I2u(hNtuRYuYr()|_80@U(Wl)Y3Iu4iZzF@sMOqL3v z0Y{lYeNHMXb}x6#X{j5{9_P9{$9-%`NYZA`HG?+hw`hGzSYGtp&} zNm@u-zx34sc70rN-RIG^ISg%S;1G>M@1Iy~!LvsZn*IK@?W@t;D5^7j$tq~ZKw@$xw7 z1j2frJ7Pxh#b}7gx}W#`px>efSWP5z9aj)@Sp!rMZlS$hBqJ21kP{QQk?f& zfM0iDWZuJXC{a&u+iL|8%(Q~)7+t{P{1w$ND6;qpl+vVmy^Jbh6612YLRx2viD=#@ zh(ey*l^JOIBWr6fhgTv-L9+-Z#cjrMCzuV!AEmRzKnuFsB$}bQ2`L%DRMJEtDnZ}9 zGag5G9gH8DZvC;~;`!&}Eiks(?L8?-MnY+ZXuH=ZVx9z2LQxI+6?3b;5Oh*UI+S5}vYjco*9V$%MgAQm z!hVWW8tJEk*c(E*Q^lZ>lb(?SHz`RaC0#)In+QIwREpMdC`oCCztwNh?}bM2C%UuG zWlD2apV`}8)%LWNm8VIHNn?J+8ncMT6$Ka>Bns4vP9Boa?zV$cwcn4|T%5$g>q_c0Epf&!O+M={KEgLnF zqF7a3d6R8%lN${|Q)lq+&bs}AX@-<9zls z$ISZHO``ops4Oqr#^mH`?lic&JqgEC_D=%icWEm;^Sob$#5iAewd#F}T>c_L)$T&_ zk&G#0lhae8t3=We=(nY0WE3-Lo`h`LVYACyxeboP`fSDOtWo7}eRQZNmr}#q*px9R z4H5vJC0>1g#E%KxE2Gnso8rn3Z%9i>sE+@HVGVz0xoLt(Xhj{-82Pm*epnR>FbK-* zAf642!z5z43Nba(w4&Z5-=oWF-#R%CS2(ZN|B-w)s4mQ+t(4)xXRCGL5y9>DK8|m% zIwk0Jj?41?nj4gC`vfpoqS)u;xw`vA>$hf4T=tbqa@MA$`9Ij=i(!xXk-L3N|B0f}zOpr!d#~U{#x8 zA|Tw~zM=8|eD8a$9~MPr1!%rI?}4Y?m57EeekT`$41h7y=AAZ=G2MIeTn_G=8!yau z<4Y``FX?#QWv2|>H#|))l{0NBIqVBLHeG$`-;K(8-{<7{2Ma%OC;qv(toEw0JsF+# z(bi}o>+jxAQ_gk1G(fY;3A5Og?#AH^%=@@P_;R_v=A3QMe7|}pxLhSyj(n=#b7$w3 zI4_)h{qq@rbHndHy-tdMn}&U5T%#WNPYtj8l29v6clhtOS4jAmC-=^FSvdKXM|w@+ zu1Y;5Q!I7uF~CeVGI1ZVGP|}gc0v#~+OnLfB$BBCXRBV%-&97Ij}j7c?e>E96BC7=%n@s0i**sDhmWNL`}$s!bqdD z|DR9)&X89WZV@$tbR-$;8p<@5S&nYACF8Oz=eTNYvWcZ~r!^RHW1)iQ8t#tWz)KcA z2TE#c>9q`dR^7RY3tY-?J#XR3G5n+sJPr!%7znd{=Kf9K0q?e_P;p(zF^|aH51dk z5=Dt>j zDhg)eX-1m-6p<1&Ld+xQC)Q(y-lN&ATPgGIBJsiI6EHy5%KfarkJ$V~>XNJ!Nm=Q` zKNJlb|FKVbzaZjbf_E*?`@k|wYOR6Dd-#ye+<&8K{(1a;^D)%b`5`&Yb{m1(+Cr(K zA44?;v&LefPEjDCrI@P4NDb&`3Cbg}WD@$VafYfJ4GIkBsJ-q3Tz(Ea*Pd2ivf1kj z0V;F-4b+pKhd&CEr`l*?Tg3G=QRfo{@%ihMuJ)H&&a?Q*S=?>duj^n_0{|r@ zlDFTIe~?l97dDUNUWL%Krf;xU&|_{EAayn4FlHp;q;1|^HVLl%R@hT=DJNb~z(d); z>zz`Vw%>8pTk;wYVHz8h4HVvF=WGL+>LQqI7 zDQItbTJgtQSk!4~ONO|7bfn$=6Zm)f}g0d&7W<*Lw|hQNa=Oh!c0Gf2X43xcRo;#0g}PCi|Ne&KVv__oHr0e3_I}H1B`9 za=U1|QW;Q+qnKMNbJqZ5@?lToQ^b;Ir8q&-IY@jmNtB2o6hARa+Fzw~Xr-#N3ZdEE_ z%CMA4CbxlHz^lclIu0f1r!mPpn?V^d<&x`LR z^U)v$5~*Qy#uw=0W6{e+v2pK||B*{n?O7+HRrc4`C37S$2oFo#Y zo^uSAR3y35`4kklpUIN9F8>{3(Dq?bmS{*xDIO@?B>*KVJxL%L`?MMUU-a?60)1Sg z3akE)T7dt<7$l1!Ifh~ssZ|o$)l_VTw=(VrFfit+l_agT&ClpPs^NJz#V%vxFk%iW zY#K*hE_n4QPozzT?%Q|8-0kjcA9dxWzwFXKADe96R1qM$IgCGITWYo<&g!XzIO-f@ zYG?3$jdJU}^7E>H?g`9L0R*1z$ELpzcyUv~(~MG?#1gy6PE zQ63c4&GX&b(Jx4v#mH1cFy^?w!s*5*tdSEi*jhTxZr+#=A-51jsM@gQ_2(JdwxwHq zJgo@il9h1V=ZSoIR@u46n)PU7`m9$Kb=%(kdnES7lKY9AD&P$rVVZ_FWwid@x zXc^Aa#g4kWGT65r{%I&lRxp$rgf)0WIa^#A%4Kge$oKRlBeFfBK#2xwkffgwst@Di zHC%4hv?T+W1!IU$KcS93NHM66@wbR7F#>10N?_@D<# zo8JDB@ATxve!FqTwtZ6fZz}2Gndj{4_?x#oGGdxPpxO}b+kd7p%^SP=Q!DBD{4{ChatLrZ%?uS zMW$;(?Alku$M(+L=#RGdbJ-S(f>|6SI-7`5LC0QOKbGdETkSB9QYP-P)p;MiyeO|b zjEat`SQb6CINSS5V|NHuA0^hO9uW#@ne`b$s|(er_d#I4G9I~bz1_RtY(I6!^WonP zrIu(ZT-7xM}8Dy19$v94ep79vdZ>Y`-@gxjOYxWb{-A0axt0Hx&`o2n09B<8!~L z-g^4BJljzk;I;KOJ>hqHw%fL}?CcxW_YhZtP~1i+b6&Od*16h`f&PdcdymeUERIbQ+KV} zWsB*bRU9jk^DBG#tasVimRGXD=`sblGmsL&P$3dJLVQ17-}v@jP!y8J;5#?50&TW` zUI`&_C^02iIIKzmjAZ-=IO5XPEurm^Sgsu-vG#D*IrO4znb4B@zp& zP>?A==PblRKLVlwj&lecnCIzzq+1^F1-k;}dI-7;>UQJsNxo5IyF?mF#pnqs$+$m-9Ylo(Ux4)|Fd!qxmrSmAtI!(`QkP=>L{YAw#}d@oHE6^k|feqtkq+rhL1 ztKWy#Dpy9&dj2uNp&wMN{~2uLk^1Mg$-)@fj=WISH8V5A#9mNo>g2Y!V5E1!Ps2Rz za(|*jWEz=J*T(3A)Dn`Zw~rejlAxkYt-b@kEbGq!T|}z!d2np(=OrI3P}c?oSmC!8 zoT*@&zdy1TN-j2wO_VnrT(TmByz*7DQ#<6+l%yvUliNk~u{LGae~xGXEq54o4&DOM?g8j{XC1 zb<1_TG~nuF-OYhahfinsvkvgs!$ng}WV9m#gimUo8Bi{QGye3t`-jyh9wHG|*T*JJ z%xzn{6w;W~SQS?MI|81;-WanyLQzdUW#Gq0OIMg!$YNakbxp$J2hP!hSJ_S0kF9eR z+~*x?khHlH<9^`8wVJZuL!Mc^O5qMo8VO92)mVivLf-N2zUOlgnR~JU)#9T9b>0Hw zUh}#zVMQ&)8U6l0QE-ypj4?Gwq7WrQ`USYs!BQ{J!}Gm&U72gy zsc0>f3%_uM(YJSCvMVG(`$EJ5oiJV-TB~1GC_z(_uMfmjR5SFEPfjt2a%ZssiH@o6vD&h( zu&TK#<+6*fH_ywsh0&}UmdsS~nG7S(qu;?HU9PRM?(^;fP1eRH_C1|hf&&_25CSRK zFW^T6Reh1c*4;&fR)cn9`nA^XhL`+S0giuCl5$#mASvv^D}F>_LN;IQEl`+(ZZ+Ysw*KRWK{y44J#bF|UX z-eBfLao1i`EZ)0BSy~!{DKZ}rCz4CG`>eVIs&;@^6Sl_(RHwK0YvSi8I~xq$J##RK zOTu91E4}wkjHi7Ac*FdBEbPo)3Y^E=G+9OKNR?OzuBhq<3z)p|7qELrmMj`j&&3)= zPn1WM(C(naf1iOAy_MD}A4TQ=Qca)?Dwp}q^RQOfp4y^vw5N@I+(aq zbk`d7|6l@LtouCssQBJU64kRadwfd+?%38fm_HW=MN-qUk8Mp&`QZ6R{H0A(n&!Th z08udp`(ntLsMR$M{eiUO2kF94fq|G%fo;e?+2}mPW{)m!-|k$H9^qm1K>6oX>fRZN zrwH|sXh;%FJZ$tSx+a%~)f=A8Y+V-v4nbQRUS%&?a9ays#>zrl71JU<%K99YnSy+F zpxQ?~D_0NXe+V2Cykiz)7;@xGGcv-p&04$Bpx zjH&}W5u!Cdp+~D!k~8}a+WAB9s$#=gK5MtRFnhjcpp$4O2H|mib7bWIcJ|thD@(T* za4D0+(LR|JqeNMG+)9*`n5Zi#nCq?RK;Ig0#fi^i^;^x1`75F;YJQp4jyy3f@Jk1K zpEk*qCEV?C)i6O7v!bdc17OXnB1@ZD0T`fAl`}&GtxW%kD5N}hwLV1-w1Unz+N>SW zN^nFGLPQezF3$|5fJnHs8IUaANW7$Pl6RX**71HXFF6X|A~Xrs6xdFZ6z)`-GhI`{ z*~1zUVz?xOpsnPvFRtMb~VaSyGSu0CK6Hok*t@Dc(&XM6EEKX z{AP@1_WGiEh%!knDVlCKdY@%pKU}4JmNar61t7|ZhKdcv_Iq|Hmv0u?n$xVxp<%(; zz+pnPK9Nczxu50~ivsnw6!1ahlmRCFXZj&Bl&H5HPqNTO|xu#ID@dZ_A;vTe$Dh<2R% zwUr&nG>QiD8joc6smfu6dC6a$2Vh%~iPxy75mzQ`Hp#~iti3sP3vQ6m8cdcWKc6I27R{+LqWfMNe?*K4Ih?okv)UgR4O zFPjWpy7nkTGYUsB^*7ahCk229jbZ|BxfE?;wCMlz>NsL`pM3BwK2m8rt(_!I1w+U8 z29{SW-z>8eS}IB)PhHMRU5N=JSE?^2--7TlZMIm)FmcPWvy5I4+%XG0F2S==czZp)v-*y0U8GrxufNd05#T2f!W zKPg{dkERX*;c+@ftS8VYI!A1VUdxPKI|&35^=}4z)2*!kCMmL@+@hq17c{$3=17zj zp6Hf(^t;)Tha^jFlCyQ+2k>}3$xD(_*C^N8?i3rhK90-jf83sdfn6~Ly1KJ|$OFPQ zU`S|ol!?wAQ7Rk+EL;eiKzwg&MsR8(75pGEbu$9R})rDnk*e5sB2z2+Ru zLuSvn;8ae>4pMB!Zq0qZ+kA)`{5Hu+Hvu=^S@VU#pcL?#>7w(J(CNL%Yy@)PiNg#R z7e%M|cn+&R?C!6ci+6Ld^mr>T39iHjS6}Vce_lvG-r&H$ER!wixr68+jx$5k-=O0i zi5cq};%?&46q--WQop1u_p>Mu{QZQe>BVU(KTs>sBCa_d(4O31~gfF>htsu*JzKwVw#I}6uil6 zLO)>^`FmMhn#mv24_!anS@rN^B47M+Z8|4HQ-~ibUJ?qsKLC=sNDV}+m%RQ%7ngvB z;$uHFywB8uh{dbNQmwlcTa91X6Z!eog^q<%?siRNlXn|fn@c=Vam{Dj!g>u%Xp>>@D2jZ;1+YL_JE=5?b85gDxUtB zi0-Z8bJJmtlB=kTe_J!VE#(fF*p3CBEU||!cROKx#}%uN;TaiPqe5IPC&%Jgs2wqj z1WqkY$=usCbnb;ywcvi#0#W^t}3k08LoW7jQn zJ(BV9tS26t@(2w5duh#)uS{5(VRLadT(_MfL(eelACYbb@voeai=79{_xEvXXj~&zECj~k+5TD8lYQ5j=QC~S%n5k(U3fukBl8*!cuugp zK81ceV$qzl&KQ!qSv0#u#rt|s$QH$AD{YJJ5rd`&LCHP!;J_#HT2y!20p!&;{E+|X z#1t8liL$hD=%(-ZeX3&+Bmgz}7RNy6PaK-@axL3`O2P6uHsxw+Nqp%27C2u_V{}=$ zA{>?S0Efd9e7%zK>)EJ>R_w)ke|MQbzUYVWpiRf?M|HxzSFCIjz3DLp!(6)=-sRM~ zfrh=R+-@$l@n#!JL+TR~obEZGgej`grnBd9fY zvZTHeE2G!`1=pS2+Re9evp;#iSE0>SG1cnknPHU<)CcrYhS&81f1;e@*z94uXhjsi zwKnls?I$MnU0@HKust6+OvQ>4hFyPGy7-ON^7J@`JL70PuAOPNN0oCEoqM=097^++ zt{an%-338dwrQn>Qw0g(xl>Ifli4>CX`gBj1L5qJ7IQGAXY^{zGq3T6;=$BXDzMVy zNX_`S(TnZ}+j`4kG=j*>D{=;Fia0snKVpGXXw3vqhC*zkKMj^{X_yhiouPo$_yzI8{tFxI$H zdT(glQJp?NJCay?Y>{gOnIVBbNbd*+D&>KeYbpK+h)TZVfQuGB7=rI|A=7o*B=A_p zBS{w1_VUijQ}VQX|I#WGbXkJsc@3_W;ar1VjD|~OFhAde0wAMZ`XZiA}>6=;0x z94uvF47a2wsMdV~wZJiNV`{l+A}7xSMyhT+4m@=$s@-cN>-jq-xHa=!uNuW$tFlyo zfU*G51$=W{A!Lbdhr~(llIaoj(nAe~*yO;>VPUS%q5(RNL)}!(i>KY>1zE}6KSL?2 zL7M$KI4FcUX@x!TQBe4E6yx#Q7RBd70@LjZek|RBYAaXhqx#1H|HsXvD!@b{+2LW3>=6jU)RWa zapl0Et|Hp{_g!*V%t1OCOvT$P5LejH-Z@Kb{>E;ngRs0z(^tSYUT-y7ZQn0hEN6Va z@jJu-@`bU-)yhAyCx^HOFz`T?zin1nW8SM{trZ4${;;)qV4enKQ^JI#e4sQ_(FOIo z0XSM8choVwI)$KvJd#PrB;DVB8k*SHztH>zF9#i(GIwt{Pi}vE$jdGdaJcEU?7ATp zpdZ!hzG?qsDCNE`EMNAK7dLpOmobZPEfrQos9G8?-NCuy>qH2s^rb)skxiiGh@tHeQ?*TEnLV$ctmGB;eT9L z1h+x^onx-407f5m>q!=C;X?h+tS+yg@-J)HRHe-fFpV;a>$Q+cK5>utvqT1-RJUix za;A2+W{8E{*TkwJd_Z7wS%bNbW2b_`W78zq% zULMcfbP1Ca@A9u4#lmvbpJ(fR8*i9x9FOh9H^hJqH|9#OERoUr*QwUod62% zox}Vl*sT3st?aP#l)dcyKN`2mNRr}!Ij?3oIY@_flHC@Sr}W1xk4&=e%Y&s>)XD6n zJ_6m2Nw~{Pa-%IgEtCSXj#cRf_KUr-d5@7QM5d$+(>c}6c;wlTbj_Bz(jgEb(LwQF zc{!=DndDGHzmDA>5;SN`s9E}ban--86a@95AfedwwXJg!?I?6BmP9oKk(Mbw^k&w` zEQdimrS^YhDIB)T^fX*xNQ}?1qn{h{ol3A-^&5b>+ta^JTM%cW7AB?Fpv`}Q44AMm z?5XIf4(oheg5y0O*YWEdiGzC$D>NGk3=L#gpxh7<(Y|5)vfqnCkWU_~&BnN1C;ORT z9Dkl?Sjt{Rut6vsu9LdcMYzFjuH;t21v6Kx^_u{x!Oim^Sm zgp=NeI#ebCs*23BLU&FUqH1I<2LjEo?+tg_=P*~LCqB?FnfF^Ic(~ozX=0w3%yuk` ze%VAfe>=JImdfA>UwS9F>E|WEeEx^p#c({KsCb!Q*v!qI_QMYR1u6LvMUlWgZA#{8 z)^N?sk@_R)a42#s%am{1b_bk?#rm6kDZtHn6r0)ql?8aS-jAC$#IlROS6jNNxa0*E zFHX9%ow8ADpUT6=dNTdJdkrvshMm{&Evw%#JfDX*du#GM)&fH=$WhOhf*)bhBQ8Yu zGaw?lG)2hOrs{F?A5Ki<&PA=_voQBxm??O2g-W8A7jeu5o*>z5+=$#@-oK6-lK~K zR+qc?%T1Q6$o42xe6z`8vij$X2G4vgF99=dW4{)k7hzT2e0-FJc05%?(p%-U@`;RI zQWP}K$&8P_Q{L-)`>L#oak||Njwa395_nFA6>DjN)ZcYKc@L8R6>+}POv!Ci8=m}n zK1;gjc;8s>pZ|RL5rkc|UY@<+ogafct6~E*{2OY9ECUEY)XVI|OSer*!ZCuZFBsP| zO>NW0AFAU_Tx^t6;b8buu-X8b_9KN$T2^5Z(RAZg^)1gWGiR`$U7B5aAB);p4=Cm> z*LG*kK$`4MfORHB|6A+>xbmICf3gJyofMUdg(7R~UY>EBK5nn5)B<_UQ!+~+lq+M4 zLjhaVWwVanei5o>+B|*8IjMTYoPtkS!N3Mnoe*6fnRCBZ7nc0${+A91a_fNzqfC7@ z1)J=JSujN7BC+vw3KZqfCgK`Tzr_Fyk8-dHXvw&sCDXTxkQNS!gcybcs&b|oOECO_ zJv-5wCrmv$zv+f(RZPX4v9OknA2R1Be9F!5YWGYD2-h8}vK>(+mswF!QBUaZB^l}d z1Sy`BX+|%HQ8fLI2CCJj-%N;R#evHZQ!UE{ewntdzyLYt4^mDJ&&zl9mmW5v8!RG8oU3j?0J@YaC2>hkjx8r>IhOD17+9w$?0UxL zNjy14bt+0qN-Z?hFM&u(M^|N;s-%)EjzkeaJU>`Or309%^+J9Z$EGK0hh5`J0LOrW?VstUj3BeIv5v`BLg)i`Kzbvv`KADF zacy!`30?{^2ug6GeJ>G0V7BOQkj; zG~ZWGb0LpQv4e(^5~Ob4pc$KCt%OEC3^Ce%y`-6}M4!~8;+z_z2du=X=slxciJpgz zR;etvP?VD^=>{p_nHcL&78P2I&6$v`M3exzztq?RrVrML2NIs)_*r}KWk|FFjiLJBV(!PReObjAo!uB(jMjgzYPrP=bPIcr5spzAmo>uObP47H zMX+Edv9^YrI`8PSvm*5mnZxCvh$Jrg2wM$or;1b!Z08z_Z*fg2+->{eg>yFI4bo{C5|!8F}sTxc$-$jz7^@l26{x>XYXFZuYJa+xNSRIdTyo zbDGxGr9u2Qp1s4$T-_nDnvj<(qb=kVyFB)ZuYz2o~e1wix?NTCYsS zZoWF;_kuMxL5%F++@uGwZk`uAjM(M{dCeArh&{r$?m_T z`0-8GSTA*V5eTq+q1N*Q^hm2qY~IuBWs>lSVVT6=dnlR!)L%_GH%Y&fM|H((3A7E z^_7BV-)Ico!F)^%au#a1#z({Gu5yOS{wsfP&8K0HDcti_YSNi5V@$V$DEu)$i|IC# z1}|r}@fgOjbJJvgzIV&T;gtV?`pr-=Xo!KlSS~K;?IKY!$tx?tMy*v+nvcTzD}CZ zi1wJ<8-^gIZ+d%6ZM+?K9tdR!662l~c(Trc+35Is^JD^rLL}eXgwVYmeHo@)?Z>X1 zJ2<+)SuP?;pU%{EvOL23&@Qy{g{0+P{i$gFB#JikV_hg{DFO`giw zAev7E>s$~@A>Bi6m7bh1hsFQi=-@3+A|!ESlDU8E)ccT_j_uzt z9F9Lm{03cEw}q_C$_G8{9H*jSVxFp(&L1-Ch@zXq3Y%^6K(m2u)Sd&&I{TM-cwPJL z=K5r9P16Zk&3%yDornvzcv_>Ak65xysWQwqInZ-;CqcSYGd6fL)gSwn@# z3UO#P`Zjv|><)lowI2LjUk~)I?8W3MLA(5Uy(1M%h4-Ct@358^Zs&#Vu;;Y*c$PWg zqch&sLWl$cHE<3S(4`ovUvc#)!*X!|Gf&j}AGpPK z$yxPx`Kz|-D@rn=mYcT3v0ayDqHuP5J7NV`4@>yudmFN`w`oH0*+Icyk#yT3B@hHh zRG+R)=mblIT6p;ltbk^mj99IMa2UNY9h^(kmLHMybsS|DJ8hWSW|@Vb_Ta5`ZzEId zSMWR&cIMCaNM^=#L!MzEl#`jq%iW)Uj%isH@2^zA*_jR4YOw01-#RC|q8rfxQqS%F zCEk@S6k_%)5OmtXj(c+yX|s}XRqX$g<#H%>V=@I#34}O+1H~G`3BTlY1jCRVTitM} zf=U*8MAYh$pe^vm8sqMi`8HS|d>wo;w~G~x6H*EMRh3X5e}(4-H7nHXsFqxFNzDyo zzB2fR9@&FpEbj~5ASNdkMO)VoXYmYry)c)k;rR-%>+hVG z6>$2XhAIeUaR9{6b8Ab%&GXkKN)g86U;$j4*xCZ$?1jwjcJSwnsd@DQxPPS*Gr|$c znIrl*WaMDMam=uOp?a0?zb5)33Ivu6IL9awB!00HS$tJhm>AJZ3c;w1?>q9aVr_1` z@2h@z7l34GTsb0PNFZlxkU=*3*+W0RsyIQno>%3X3gr~8*Ow(FIr`Jt0Ei^}Z}|q* zxM{z)3Stn~`Q1G$aCL<{H0aN9YGcRi13}>0BlRyQgo>os9H1x5ROHBBzWVO7I+|en zhxVT<-oWlmV$7BXAW}C}w2_8~4}|b!Vk`L=8tSFt_9{+jdV_B%9@tFrN6#77<(1dl zDSXsC7}qR^XFm?j{o2E*;+>V!dv*2JwuGULz`k@#zEc^4$?;mIXWWTsx2DFGs{?_5 zr;^#ILkiRD@53@L!GmhQ@c=~Jhu#&^+O5jpGI*W;Awh3Wgo!Z^g>?nWaOixf!j|u5 zSyoq|BSYIP+r{TEb|)#Ps#56sy6tA*@j=N!`c|*$Y|0)PATRb@Ky3a~*!xwI5FOvx zLWA@@{_V`$vF&ct?ed(C)y)$sfAvMRyGrzmwCK~YWBHTm8?_9b{;cjqSZtb}0g*Td z0om@8epbsR3F1$sBlxRcSNe`8zW5bgoo0GCG$1#pk!9c9h+xTgCr1qTV6PE|;&4o4 z9D$3?TUWyvj|2Op$ zsx?RZRF+t3CG;0i+t7M4`BUgyG+dE3keV6c@Ah0ICJ-;@1I&W|3E`ZVfh(erD2Bx6 zeIWL2)aNF6TsQRr#QmkH=+p8Jz3lsJ&(t$8X~f>ZaWA*rg6%`hoHjB%n=Gr+YPTg6 zW_J%{GBLqFcgK_=0(jNGN`gG5?nvqquKa}%0wC1BYL$)@PH+xCz!U7`dor5Xm~3Dy zuif>wloKa?%i9ou+`=fRRY%VAGt``P0As{1e-vmG^doiu7ewM_q*?ASS{GALm*3l@ z>w17|L(kX4FB*3T`Ex=83eh(<54LcoxJvHUDP`CZAsJ#+J=b~lphSY{L$xvzM!w5B zqHs+YxJW90GS=?Lbo#4EO6?y^eb>2@<42F@y&O9WLq?ylw8%NeS z{^5fp(sL8JtneK!o4Hk*%ZL6MY`(xk;-U2)#}w~a8LLA=^QGx;jTOFTU#d(G=DbCj zjqKlPZcw^A9-Bi2tA;ZMq_0uX9Ql>k!|)bawl$ zuQOhOL}Td`vz&r`63N%@EZ%ECK6e|QT}NufH=x~^;@bLJfd7O~4Z|zMYZmr|0U+sw z6hDhQz)!U#J5St|(uzlM`EE!;g+075vB*E5eX_QQF>=G3%976|mae$7r7A4l{~WJB zbQ1rq@f;#v6^3VeAz~IT)w8iQLxle~gs*RM^}plJ!)G?dp(XEaQpmFDeTSI(_ zj-3Owfwl^o|0kgn=BZ3Q$57n{ID@5D%s^9Y*PXwK_A;fA3o-_xi$&mLPmG-qrzNd7 znio>m*{9WwTW1QW4vVum*GQpF#i>eV4qAoo;qpyHqEVdVYAgm*&x_XfG)4itD zkSBwELT_ZQMS^}c-&mIlV-GT`bk--jM5NcaN+M4*5+-3>_ce>Fwbc9K<_o9^p&Et^ z{QcZVIEau|e^B7DGmm|nEA_k+hE11ARv-m4|Ank6W`Btn1|P0OLo$8x?Of-*;Q?Z< z%?e#|%u+A}AKI&zG3BQI-N{q-z~1%e4aj_I@Jf zMf>>h4Hpa?au(J@p5EFoXMqb!zdr8sK`pPf(?u1AW9$j??!)Tu<9 zg(s>OkPKgTyQn4SgH{TMTak(tY7XOQ!CHtXo3(Z%Sqg~r3mRO!hfX;*}@ z%noCu`%bd7`!8nHdC%S90#cU`p0rt80r!Wlx4uYnD6xnGfin{DF$&{jFJe(JMfq2p zRoo`px0;OVsYQ&YG$;;h>q8FJX?n0=9qzgoPB)(FRD$0av{s1&zd$XIa^%MWh1&l` zB5}U`$)m=fNmnC z1?aAEPvNSqu>6}%&&Sth$(g1lD5LT`3`*7h=W4N?N37_Ztu{BO2SxOK9L}|a^DLytX)>)pqnY-+-x=Ki|Vg7{ygN1pVS80FpguTqmT4dBJ zC2WZjiqvGjsJZu?oE$ly(&gpwag`!7?U`{NYg|i}qDZq1j^A1G;5+7ZB{HsVC7FS< z52`D4qw2J1H2(ug?MCFN(*Yt}=nvBXBDWiYjSNZOq_LkF^K?;?KHWAZ^B~SDBo#|K z)l^n{Q30Iw-Z0r-?LoV(T%hmQjyN~azt)#P9kdm(y(IkC%R6ju4o!&p>?s8sF1Jtb zUZF{v!g)soMSM^6;%8uu5Q9y5hj@mV%PfN(cY)F4=QK~A1LOz=d-8r1+jMOXtM89r zapUTH-{Gjb7L#3n@yy!pvu)(l0uP zoZ6l>Q*NfUqPg**Tf;c`Te6Gr^@i7nTq3&m4l@s_Sp8i@a9*NaLuYvNOFUcc@u)WW z#tLlaU|O%8Hhc(2+P0SW2kMj3@(fSa-kyKGc~N8V;s>%{_WZ4VWMS;V`5rrao37Th z$K8Y{Q7p%>g)<+#AxvPTR6UyXDfcy5=xy6uq6Pd|T$5*gb++v94A`}33#G?e?uMaC zmRzp;BqjtB4fVvmF&KpTozXd@G!=vj%63f7O?VBjztRzSelYQqc8?50{JO(fxLG*0 zxWeM{Q)d{=mDwCjzGToBj8E!tHzcikLF$ir=Fd7s_myN-kWZQH(dFBnYqiM>Pwnf3 z(HNDbHGDa{5B!BUb$6J)t?QlDoix5(pNb~p{X}~1h37qEK-7LPp*NG7CFO1kyC_yh z_4@(kax!HiU8mm7!>oeS0HRseD+q^}EmRDTOnqqiYQU2(U0rZDhGJU9pi_iGJ1d!)6DMJ3ZDeaXeAOInJs3 z@b6MNCotV-=jy8X_{i02KFrk3K6!z~;{}z)ANN(WXdbjs85H_ z>)h~xVzUp$#yLOCg^9vP^Iyg<)4Xu+Y$j=%WVfJ|;s^3Q2l+))AZHBpgTd?-dZP-D zs#Hro*0x{PgBNq*qMjrAn0Z(ced1;p@1MPrV$5Z>tePz`(tDh#HL`lF)UEFc_Ghnb z1r69^C@zkK0VIZ__6^&Y95L91#)`x#5sC zdAb_09F6Du7VGcDUsGA}(`AD#A^L15MB5GXzx4_qjM1s4MtZvY@T4%gLl>B~Mf!F7 z=tw+})NBKV)!ieZWHmOQp{ID=;qZ2`kya@Es$3BA8@bZsj|(LSq8M_fHXo%1&xJRlxdMPeIIV|&|kaRyG!L~=o=&tkoC?$M13Jq^gS!-!Oi=R?Qu zCs!(Wcy|24RWPFY?ZY1=10o1Y*NbnZUxlySBs=ne{I0Bzn;DVauu30vt=>n7ZzS6M zI$uG+*q=Cm?l1o3hw1qG+8EeaOEe7T@Vx%U@qS5;TM}%5QwGN-c8AwD(`WupEr2GG zTowCv^;ms&=0l*3V?o8!mCCQ^b^K(j*da)q#tt7;y!5t81(Fa3;#j(yawjdTrHPl; z{tXz@J#2obXeqcQW^UyWz95i!q?A<>%xt+_mO(f!im!YmWADZJeieB-Rilr{kh!q- zcVN@vA+PJfctwnrqNJUn`lBXwJgXU{uu6yLl^O1-0dund@a%%wIGLGhhMky8Ad0I7 z4cxkMA_7P|vGaN7A>Q>(SSA117MNp5$ElY5TB<7b{og0zT>Xv?9I;%?dD*UzRT@a zqMiiY55Jg0*+c1V?V?TOph5mr95GVvLa&{^5X|db(tq_-%`%>m7YL`Gsu>!+EDV+V z$XnT-6bzm27%=$XG>ARmjRWbvr$uLs_btz*+>XB=Fw(&^^Gp?-`jcIZK_>C@hVRGm zfM(uZcM5TUmLE`MxTBV=m{&LGl)ujVgcS#ORPEz_>U#FRD#Bj5UD|QItd2#fIR`fq zFi_M_cu7gJKR@Z%fn#3Cy;lOXr(`L>kM0E=JRxL}e>{@BJ?cK4pG7&-*K%Luj-7?l z80os@WcS;Y!ow-GS)^_4NiWT`1E zMIzqu#^-H{DDAc;fB*X4wv}{6v_JmLIycamT35>&3IgxG-LD8MSo?&U`W4>bjnyE1 zp*MP_vsXm0dr8oJFtIqA%HsfUWpu*$=*gZrHR-%}yqtf8T}k%Y@6PA-YGvZy-80@! zYd#;US==$cC1x%lqMFb%6Q#@IGpod0)IB;4aae?U*(A$k6UIuK=8;Wxa23e#r2on5 zc!XruIP94Gu^rLOZ=ktltCPu!xVWM?dhOI5kLAV-zANo!ZunyFwf0!?aSYv;Wf^mf zydHH33-0#Xy}$nGEyn*urqjwY*;PAS&S|KVJz&LIio4d3hE_cx!f#l1<|S962`ba` zuQxNFr*?1pS$=MyJmOR-JYxny?a0p7Ft4uj!INU1t><|~JgsZtFw;QP9|Vo6O)F9j zOStsI)8FfhI!vl*(OdG41q0s_V&nzu1ET69r9tPV^`oR*lg6vQ4X1AWiZ%M^gk2FJ zHUtlglrAuagI8_1-+RBd<6*n^Xzr0F(Za3>E#AsS!=c9A4jf79Xo z%FLU_1cbs0$UZ!4K_7|fHD;9n&t2|}l|uJ3Ud*ZMW1LNIK&zom1tcZ%L<;(UTM_cV zcOtPOESiDRHM*(09Tf>Qwbg^90wS`;>BiK(*u%E-+w@DB822*C3zYzBhCWK6s08Yh z4IJ#q&;K-~juw~HQ_dJ|?N+fL!bT#!Ztb|9BoGquO=c3F->y`l)@`grk~FXLGCWAW zuHf~UuBZwblk1(%+UkVPttS-qGJA?9d(ZAL65|NZz-=9-1cLG8XCj(TZnT_fQe`~| zoSf~U`aG{i+Q5*%{ME`4Th|`tV9DuJ!__AWkD=)A-EH zfx0+&9^O#%Y~PP14$lq)Zd3Y$xOnH#O?00TqFgdB4M@Tq62nvK zuIGK|ATdO+xZ`y&1p3dU%;Q2#QShK*_L`kXDgX96(uEWK6RMF3a&GSQvkHJw0j}X{ zGn`uDiS(i1#C1>YxcM6x?9%{mRO3v=*_qPTwFpSDbq=TMwFbP0qaxFphcVeQyK_#^yeK50p?^Jh+U>-rzD>Tr z{Wy$Rk5t|E%pQ}iHd>g4bM!tEtb(H^qF7Za0>g9VI2KTv!AGC^^y59OAD-Zv$|At1 zz3JeGQHiFjWzb3$-n>{bMO(R~LSDwqu~PB-e|ZIAL}u6Q1(-f{ zp?2hR+0Hr0+9j9nLuM}+ro1EsLym12^s1skdrKcN@1PC-WOt#V<{7OnS3z0cA$J#9 zdAqF#=;(Dc>c|DT{6Se+`=E^vZenr@wejMg%epa{X})#4el-wbg&@}&J5n8Fu8GAi zA#^x3S1E+K!%d0oE(l7d4stutAHSWv4& z=Yff|miWA8!CIaG{oYeE*>v7b`3U5IQ|%b*N82ZSLSEk{C+B6$Sl|QO4{5F`7btLD z$Kh$5{6KJjOc|w+ZOnUH%dXIZK?-<9%BoAcPZm1nW>PQum`OL`fG0F~xAE-eO9!{^ ze?4B3!~dC>gvIRqCS8;wd+-{+v}0>>Q!pTPx)Md9vi9UYiU3+JZ;jR80N{ksP#(Gi~byx=*036Q8 zQ96p;LszajRYO>YEShBYko_v6t&~M-lNyX)zuy6r`83xK`HGyc=lzG8(7~bTO^s;5 z0-PEE@T9}lFC+vI-@_&Etur+>F0%AY_7a#L+fgj}$9|P*#USPPxTr*_lFX1b+2`@yd_TN_kUt`-hlbl6I?^s#1^+_n*&@M;?kb z{M#IAC6JLw&9Vxqd+x4|(MVow)Z>`0qRv$UeZe6;a;A`qk`k$YhKF#RSqh=P0y))5 z>D3len+V&1PabNA6H-(3h7TM=!!*o|8sUEqS6Hc%mDoSIY{T|izFA))Ma8tz#8ZYF zVJOu+WV0r{xi6$eLvlZAaB;`(r5xEx*^T^{lXNe{NT=3@zmKL`a~9)3`?`y(5d|v< z8JaVPQwc_uQaHnURu|9#$)CA%)#~Zq07F4L9e^ip|MVrcxQU`o3Q<_WB;#z8 zgyn;DzqAvclSDm@8t7s|fuIdNWbu)T^CJ1AJY`fQD==#5zTTvFb<5>!<0zW+;yvH^ zKa%XIxnJ2qEg(QogB}{0U;~Qij37@Bxe>E+YT^P57i>0VeST|Hna9=02g#9PTz`|PRK^OUdZRwQ$|G###vCkH7_WxX9bA|Y>_j=pVe*4#f7^T{E}edy1?=3@*457u}DLZ4(n>i=Ilx zl@~ug{c@50GL&A<(4VSh1>Mpw>3C5}AK5ORI$h~^WbdLS92uQ|0!{t}YIgDHN^;&(FCLXUB05&8k?i(RjArJ+Tg^42%%w)hc zzY-tA$}N`*;^DYqNuBekzDT~t!J*}s|HWlw0O)t&RyC6*(RGcjJ1U%xi_~BdU{;dq z|I!Xv=vXNrLO665POLO&y3GbzSeqJCL;aVsmvf+fBMC<1Fhu8rcS^s%lm0-10dVtc z0xA1bhC25GYw_uT5_GcVYLfl(0yT6N@|jc{U*OUSE!#@v9~q7^SQI0${dL!~N&qzm zK$E6@T)d`X0Zv8V8P#gY98$b|VZQN;e*)>6mm<{HF`CZJHtqxKkI$UTdzo=32EY5jS3um;sSBfJjo%?F{R*oFSGhSO6}PHoXt3&tBtxBRQZX=V8h?!)xsp1)_}S$&rmV6}>}R%( zoLO9n>9 zi-vdV^=pJ3p(eAa-u#P!P|5L>Wr|jUq{xgJg9k~r{P9*9wH*wLiFSJwT|Q@0i63H) z?Q#0xKdtwJi>;0NsVI171j%>x z+N?Y(e!R*UZaybrO??jfx9HZf7GOE)p?q9<#JzclZs&s=U{m4n?`69AAV0pFw6CrV z;p$8VMMb2%EnrNdl|oy%aPMW~iqZI}Gtk8De%!gaAL@S_cTbL$tq(0Qc{cjg>RgG9 z?qLYFxb(~rw~^^yqk@UuMLl~qT||j)NFN;9i@#~#J#diyr3uU6?U*zdwfAxyOHTUh zCws!}1NT}=I?llQNk#LZvVB~ouS?OzpF|hsBz}`GUS^E^yW#ylt#b!DnqbIn#graH z1_I)%!O8aXN(nz1PjF+opIc?Btrg} zvB@%3Enh1B88(sGgqXATs_?=e^flg#@Qc`*(;DuaSrgdoHjp%GDg0xHwl;UBtq*4Y z;sa)CwE<$%*WBhDfHHJ$3h=le_lVPc4od4t7QBV&_tRmhuYH`=p4~Hqq}i z`RcDPjADuqXd-$=4q00US7{2{mf@3n9R1b&=fWW$q#I&4?)k|U=UEV=lfS(zSDUup z+g;dMT)*Sk;y}pv#%{0Hh@O|hyv4Aq(AIW>Z!RaEJh;W}sO2G!n9BoEuei}t7ZIJg zM!!v&S~{)6!|MPBZpe%GW2jQ)MQgpmpVrvNHbs`qPX>1@!&+{!M8I_ot5OkXxs@!$ z^Guk<-uy_k7J5JWQAc%2IZfQ-WE9-(@RHoodS6iQ9|8Ecp;J9q$_SQ=|s+ zluKB7qahY*bouYH#M4jwDgvoDk1EWUhY<7BJ=96Fg8bXn7nQbZ>YNLo{bUg8I_gU9 z8CPlt(?^%|5M=__k+}|Cl_IHI*auW?oK&PU1o|)t!4fwXKM~Wm4SBl?-v6IRRcO|IT;3kkAMc*5%aGmO~+`qNxLjH@g5Q$6P zKlN;f0g-}zX#Q;;)G8VUS4f#h7_FA)<=G-Imz`b}Vc#}Yz}+AC##pVKpQ)i)A$@j! zs^p?w8|C0?wB+;>x__ZFa2dLWjkNckJ8fibyqS?%kL$uv;kEu@2M1AqEVJA~@bd8o zMogQ{W9eh`1(x@~J;Z`B|L(0Eu>EM%k9L;D*n87<7A%@kruU;Yg{WIq ze?BfhL=(rO2RZ!w_m-Gc?lIf?9^`thISP1wLwXv-1jGLQXq$26nHCr5o`vF{54Wmo zUC-l3)OG3$y53@Nm|zgtDMZ+?D1Me|DzS(T)vd(-G6J3#%Po{P_} z4(1q}Jg%ot8%wJsvMcFb-e^M#xpPa>zd;aSeucC!L=dCiIo$;bYf77&vyf6vYe};h z^!4o!nxjfdXlX(@Mv~wws3^4*&ITrTY0F8NBW0u(mjomuBooeJNk$Z2ogdAD4wG(^ z%;L=aye6s4ZTzKufi#6AEXzAHF1KDhH_y8Iod-6<(D7UIpmlj(KrUaZ zboJ|;=*dYn^_oH};B%e!2yPT_Wt)v!dF#2Y82eC;1gkuXL3zCJ`%@=E^$OGjKTBeL zajYqO$4Qwnwp7B_2Hk328a|%qP6S6(O=%|kjGVWJlhiV9UTh6q;521Vnmfl?z71A~ z&X5+??azL9DKOK70uQ05l@D1!@p?iXze!O|3!i{mB{iVJ!Mn@(0vp|UHtlXJt!XgB zO_He%f=()WL4AJ=o1lDNmA91+(*BB?NR4gU_kQ;r`2YcVx=FsdPEy(r%ahm)I+b1E za5#tV^nSYn@kX+qBD~Iontr~pF*K+}rC8+=D8%-~p<~UIpc;vroEHa+@F_2(9cg~s z94Y=3Wz})-ge8lS86cA+<}M_q%{J_5!%3?yS&1Ix1+P}!*KcM0K_Qee7Ws-;m@z#Z zj>zDCg5^3+Es4jJO--Ip8GfLkuFXXR0kXp&6Tx=L3}rW{>Cbb6^{)w;;QfjV%f?HD zIw>Htc(oQ%Rr@ri20rTpn*VjM>iXmtqNi8UO%;1%cl|ZWKDHY?%Vn=g+YcsRG_CjN zGS{;Q{=J4JojwbnSIEk-vA$8=PXxp%>fUxY49}aT2~+z!EYtN+m&es=y-yCT9nrPT zsAcb3id_OEqc7q*lkxGMJ(mN*J|_%*&m4pXqB=%9%1%?B+nFerPdBh^jwp?GM(jpt zFN#S5gHD9GF3`Wbf-RIR`&}QuC=OP{$A@6{P*Vq#E_H8aNp;qfO}dvF@niU!zp;9I zabGv2UmL88tbdHl+Zh@2v`^L@H;f0lqO5p0Q}A(L3e3$t?GzS)i$|q=W@27{m`yBS z-_nG7xFQs4;M^=WeGzP$-I}=V%9RHrqi^X1h%;z};xKFm6?HkmW#Pz(%;c`!T;F

ljbh{q!>g)scHzDKz@*W-$S-1zSQE*S_lUoJaZRT#(pZ3=Gt0F@GYXY3AvDoqc zkE9$+FDBav3C^!kk>p)U&Nx$Q`aS#i^QbZOIn<+fB!(#%UgKfyu%g9E6-p*Z#P;gJ zuPw;to05iRMWUm9RsL>=GE#gZuM>uwQ>9d}K_Slr_AVIj{qdmY+nlXkDM>LJWByla zV3At79dooRc$! zrCrsc->tWp_XIVPR8*)0UG-b^kbw!@NZT+GLz4N75uqQssCYa_f_4+g?E z&$Wmb*~OC;E6)d4Tdt$Pvvpsu!6L&evJ@u6Q}R^ z-X~a#4QqCLyv(-he6o*7!u__hP(AF7!3egR3rJh@`Cd4|LdxAR_0HO79s{t-B3JWb<1Q;@5~#wsM2%eV z&2SX)YRRy!vzO%H#S-~+x-^s=C6SIWYfxqQSf-USkYKWn5JDA~^QYCT(l~an#!|UC z@tn&9cbn*I^6g~&Ic!3`0%2Y#m7P72Kyz?M5wpbo$?)%r3S*k9aG`jrb4ib5riR2x zljcb%Lhk~w=xO2}<@@r+uNxxcUf1gC~uTM<=drgRHxYDu&AY-N-oCkPeWB-ub0Cj~qNE z!pC&hw;nD{PK6y${O!}1`}JcsUN%ROY6HS4z^G4dEe^E&GICd~y;$eaPjy_TQKI8G^;9P1XfkuSl)>UV2APE-%4UFk5 z|LO}hnC$O9T16#g0wL?vTvM}2o9LMHS5Tdc(KgF4BbM5eRo+t+g+!FAIG#WX8c z$Ue+n^?PNTooedWfJuNhN452LozEfbd6zrJ!bF3a?@znYWRSvFFo+GIey>y4qiGGx zuJfSmD6!lg*q7~3?lSUGCS}V0P;}f|{b~GFLw?L&zGOJ)$s3U#Hd!H-B)>CJSf*&e z(jkyV#q{sK&*aCDqQGTBX!4N2HEAoNSzw~Km`Q?SsQn?H7Cdqbq-VYTvf(g*(S>T{ zeN%3?Z^vr-x_8mId&}ONoK<$cFqzVmZbR%QOylHUGTx_W%DV&qJuc*C z{%&gT~dCEH?yOK8=G>MDMG&|WFIAv`y8w-`7noeI+<08%L>(g3A2l+6lDjGrK zT22+pfursC@B;i9T+5AUmnW?10RNXgI=yS9yH&0AC|9Ue&l<- z@ResN``*vfCTKqrG&_h9GcT_x@h~2tdvMh zWk;z#=|n~DeRaRO$2ezh&orF8X>`24EiaFNAB#`CWp9rMrrU0@CJsx=4m_Kw?_{Ni z&(wZ;&EK0Xh1sU39Ss=76N)7%B99~a!F-+bKMqeQ|JD29u|XR_h413k!XZNG#>Y~c zum&5A?lLFHLX21kOP4DJ$5`eoJm>fA-X*&~whM{_AC0(sH%#%Yexr+~9{AmJauOHQuY4QMMuISs(6QfO4^IM*3zH6!6QbzTq1WzF z-fE&gV_*wzN zWtBi}R#`XZzaj3PcBTBTkypHa+D^Ez#``@6G`;oZ-t+jTVzy}kF1g0?%#j0$ST=DQ z{mtRTSX1YHH#`mSbJ;=RFl;HTrz|1qEcu4^Vc#!+9#}ps4i4y{9dO%aDa9=7 zg>q)C0M3cKS-zO%OMTII?w{lks8}cylAMn-&OxcWxas8z!J%Zq_$7ac`1Xjk*h7Yr zFm-zl_bQGpxua#P+Cwjzk!To31=^VqleL+#Gru$f8rn{`k2xYr5q0~=LgMXC!ljlu zx{peGLu@(%Dol7lIF_l^^=dvqKJSNO?CvcoaGkhs4!^#TDsK;(X{U;{DO~TfKQR|8 zKQQH`>!t z_Ypkb@RI1v_(OdSBwSrG$aiaxg^MqzA776S75(=H36y_)rtk$Da@(#eqBm+Bd&=q_ zV(9Q~YQhy?(&JI0pzAI5xa>a=g%LtKaM-{U1IMV%qeoK4v4a6PSa^}8l)5n+i?U3d0cQd__~o( z+|U;~`RWcB8Z1gW=0fx*9K=YB>0o?R(?74c@GYAP7~TDozf1~lpJt0Yy>Vnjy~f^6 zo?^24b~E1kE68-4&Ee&&XChS}9n>Z5nY#c{~m7zx=-=$~}tMhI|}@tbNgtiR^!7;0Dl5Ql!W z-YiRpOz+rBpMnOf)rSTtJySReBlr_edJX35fprhHO>OUOn1Fz&N%P#+l{eq|+Z9vF z35wOiV2>F0kF=+>H;hGj_;kQ&^Je}1r7TB& z7N1$6qm|hq+63;{q_45G=3EY^3X%kf4W`T=rmmW@{6i_hf7%q=>SFaDV_Rde1$Y2iJ-h3J!9bE-N&Mua3P2q6M*Izip zO@|+Q9QLhnaD_(1BrAbaWve$Mm?kqT7fG<0uH;&miV}+WKe~Vuk8zM<1cwNW-veoK zQ9u%(sl4dTJMmON>p_GmUKaBOGUnF>Y^}kHG5v3TA?oxSzAg$6ZmD!R0g%Hee@uw17%~U%{VqPVL-rY*R(_~B}L?(qM zMll@%^CyHBGr-Wd_ByQ9P!&ajU?NrslthB)fd=>|5(Eip3WOk1kjzP(&G02e$boB;?28&5=81x z83F<6TFb(#gXN?@XC{T3=R0Mn(w845aY@(+)^htE59^G5F^p?SSGJ#2+jR@0c~q2I znN_~EZQ679T8lWBVc+WMujJj*XYc0Ll3^c$HCoG}>WZ&ZsPK$@!3K91P~h22u z=dTxy{VCh8q%(|l-Y-L$C@*lbo=g6>4{gwNgt`u%`lZYkGvo+iij0lIg!nJLEF2oV ztimWm@^5;Z?N?Z2{?uMv3Uw$776id=jXhe7X% zMKW9rO9Q0b;3T7{yvxhA!(Fz|I0W;mw%x{q^m!DpnT(hU_V=7f4N~l`{vFSSnbVd! z5nL%%DvSkaf)JW4TE(I?+tGy*bkLO2Kfaal%#(bbs>q+EH+eOgback+z!BCQ6ML{>0M(0P|) z=hFr!h?S$M6p&&Q&3nRwT82j?kP@+}S@?KCX)q7iH6j_=FDIqT&=vv$If|uCt|9Zr~ntx zcUsB|%WAQk__YoV8xccJ@k3E3C6J{JhRQkTJ1Ddjuq*VAO`k;4$w+}Dd6v-e$cUeEoNrx7fDcH)Kn z(aq%|IZs`sm`Zl%%AK>v#jx|p18i1l1rvEvDwQ#9YHE<1GBaZVq2yh1+>u`?7lkvf zvtC~(21o0+T;e4Ah1&1~3D^Qn2V2~~Nq>5CM`gw{GoojCxRu}VENu1F8^F^M>T@?v z)ENHlWLrXV{jDqgBbfJ8vHGEQYGOi~T5al%aVRGz{EKhx!KHpP3{Ul9xw#55TJKGC zQ8p$&qS8c*nPerhjA0b!wcoD$pswy_Fqmt;>E6Jzm5egU?;g0YJwS*sb-pL!9}6$2 zs}pVH)Z*rcvau`{{=Fn{ow9l9bx!UTyn?Pyha+4gQ;%gk7w1{7kpfkxh&5yD;kB&3 z7WSH?Q{NV->jWZEm;TqBJ%?~C{Dh2(l0inuO&`TtTQjuF%Bo+NuS{INOZ_tgtCc=h zEU{b&+bR|Uq>Kz7u$7(C2z$NTrtG1!zMgn(Q_~AklP0Ll4WYM!Wf_SY?AT;8(Sg7} z2?uM6Nj5{L(y-S(lg8z1v%Z_3f{B_=|B9xjn*Tum#Z=$!zD+H53m?+?v{aOn>HSE~ zL<-kCL7oD4peQ1ums`yRG`GEqBpoddGHqu{gUtlTcPDA^L-~on2~iPywlfKi?Ol12 zDq`9!eb`Jr^9~;;m*Ho%=)5)U&fW-@&GumDYT&N;&z8DyY?n3zS!oFOZBVLSO)0xf z4oa{X@>BmUdwC}*!PsH+P+4{c><-AmM0!0!c7x8OG7h zXv^O9>+9UJo;Y)Ffe_W|e43;QvTTWViK(~F210gBa_HeB34$$db=|1nTNPbw{Z=$J z6bHx}LeoxGnNY|NFFt(kQrx&k7);rQyND?r&xyUmPnDJN*j$fuI}W1|WbN7{)*rwP z8K*xzjU++G2RS_L%E9^F9-u!vJ769vI<66J(>gt%+*leP^v`nG&N*g-?M`4QeRQp)-l9~d>{ zn9Iw2ID;o0+VLQ>nOBNPYxl8$R?r=K9{S|lZ4f8mS49VRzZ znZ2Eu8(up36zPg_7KnvkcX!5~wZETl93Nd70X!Ypv-)(zzp}FEHF?wgqba_z;alZ( z_!ygdkIXKnVlp5uNE?qD^*oa~r=XJ%2)G4LOXH8M`9^KT?(+6%YG^i4thB6E#&zO5)4Kc`qNclj@Ip3Zr^*$v~ddpnCFvpUSi;>RHj+3m2yL_mbx^ z(skRtR42>74g~7*bWx}d|B&iU?z33(pLefBdoNT8TA&Q;mqm5zoxU_+Pco>o4ACtR zkLhl(;~j`f0t?Z%=ff4)nxv!p+unOD%*gkhmd4w4O=bTN>A%x@)GeH5I9d13~NajYgS~Z^A$Cf&TsZpznIP ze#>@d&0`5oF?hu$j|hPurD1DIw@OIZBHMBkL^&eP&Mt`2yXi%M1|j=2ZUU#6k6|wS zYKse!^8}{2(qZ?_hXW#pecIblnB{>_mjQzh<11k_IN4>{Ja3CEM$M5kqtdm0kd8n{ zI~bU_ndQY08=f|(icE0$#^nJN5G`IE&&DpuyCUO%97Dn7DsYVicE#vn60`@c?tRG8 zWFEWpYkvXItxxwJZT0M`$1 zQJz&~p+^Q%>GM+Sh_cb)}%Br%N<3_1V(K!d6Lm(kf;tB!GgeruZiu zSqoe9D-Xx!Jl+geL8YDaOiNia>b9co+Y z+RVn$fc6-9w?Q}*2&v{Szyri00sB3Ak{L3pt7WoKqAoqnuzhq7cwEOPcqF*$Enuz- zJgZs?NDIEKu7h{tZ2!J5N5eA3m>>my@<87ay>MHXbiv#ZvmVdaYTOty(@a8?1c)mC z#Sf6}k%ooZ4O`hRtbv~b!WInPZ;jQ*k4XhV)xYxLur&IAzSkWN;2GsWfLQp0veQw4 zfbhIErRlLN$@-$u-7wVfT7T%tiitXtZV!eDlmbQ46C@5Hr9o~KKtg;^G?sFI`7^h&dkg!d2% zN=z2-&i+B!t>7f@_gS-U17)^aR31=%Kpx3|UD7OEnUH8mPZ9Dih|qu2hk9Ie?9S5b zE*)?qI*AP}aEE!3=|dhBI6T8R>`Bt={@lxaZg16AB%BWv9fK;NLuf1Iw%vB6u!Q;c zA4{Q!{W83fmW3ceo;stSL~PuWn}LW~ma{T!GA&2`j|o_*qd_higZYkNg{)Ok3W?fD zU8fA43CjvMoj3_GRr_?L>`FbL!cwdj zdx>rwdQs}Gb^=t?QQywWgVCe&I zYw6RMaX3$N6iMN`g|Q(m9irHCaWc)Py*Jx#+YRz^(sk4;dLn15uXnFpDriM|D?xiV zGeAgRwRwIR;X??WW}CYck+(JN<(v1e^0wEMxW*ZskPvV#g=CG|08Fo1-v+KSgIR89 z1qA1@v3uoAFm54K(v2>>{yA8>W8+S0FqE06GHZdMNinFbs*~S4~=g6q0)hu=ZDq2 z+e9jAR~%QMqe>p?-@u|XeHqie*I*I6BEV-fZ}>M?c@3dkJG6T>Ni5e z?ryjYZ5F+jkCOfjMVcltmh4PILLxGsT1VpVY5WIhX0;ikdT7kmm$^VPY@DYi>LjLq z2Z;o1L-@a$=7Oagq<4l)j@=7qJ^x}5r7@R11(3!8r0#=Yel!@NPVf_U7@Y-yme({5 z%THmx_*i!Qhkg(wDIt$y?HJ+!qFR*6v4-D>Cb_4%?7i#F#HFfBM=~9l|9jV9{ z=+D#k9$%}A3WXOJ+i&4{+FNB*87VMHcUnS>EneT}xrh9vIr>lD%(-_SUlo$F1NTMp ze3Da-!;R{5rEZ4yMM$JRkf;6jGBrg-A8fB*e7C+TFhH({uErrjJU>o&g`*ii_3S|q zvW^1*I-jq_9ful4ga}@p>y8-omP_X zd6d->(UENq!Rp@R8hEFH2t8@W;@3Z+M}PmY2EVWLeF9jp?(UXTt_z+eh|94F6AeBZ z5l6-;CQ55$Owl_g`*^kLc>D+R8xLPY?k5*Z>ngR-2-Q1ix9?C$Ur}qfUH86cTdf!R z{JDj366sjBiECSNgKo%J)X=9R^qaY`PiO`&KF`A=Q?q-)?=8r4ZV%q)3*Bf*Z;r=B z=Upft9<18Vc<|{f{Qe$Pp*LANskr5YtakfWXT)GsAH6A>vk0jb%CO;T2<7DClEMM< zR+WG~q;uHCGFlR)2-*h&X+}yNh3}t`gMJ;XeRJsiA?mrxv_@BM*f|L_nAZ(CvToS1 zyYThF)J!m#foFbu94xQdlv1)kp<+&6l$Ad z@s69YzpT#|G|1s$!9}=Kv`={99E`~P@e~!$w2dtyYskL2u^QM%5t6&)iwKIG91U0M zGPQtJQQ5MpK~AHHD$`K8VC$_vAD4@*4Fw9u_B|hS6>o@-`NqIG3{PFcBb zbWvv7yJ`rv3GwgQLKn~%I5m2uI)U!}QnIFoSlZF`h%@CBiv}Y<2S-NkA+tTtC}Ha= z;{1&bc`h~CKUp^3yGGZQ|%5=OSiZh<^P* zOH#Dn$im-AxD(WFM@JBAjub0tkM1REFbgY0P(J--h-D;Zf>#)A9F;aL#@PxH+`3!h zd?G{o?~3PvkewXuILoPd{Z+)Hz8?jcvrO<1WfON13z(2wprNDLVg-W3qhp!0&QtoL zt;17|4LFNs=VhW*IxVSMy6KLnO=lZ}rv1wn-!1!In81y%pS{?jw8|oV(6~^RyvyM% zZOEt}+P4s2b-O2$#`(*EzbtjgRA5cz!zZv%Zl1owe{0)MM-1khA@BSYno`tV($YmM z#pR3+qC^etp`o6CPz;$y*h24#9-Y8)m6u5qV&`CkP7K%mgC18(=1OhWhb~>g>4|sXGppw{Cq7?uZSwoxdVabPd?M*%K_<$sGxe(A3G-p(tRIB_54|J&{O{_ zUg_qf6XPU`o+Pb~JjlBCuB@pvpzbm!Z3xoq*tVsiZO)yT=lk!{)P?gw%F#&EBpyvg zgMO#un!G%O5M@^(V*WAe37ooPB|-+}Yr*&0Dv3cn61uWPe#SZ)a>C0NKlR*E$2qz| z4pIu(uDKgKTqR2}tld3Q1MF%74xR*cj=z?y5L+dr;?Z9XWtpEalu2C@inT=Sd-QXp zJpsFq@xO)QGtGMz?(Bu4w_59woXeO}#Fd6)Hq862q$7mlsxq@9?97t>!5R23W$X4g zczYI5^rx}6=Vw`Pa6RSY(=d54yqLNSH4M@tW}kvhfip`f{Y4tsuwF)fuLCO0oJ`m} zF?xT9vXwmrI%q1(Xah8)tn7ir#qY?^3^k6dt_3%+_+{kHWSd<#9R?(Ykq>!_*AcX{ zp_R73G2=K$HUx~J&~*D&E|MDR7)!tf`AA}F03W- zWJLOO8*c~b9wWP$`{?HPVwq>j4VK8|REcMw-2fweFop8@(%e`DWl#YXE}`>;%y zXNgQRU95P|7i_x$AT+#B?vSjYFG)W?HNRr@4vfEw}Eelsj6!w*B+ex%ivmyR3fUpgM_{ zg>s^CC?WeviM%11O&Qc*sv4=_!qXkxLDy_$h76>NI~DS0WZW1Xw>MNg^`$D0S`Qh- zi2pHN$!K}3?9d?eR9g?v<>sz|tG4hQ#q;nn-io>dJsdT<$svHLv^O=t6b*1=h`J&d zdspcz8VDw#W6DW}tey2W_T_evqFWZzufcHhCzrBk*n1-GiMxTKiEf?gK|cx7g&5W@nqvAzdPOW73#u7NJc^0&N-!k%dZN|A(B7 z^Y$kqYlP?#`%dCap+dK3GIT1AImcaCWFwy%hyof-4WR5gO1^DfT9E|rJ9-kYlhjbw zAK7?4OeA)q=2NY~Z+oYA@Etm83GPRUr~s4LYGRk%+#xm*kBU7Hr{SGky|mxU=1#Bi z6r{KAYzN{0a!BlI|Fj`R@%k7wg52iV-qSYmN9Bv1Cu*}C_KE95mZO_NYucidhP&pk zQiYsLUwxf9_Bo%oX5Ed${&k8zYI`zH+g_7{P^lw79M2EBW!;qvz;An(u;a&fno*Tt z)>0fQ;#4|<&ANRitS(%b`fnji-kON&RhV_s$^mN~VK)f30N~BcTwr`AzMRcV;Gm2V z9VQkT9_FJtKDpgI7UozrXvqKJm?_ZIQLBN!-dq#|zE}K};ScBx{st@Sn<4nA4e=Cd z9zuL$QD2$xW8fgXA38uI0Ni2MKU(xTa?-q_sfeehF`KhNE{qa3=aNSmj);xvsoAS* zZM!#FNjPcD+vNRKJr?+l&Ja20ovAbVKDyPQjf;mJz*hFQM=H0O0CpU2Z`IS<4~VjO z%u<18@~wz8Z=68|Vnfkl3?x6Csx`0^p&dvE8S*$USLUt;Xb7_V!D+~Mc5p@&wq_#$ z$$FwP$3BhiB~{JSP?ZW~8#u}s{b;nNW62DGXuTiQxxWw9!T<>!3eV## z5g=jvx3GF^Is@4eBRw6c5v21t zH97`Vgii;V_t|lD$l_EFkZj9eW(5PqlI%+>WF6Umc5*w|^J~8sK=C?*GmFA~hSFPO zfmqb9g+m>oT>YSc!xO-F{~bPe;{f61?lsSHXLH_@C&+|dIgARZwpiSAkr6K42m~PP zztx1AL;FzY=RI7{+dy5&qv~+it;0E)$SYgNLY4tp_NoV;lU8D68VY`y`&nJp=x}VH z%t_&-D>Qe@jCvE_RzyU>3%cMW_kKHJ{_H6QmTM`|(b2a}e3wYpic3AF?_-5oC?_GL z?@W9sBiFa1tZn-+%0F4Gnq016*GqgQZk@I3vlIn4RbCdv5WW*+(4<9#vN)QTgzues zS$5H14>JNpm;QCC6Ao8{;*Y>%xMG_N(QMPJMTBIWEJ1w0eX2hr>P#LskRSKqzS$*GQP)XvP1M-_^Hz04z z&`AyUTP@}gOl;ar2U+K6XfHoU+pjskM&TDJwY)0MbB#ftug)0IGCgoU@;mo~^43$i82{UgG zFU^DV5JjYXzi`>8Z66sVjiuEsLBepI6Ue#Mbg1~9BiMyT`TiAZzpF~{{-@$;O+k#;m5_k9=T9Zq=B|Ta{aX{FZ2=?;iVe?n zpb(r6D5as>*NwgyFb(|2S%83Ppf5_!fnfXKcJu$#Ve0BLvM3cFa1-Qz?p`*Va~joX zxC^qW(V=X%Ox$$?)fZ=6yY1-_ITL~DRuB+yJxLKk6?j+AQXxaO!JJ$UY=@%!z21?N zZ4Q0=%c}Gr)!tLT23|>mj9MgJF-A;g0)vt`?c7~A{N&ZO7!k@Cu+6(J#8;~?Y;h29 zui!gpiTk66gI6edyc+a0zXA0xz%&u%+FNoE2)s9OZev@o&&SU+=;oAi)^|D#b~r>?nXG{MStOaUrWOj5W)Utjc$A zN!O8E;+{8_Use!yhC%Ub;^x2Bt}%LCf?01M?&JVEDc;8AHi9e_8wp_X`^KdI41{hK z-rPK&^-P!-ttt^GgG1U1N!xdT%a&ji{lYWsiF^o*QEQ^+U5S)7`J=Dn=6-#kYJSaQ z`+sY*2$t(hySfN@#CnDjj3gJ)Wet)5Tm=Cwv~4WtWG&8xk7ZW&`ZlsqKou$Qe2xP* zCt;rCchhYqW(1|OoXhMvIc+(T4jB(sOvMKP;MHZVc+67oNRNP)KQ%TcY+0VKFPbJ{etM6rE=q=pB^;0u zEzpaIPIlBBoX+EVWO?Z9!iL$ma^NWMCFTskHW_N zHD-p)lM+~7t?XC}0ALG1%ahH2d6X%dPL!}a(9ng~zuq!{g&!Qwi#_7V+{oJg_RW0| za)`RryEI(y55@86jlt7QPLxapKtyr)Dcc)s249<%=r$j6GLBwM@&5MY}T$fDLnDac}v2EM7Z5y4WW7}rOwryj@=88M&XypTAc_h29Fc~Wbx znx#>r#yzUWU6D!(k_fQ4upl5H2+~qwDj*=Bav&gJzR-~0|3ti2tbHfot|HQE(BF?A zv{}UWJGPs+mYb@hg`20bi#dqBv70%)tEr2*xr3{fquY4etqceVF^II7u$os6FxS%y ze`O_n7f`#Ms!_FLhcQLK>BGs6o*bG4B7K$sLIOhq6H4AZFH4Ld0L@>BE7#N@KbBz< zf^edOE0%~bRLPc>U3g>2)^8{bpYMkcqbrN;^9X`bsff%RyO;v_UU*e@d? zHW1n`w>zmeQDS6h33kbyXRtqs4xvKC$T1k9MzG(Xi2SdTryM7;XvdBS+Rql4FR3bj|Fa2Q#_!1IzGXodBYHvSs=?(RUyby#! zSCIndq%8$Q&XHube8!x$QepEa5idndS0 z^EPGKbak@2(hwj9p^(Xu3$Ka=T{b!tP1^%Vq8*7swZP7(9;Vhb>i^CbOK+kLphG_e z<>ctiazE?s_&mt#d>8FiM4vL-IWJpK@Lx&V9$zh#Sedp<{+{o#Gtqtecx ze2-h{oqa4~>v2Q1ICSRQMZR(%ZI6YrEKdkLw`>O`jiu}UM7KycGv+8WVkt}Dzk+uN zXvzvIqGWG43scS1Pl}w#2%fOA*eX1AzRXU2;W=HuFeQQr*Ps4S+?i6RQlyys&d-=L zPUj!+@$@4D%#2#rSvXkROgm`cly7x})r!V6HytcgaTW6M_wK^WSmaJ3z~Pw|LJd?D zms=r*YXu|Afr5}+?0&LS<-XCC;iZp`p!N?AoDxOW-iZoSBaW`QH(5_W9z{NI*%T0) z4^OPl^_JMYJ9=GTiFZHz3v92oqyOqX6CvD10S4*@MTF4j2MDjU8$N7h!+HCDn(FZz z|A^Ofqtm2|h}Jw6ka5`iEiUW*+!D?`)fUth@P=(awlkg#hjqXBQNHJO1?rtUJF4kFP@au1 z!X(L@Thy`lxTbyk?^2W@jo2guEa=gb^#+wHQ_9BuA3(arkuKo0bYif6c!6Qb@J3pGYb* zCMr$vHS_?w&}?E(T2qer+-K4*(H&yE0b68BJ91^C;>jf1U%mT#RGYdtghM=m(?cIx zs(jYp=zk!4Xx;yjQ)(NF`$HM0z*umy{m${5Rcn7`<>+!W*0GtxAcub~)dGn4OG3{F zO^ONUp|r9cMhWfb>^dz;-#9%WmDPU&tJ?o%*|y)dJC{i9)fvqC7}AX8@$yop4MiXi z7M3>QeHIgaVGFrUKn#iP;PBPk@iQ7$9B5YbQV z8rg0{<_J!8TfQZ+ovk3piUF1?Khwqnt}}T1tLT0w53$RBSIq!Bv`E|uwuyhP17b&g?*#{)88Zqe8Klq7lD^UaDl#8 zGX_5w-)?OEL7wL}y^OBk<@x%fZ;W*#Zj+^F&CA6^a>8@b*F;MzxBkkSd0WTw&;A3AId~$Sz7^wv&#p>X%g2^b1 z1}|mA`b-!=4#%K15hbW7+Q;~Wvo#tLK6i4{v|~CJcp8@xPSw^kplzOx>}5hl^vSQ*L?%AZw&iS_(`S9gH|CnoL%uVtdE;)AyM0^!E@|)+g7A2%k#*j-bAt_9&lp z_zY@+dpkm}XV3s0a)L@tgz)4mLoH988T24G#Nl_5c4&7C^97;mNiU ze+dy|KSCp^euFJKDfs`}2@4H`YMeykSdjcLBc}0%p9|l}Zd8XY9!!nqvaH(RO<>#B zf`X6gj)#~X{39tMe=dz(1qJ)P>{l4i_2(Mw$#zGs{6L{&meFn@&N(DG>K%{M%U}Xa zr#&T=+}oXRfM&8N!7 ztB~O{+#hSs9wthwL}W0|V@LbSIM93azsi~=78e%}zUWGHStn+R6knS&44x=9H6@)CY%2Re^I6xnUfAXIVEG%H1{eUPbV)-tfz7cY43!D>9U7lw^^}(h?|4JKhFQF6XWua8ed2o4*pQmDcAa<+zaV+no`RP8&MbO}x&&AEBfy z#D%LkOj%1(bK~S>^bqo2f^?voPy`BC4)OW*@JTX~Q2;re&eZ0Vqc!p2B@zD+1WmS( zd+84BA_3rxd~-9e6O;+4h_q>cN}7U(0t1e}p6P;AMg=@F$zrAc0@J=zdo~quCHv%@ zER{=y<8ECkBymenmBpnpXtKgjiBbec>3io_E(59INav zPN72CCIuyIA%`bN4nkXfp|GwxuxM1~uJ^{TIUFky z4f(ASKR|78`Ify~rZcl-Z2GQKVs_8XEkm$;Wq2epY?VpS{{Fs`Fe478MQ_7{HTHx; zqj@7|qt=-Yshq*37=}=#G^;Xlt-<>1Etl=Bm7RM0n>kd z=!@_@>vW^D?n1jMkErJSa~nu|dcO`-R)?&OFt&3BcXXxLywKOjVR4t?!8xzQM!;2b z2@P74mh^?%aROI-Q1Af$$WG$OEz;x9#{1!ghv#IGW{k5(H!jSJ(286@T0@*|@UH=C z{1+nd4o@OKPbLu2c6m+YxRoa-ccX;exTVZ^(Kexoq+5aasurZNFSnE401S;vHDz^8 zRF2Z9%EY!McfF>Rl7c@OJ~|UU7cv!}^6YsJXjQ&V5Ud0)Ph^5suij9zp-|py9doX= zB!}HhQ)EnZ9p{1H`%`#~q1Ew8nWr=~#taJkqQIvM%Mg5dRPNq|Rf_dOdCC~ffU31j zV&g+uuggQJIA5Vs9gnxx3fZy3G1*r!G?qxc386n>C^fts*sDyAz}lxd9a=|QF+4Iw z#QQSv`y4wpBQ{K{%?)AB4@eAc_0Y)me8v|?!=6|gySQ^=wvr{W^KUhBb7ht_K0tK) zIQ%|61VP$S%~78{@Wq$n^5B$|LNJ;YY0AQ*_m>*AoUAI8VXe(klfJQ^`{Vng0aZ(1 z<`9N?R$=_u?;m!a@GT1qBTO)5auq#cSGj{_ElOHCat?o5-{f;LxhV;%n0 zEo0MU)2O&a)wimd#IIM{-X-cJEY6LfjchJP=t8;y&`XfY@>8Zu(oZfR{Xmj3yQ_~3 zYVj`$EPTtgF6!fGP5oLceKoo3fDBG(T#;c~RMj(son;8a zdJ$O;M#4jx9ZAvPRM6sN;{`^73Y19XUNa5w3X;oU2)DUr3S?=j&{|*k`d|FG5yVFM$JK8F(fKfXI%|*uN*4vk{ z22E`tmB?EEN6GBE;iHQ@l@k!Egpl(|+8nyk_jclH$k|8A*wV7iV4bk;<5Khqh#qj%(4n zzT0w^`~CWU9)^=+18Ih(IOkZ>aB4gy-0Nowm+u7{qjy^+`g*uu)@z!Ql$9h(dG~@) zDyIP|j2GX%C>A}gjgV!GEQb?#$-qMjA^|%ECymE+Qa+f$o3~}4dEx{}VKT!=EG402 zkk2FEsfnqp0hL6bw@@}(p^oqzb-pqi+Gwf1dT%???bU7iMbC>@KZYK@JSZ(UzDo7X z5OT$~ZX!}VLt~!9KJf!A0+PSoPh|}Wx3w(^+W?*y&pNV_qQhJqcGl2wFb-1Z&|Z;| zfl@Uec%KO4t?yNoJ5|i3tN)iilM*(1@hx`$j|xk@6{v_8-;nMXwtLInG**L_^oepQ ze*UoQG8U$@wzr-3$Gwe)Zz_OuCTlV_oczYbvq)j;q)l*Q0A9>PPWoSc5&N$W!-usIFHyYiBg6v)ua^s z;al%|EHNMISmU8N93~H58RK)D&#<3U#zeCocpTXXU2R?X)_-k^lryz_xMI3iP~gln z?#BUSoZP{im`LGgu0N%2sCQUU`rv%K5VB|Dx;B@UY~VM3qGawEln7uv2;neF%SK^B z3v*#hSRf}aZRqm`YyKAsM1@}@Ib$1d0VW2Bj#tb^dqDW#?Orp z{;9Y_J^u#7^qs+XM8W*pyZdNoi{?9z)mn!F+;3f88OvUv$#DZmF~F6Q)2wlqs~KqIcRBB!*1=))B~Spdy4Em0R(4K_%313W zsW9uf^^zd+ln|K{`~w2gx&1)t^NL8+`{pGjRoQIDRRm70CMe{omrwn>Y9$#+>)aw# zguT|bC5t9wPl!$g?j_u%1`D$U;}#>C99Zg$vHjG;vPH=0@n>naAl@B<)zb2%SG&kC zJ}x^ByH*eU&ta(0EOc2&92|{mOxAzGYmel_()#AYjeLHerNEYl_wrm-c?hlh1KhNq zTOOC;Eq2^CEUZaSNg%2`l4eK;#-;4e)8GgXeF#fh`=b=u6A3|92?*JKAZL^qOk>M^ znGR>F-2RW{FvY8fRBvfes^ARgiA)Yw8>2P9H2@#6SU3q z8pp(229mZrZ1<`MPh<{RS*9P=DO-Fh&o4zPh3w|ad?OKsCU}pvOizDc|8`EGKj}tb zQlQ7cB*>JLoLLo)SQPgRWzV;y&Sx!7jE@r!WrZncA6dje-u*VUXU2v^y&xw~5w?Cr z(W~jQY6Dn3lb8Kr$6jI`uh(fPLpuKJK6I$)A!)I;mg;x3IW$9nz}M9q8jiF=b%QJW zN0=~D%pwmFI%F)I6&A;a7`22YFP7maYZA-PVwxz*lKx3#uC3-UfapMq5>e2Q!IKhG zX-Tm3+VlzPMF}lJ(tbToTe&x zhM3u=2ClzA7R?_fx$JqxLCH8QbJ1nxRHa&yLRQ@_F&1%QI+ZwygHy%dGA-qjq)X>p z-ZpKj3y(dR$tzJSS-)0HaJyXnAbGsbMX^9Oq?f!tI{nbOLr@qQ1)GD%Jj7outbeRD z$x`DD2I!Kb3ZALc$l45rc495KtIXNB&Zs)t33WqAexzyM?-hcm zdOAm6*)SZEMkwhO)C zLfrd{IHRUJWXy^puS3#6Q%p?%$iYVt+YAYs`a2l-X~PB;UouzHOvj4Z{mh}%FqL`~ zoIa0pXwKbfH#sT$b6jSqo+{qGB@P`SC}xgey{WR5oPN~HPr;tPu)8@T$L%n0L{t(_ z7^{x{D&hlCd_+%+B}3p(sJRXGsX1uqtCKXEylAQ);_FKpjYm&8MurKJ4oGa?L}mk8 zpKTZ1sZppbVuQUcU#X)!SskOLkOpyBB9lBU?T;s_1HoUR%jYvM6IFi~5a{j^e zyp`wBkNc?=Oj;_Y%*h3@8gmA6{S_=mkzG^+Paf~SE~2tLDu)j8CB-2j-jX8xK?SH-p>(4z|*gQ}}LUH7m=(tY6`%}I6bDG}Xjeb*Cmvq1`a z){_j=n!0LB?Jk$%#5fI1U_^}}8*4~4xTDY#KpZ;k7U_FOF@1NT!t7 z(yC`Fw8xm?Cq-GNF>s}2{SBJ3QVw7?x@KKvJ6ff6Rs_!X2|lMD!p+P7^aiP0>4;?nh9-keQlr9s5cHYM#GE(|^0uE0ZoLvTe=xk(P#Eo3bk|ibNtyL3rKhMk z%RJg`Xsx$?#H+KIF*6AGP_64s%wp~aaRx3smOETpc(gtriz8v6s%%9^he18_n4h-N z7}&=FGF){~j(snz4~w!=77^AS@zqN9x*8y8dvj?j0j6WKVzc-6MI5NYxzjqZL7#jtJ{|b& zbg(15nHAc&f>JnxM)BBIwm$kPNn0(AsV3p*Qkm76ET!SwCmUcTHQ5~>NMnSlyN#BgP>gmOB;eLCsYU}0Rf88DhbZ$s`ak7WY_8sLNtC-3}zF$c)NQrlzV(3=p z>}s{^cbFmHHWMNfhyJJM*35e+DV&-m>Cql}5&u2R>@l=a-% zo68?F*hCkT1Oiwn?mhl&hK%=e*tE4Mm&*^>u@xwb!$AFb;rk5zC-)4ICmy#~Vocw00gAiH^2Hd6?^ui*df$=nj0lhJ9ERkl4Dv_0ALH$j+F z7q8TBiLKI9SK{N2#_{%1fmzxB?p@Xp>g8smr{CVPQ^=j$S|ya6hPqB=1O`IriW0o< ziW=VE<@m+XGMgy>wzdWu0ch~tNu)B>rjhj6ryb>dIL7nU$EQ788+NwGZwTS&MuK5gfDr%tsOL_#Jb6P&)V?X33HhnZ`Ng-k zl7hWFp(t1`NnxQ9SC84Vkw-;3U)(w}+g|+&{D;CuR!$dI7K_gs0#)ypT>ea|Bs^QS zvhw9ma89!8|H}p7ZA}ps*qClhMErcq%wC#Rh^4Y6cR7(e?hBMVo#3SLE+&N*v$l6x z+!&IvaTd_bQ=R2TbNkUMZ7z5EXBU6uFH-CMo(dklSOs8JZl*QQ_JaGqnfiUdneP4# zhWG4#>|wrz#37(FO#TZh-5eB zpU`JlJpbCznH4rqjPCY1 z0!BhwF>m!9kFeIFv(9*wDK(%xayPnhI=F*`mLP4=kU%t^xI5EUb0z3V`CsCMc&8 z!e-YAfsvKK#NiK&mI}J*wKrCcCQ{S@)x-ykRg3wGg+|R)dF_^(ZoSAUWbUlNizxGW z0A6iec`rR)oqwAxkD^aTsbn&9Cj-1U_&Yy~1Q=~On{NReSY1G2zKRB&Sh>uUnMl?p z9L@+5;f0`d^{Q;G-fihvele{oGQqh)XGshfzeLPf{8D3G+UyXWs8Q_rKBuh1U4+9=aB8`6P(jS7z5@@WBzBG|Wghpa|D|TBBWHG;jtzm}9Ai#bR z&rWaVp)v}KA};P2k-=BcL72fbphJU8bL~N}Uf7o{AQX^w^$#YjRl

e}w(eWjaPC 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 O_^B(uR;p64{QQ4xh-!rZ diff --git a/data/guide/kylin-ipmsg/en_US/image/2.png b/data/guide/kylin-ipmsg/en_US/image/2.png index 0f9215b37babea388fa391cfc69880d5836e2783..439d5610b5df1725c73d0df0bcf7ccea119bcd69 100644 GIT binary patch literal 29739 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 z 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≫zTBrN6DEv51f(OD#uK-EnHWSU>y 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 XRZB)L=BE4_00000NkvXXu0mjff&A|7 literal 41727 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 D0xpRP diff --git a/data/guide/kylin-ipmsg/en_US/image/4.png b/data/guide/kylin-ipmsg/en_US/image/4.png index 57ad81334b46bc38b696269605f5d5c0b3bfab21..0abf18645d46ca7b368146ae8407010cf3ea490d 100644 GIT binary patch literal 37749 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 F0RYE#4b1=m diff --git a/data/guide/kylin-ipmsg/en_US/image/5.png b/data/guide/kylin-ipmsg/en_US/image/5.png index c0ec24421d61a9c88c52ff23f768fbb859fb3087..1330fb4ed3327f53827840b4b9a57148b38c3192 100644 GIT binary patch literal 18239 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 literal 13996 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 diff --git a/data/guide/kylin-ipmsg/en_US/image/6.png b/data/guide/kylin-ipmsg/en_US/image/6.png index 49e361fe6aed01cd3193cfe586a1e84cd3cf5d60..efea0f997c8541cf1b3a6db92373d66806e2d353 100644 GIT binary patch literal 20433 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 E0aY&bivR!s diff --git a/data/guide/kylin-ipmsg/en_US/image/7.png b/data/guide/kylin-ipmsg/en_US/image/7.png index cef97f97dee5b1be8e8f1cd2fbbab5c3f19f051d..e8ef9a1c4283e71ecd657ad6360a11beb2f898d5 100644 GIT binary patch literal 23744 zcmeFZWl&u~xURW@BoHJJ2oM~C1&81sBoLh7x`E*CZb@(t5ZnR;cXxMpcXxN6=A3(e z+^REkr)GXkP1U7}+OYO!tzNylzy99mdz%1RX;BnJTto;2f+F@+SPlY#X$9ZQ2(Q2q zHaBx8@bbb|P)q>YxDf}_(P#o6nVqd$71G*rJoqYF}}!Xu1+K@)hV_vK~FVPO57##CY7 z;ax4irl#f;ERyLFt-n7y*H4HDx(lutu@8%&iws5N%>$F3cK1I@vfp>Mn$Q@&A$o<(H;_C z{KrfDfBRBOYyM?nFdgM-8L%*@KcK}bl5l#HSP0*SYg zeATPgz(7QF3=AHZuBnd3m{@N&qgKCbfW$u(!MG z9}qx7Pao>*`>M@r!oPoluk4;8f-rnEuKi%l7!+%lq?*032@T0YZ0|h0epHu={>ex>0!HpmSNqZC*K0=k{k_GZF z8m0W^iHV9invLDv-at&6;1;X9%Yy}|FE}d<0kU^jC;=%SA0cSXYDZ8>X{iaTyO0nZ zcw$Mpu~AW&LD&o;=_6=FL_;OIU0fIV&yR)m;ElJvy}hugC>*2ZVm+JsubrJ8x8oN0 z`iILoG71WZT${qe!u|wy)F0d1M!UPaTo;Lll~-Ti6nWVF8gLzRt)rgOxbzW!EPdo4 z@<@@?#oH4ua#%K^e|}%eb?`#=09<8lmRFU6g2H!pR_*@&eik2t$95B0y~=_$^nifh zBXM|mSXz;hkr9obpMP|0EFd62=k|Oj$wk_fI(K&lJE1Ri%;(>Rvb^R}HzTU4L9q2& zbig9VtZMwfp+?z`%C#>>w6~jY>?bNv`X9$UAd~k7ETnJ=Pez>aD$SNti6R*a#cLPF zD(b9HdB-Es%x=}(2^(YZC+$Uokm&~rdTtp^I7VhSVxb0tInAQPpb0Z>sJD2|c7GST zpg-YAq2(zU<*Tc!vLD~|$1n#RNrL&3D+vj$ZZVQjf<+kaOdiKIx-9;*W91{#GRWf($~}|ww%{p z?vPPcB8S1%U2Lx@Qh0L}WmWkOqM4ptex`3QMrMd}`U<(Rer@Q_$l(iDHQT+9*uKd1 zj}EZA+jZ{*=dWicK1fPR{!2~$`TO^8rK#7Q9UUcxLxhp0Yn>saJUsOhQFe}wlpGwf z|NfDI*&4@T{XHgmitJW}aLCy| zX6S+71w9g&%V6e?kB?it_Qq7as4pRT`2*h22NO82u9xQf!=q7C z0W{=-*igh%>mOb>iPDyY2sF97oZ*UJs#AEacQD(@W2}w}GL7lq;nn&piob*sIwTdi zq>TNK#^502<>mDZ416h2THD(*WgAH5bp=n6xyIpafSuXn{`xS7e0gs#NUeZ^ojnE& ze)<%(5}hf|z+7B}%ks??9|5{hbt!~1qYbJl3Ld3N7CVk1Sq6BB9R0Yg=G>0~Ox+(j zs=kH8Gb@A|9}CvHYYeBb!kZM?*1yB!e?HeDf=;&+mW7BG<1J5P)$W;d2Ow2rp&NsaPV;S!{cZm z7vEw6Tr=sJpM%S(ug~o7BL#7ir7uZa(=|34W)s0Uo85soFdW>mOFTTJS&7-{H}?@5 zlARrDuQ*lFH}{%(%O2jZTbN2Zl0Cv&x+MsH%Sgqv{g4;f(^NBmaUa&z>i^!DPuA6S zHdT&#n02?OQC944SmX(`m9y>oZ&MZA3QVXOpG`OzuM`XEI5obXIa-J8KJ|~Z2i-di zP$ilx++Ww;oUF=Iec2D`Tl*?bg2y5 yUklc| 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 LNkvXXu0mjf!h?RP literal 24799 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include // MEEGO_EDITION_HARMATTAN - -#ifdef HARMATTAN_BOOSTER -#include -#endif - -/* -* qml application viewer private param and functions -*/ -class QmlApplicationViewerPrivate -{ - QmlApplicationViewerPrivate(QQuickView *view_) : view(view_) {} - QString mainQmlFile; - QQuickView *view; - friend class QmlApplicationViewer; - static QString adjustPath(const QString &path); -}; - -/* -* Summary: adjust the path -* Parameters: -* path: path before adjust -* Return : path after adjust. -*/ -QString QmlApplicationViewerPrivate::adjustPath(const QString &path) -{ -#ifdef Q_OS_MAC - if (!QDir::isAbsolutePath(path)) - return QString::fromLatin1("%1/../Resources/%2") - .arg(QCoreApplication::applicationDirPath(), path); -#elif defined(Q_OS_QNX) - if (!QDir::isAbsolutePath(path)) - return QString::fromLatin1("app/native/%1").arg(path); -#elif !defined(Q_OS_ANDROID) - QString pathInInstallDir = - QString::fromLatin1("%1/../%2").arg(QCoreApplication::applicationDirPath(), path); - if (QFileInfo(pathInInstallDir).exists()) - return pathInInstallDir; - pathInInstallDir = - QString::fromLatin1("%1/%2").arg(QCoreApplication::applicationDirPath(), path); - if (QFileInfo(pathInInstallDir).exists()) - return pathInInstallDir; -#endif - return path; -} - -QmlApplicationViewer::QmlApplicationViewer(QWindow *parent) - : QQuickView(parent) - , d(new QmlApplicationViewerPrivate(this)) -{ - connect(engine(), SIGNAL(quit()),QCoreApplication::instance(), SLOT(quit())); - setResizeMode(QQuickView::SizeRootObjectToView); -} - -QmlApplicationViewer::QmlApplicationViewer(QQuickView *view, QWindow *parent) - : QQuickView(parent) - , d(new QmlApplicationViewerPrivate(view)) -{ - connect(view->engine(), SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); - view->setResizeMode(QQuickView::SizeRootObjectToView); -} - -QmlApplicationViewer::~QmlApplicationViewer() -{ - delete d; -} - -/* -* Summary: creater. -*/ -QmlApplicationViewer *QmlApplicationViewer::create() -{ - return new QmlApplicationViewer(); -} - -/* -* Summary: set main qml file -* Parameters: -* file: qml file path -*/ -void QmlApplicationViewer::setMainQmlFile(const QString &file) -{ -// d->mainQmlFile = QmlApplicationViewerPrivate::adjustPath(file); - d->mainQmlFile = d->adjustPath(file); -#ifdef Q_OS_ANDROID - setSource(QUrl(QLatin1String("assets:/")+d->mainQmlFile)); -#else - setSource(QUrl::fromLocalFile(d->mainQmlFile)); -#endif -} - -/* -* Summary: add import path -* Parameters: -* file: qml file path -*/ -void QmlApplicationViewer::addImportPath(const QString &path) -{ - // engine()->addImportPath(QmlApplicationViewerPrivate::adjustPath(path)); - d->view->engine()->addImportPath(d->adjustPath(path)); -} - -/* -* Summary: set orientation -* Parameters: -* orientation: target orientation -*/ -void QmlApplicationViewer::setOrientation(ScreenOrientation orientation) -{ -#if QT_VERSION < 0x050000 - Qt::WidgetAttribute attribute; - switch (orientation) { -#if QT_VERSION < 0x040702 - // Qt < 4.7.2 does not yet have the Qt::WA_*Orientation attributes - case ScreenOrientationLockPortrait: - attribute = static_cast(128); - break; - case ScreenOrientationLockLandscape: - attribute = static_cast(129); - break; - default: - case ScreenOrientationAuto: - attribute = static_cast(130); - break; -#else // QT_VERSION < 0x040702 - case ScreenOrientationLockPortrait: - attribute = Qt::WA_LockPortraitOrientation; - break; - case ScreenOrientationLockLandscape: - attribute = Qt::WA_LockLandscapeOrientation; - break; - default: - case ScreenOrientationAuto: - attribute = Qt::WA_AutoOrientation; - break; -#endif // QT_VERSION < 0x040702 - }; - setAttribute(attribute, true); -#else // QT_VERSION < 0x050000 - Q_UNUSED(orientation) -#endif // QT_VERSION < 0x050000 -} - -/* -* Summary: show qml widget expanded -* -*/ -void QmlApplicationViewer::showExpanded() -{ -//#if defined(MEEGO_EDITION_HARMATTAN) || defined(Q_WS_SIMULATOR) -#if defined(MEEGO_EDITION_HARMATTAN) || defined(Q_OS_SIMULATOR) - showFullScreen(); -#elif defined(Q_WS_MAEMO_5) || defined(Q_OS_QNX) - showMaximized(); -#else - show(); -#endif -} - -/* -* Summary: create application -* Parameters: -* argc: main argc -* argv: main argv -*/ -//QApplication *createApplication(int &argc, char **argv) -QGuiApplication *createApplication(int &argc, char **argv) -{ -#ifdef HARMATTAN_BOOSTER - return MDeclarativeCache::qApplication(argc, argv); -#else - return new QGuiApplication(argc, argv); -#endif -} diff --git a/qmlapplicationviewer/qmlapplicationviewer.h b/qmlapplicationviewer/qmlapplicationviewer.h deleted file mode 100644 index 38c7219..0000000 --- a/qmlapplicationviewer/qmlapplicationviewer.h +++ /dev/null @@ -1,59 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef QMLAPPLICATIONVIEWER_H -#define QMLAPPLICATIONVIEWER_H -#include - -#include -#include -#include - -class QmlApplicationViewer : public QQuickView -{ - Q_OBJECT - -public: - enum ScreenOrientation { - ScreenOrientationLockPortrait, - ScreenOrientationLockLandscape, - ScreenOrientationAuto - }; - - explicit QmlApplicationViewer(QWindow *parent = 0); - virtual ~QmlApplicationViewer(); - - static QmlApplicationViewer *create(); - - void setMainQmlFile(const QString &file); - void addImportPath(const QString &path); - - // Note that this will only have an effect on Fremantle. - void setOrientation(ScreenOrientation orientation); - - void showExpanded(); - -private: - explicit QmlApplicationViewer(QQuickView *view, QWindow *parent); - class QmlApplicationViewerPrivate *d; -}; - -QGuiApplication *createApplication(int &argc, char **argv); - -#endif // QMLAPPLICATIONVIEWER_H diff --git a/qmlapplicationviewer/qmlapplicationviewer.pri b/qmlapplicationviewer/qmlapplicationviewer.pri deleted file mode 100644 index f4f5095..0000000 --- a/qmlapplicationviewer/qmlapplicationviewer.pri +++ /dev/null @@ -1,103 +0,0 @@ -# DUKTO - A simple, fast and multi-platform file transfer tool for LAN users -# Copyright (C) 2011 Emanuele Colombo -# 2020 KylinSoft Co., Ltd. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -QT += quick qml - -SOURCES += $$PWD/qmlapplicationviewer.cpp -HEADERS += $$PWD/qmlapplicationviewer.h -INCLUDEPATH += $$PWD - -contains(CONFIG,qdeclarative-boostable):contains(MEEGO_EDITION,harmattan) { - DEFINES += HARMATTAN_BOOSTER -} - -defineTest(qtcAddDeployment) { -for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - greaterThan(QT_MAJOR_VERSION, 4) { - itemsources = $${item}.files - } else { - itemsources = $${item}.sources - } - $$itemsources = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath= $$eval($${deploymentfolder}.target) - export($$itemsources) - export($$itempath) - DEPLOYMENT += $$item -} - -MAINPROFILEPWD = $$PWD - -copyCommand = -for(deploymentfolder, DEPLOYMENTFOLDERS) { - source = $$MAINPROFILEPWD/$$eval($${deploymentfolder}.source) - source = $$replace(source, \\\\, /) - macx { - target = $$OUT_PWD/$${TARGET}.app/Contents/Resources/$$eval($${deploymentfolder}.target) - } else { - target = $$OUT_PWD/$$eval($${deploymentfolder}.target) - } - target = $$replace(target, \\\\, /) - sourcePathSegments = $$split(source, /) - targetFullPath = $$target/$$last(sourcePathSegments) - targetFullPath ~= s,/\\.?/,/, - !isEqual(source,$$targetFullPath) { - !isEmpty(copyCommand):copyCommand += && - copyCommand += $(MKDIR) \"$$target\" - copyCommand += && $(COPY_DIR) \"$$source\" \"$$target\" - } -} -!isEmpty(copyCommand) { - copyCommand = @echo Copying application data... && $$copyCommand - copydeploymentfolders.commands = $$copyCommand - first.depends = $(first) copydeploymentfolders - export(first.depends) - export(copydeploymentfolders.commands) - QMAKE_EXTRA_TARGETS += first copydeploymentfolders -} -installPrefix = /opt/$${TARGET} -for(deploymentfolder, DEPLOYMENTFOLDERS) { - item = item$${deploymentfolder} - itemfiles = $${item}.files - $$itemfiles = $$eval($${deploymentfolder}.source) - itempath = $${item}.path - $$itempath = $${installPrefix}/$$eval($${deploymentfolder}.target) - export($$itemfiles) - export($$itempath) - INSTALLS += $$item -} - -!isEmpty(desktopfile.path) { - export(icon.files) - export(icon.path) - export(desktopfile.files) - export(desktopfile.path) - INSTALLS += icon desktopfile -} - -target.path = $${installPrefix}/bin -export(target.path) -INSTALLS += target - -export (ICON) -export (INSTALLS) -export (DEPLOYMENT) -export (LIBS) -export (QMAKE_EXTRA_TARGETS) -} diff --git a/qtsingleapplication/qtlocalpeer.cpp b/qtsingleapplication/qtlocalpeer.cpp deleted file mode 100644 index 9fca1be..0000000 --- a/qtsingleapplication/qtlocalpeer.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - - -#include "qtlocalpeer.h" -#include -#include -#include - -#if defined(Q_OS_WIN) -#include -#include -typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); -static PProcessIdToSessionId pProcessIdToSessionId = 0; -#endif -#if defined(Q_OS_UNIX) -#include -#include -#include -#endif - -namespace QtLP_Private { -#include "qtlockedfile.cpp" -#if defined(Q_OS_WIN) -#include "qtlockedfile_win.cpp" -#else -#include "qtlockedfile_unix.cpp" -#endif -} - -const char* QtLocalPeer::ack = "ack"; - -/* -* Summary: qt local peer -* Parameters:res) -* parent: parent widget -* appid: appid -* Return : . -*/ -QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) - : QObject(parent), id(appId) -{ - QString prefix = id; - if (id.isEmpty()) { - id = QCoreApplication::applicationFilePath(); -#if defined(Q_OS_WIN) - id = id.toLower(); -#endif - prefix = id.section(QLatin1Char('/'), -1); - } - prefix.remove(QRegExp("[^a-zA-Z]")); - prefix.truncate(6); - - QByteArray idc = id.toUtf8(); - quint16 idNum = qChecksum(idc.constData(), idc.size()); - socketName = QLatin1String("qtsingleapp-") + prefix - + QLatin1Char('-') + QString::number(idNum, 16); - -#if defined(Q_OS_WIN) - if (!pProcessIdToSessionId) { - QLibrary lib("kernel32"); - pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); - } - if (pProcessIdToSessionId) { - DWORD sessionId = 0; - pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); - socketName += QLatin1Char('-') + QString::number(sessionId, 16); - } -#else - socketName += QLatin1Char('-') + QString::number(::getuid(), 16); -#endif - - server = new QLocalServer(this); - QString lockName = QDir(QDir::tempPath()).absolutePath() - + QLatin1Char('/') + socketName - + QLatin1String("-lockfile"); - lockFile.setFileName(lockName); - lockFile.open(QIODevice::ReadWrite); -} - - -/* -* Summary: check is clinet -* Parameters: -* -* Return : . -*/ -bool QtLocalPeer::isClient() -{ - if (lockFile.isLocked()) - return false; - - if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) - return true; - - bool res = server->listen(socketName); -#if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) - // ### Workaround - if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { - QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); - res = server->listen(socketName); - } -#endif - if (!res) - qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); - QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); - return false; -} - -/* -* Summary:send a message -* Parameters: -* message: msg -* timeout: timeout -* Return : -*/ -bool QtLocalPeer::sendMessage(const QString &message, int timeout) -{ - if (!isClient()) - return false; - - QLocalSocket socket; - bool connOk = false; - for(int i = 0; i < 2; i++) { - // Try twice, in case the other instance is just starting up - socket.connectToServer(socketName); - connOk = socket.waitForConnected(timeout/2); - if (connOk || i) - break; - int ms = 250; -#if defined(Q_OS_WIN) - Sleep(DWORD(ms)); -#else - struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; - nanosleep(&ts, NULL); -#endif - } - if (!connOk) - return false; - - QByteArray uMsg(message.toUtf8()); - QDataStream ds(&socket); - ds.writeBytes(uMsg.constData(), uMsg.size()); - bool res = socket.waitForBytesWritten(timeout); - res &= socket.waitForReadyRead(timeout); // wait for ack - res &= (socket.read(qstrlen(ack)) == ack); - return res; -} - -/* -* Summary: receive connection -* Parameters: -* -* Return : -*/ -void QtLocalPeer::receiveConnection() -{ - qDebug() << "receiveConnection"; - QLocalSocket* socket = server->nextPendingConnection(); - if (!socket) - return; - - while (socket->bytesAvailable() < (int)sizeof(quint32)) - socket->waitForReadyRead(); - QDataStream ds(socket); - QByteArray uMsg; - quint32 remaining; - ds >> remaining; - uMsg.resize(remaining); - int got = 0; - char* uMsgBuf = uMsg.data(); - do { - got = ds.readRawData(uMsgBuf, remaining); - remaining -= got; - uMsgBuf += got; - } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); - if (got < 0) { - qWarning() << "QtLocalPeer: Message reception failed" << socket->errorString(); -// delete socket; - socket->deleteLater(); - return; - } - QString message(QString::fromUtf8(uMsg)); - socket->write(ack, qstrlen(ack)); - socket->waitForBytesWritten(1000); -// delete socket; - socket->deleteLater(); - emit messageReceived(message); //### (might take a long time to return) -} diff --git a/qtsingleapplication/qtlocalpeer.h b/qtsingleapplication/qtlocalpeer.h deleted file mode 100644 index 4735ae7..0000000 --- a/qtsingleapplication/qtlocalpeer.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - -#ifndef QTLOCALPEER_H -#define QTLOCALPEER_H - -#include -#include -#include - -#include "qtlockedfile.h" - -//namespace QtLP_Private { -//#include "qtlockedfile.h" -//} - -class QtLocalPeer : public QObject -{ - Q_OBJECT - -public: - QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); - bool isClient(); - bool sendMessage(const QString &message, int timeout); - QString applicationId() const - { return id; } - -Q_SIGNALS: - void messageReceived(const QString &message); - -protected Q_SLOTS: - void receiveConnection(); - -protected: - QString id; - QString socketName; - QLocalServer* server; - QtLP_Private::QtLockedFile lockFile; - -private: - static const char* ack; -}; - -#endif // QTLOCALPEER_H diff --git a/qtsingleapplication/qtlockedfile.cpp b/qtsingleapplication/qtlockedfile.cpp deleted file mode 100644 index fb30521..0000000 --- a/qtsingleapplication/qtlockedfile.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - -#include "qtlockedfile.h" - -/*! - \class QtLockedFile - - \brief The QtLockedFile class extends QFile with advisory locking - functions. - - A file may be locked in read or write mode. Multiple instances of - \e QtLockedFile, created in multiple processes running on the same - machine, may have a file locked in read mode. Exactly one instance - may have it locked in write mode. A read and a write lock cannot - exist simultaneously on the same file. - - The file locks are advisory. This means that nothing prevents - another process from manipulating a locked file using QFile or - file system functions offered by the OS. Serialization is only - guaranteed if all processes that access the file use - QLockedFile. Also, while holding a lock on a file, a process - must not open the same file again (through any API), or locks - can be unexpectedly lost. - - The lock provided by an instance of \e QtLockedFile is released - whenever the program terminates. This is true even when the - program crashes and no destructors are called. -*/ - -/*! \enum QtLockedFile::LockMode - - This enum describes the available lock modes. - - \value ReadLock A read lock. - \value WriteLock A write lock. - \value NoLock Neither a read lock nor a write lock. -*/ - -/*! - Constructs an unlocked \e QtLockedFile object. This constructor - behaves in the same way as \e QFile::QFile(). - - \sa QFile::QFile() -*/ -QtLockedFile::QtLockedFile() - : QFile() -{ -#ifdef Q_OS_WIN - wmutex = 0; - rmutex = 0; -#endif - m_lock_mode = NoLock; -} - -/*! - Constructs an unlocked QtLockedFile object with file \a name. This - constructor behaves in the same way as \e QFile::QFile(const - QString&). - - \sa QFile::QFile() -*/ -QtLockedFile::QtLockedFile(const QString &name) - : QFile(name) -{ -#ifdef Q_OS_WIN - wmutex = 0; - rmutex = 0; -#endif - m_lock_mode = NoLock; -} - -/*! - Opens the file in OpenMode \a mode. - - This is identical to QFile::open(), with the one exception that the - Truncate mode flag is disallowed. Truncation would conflict with the - advisory file locking, since the file would be modified before the - write lock is obtained. If truncation is required, use resize(0) - after obtaining the write lock. - - Returns true if successful; otherwise false. - - \sa QFile::open(), QFile::resize() -*/ -bool QtLockedFile::open(OpenMode mode) -{ - if (mode & QIODevice::Truncate) { - qWarning("QtLockedFile::open(): Truncate mode not allowed."); - return false; - } - return QFile::open(mode); -} - -/*! - Returns \e true if this object has a in read or write lock; - otherwise returns \e false. - - \sa lockMode() -*/ -bool QtLockedFile::isLocked() const -{ - return m_lock_mode != NoLock; -} - -/*! - Returns the type of lock currently held by this object, or \e - QtLockedFile::NoLock. - - \sa isLocked() -*/ -QtLockedFile::LockMode QtLockedFile::lockMode() const -{ - return m_lock_mode; -} - -/*! - \fn bool QtLockedFile::lock(LockMode mode, bool block = true) - - Obtains a lock of type \a mode. The file must be opened before it - can be locked. - - If \a block is true, this function will block until the lock is - aquired. If \a block is false, this function returns \e false - immediately if the lock cannot be aquired. - - If this object already has a lock of type \a mode, this function - returns \e true immediately. If this object has a lock of a - different type than \a mode, the lock is first released and then a - new lock is obtained. - - This function returns \e true if, after it executes, the file is - locked by this object, and \e false otherwise. - - \sa unlock(), isLocked(), lockMode() -*/ - -/*! - \fn bool QtLockedFile::unlock() - - Releases a lock. - - If the object has no lock, this function returns immediately. - - This function returns \e true if, after it executes, the file is - not locked by this object, and \e false otherwise. - - \sa lock(), isLocked(), lockMode() -*/ - -/*! - \fn QtLockedFile::~QtLockedFile() - - Destroys the \e QtLockedFile object. If any locks were held, they - are released. -*/ diff --git a/qtsingleapplication/qtlockedfile.h b/qtsingleapplication/qtlockedfile.h deleted file mode 100644 index bbd91ef..0000000 --- a/qtsingleapplication/qtlockedfile.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - -#ifndef QTLOCKEDFILE_H -#define QTLOCKEDFILE_H - -#include -#ifdef Q_OS_WIN -#include -#endif - -#if defined(Q_OS_WIN) -# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) -# define QT_QTLOCKEDFILE_EXPORT -# elif defined(QT_QTLOCKEDFILE_IMPORT) -# if defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# endif -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) -# elif defined(QT_QTLOCKEDFILE_EXPORT) -# undef QT_QTLOCKEDFILE_EXPORT -# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) -# endif -#else -# define QT_QTLOCKEDFILE_EXPORT -#endif - -namespace QtLP_Private { - -class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile -{ -public: - enum LockMode { NoLock = 0, ReadLock, WriteLock }; - - QtLockedFile(); - QtLockedFile(const QString &name); - ~QtLockedFile(); - - bool open(OpenMode mode) override; - - bool lock(LockMode mode, bool block = true); - bool unlock(); - bool isLocked() const; - LockMode lockMode() const; - -private: -#ifdef Q_OS_WIN - Qt::HANDLE wmutex; - Qt::HANDLE rmutex; - QVector rmutexes; - QString mutexname; - - Qt::HANDLE getMutexHandle(int idx, bool doCreate); - bool waitMutex(Qt::HANDLE mutex, bool doBlock); - -#endif - LockMode m_lock_mode; -}; -} - -#endif diff --git a/qtsingleapplication/qtlockedfile_unix.cpp b/qtsingleapplication/qtlockedfile_unix.cpp deleted file mode 100644 index fa70711..0000000 --- a/qtsingleapplication/qtlockedfile_unix.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - -#include -#include -#include -#include - -#include "qtlockedfile.h" - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == NoLock) - return unlock(); - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != NoLock) - unlock(); - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; - int cmd = block ? F_SETLKW : F_SETLK; - int ret = fcntl(handle(), cmd, &fl); - - if (ret == -1) { - if (errno != EINTR && errno != EAGAIN) - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - - m_lock_mode = mode; - return true; -} - - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - struct flock fl; - fl.l_whence = SEEK_SET; - fl.l_start = 0; - fl.l_len = 0; - fl.l_type = F_UNLCK; - int ret = fcntl(handle(), F_SETLKW, &fl); - - if (ret == -1) { - qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); - return false; - } - - m_lock_mode = NoLock; - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); -} - diff --git a/qtsingleapplication/qtlockedfile_win.cpp b/qtsingleapplication/qtlockedfile_win.cpp deleted file mode 100644 index 31ce21e..0000000 --- a/qtsingleapplication/qtlockedfile_win.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - -#include "qtlockedfile.h" -#include -#include - -#define MUTEX_PREFIX "QtLockedFile mutex " -// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS -#define MAX_READERS MAXIMUM_WAIT_OBJECTS - -Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) -{ - if (mutexname.isEmpty()) { - QFileInfo fi(*this); - mutexname = QString::fromLatin1(MUTEX_PREFIX) - + fi.absoluteFilePath().toLower(); - } - QString mname(mutexname); - if (idx >= 0) - mname += QString::number(idx); - - Qt::HANDLE mutex; - if (doCreate) { - QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, - { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); - if (!mutex) { - qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); - return 0; - } - } - else { - QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, - { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); - if (!mutex) { - if (GetLastError() != ERROR_FILE_NOT_FOUND) - qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); - return 0; - } - } - return mutex; -} - -bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) -{ - Q_ASSERT(mutex); - DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); - switch (res) { - case WAIT_OBJECT_0: - case WAIT_ABANDONED: - return true; - break; - case WAIT_TIMEOUT: - break; - default: - qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); - } - return false; -} - - - -bool QtLockedFile::lock(LockMode mode, bool block) -{ - if (!isOpen()) { - qWarning("QtLockedFile::lock(): file is not opened"); - return false; - } - - if (mode == NoLock) - return unlock(); - - if (mode == m_lock_mode) - return true; - - if (m_lock_mode != NoLock) - unlock(); - - if (!wmutex && !(wmutex = getMutexHandle(-1, true))) - return false; - - if (!waitMutex(wmutex, block)) - return false; - - if (mode == ReadLock) { - int idx = 0; - for (; idx < MAX_READERS; idx++) { - rmutex = getMutexHandle(idx, false); - if (!rmutex || waitMutex(rmutex, false)) - break; - CloseHandle(rmutex); - } - bool ok = true; - if (idx >= MAX_READERS) { - qWarning("QtLockedFile::lock(): too many readers"); - rmutex = 0; - ok = false; - } - else if (!rmutex) { - rmutex = getMutexHandle(idx, true); - if (!rmutex || !waitMutex(rmutex, false)) - ok = false; - } - if (!ok && rmutex) { - CloseHandle(rmutex); - rmutex = 0; - } - ReleaseMutex(wmutex); - if (!ok) - return false; - } - else { - Q_ASSERT(rmutexes.isEmpty()); - for (int i = 0; i < MAX_READERS; i++) { - Qt::HANDLE mutex = getMutexHandle(i, false); - if (mutex) - rmutexes.append(mutex); - } - if (rmutexes.size()) { - DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), - TRUE, block ? INFINITE : 0); - if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { - if (res != WAIT_TIMEOUT) - qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); - m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky - unlock(); - return false; - } - } - } - - m_lock_mode = mode; - return true; -} - -bool QtLockedFile::unlock() -{ - if (!isOpen()) { - qWarning("QtLockedFile::unlock(): file is not opened"); - return false; - } - - if (!isLocked()) - return true; - - if (m_lock_mode == ReadLock) { - ReleaseMutex(rmutex); - CloseHandle(rmutex); - rmutex = 0; - } - else { - foreach(Qt::HANDLE mutex, rmutexes) { - ReleaseMutex(mutex); - CloseHandle(mutex); - } - rmutexes.clear(); - ReleaseMutex(wmutex); - } - - m_lock_mode = QtLockedFile::NoLock; - return true; -} - -QtLockedFile::~QtLockedFile() -{ - if (isOpen()) - unlock(); - if (wmutex) - CloseHandle(wmutex); -} diff --git a/qtsingleapplication/qtsingleapplication.cpp b/qtsingleapplication/qtsingleapplication.cpp deleted file mode 100644 index 6e52acc..0000000 --- a/qtsingleapplication/qtsingleapplication.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - - -#include "qtsingleapplication.h" -#include "qtlocalpeer.h" -#include - -/*! - \class QtSingleApplication qtsingleapplication.h - \brief The QtSingleApplication class provides an API to detect and - communicate with running instances of an application. - - This class allows you to create applications where only one - instance should be running at a time. I.e., if the user tries to - launch another instance, the already running instance will be - activated instead. Another usecase is a client-server system, - where the first started instance will assume the role of server, - and the later instances will act as clients of that server. - - By default, the full path of the executable file is used to - determine whether two processes are instances of the same - application. You can also provide an explicit identifier string - that will be compared instead. - - The application should create the QtSingleApplication object early - in the startup phase, and call isRunning() or sendMessage() to - find out if another instance of this application is already - running. Startup parameters (e.g. the name of the file the user - wanted this new instance to open) can be passed to the running - instance in the sendMessage() function. - - If isRunning() or sendMessage() returns false, it means that no - other instance is running, and this instance has assumed the role - as the running instance. The application should continue with the - initialization of the application user interface before entering - the event loop with exec(), as normal. The messageReceived() - signal will be emitted when the application receives messages from - another instance of the same application. - - If isRunning() or sendMessage() returns true, another instance is - already running, and the application should terminate or enter - client mode. - - If a message is received it might be helpful to the user to raise - the application so that it becomes visible. To facilitate this, - QtSingleApplication provides the setActivationWindow() function - and the activateWindow() slot. - - Here's an example that shows how to convert an existing - application to use QtSingleApplication. It is very simple and does - not make use of all QtSingleApplication's functionality (see the - examples for that). - - \code - // Original - int main(int argc, char **argv) - { - QApplication app(argc, argv); - - MyMainWidget mmw; - - mmw.show(); - return app.exec(); - } - - // Single instance - int main(int argc, char **argv) - { - QtSingleApplication app(argc, argv); - - if (app.isRunning()) - return 0; - - MyMainWidget mmw; - - app.setActivationWindow(&mmw); - - mmw.show(); - return app.exec(); - } - \endcode - - Once this QtSingleApplication instance is destroyed(for example, - when the user quits), when the user next attempts to run the - application this instance will not, of course, be encountered. The - next instance to call isRunning() or sendMessage() will assume the - role as the new running instance. - - For console (non-GUI) applications, QtSingleCoreApplication may be - used instead of this class, to avoid the dependency on the QtGui - library. - - \sa QtSingleCoreApplication -*/ - -/* -* Summary: single system init -* Parameters: -* appid: appid -* Return : -*/ -void QtSingleApplication::sysInit(const QString &appId) -{ - actWin = 0; - peer = new QtLocalPeer(this, appId); - connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); -} - - -/*! - Creates a QtSingleApplication object. The application identifier - will be QCoreApplication::applicationFilePath(). \a argc, \a - argv, and \a GUIenabled are passed on to the QAppliation constructor. - - If you are creating a console application (i.e. setting \a - GUIenabled to false), you may consider using - QtSingleCoreApplication instead. -*/ - -QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) - : QApplication(argc, argv, GUIenabled) -{ - sysInit(); -} - - -/*! - Creates a QtSingleApplication object with the application - identifier \a appId. \a argc and \a argv are passed on to the - QAppliation constructor. -*/ - -QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) - : QApplication(argc, argv) -{ - sysInit(appId); -} - - -/*! - Creates a QtSingleApplication object. The application identifier - will be QCoreApplication::applicationFilePath(). \a argc, \a - argv, and \a type are passed on to the QAppliation constructor. -*/ -//QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) -// : QApplication(argc, argv, type) -//{ -// sysInit(); -//} - - -#if defined(Q_WS_X11) -/*! - Special constructor for X11, ref. the documentation of - QApplication's corresponding constructor. The application identifier - will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, - and \a cmap are passed on to the QApplication constructor. -*/ -QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) - : QApplication(dpy, visual, cmap) -{ - sysInit(); -} - -/*! - Special constructor for X11, ref. the documentation of - QApplication's corresponding constructor. The application identifier - will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a - argv, \a visual, and \a cmap are passed on to the QApplication - constructor. -*/ -QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) - : QApplication(dpy, argc, argv, visual, cmap) -{ - sysInit(); -} - -/*! - Special constructor for X11, ref. the documentation of - QApplication's corresponding constructor. The application identifier - will be \a appId. \a dpy, \a argc, \a - argv, \a visual, and \a cmap are passed on to the QApplication - constructor. -*/ -QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) - : QApplication(dpy, argc, argv, visual, cmap) -{ - sysInit(appId); -} -#endif - - -/*! - Returns true if another instance of this application is running; - otherwise false. - - This function does not find instances of this application that are - being run by a different user (on Windows: that are running in - another session). - - \sa sendMessage() -*/ - -/* -* Summary: check is running -* Parameters: -* -* Return : -*/ -bool QtSingleApplication::isRunning() -{ - return peer->isClient(); -} - - -/*! - Tries to send the text \a message to the currently running - instance. The QtSingleApplication object in the running instance - will emit the messageReceived() signal when it receives the - message. - - This function returns true if the message has been sent to, and - processed by, the current instance. If there is no instance - currently running, or if the running instance fails to process the - message within \a timeout milliseconds, this function return false. - - \sa isRunning(), messageReceived() -*/ -bool QtSingleApplication::sendMessage(const QString &message, int timeout) -{ - return peer->sendMessage(message, timeout); -} - - -/*! - Returns the application identifier. Two processes with the same - identifier will be regarded as instances of the same application. -*/ -QString QtSingleApplication::id() const -{ - return peer->applicationId(); -} - - -/*! - Sets the activation window of this application to \a aw. The - activation window is the widget that will be activated by - activateWindow(). This is typically the application's main window. - - If \a activateOnMessage is true (the default), the window will be - activated automatically every time a message is received, just prior - to the messageReceived() signal being emitted. - - \sa activateWindow(), messageReceived() -*/ - -void QtSingleApplication::setActivationWindow(DuktoWindow* aw, bool activateOnMessage) -{ - viewer = aw; - if (activateOnMessage) - connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); - else - disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); -} - - -/*! - Returns the applications activation window if one has been set by - calling setActivationWindow(), otherwise returns 0. - - \sa setActivationWindow() -*/ -QWidget* QtSingleApplication::activationWindow() const -{ - return actWin; -} - - -/*! - De-minimizes, raises, and activates this application's activation window. - This function does nothing if no activation window has been set. - - This is a convenience function to show the user that this - application instance has been activated when he has tried to start - another instance. - - This function should typically be called in response to the - messageReceived() signal. By default, that will happen - automatically, if an activation window has been set. - - \sa setActivationWindow(), messageReceived(), initialize() -*/ -void QtSingleApplication::activateWindow() -{ - if (viewer) { - // viewer->showNormal(); - viewer->show(); - viewer->raise(); - viewer->requestActivate(); - } -} - - -/*! - \fn void QtSingleApplication::messageReceived(const QString& message) - - This signal is emitted when the current instance receives a \a - message from another instance of this application. - - \sa sendMessage(), setActivationWindow(), activateWindow() -*/ - - -/*! - \fn void QtSingleApplication::initialize(bool dummy = true) - - \obsolete -*/ diff --git a/qtsingleapplication/qtsingleapplication.h b/qtsingleapplication/qtsingleapplication.h deleted file mode 100644 index b53df74..0000000 --- a/qtsingleapplication/qtsingleapplication.h +++ /dev/null @@ -1,113 +0,0 @@ -/**************************************************************************** -** -** This file is part of a Qt Solutions component. -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** 2020 KylinSoft Co., Ltd. -** -** Contact: Qt Software Information (qt-info@nokia.com) -** -** Commercial Usage -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Solutions Commercial License Agreement provided -** with the Software or, alternatively, in accordance with the terms -** contained in a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain -** additional rights. These rights are described in the Nokia Qt LGPL -** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this -** package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** Please note Third Party Software included with Qt Solutions may impose -** additional restrictions and it is the user's responsibility to ensure -** that they have met the licensing requirements of the GPL, LGPL, or Qt -** Solutions Commercial license and the relevant license of the Third -** Party Software they are using. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** -****************************************************************************/ - -#ifndef QTSINGLEAPPLICATION_H -#define QTSINGLEAPPLICATION_H - -#include -#include "../duktowindow.h" - -class QtLocalPeer; - -#if defined(Q_OS_WIN) -# if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) -# define QT_QTSINGLEAPPLICATION_EXPORT -# elif defined(QT_QTSINGLEAPPLICATION_IMPORT) -# if defined(QT_QTSINGLEAPPLICATION_EXPORT) -# undef QT_QTSINGLEAPPLICATION_EXPORT -# endif -# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) -# elif defined(QT_QTSINGLEAPPLICATION_EXPORT) -# undef QT_QTSINGLEAPPLICATION_EXPORT -# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) -# endif -#else -# define QT_QTSINGLEAPPLICATION_EXPORT -#endif - - -class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication -{ - Q_OBJECT - -public: - QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); - QtSingleApplication(const QString &id, int &argc, char **argv); -// QtSingleApplication(int &argc, char **argv, Type type); -#if defined(Q_WS_X11) - QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); - QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); - QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); -#endif - - bool isRunning(); - QString id() const; - - void setActivationWindow(DuktoWindow* aw, bool activateOnMessage = true); - QWidget* activationWindow() const; - - // Obsolete: - void initialize(bool dummy = true) - { isRunning(); Q_UNUSED(dummy) } - -public Q_SLOTS: - bool sendMessage(const QString &message, int timeout = 5000); - void activateWindow(); - - -Q_SIGNALS: - void messageReceived(const QString &message); - - -private: - void sysInit(const QString &appId = QString()); - QtLocalPeer *peer; - QWidget *actWin; - DuktoWindow *viewer; -}; - -#endif // QTSINGLEAPPLICATION_H diff --git a/qtsingleapplication/qtsingleapplication.pri b/qtsingleapplication/qtsingleapplication.pri deleted file mode 100644 index 57945de..0000000 --- a/qtsingleapplication/qtsingleapplication.pri +++ /dev/null @@ -1,3 +0,0 @@ -SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp -HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h -INCLUDEPATH += $$PWD diff --git a/recentlistitemmodel.cpp b/recentlistitemmodel.cpp deleted file mode 100644 index 798b8ba..0000000 --- a/recentlistitemmodel.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "recentlistitemmodel.h" - - -RecentListItemModel::RecentListItemModel() : - QStandardItemModel(NULL) -{ - QHash roleNames; - roleNames[Name] = "name"; - roleNames[Value] = "value"; - roleNames[Type] = "type"; - roleNames[TypeIcon] = "typeIcon"; - roleNames[DateTime] = "dateTime"; - roleNames[Sender] = "sender"; - roleNames[Size] = "size"; - roleNames[Mac] = "mac"; - setItemRoleNames(roleNames); -} - -// 添加最近聊天记录 -/* -* Parameters: -* name: user name -* value: msg value -* type: msg type -* sender: msg sender -* size: msg size -* ip_mac: sender ip and mac address string -* Return : -*/ -void RecentListItemModel::addRecent(QString name, QString value, QString type, QString sender, qint64 size, QString ip_mac) -{ - QStandardItem* it = new QStandardItem(); - - // Format timestamp - QDateTime now = QDateTime::currentDateTime(); - QString datetime = now.toString(Qt::SystemLocaleShortDate); - - // Convert size data - QString sizeFormatted; - if (size < 1024) - sizeFormatted = QString::number(size) + " B"; - else if (size < 1048576) - sizeFormatted = QString::number(size * 1.0 / 1024, 'f', 1) + " KB"; - else - sizeFormatted = QString::number(size * 1.0 / 1048576, 'f', 1) + " MB"; - - // Icon - if (type == "text") - it->setData("RecentText.png", RecentListItemModel::TypeIcon); - else if (type == "file") - it->setData("RecentFile.png", RecentListItemModel::TypeIcon); - else - it->setData("RecentFiles.png", RecentListItemModel::TypeIcon); - - if (type == "text") - it->setData(name, RecentListItemModel::Name); - else - it->setData(name + " (" + sizeFormatted + ")", RecentListItemModel::Name); - it->setData(value, RecentListItemModel::Value); - it->setData(type, RecentListItemModel::Type); - it->setData(datetime, RecentListItemModel::DateTime); - it->setData(sender, RecentListItemModel::Sender); - it->setData(sizeFormatted, RecentListItemModel::Size); - it->setData(ip_mac, RecentListItemModel::Mac); - insertRow(0, it); -} diff --git a/recentlistitemmodel.h b/recentlistitemmodel.h deleted file mode 100644 index 29aee86..0000000 --- a/recentlistitemmodel.h +++ /dev/null @@ -1,46 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef RECENTLISTITEMMODEL_H -#define RECENTLISTITEMMODEL_H - -#include -#include - - -class RecentListItemModel : public QStandardItemModel -{ - Q_OBJECT -public: - explicit RecentListItemModel(); - void addRecent(QString name, QString value, QString type, QString sender, qint64 size, QString senderIp); - - enum RecentRoles { - Name = Qt::UserRole + 1, - Value, - Type, - TypeIcon, - DateTime, - Sender, - Size, - Mac - }; -}; - -#endif // RECENTLISTITEMMODEL_H diff --git a/kylin-ipmsg.png b/res/kylin-ipmsg.png similarity index 100% rename from kylin-ipmsg.png rename to res/kylin-ipmsg.png diff --git a/run b/run index 119190e..fbe9385 100755 --- a/run +++ b/run @@ -1,10 +1,9 @@ #!/bin/bash -rm .qmake.stash rm -rf build mkdir build cd build qmake .. make -j8 sudo make install -./$1 +./src/$1 diff --git a/settings.cpp b/settings.cpp deleted file mode 100644 index affbc36..0000000 --- a/settings.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "settings.h" -#include "platform.h" -#include "theme.h" - -#include -#include - -Settings::Settings(QObject *parent) : - QObject(parent), mSettings("kylinos.cn", "KylinIpmsg"){ -} - -// 获取当前接收文件路径 -QString Settings::currentPath() -{ - // Retrieve the last saved path (if any) - QString path = mSettings.value("DestPath", "").toString(); - - // Check if exists - if ((path != "") && (QDir(path).exists())) - return path; - - // Else return the default path for this platform - path = Platform::getDefaultPath(); - if (QDir(path).exists() == false){ - QDir qdir; - qdir.mkdir(path); - } - - return path; -} - -// 保存接收文件路径 -void Settings::savePath(QString path) -{ - // Save the new path - mSettings.setValue("DestPath", path); - mSettings.sync(); -} - -// 保存窗口位置 -//void Settings::saveWindowGeometry(QByteArray geo) -//{ -// mSettings.setValue("WindowPosAndSize", geo); -// mSettings.sync(); -//} - -void Settings::saveWindowGeometry(QRect geo) -{ - mSettings.setValue("WindowPosAndSize", geo); - mSettings.sync(); -} - -// 获取窗口位置 -QRect Settings::windowGeometry() -{ - return (mSettings.value("WindowPosAndSize")).toRect(); -} - -// 保存主题颜色 -void Settings::saveThemeColor(QString color) -{ - mSettings.setValue("ThemeColor", color); - mSettings.sync(); -} - -// 获取主题颜色 -QString Settings::themeColor() -{ - return mSettings.value("ThemeColor", Theme::DEFAULT_THEME_COLOR).toString(); -} - -/* -* Summary: get friend name -* Return : friend name -*/ -QString Settings::buddyName() -{ - // Retrieve the last saved name (if any) - return mSettings.value("BuddyName", "User").toString(); - -} - -/* -* Summary: save friend name -* Parameters: -* name: new friend name -* Return : -*/ -void Settings::saveBuddyName(QString name) -{ - // Save the new name - mSettings.setValue("BuddyName", name); - mSettings.sync(); -} - -// 保存昵称和备注 -/* -* Summary: save nickname -* Parameters: -* ip: my mac or friend's mac -* nickname: my nickname or friend's nickname -* Return : -*/ -void Settings::saveNickname(QString mac, QString nickname) -{ - mSettings.setValue(mac, nickname); - mSettings.sync(); -} - -// 获取昵称和备注 -/* -* Summary: save nickname -* Parameters: -* ip: my mac or friend's mac -* Return : -* nickname: my nickname or friend's nickname -*/ -QString Settings::nickname(QString mac) -{ - // 昵称默认"error" - return mSettings.value(mac, "error").toString(); -} - -// 保存图标路径 -void Settings::saveIconPath(QString path) -{ - mSettings.setValue("IconPath", path); -} - -// 获取图标路径 -QString Settings::iconPath() -{ - // 路径默认"" - return mSettings.value("IconPath", "").toString(); -} diff --git a/settings.h b/settings.h deleted file mode 100644 index 6167cde..0000000 --- a/settings.h +++ /dev/null @@ -1,71 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef SETTINGS_H -#define SETTINGS_H - -#include -#include -#include -#include -#include - -// 错误类型 -enum errorCode { - CONN_SUCCESS, - CONN_TIMEOUT, - DISCONN, - TRANSFERERR, - TRY_RECONN, - SKIPFILE, - OTHER -}; - -class Settings : public QObject -{ - Q_OBJECT -public: - explicit Settings(QObject *parent = 0); - QString currentPath(); - void savePath(QString path); -// void saveWindowGeometry(QByteArray geo); -// QByteArray windowGeometry(); - void saveWindowGeometry(QRect geo); - QRect windowGeometry(); - void saveThemeColor(QString color); - QString themeColor(); - void saveShowTermsOnStart(bool show); - bool showTermsOnStart(); - QString buddyName(); - void saveBuddyName(QString name); - void saveNickname(QString mac, QString nickname); - QString nickname(QString mac); - void saveIconPath(QString path); - QString iconPath(); - -signals: - -public slots: - -private: - QSettings mSettings; - -}; - -#endif // SETTINGS_H diff --git a/src/main.cpp b/src/main.cpp index 92b4937..dad3078 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,33 +17,32 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include -#include +#include #include #include +#include +#include +#include +#include +#include #include + #include -#include "qtsingleapplication.h" -#include "qmlapplicationviewer.h" -#include "guibehind.h" -#include "duktowindow.h" +#include +#include +#include +#include -/* -#include -#include -#include -#include -#include -*/ +#include "view/kyview.h" +#include "view/common/xatom-helper.h" +#include "view/common/dbusadaptor.h" int main(int argc, char *argv[]) { // 统一日志输出 initUkuiLog4qt("kylin-ipmsg"); -// QApplication::setGraphicsSystem("raster"); - // 适配4K屏以及分数缩放 #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); @@ -54,121 +53,83 @@ int main(int argc, char *argv[]) QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); #endif - // 需要给QtSingleApplication的传入参数id加DISPLAY标识 - QString id = QString("kylin-ipmsg"+ QLatin1String(getenv("DISPLAY"))); - - /*lock file*/ - QtSingleApplication app(id, argc, argv); - app.setApplicationVersion("1.1.22"); + QApplication app(argc, argv); + app.setApplicationVersion("2.1.1"); // 设置不使用gtk3平台文件对话框 app.setProperty("useFileDialog", false); -// QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); -// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); -// QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); - - // 国际化 - QString locale = QLocale::system().name(); - QTranslator trans_global, trans_menu; - if(locale == "zh_CN"){ - trans_global.load(":/qml/kylin-ipmsg_zh_CN.qm"); -// trans_global.load(":/qml/kylin-ipmsg_bo_CN.qm"); - trans_menu.load(":/qml/qt_zh_CN.qm"); - app.installTranslator(&trans_global); - app.installTranslator(&trans_menu); + // 连接DBus服务 + QDBusInterface interface(KYLIN_WECHAT_SERVICE, + KYLIN_WECHAT_PATH, + KYLIN_WECHAT_INTERFACE, + QDBusConnection::sessionBus()); + if (interface.isValid()) { + // 调用拉起主界面的method + interface.call("showMainWindow"); } -#ifndef QT_NO_TRANSLATION - QString translatorFileName = QLatin1String("qt_"); - translatorFileName += QLocale::system().name(); - QTranslator *translator = new QTranslator(); - if (translator->load(translatorFileName, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) - app.installTranslator(translator); - else - qDebug() << "Failed to load Chinese translation file."; -#endif - -#if 0 -{ - /*add file lock*/ - struct flock s_lock; - s_lock.l_type = F_WRLCK; - s_lock.l_whence = SEEK_SET; - s_lock.l_start = 0; - s_lock.l_len = 0; - s_lock.l_pid = getpid(); - - char p_lock_file_dir[512]; - char p_lock_file_path[1024]; - char *p_home = NULL; - int i_ret = -1; - int fd = -1; - - memset(p_lock_file_dir , 0x00 , sizeof(p_lock_file_dir)); - memset(p_lock_file_path , 0x00 , sizeof(p_lock_file_path)); - - p_home = getenv("HOME"); - if(p_home == NULL) { - printf("get env var HOME fail\n"); - return -1; + // 文件锁实现VNC单例 + QStringList homePath = QStandardPaths::standardLocations(QStandardPaths::HomeLocation); + // 需要给文件锁加一个DISPLAY标识 + int fd = open(QString(homePath.at(0) + "/.config/kylin-wechat%1.lock").arg(getenv("DISPLAY")).toUtf8().data(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + if (fd < 0) + { + exit(1); } - - sprintf(p_lock_file_dir , "%s/.kylin-ipmsg" , p_home); - sprintf(p_lock_file_path , "%s/kylin-ipmsg.lock" , p_lock_file_dir); - - i_ret = access(p_lock_file_dir , F_OK); - if (i_ret == -1) { - printf("lock file path is not exits\n"); - i_ret = mkdir(p_lock_file_dir , 0777); - if(i_ret == -1) { - printf("create dir fail\n"); - return -1; - } - printf("create dir success\n"); + if (lockf(fd, F_TLOCK, 0)) + { + syslog(LOG_ERR, "Can't lock single file, kylin-wechat is already running!"); + exit(0); } - fd = open(p_lock_file_path , O_CREAT | O_RDWR | O_TRUNC , 0777); - if(fd == -1) { - printf("get file fd fail\n"); - return -1; + // 国际化 + QString qtTransPath; + // /usr/share/qt5/translations + qtTransPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); + QString kylinWechatTransPath; + +#ifdef QT_NO_DEBUG + if (QDir("/usr/share/kylin-calculator/translations").exists()) { + kylinWechatTransPath = "/usr/share/kylin-calculator/translations"; } - i_ret = fcntl(fd , F_SETLK , &s_lock); - if (i_ret == -1) { - printf("lock file fail . errno is %s\n" , strerror(errno)); - return -1; + else { + kylinWechatTransPath = qApp->applicationDirPath() + "/.qm"; } -} +#else + kylinWechatTransPath = "translations"; #endif - // 单例判断 - /*check file whether locked*/ - if (app.isRunning()) { - app.sendMessage("FOREGROUND"); - return 0; + QString locale = QLocale::system().name(); + QTranslator trans_global, trans_qt; + if (locale == "zh_CN") { + if(!trans_global.load(QLocale(), "kylin-calculator", "_", kylinWechatTransPath)) + qDebug() << "Load translations file" <setWindowMotifHint(KyView::getInstance()->winId(), hints); +#endif + + KyView::getInstance()->show(); + + // 创建DBus服务 + DbusAdaptor adaptor; + Q_UNUSED(adaptor); return app.exec(); } diff --git a/src/model/chatlogmodel.cpp b/src/model/chatlogmodel.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/model/chatlogmodel.h b/src/model/chatlogmodel.h new file mode 100644 index 0000000..e69de29 diff --git a/src/model/friendsinfomodel.cpp b/src/model/friendsinfomodel.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/model/friendsinfomodel.h b/src/model/friendsinfomodel.h new file mode 100644 index 0000000..e69de29 diff --git a/src/model/localinfomodel.cpp b/src/model/localinfomodel.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/model/localinfomodel.h b/src/model/localinfomodel.h new file mode 100644 index 0000000..e69de29 diff --git a/src/src.pro b/src/src.pro index 3759a09..0b41c7b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -1,33 +1,53 @@ -QT += core gui -QT += svg -QT += dbus -QT += x11extras KWindowSystem +QT += core gui network dbus +QT += x11extras KWindowSystem + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -CONFIG += c++11 # 适配窗口管理器圆角阴影 LIBS +=-lpthread LIBS +=-lX11 -TARGET = kylin-photo-viewer -TEMPLATE = app +# 配置gsettings CONFIG += link_pkgconfig PKGCONFIG += gsettings-qt -DEFINES += QT_DEPRECATED_WARNINGS +# for nullptr +CONFIG += c++11 + +# 配置gsettings +PKGCONFIG += gsettings-qt + +# 统一日志输出 +LIBS += -L/usr/lib/libukui-log4qt.so.1.0.0 -lukui-log4qt -#stb -LIBS += -lstb \ +TARGET = kylin-wechat +TEMPLATE = app -#gif -LIBS += -lgif \ +DEFINES += QT_DEPRECATED_WARNINGS target.path = /usr/bin -target.source +=$$TARGET +target.source += $$TARGET + INSTALLS += target -SOURCES += main.cpp \ +# V10Pro使用自定义用户手册 +greaterThan(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 9) { + # message("QT_VERSION ("$$QT_VERSION")") + DEFINES += __V10Pro__ +} + +SOURCES += \ + $$PWD/main.cpp \ + $$PWD/view/kyview.cpp \ + $$PWD/view/common/xatom-helper.cpp \ + $$PWD/view/common/daemondbus.cpp \ + $$PWD/view/common/dbusadaptor.cpp \ + $$PWD HEADERS += \ + $$PWD/view/kyview.h \ + $$PWD/view/common/xatom-helper.h \ + $$PWD/view/common/daemondbus.h \ + $$PWD/view/common/dbusadaptor.h \ RESOURCES += \ diff --git a/daemonipcdbus.cpp b/src/view/common/daemondbus.cpp similarity index 71% rename from daemonipcdbus.cpp rename to src/view/common/daemondbus.cpp index 1ff220a..c3d4df5 100644 --- a/daemonipcdbus.cpp +++ b/src/view/common/daemondbus.cpp @@ -1,64 +1,63 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "daemonipcdbus.h" - -int DaemonIpcDbus::daemonIsNotRunning() -{ - char service_name[SERVICE_NAME_SIZE]; - memset(service_name, 0, SERVICE_NAME_SIZE); - snprintf(service_name, SERVICE_NAME_SIZE, "%s_%d",KYLIN_USER_GUIDE_SERVICE,getuid()); - QDBusConnection conn = QDBusConnection::sessionBus(); - if (!conn.isConnected()) - return -1; - - QDBusReply reply = conn.interface()->call("GetNameOwner", service_name); - return reply.value() == ""; -} - -void DaemonIpcDbus::showGuide(QString appName) -{ - qDebug() << Q_FUNC_INFO << appName; - bool bRet = false; - - char service_name[SERVICE_NAME_SIZE]; - memset(service_name, 0, SERVICE_NAME_SIZE); - snprintf(service_name, SERVICE_NAME_SIZE, "%s_%d",KYLIN_USER_GUIDE_SERVICE,getuid()); - - qDebug() << "service_name " << service_name; - // 用来构造一个在D-Bus上传递的Message - QDBusMessage m = QDBusMessage::createMethodCall(QString(service_name),KYLIN_USER_GUIDE_PATH,KYLIN_USER_GUIDE_INTERFACE,"showGuide"); - // 给QDBusMessage增加一个参数; - // 这是一种比较友好的写法,也可以用setArguments来实现 - m << appName; - - // 发送Message - QDBusMessage response = QDBusConnection::sessionBus().call(m); - // 判断Method是否被正确返回 - if (response.type()== QDBusMessage::ReplyMessage) - { - // QDBusMessage的arguments不仅可以用来存储发送的参数,也用来存储返回值; -// bRet = response.arguments().at(0).toBool(); - } - else { - qDebug()<<"showGuide In fail!\n"; - } - - qDebug()<<"bRet:"<. + */ + +#include "daemondbus.h" + +int DaemonDbus::daemonIsNotRunning() +{ + char service_name[SERVICE_NAME_SIZE]; + memset(service_name, 0, SERVICE_NAME_SIZE); + snprintf(service_name, SERVICE_NAME_SIZE, "%s_%d",KYLIN_USER_GUIDE_SERVICE,getuid()); + QDBusConnection conn = QDBusConnection::sessionBus(); + if (!conn.isConnected()) + return -1; + + QDBusReply reply = conn.interface()->call("GetNameOwner", service_name); + return reply.value() == ""; +} + +void DaemonDbus::showGuide(QString appName) +{ + qDebug() << Q_FUNC_INFO << appName; + bool bRet = false; + + char service_name[SERVICE_NAME_SIZE]; + memset(service_name, 0, SERVICE_NAME_SIZE); + snprintf(service_name, SERVICE_NAME_SIZE, "%s_%d",KYLIN_USER_GUIDE_SERVICE,getuid()); + + qDebug() << "service_name " << service_name; + // 构造一个在D-Bus上传递的Message + QDBusMessage m = QDBusMessage::createMethodCall(QString(service_name),KYLIN_USER_GUIDE_PATH,KYLIN_USER_GUIDE_INTERFACE,"showGuide"); + // 给QDBusMessage增加一个参数; + // 这是一种比较友好的写法,也可以用setArguments来实现 + m << appName; + + // 发送Message + QDBusMessage response = QDBusConnection::sessionBus().call(m); + // 判断Method是否被正确返回 + if (response.type()== QDBusMessage::ReplyMessage) + { + // QDBusMessage的arguments不仅可以用来存储发送的参数,也用来存储返回值; + //bRet = response.arguments().at(0).toBool(); + } + else { + qDebug()<<"showGuide In fail!\n"; + } + + qDebug()<<"bRet:"< -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class DaemonIpcDbus : public QObject -{ - Q_OBJECT - // 定义Interface名称为com.scorpio.test.value -// Q_CLASSINFO("D-Bus Interface", "com.scorpio.test.value") -public: - - DaemonIpcDbus() {} - -public slots: - - int daemonIsNotRunning(); - void showGuide(QString appName); - -}; - -/* -// 使用方法 -DaemonIpcDbus *mDaemonIpcDbus; -mDaemonIpcDbus = new DaemonIpcDbus(); -if (!mDaemonIpcDbus->daemonIsNotRunning()){ - //增加标题栏帮助菜单、F1快捷键打开用户手册 - mDaemonIpcDbus->showGuide("kylin-ipmsg"); -} -*/ - -#endif // DAEMONIPCDBUS_H +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef DAEMONIPCDBUS_H +#define DAEMONIPCDBUS_H + +#define KYLIN_USER_GUIDE_PATH "/" + +#define KYLIN_USER_GUIDE_SERVICE "com.kylinUserGuide.hotel" + +#define KYLIN_USER_GUIDE_INTERFACE "com.guide.hotel" + +#define SERVICE_NAME_SIZE 30 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class DaemonDbus : public QObject +{ + Q_OBJECT + // 定义Interface名称为com.scorpio.test.value + // Q_CLASSINFO("D-Bus Interface", "com.scorpio.test.value") +public: + + DaemonDbus() {} + +public slots: + + int daemonIsNotRunning(); + void showGuide(QString appName); + +}; + +/* +// 使用方法 +DaemonIpcDbus *mDaemonIpcDbus; +mDaemonIpcDbus = new DaemonIpcDbus(); +if (!mDaemonIpcDbus->daemonIsNotRunning()){ + //增加标题栏帮助菜单、F1快捷键打开用户手册 + mDaemonIpcDbus->showGuide("kylin-ipmsg"); +} +*/ + +#endif // DAEMONIPCDBUS_H + diff --git a/src/view/common/dbusadaptor.cpp b/src/view/common/dbusadaptor.cpp new file mode 100644 index 0000000..f00df2b --- /dev/null +++ b/src/view/common/dbusadaptor.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "dbusadaptor.h" + +DbusAdaptor::DbusAdaptor(QObject *parent) + : QObject(parent) +{ + QDBusConnection connection = QDBusConnection::sessionBus(); + if (!connection.registerService(KYLIN_WECHAT_SERVICE)) { + return ; + } + connection.registerObject(KYLIN_WECHAT_PATH, this, QDBusConnection::ExportAllSlots); +} + +DbusAdaptor::~DbusAdaptor() +{ +} + +// 显示应用主界面 +void DbusAdaptor::showMainWindow() +{ + qDebug() << "showMainWindow"; + KyView::getInstance()->pullUpWindow(); +} + diff --git a/src/view/common/dbusadaptor.h b/src/view/common/dbusadaptor.h new file mode 100644 index 0000000..8103c3e --- /dev/null +++ b/src/view/common/dbusadaptor.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef DBUSADAPTOR_H +#define DBUSADAPTOR_H + +#define KYLIN_WECHAT_PATH "/" +#define KYLIN_WECHAT_SERVICE "com.kylin.wechat" +#define KYLIN_WECHAT_INTERFACE "com.kylin.wechat" + +#include +#include +#include +#include +#include +#include +#include + +#include "../kyview.h" + +class DbusAdaptor: public QObject +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", KYLIN_WECHAT_SERVICE) + +public: + DbusAdaptor(QObject *parent = 0); + virtual ~DbusAdaptor(); + +public slots: + // 显示应用主界面 + void showMainWindow(); +}; + +#endif diff --git a/src/view/common/xatom-helper.cpp b/src/view/common/xatom-helper.cpp new file mode 100644 index 0000000..c2682fe --- /dev/null +++ b/src/view/common/xatom-helper.cpp @@ -0,0 +1,216 @@ +/* + * KWin Style UKUI + * + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: Yue Lan + * + */ + +#include "xatom-helper.h" + +#include + +#include + +#include +#include +#include +#include + +static XAtomHelper *global_instance = nullptr; + +XAtomHelper *XAtomHelper::getInstance() +{ + if (!global_instance) + global_instance = new XAtomHelper; + return global_instance; +} + +bool XAtomHelper::isFrameLessWindow(int winId) +{ + auto hints = getInstance()->getWindowMotifHint(winId); + if (hints.flags == MWM_HINTS_DECORATIONS && hints.functions == 1) { + return true; + } + return false; +} + +bool XAtomHelper::isWindowDecorateBorderOnly(int winId) +{ + return isWindowMotifHintDecorateBorderOnly(getInstance()->getWindowMotifHint(winId)); +} + +bool XAtomHelper::isWindowMotifHintDecorateBorderOnly(const MotifWmHints &hint) +{ + bool isDeco = false; + if (hint.flags & MWM_HINTS_DECORATIONS && hint.flags != MWM_HINTS_DECORATIONS) { + if (hint.decorations == MWM_DECOR_BORDER) + isDeco = true; + } + return isDeco; +} + +bool XAtomHelper::isUKUICsdSupported() +{ + // fixme: + return false; +} + +bool XAtomHelper::isUKUIDecorationWindow(int winId) +{ + if (m_ukuiDecorationAtion == None) + return false; + + unsigned long type; + int format; + ulong nitems; + ulong bytes_after; + uchar *data; + + bool isUKUIDecoration = false; + + XGetWindowProperty(QX11Info::display(), winId, m_ukuiDecorationAtion, + 0, LONG_MAX, false, + m_ukuiDecorationAtion, &type, + &format, &nitems, + &bytes_after, &data); + + if (type == m_ukuiDecorationAtion) { + if (nitems == 1) { + isUKUIDecoration = data[0]; + } + } + + return isUKUIDecoration; +} + +UnityCorners XAtomHelper::getWindowBorderRadius(int winId) +{ + UnityCorners corners; + + Atom type; + int format; + ulong nitems; + ulong bytes_after; + uchar *data; + + if (m_unityBorderRadiusAtom != None) { + XGetWindowProperty(QX11Info::display(), winId, m_unityBorderRadiusAtom, + 0, LONG_MAX, false, + XA_CARDINAL, &type, + &format, &nitems, + &bytes_after, &data); + + if (type == XA_CARDINAL) { + if (nitems == 4) { + corners.topLeft = static_cast(data[0]); + corners.topRight = static_cast(data[1*sizeof (ulong)]); + corners.bottomLeft = static_cast(data[2*sizeof (ulong)]); + corners.bottomRight = static_cast(data[3*sizeof (ulong)]); + } + XFree(data); + } + } + + return corners; +} + +void XAtomHelper::setWindowBorderRadius(int winId, const UnityCorners &data) +{ + if (m_unityBorderRadiusAtom == None) + return; + + ulong corners[4] = {data.topLeft, data.topRight, data.bottomLeft, data.bottomRight}; + + XChangeProperty(QX11Info::display(), winId, m_unityBorderRadiusAtom, XA_CARDINAL, + 32, XCB_PROP_MODE_REPLACE, (const unsigned char *) &corners, sizeof (corners)/sizeof (corners[0])); +} + +void XAtomHelper::setWindowBorderRadius(int winId, int topLeft, int topRight, int bottomLeft, int bottomRight) +{ + if (m_unityBorderRadiusAtom == None) + return; + + ulong corners[4] = {(ulong)topLeft, (ulong)topRight, (ulong)bottomLeft, (ulong)bottomRight}; + + XChangeProperty(QX11Info::display(), winId, m_unityBorderRadiusAtom, XA_CARDINAL, + 32, XCB_PROP_MODE_REPLACE, (const unsigned char *) &corners, sizeof (corners)/sizeof (corners[0])); +} + +void XAtomHelper::setUKUIDecoraiontHint(int winId, bool set) +{ + if (m_ukuiDecorationAtion == None) + return; + + XChangeProperty(QX11Info::display(), winId, m_ukuiDecorationAtion, m_ukuiDecorationAtion, 32, XCB_PROP_MODE_REPLACE, (const unsigned char *) &set, 1); +} + +void XAtomHelper::setWindowMotifHint(int winId, const MotifWmHints &hints) +{ + if (m_unityBorderRadiusAtom == None) + return; + + XChangeProperty(QX11Info::display(), winId, m_motifWMHintsAtom, m_motifWMHintsAtom, + 32, XCB_PROP_MODE_REPLACE, (const unsigned char *)&hints, sizeof (MotifWmHints)/ sizeof (ulong)); +} + +MotifWmHints XAtomHelper::getWindowMotifHint(int winId) +{ + MotifWmHints hints; + + if (m_unityBorderRadiusAtom == None) + return hints; + + uchar *data; + Atom type; + int format; + ulong nitems; + ulong bytes_after; + + XGetWindowProperty(QX11Info::display(), winId, m_motifWMHintsAtom, + 0, sizeof (MotifWmHints)/sizeof (long), false, AnyPropertyType, &type, + &format, &nitems, &bytes_after, &data); + + if (type == None) { + return hints; + } else { + hints = *(MotifWmHints *)data; + XFree(data); + } + return hints; +} + +XAtomHelper::XAtomHelper(QObject *parent) : QObject(parent) +{ + if (!QX11Info::isPlatformX11()) + return; + + m_motifWMHintsAtom = XInternAtom(QX11Info::display(), "_MOTIF_WM_HINTS", true); + m_unityBorderRadiusAtom = XInternAtom(QX11Info::display(), "_UNITY_GTK_BORDER_RADIUS", false); + m_ukuiDecorationAtion = XInternAtom(QX11Info::display(), "_KWIN_UKUI_DECORAION", false); +} + +Atom XAtomHelper::registerUKUICsdNetWmSupportAtom() +{ + // fixme: + return None; +} + +void XAtomHelper::unregisterUKUICsdNetWmSupportAtom() +{ + // fixme: +} diff --git a/src/view/common/xatom-helper.h b/src/view/common/xatom-helper.h new file mode 100644 index 0000000..d4923cc --- /dev/null +++ b/src/view/common/xatom-helper.h @@ -0,0 +1,111 @@ +/* + * KWin Style UKUI + * + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: Yue Lan + * + */ + +#ifndef XATOMHELPER_H +#define XATOMHELPER_H + +#include + +#include +#include + +struct UnityCorners { + ulong topLeft = 0; + ulong topRight = 0; + ulong bottomLeft = 0; + ulong bottomRight = 0; +}; + +typedef struct { + ulong flags = 0; + ulong functions = 0; + ulong decorations = 0; + long input_mode = 0; + ulong status = 0; +} MotifWmHints, MwmHints; + +#define MWM_HINTS_FUNCTIONS (1L << 0) +#define MWM_HINTS_DECORATIONS (1L << 1) +#define MWM_HINTS_INPUT_MODE (1L << 2) +#define MWM_HINTS_STATUS (1L << 3) + +#define MWM_FUNC_ALL (1L << 0) +#define MWM_FUNC_RESIZE (1L << 1) +#define MWM_FUNC_MOVE (1L << 2) +#define MWM_FUNC_MINIMIZE (1L << 3) +#define MWM_FUNC_MAXIMIZE (1L << 4) +#define MWM_FUNC_CLOSE (1L << 5) + +#define MWM_DECOR_ALL (1L << 0) +#define MWM_DECOR_BORDER (1L << 1) +#define MWM_DECOR_RESIZEH (1L << 2) +#define MWM_DECOR_TITLE (1L << 3) +#define MWM_DECOR_MENU (1L << 4) +#define MWM_DECOR_MINIMIZE (1L << 5) +#define MWM_DECOR_MAXIMIZE (1L << 6) + +#define MWM_INPUT_MODELESS 0 +#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1 +#define MWM_INPUT_SYSTEM_MODAL 2 +#define MWM_INPUT_FULL_APPLICATION_MODAL 3 +#define MWM_INPUT_APPLICATION_MODAL MWM_INPUT_PRIMARY_APPLICATION_MODAL + +#define MWM_TEAROFF_WINDOW (1L<<0) + +namespace UKUI { +class Decoration; +} + +class XAtomHelper : public QObject +{ + friend class UKUI::Decoration; + Q_OBJECT +public: + static XAtomHelper *getInstance(); + + static bool isFrameLessWindow(int winId); + + bool isWindowDecorateBorderOnly(int winId); + bool isWindowMotifHintDecorateBorderOnly(const MotifWmHints &hint); + bool isUKUICsdSupported(); + bool isUKUIDecorationWindow(int winId); + + UnityCorners getWindowBorderRadius(int winId); + void setWindowBorderRadius(int winId, const UnityCorners &data); + void setWindowBorderRadius(int winId, int topLeft, int topRight, int bottomLeft, int bottomRight); + void setUKUIDecoraiontHint(int winId, bool set = true); + + void setWindowMotifHint(int winId, const MotifWmHints &hints); + MotifWmHints getWindowMotifHint(int winId); + +private: + explicit XAtomHelper(QObject *parent = nullptr); + + unsigned long registerUKUICsdNetWmSupportAtom(); + void unregisterUKUICsdNetWmSupportAtom(); + + unsigned long m_motifWMHintsAtom = 0; + unsigned long m_unityBorderRadiusAtom = 0; + unsigned long m_ukuiDecorationAtion = 0; +}; + +#endif // XATOMHELPER_H diff --git a/src/view/kyview.cpp b/src/view/kyview.cpp new file mode 100644 index 0000000..27117f7 --- /dev/null +++ b/src/view/kyview.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "kyview.h" + +// 生成静态实例 +KyView *KyView::getInstance() +{ + + static KyView *instance = nullptr; + if (nullptr == instance) { + instance = new KyView(); + } + return instance; +} + +KyView::KyView(QWidget *parent) +{ +} + +KyView::~KyView() +{ +} + +// 最小化状态下拉起主界面 +void KyView::pullUpWindow() +{ + this->showNormal(); + this->raise(); + this->activateWindow(); +} \ No newline at end of file diff --git a/src/view/kyview.h b/src/view/kyview.h new file mode 100644 index 0000000..4498825 --- /dev/null +++ b/src/view/kyview.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef KYVIEW_H +#define KYVIEW_H + +#include +#include + +class KyView : public QWidget +{ + Q_OBJECT + +public: + explicit KyView(QWidget *parent = 0); + ~KyView(); + + // 生成静态实例 + static KyView *getInstance(); + + // 初始化组件 + // void setWidgetUi(); + + // 设置组件样式 + // void setWidgetStyle(); + + // 最小化状态下拉起主界面 + void pullUpWindow(); +private: + /* data */ +}; + + + + +#endif // KYVIEW_H diff --git a/src/view/titlebar/menumodule.cpp b/src/view/titlebar/menumodule.cpp new file mode 100644 index 0000000..82d63ec --- /dev/null +++ b/src/view/titlebar/menumodule.cpp @@ -0,0 +1,278 @@ +#include "menumodule.h" +#include "kyview.h" +#include "xatom-helper.h" +#include "sizedate.h" +menuModule::menuModule(QWidget *parent = nullptr) : QWidget(parent) +{ + init(); +} + + +void menuModule::init(){ + initAction(); +} + +void menuModule::initAction(){ + + m_bodyAppName = new QLabel(); + + m_bodyAppVersion = new QLabel(); + m_bodySupport = new QLabel(); + m_titleText = new QLabel(); + + m_bodySupport->setText(tr("Service & Support Team: ") + + "" + "support@kylinos.cn"); + m_bodyAppVersion->setText(tr("Version: ") + m_appVersion); + + menuButton = new QToolButton; + menuButton->setToolTip(tr("menu")); + menuButton->setIcon(QIcon::fromTheme("open-menu-symbolic")); + menuButton->setProperty("isWindowButton", 0x1); + menuButton->setProperty("useIconHighlightEffect",0x2); + menuButton->setIconSize(SizeDate::MICONSIZES); + menuButton->setPopupMode(QToolButton::InstantPopup); + menuButton->setFixedSize(SizeDate::MBTNSIZE); + menuButton->setAutoRaise(true); + menuButton->setFocusPolicy(Qt::NoFocus); + m_menu = new QMenu(); + + QList actions ; + QAction *actionOpen = new QAction(m_menu); + actionOpen->setText(tr("Open..")); + QAction *actionTheme = new QAction(m_menu); + actionTheme->setText(tr("Theme")); + QAction *actionHelp = new QAction(m_menu); + actionHelp->setText(tr("Help")); + QAction *actionAbout = new QAction(m_menu); + actionAbout->setText(tr("About")); + QAction *actionQuit = new QAction(m_menu); + actionQuit->setText(tr("Quit")); + actions<addActions(actions); +// 互斥按钮组 + QMenu *m_themeMenu = new QMenu; + QActionGroup *m_themeMenuGroup = new QActionGroup(this); + QAction *autoTheme = new QAction("Auto",this); + m_themeMenuGroup->addAction(autoTheme); + m_themeMenu->addAction(autoTheme); + autoTheme->setCheckable(true); + QAction *lightTheme = new QAction("Light",this); + m_themeMenuGroup->addAction(lightTheme); + m_themeMenu->addAction(lightTheme); + lightTheme->setCheckable(true); + QAction *darkTheme = new QAction("Dark",this); + m_themeMenuGroup->addAction(darkTheme); + m_themeMenu->addAction(darkTheme); + darkTheme->setCheckable(true); + QList themeActions; + themeActions<setMenu(m_themeMenu); + menuButton->setMenu(m_menu); + connect(m_menu,&QMenu::triggered,this,&menuModule::triggerMenu); + connect(this,&menuModule::menuModuleClose,KyView::mutual,&KyView::close); + + initGsetting(); +} + + + +void menuModule::setStyleByThemeGsetting(){ + QString nowThemeStyle = m_pGsettingThemeData->get("styleName").toString(); + if("ukui-dark" == nowThemeStyle || "ukui-black" == nowThemeStyle) + { + setThemeDark(); + }else if("ukui-default" == nowThemeStyle || "ukui-light" == nowThemeStyle || "ukui-white" == nowThemeStyle){ + setThemeLight(); + }else{ + return; + } +} + +void menuModule::triggerMenu(QAction *act){ + + + + QString str = act->text(); + if(tr("Quit") == str){ + emit menuModuleClose(); + }else if(tr("About") == str){ + aboutAction(); + }else if(tr("Help") == str){ + helpAction(); + }else if(tr("Open..") == str){ + emit openSignal(); + } +} + +void menuModule::aboutAction(){ +// 关于点击事件处理 + + initAbout(); +} + +void menuModule::helpAction(){ +// 帮助点击事件处理 + + m_appName = SizeDate::USERGUIDE; + if(!m_ipcDbus){ + m_ipcDbus = new DaemonDbus(); + } + + if(!m_ipcDbus->daemonIsNotRunning()){ + m_ipcDbus->showGuide(m_appName); + } +} + +void menuModule::initAbout(){ + + emit aboutShow(); + m_aboutWindow->deleteLater(); + m_aboutWindow = new QDialog(); + m_aboutWindow->installEventFilter(this); + m_aboutWindow->setWindowModality(Qt::ApplicationModal); + m_aboutWindow->setWindowFlag(Qt::Tool); + m_aboutWindow->setAutoFillBackground(true); + m_aboutWindow->setBackgroundRole(QPalette::Base); + + + MotifWmHints hints; + hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; + hints.functions = MWM_FUNC_ALL; + hints.decorations = MWM_DECOR_BORDER; + XAtomHelper::getInstance()->setWindowMotifHint(m_aboutWindow->winId(), hints); + + m_aboutWindow->setFixedSize(SizeDate::MABOUT); + m_aboutWindow->setMinimumHeight(SizeDate::MABOUT.height()); + QVBoxLayout *mainlyt = new QVBoxLayout(); + QHBoxLayout *titleLyt = initTitleBar(); + QVBoxLayout *bodylyt = initBody(); + mainlyt->setMargin(0); + mainlyt->addLayout(titleLyt); + mainlyt->addLayout(bodylyt); + mainlyt->addStretch(); + m_aboutWindow->setLayout(mainlyt); + //TODO:在中央显示 + QRect availableGeometry = this->parentWidget()->parentWidget()->geometry(); + m_aboutWindow->move(availableGeometry.center()-m_aboutWindow->rect().center()); + m_aboutWindow->show(); +} + +QHBoxLayout* menuModule::initTitleBar(){ + QLabel* titleIcon = new QLabel(); + titleIcon->setFixedSize(SizeDate::MICONSIZEM); + + m_appShowingName = tr("kylin photo view"); + m_iconPath = ":/res/res/kyview_logo.png"; + titleIcon->setPixmap(QPixmap::fromImage(QImage(m_iconPath))); + titleIcon->setScaledContents(true); + + QPushButton *titleBtnClose = new QPushButton; + titleBtnClose->setIcon(QIcon::fromTheme("window-close-symbolic")); + titleBtnClose->setToolTip(tr("close")); + titleBtnClose->setFixedSize(SizeDate::MBTNSIZE); + titleBtnClose->setFocusPolicy(Qt::NoFocus);//设置焦点类型 + titleBtnClose->setProperty("isWindowButton", 0x2); + titleBtnClose->setProperty("useIconHighlightEffect", 0x8); + titleBtnClose->setFlat(true); + connect(titleBtnClose,&QPushButton::clicked,[=](){m_aboutWindow->close();}); + + QHBoxLayout *hlyt = new QHBoxLayout; + m_titleText->setText(tr("Kylin Photo View")); + hlyt->setSpacing(0); + hlyt->setMargin(4); + hlyt->addSpacing(4); + hlyt->addWidget(titleIcon,0,Qt::AlignBottom); //居下显示 + hlyt->addSpacing(8); + hlyt->addWidget(m_titleText,0,Qt::AlignBottom); + hlyt->addStretch(); + hlyt->addWidget(titleBtnClose,0,Qt::AlignBottom); + return hlyt; +} + +QVBoxLayout* menuModule::initBody(){ + m_appVersion = SizeDate::VERSIONNEM; + QLabel* bodyIcon = new QLabel(); + bodyIcon->setFixedSize(SizeDate::MICONSIZEB); + bodyIcon->setPixmap(QPixmap::fromImage(QImage(m_iconPath))); + bodyIcon->setStyleSheet("font-size:14px;"); + bodyIcon->setScaledContents(true); + m_bodyAppName->setFixedHeight(SizeDate::NAMEHEIGHT); + m_bodyAppName->setText(tr(m_appShowingName.toLocal8Bit())); + m_bodyAppVersion->setFixedHeight(SizeDate::VERSIONHEI); + m_bodyAppVersion->setText(tr("Version: ") + m_appVersion); + m_bodyAppVersion->setAlignment(Qt::AlignLeft); + + connect(m_bodySupport,&QLabel::linkActivated,this,[=](const QString url){ + QDesktopServices::openUrl(QUrl(url)); + }); + m_bodySupport->setFixedHeight(SizeDate::VERSIONHEI); + m_bodySupport->setContextMenuPolicy(Qt::NoContextMenu); + QVBoxLayout *vlyt = new QVBoxLayout; + vlyt->setMargin(0); + vlyt->setSpacing(0); + vlyt->addSpacing(20); + vlyt->addWidget(bodyIcon,0,Qt::AlignHCenter); + vlyt->addSpacing(16); + vlyt->addWidget(m_bodyAppName,0,Qt::AlignHCenter); + vlyt->addSpacing(12); + vlyt->addWidget(m_bodyAppVersion,0,Qt::AlignHCenter); + vlyt->addSpacing(12); + vlyt->addWidget(m_bodySupport,0,Qt::AlignHCenter); + vlyt->addStretch(); + return vlyt; +} + +void menuModule::initGsetting(){ + if(QGSettings::isSchemaInstalled(FITTHEMEWINDOW)){ + m_pGsettingThemeData = new QGSettings(FITTHEMEWINDOW); + connect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); + } + +} + +void menuModule::dealSystemGsettingChange(const QString key){ + if(key == "styleName"){ + refreshThemeBySystemConf(); + } +} + +void menuModule::refreshThemeBySystemConf(){ + QString themeNow = m_pGsettingThemeData->get("styleName").toString(); + if("ukui-dark" == themeNow || "ukui-black" == themeNow){ + setThemeDark(); + }else{ + setThemeLight(); + } +} + +void menuModule::setThemeDark(){ + + + m_titleText->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); + m_bodyAppName->setStyleSheet("color:rgba(255,255,255,1);font-size:18px;"); + m_bodyAppVersion->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); + m_bodySupport->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); + + m_bodySupport->setText(tr("Service & Support Team: ") + + "" + "support@kylinos.cn"); +} + +void menuModule::setThemeLight(){ + + + m_titleText->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); + m_bodyAppName->setStyleSheet("color:rgba(0,0,0,1);font-size:18px;"); + m_bodyAppVersion->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); + m_bodySupport->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); + + m_bodySupport->setText(tr("Service & Support Team: ") + + "" + "support@kylinos.cn"); +} + + diff --git a/src/view/titlebar/menumodule.h b/src/view/titlebar/menumodule.h new file mode 100644 index 0000000..c377f17 --- /dev/null +++ b/src/view/titlebar/menumodule.h @@ -0,0 +1,89 @@ +#ifndef MENUMODULE_H +#define MENUMODULE_H +#define DEBUG_MENUMODULE 0 //DEBUG模式开关,代码上线之前务必关掉 +#define FITTHEMEWINDOW "org.ukui.style" +//#define APPDATA "org.kylin-photo-viewer-data.settings" 0301-cancel +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include "titlebar.h" +//#include "kyview.h" +#include "daemondbus.h" + +class menuModule : public QWidget +{ + Q_OBJECT +public: + explicit menuModule(QWidget *); + void themeUpdate(); +// void changeVolumePos(int posX, int posY, int width, int height); +signals: + void menuModuleClose();//从标题栏点击退出的信号 + void openSignal();//从标题栏进行打开图片的信号 + void aboutShow();//打开关于,主界面两栏的显示情况 +// void menuModuleSetThemeStyle(QString); +public: + QToolButton *menuButton = nullptr; + QMenu *m_menu = nullptr; +private: + QString m_appShowingName; + QString m_appVersion; + QString m_appName; + QString m_appDesc = "appDesc字段未填充!"; + QString m_iconPath; + QString m_confPath = "org.china-weather-data.settings"; + + QMenu *m_themeMenu = nullptr; + QDialog *m_aboutWindow = nullptr; + QGSettings *m_pGsettingThemeData = nullptr; + QGSettings *m_pGsettingThemeStatus = nullptr; + DaemonDbus *m_ipcDbus = nullptr; + enum typeThemeStatus { + themeAuto = 0, + themeBlackOnly = 1, + themeLightOnly = 2 + } themeStatus; + +public slots: + void dealSystemGsettingChange(const QString); +private: + void init(); + QHBoxLayout* initTitleBar(); //关于窗口标题栏初始化 + QVBoxLayout* initBody(); // 关于窗口body初始化 + void initGsetting(); + void initAction(); + void triggerMenu(QAction* act); //主菜单动作4 + void triggerThemeMenu(QAction* act); //主题动作 + void aboutAction(); + void initAbout(); //关于窗口初始化 + void helpAction(); + void setThemeFromLocalThemeSetting(QList); //获取本地主题配置 + void setStyleByThemeGsetting(); //通过外部主题配置设置主题 + void setThemeStyle(); + void setThemeLight(); + void setThemeDark(); + + void refreshThemeBySystemConf(); //通过系统配置更改主题 + + QLabel* m_titleText = nullptr; + QLabel* m_bodyAppVersion = nullptr; + QLabel* m_bodySupport = nullptr; + QLabel* m_bodyAppName = nullptr; +}; + +#endif // MENUMODULE_H diff --git a/src/view/titlebar/titlebar.cpp b/src/view/titlebar/titlebar.cpp new file mode 100644 index 0000000..94910bb --- /dev/null +++ b/src/view/titlebar/titlebar.cpp @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + diff --git a/src/view/titlebar/titlebar.h b/src/view/titlebar/titlebar.h new file mode 100644 index 0000000..a9c3b6e --- /dev/null +++ b/src/view/titlebar/titlebar.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef TITLEBAR_H +#define TITLEBAR_H + + + +#endif // TITLEBAR_H \ No newline at end of file diff --git a/theme.cpp b/theme.cpp deleted file mode 100644 index dd9ea57..0000000 --- a/theme.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "theme.h" - -const QString Theme::DEFAULT_THEME_COLOR = "#3a6cbc"; - - -Theme::Theme(QObject *parent) : - QObject(parent), - mColor1("#000000"), mColor2(DEFAULT_THEME_COLOR), mColor3("#4cb328"), - mColor4("#555555"), mColor5("#888888"), mColor6("#ffffff"), - mColor7("#cccccc"), mColor8("#eeeeee"), mColor9("#ccffffff"){ -} - -// 设置主题 -/* -* Parameters: -* color: theme color -* Return : -*/ -void Theme::setThemeColor(QString color) -{ - QColor c; - c.setNamedColor(color); - c.setRed(qMin(c.red() + 40, 255)); - c.setGreen(qMin(c.green() + 40, 255)); - c.setBlue(qMin(c.blue() + 40, 255)); - - mColor2 = color; - mColor3 = c.name(); - emit color2Changed(); - emit color3Changed(); -} - -// 具体颜色操作 -/* -* Parameters: -* color: theme color -* Return : -*/ -float Theme::getHue(QString color) { - - QColor c; - c.setNamedColor(color); - QColor converted = c.toHsv(); - return converted.hsvHueF(); -} - -/* -* Summary: get saturation -* Parameters: -* color: color -* Return : color saturation -*/ -float Theme::getSaturation(QString color) { - - QColor c; - c.setNamedColor(color); - QColor converted = c.toHsv(); - return converted.hsvSaturationF(); -} - -/* -* Summary: get lightness -* Parameters: -* color: color -* Return : lightness value -*/ -float Theme::getLightness(QString color) { - - QColor c; - c.setNamedColor(color); - QColor converted = c.toHsv(); - return converted.valueF(); -} diff --git a/theme.h b/theme.h deleted file mode 100644 index 7a162b7..0000000 --- a/theme.h +++ /dev/null @@ -1,86 +0,0 @@ -/* DUKTO - A simple, fast and multi-platform file transfer tool for LAN users - * Copyright (C) 2011 Emanuele Colombo - * 2020 KylinSoft Co., Ltd. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef THEME_H -#define THEME_H - -#include -#include -#include - - -class Theme : public QObject -{ - Q_OBJECT - - Q_PROPERTY(QString color1 READ color1 NOTIFY color1Changed) - Q_PROPERTY(QString color2 READ color2 NOTIFY color2Changed) - Q_PROPERTY(QString color3 READ color3 NOTIFY color3Changed) - Q_PROPERTY(QString color4 READ color4 NOTIFY color4Changed) - Q_PROPERTY(QString color5 READ color5 NOTIFY color5Changed) - Q_PROPERTY(QString color6 READ color6 NOTIFY color6Changed) - Q_PROPERTY(QString color7 READ color7 NOTIFY color7Changed) - Q_PROPERTY(QString color8 READ color8 NOTIFY color8Changed) - Q_PROPERTY(QString color9 READ color9 NOTIFY color9Changed) - -public: - explicit Theme(QObject *parent = 0); - inline QString color1() { return mColor1; } - inline QString color2() { return mColor2; } - inline QString color3() { return mColor3; } - inline QString color4() { return mColor4; } - inline QString color5() { return mColor5; } - inline QString color6() { return mColor6; } - inline QString color7() { return mColor7; } - inline QString color8() { return mColor8; } - inline QString color9() { return mColor9; } - void setThemeColor(QString color); - - static const QString DEFAULT_THEME_COLOR; - QString mColor1; - QString mColor2; - QString mColor3; - QString mColor4; - QString mColor5; - QString mColor6; - QString mColor7; - QString mColor8; - QString mColor9; - -signals: - void color1Changed(); - void color2Changed(); - void color3Changed(); - void color4Changed(); - void color5Changed(); - void color6Changed(); - void color7Changed(); - void color8Changed(); - void color9Changed(); - -public slots: - float getHue(QString color); - float getSaturation(QString color); - float getLightness(QString color); - -private: - -}; - -#endif // THEME_H From 05cc32b5457c37baa1cb15f39532b114ee21fe2d Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Wed, 21 Apr 2021 16:05:25 +0800 Subject: [PATCH 16/31] =?UTF-8?q?Update:=20=E8=B0=83=E7=94=A8=E4=B8=A4?= =?UTF-8?q?=E6=AC=A1=E5=AE=9E=E7=8E=B0=E6=8B=89=E8=B5=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 2 ++ qtsingleapplication/qtsingleapplication.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/main.cpp b/main.cpp index bacdde8..939b31a 100644 --- a/main.cpp +++ b/main.cpp @@ -144,6 +144,8 @@ int main(int argc, char *argv[]) // 单例判断 /*check file whether locked*/ if (app.isRunning()) { + app.sendMessage("FOREGROUND"); + sleep(1); app.sendMessage("FOREGROUND"); return 0; } diff --git a/qtsingleapplication/qtsingleapplication.cpp b/qtsingleapplication/qtsingleapplication.cpp index 6e52acc..aac7b62 100644 --- a/qtsingleapplication/qtsingleapplication.cpp +++ b/qtsingleapplication/qtsingleapplication.cpp @@ -338,6 +338,7 @@ QWidget* QtSingleApplication::activationWindow() const void QtSingleApplication::activateWindow() { if (viewer) { + qDebug() << "activateWindow"; // viewer->showNormal(); viewer->show(); viewer->raise(); From dd06b95ee3af3f83f59d3a2f3cf8dfdeef1b2c60 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Wed, 21 Apr 2021 16:12:36 +0800 Subject: [PATCH 17/31] Update structure --- src/global/database/database.cpp | 0 src/global/database/database.h | 0 src/global/utils/utils.h | 0 src/network/network.cpp | 0 src/network/network.h | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/global/database/database.cpp create mode 100644 src/global/database/database.h create mode 100644 src/global/utils/utils.h create mode 100644 src/network/network.cpp create mode 100644 src/network/network.h diff --git a/src/global/database/database.cpp b/src/global/database/database.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/global/database/database.h b/src/global/database/database.h new file mode 100644 index 0000000..e69de29 diff --git a/src/global/utils/utils.h b/src/global/utils/utils.h new file mode 100644 index 0000000..e69de29 diff --git a/src/network/network.cpp b/src/network/network.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/network/network.h b/src/network/network.h new file mode 100644 index 0000000..e69de29 From 9d8602a972bf39b560e30bddf6bc6a4c9f08c9b9 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Wed, 21 Apr 2021 17:24:23 +0800 Subject: [PATCH 18/31] Update application name --- README.md | 3 +-- .../en_US/image/1.png | Bin .../en_US/image/2.png | Bin .../en_US/image/3.png | Bin .../en_US/image/4.png | Bin .../en_US/image/5.png | Bin .../en_US/image/6.png | Bin .../en_US/image/7.png | Bin .../en_US/image/8.png | Bin .../en_US/image/9.png | Bin .../en_US/image/icon1.png | Bin .../en_US/image/icon2.png | Bin .../en_US/image/icon3.png | Bin .../en_US/index.md | 0 .../kylin-ipmsg.png | Bin .../zh_CN/image/1.png | Bin .../zh_CN/image/2.png | Bin .../zh_CN/image/3.png | Bin .../zh_CN/image/4.png | Bin .../zh_CN/image/5.png | Bin .../zh_CN/image/6.png | Bin .../zh_CN/image/icon1.png | Bin .../zh_CN/image/icon2.png | Bin .../zh_CN/image/icon3.png | Bin .../zh_CN/index.md | 0 ...-wechat.desktop => kylin-messages.desktop} | 6 ++--- ...rg.ukui.log4qt.kylin-messages.gschema.xml} | 4 +-- debian/control | 8 +++--- debian/copyright | 5 ++-- kylin-wechat.pro => kylin-messages.pro | 12 ++++----- run | 2 +- src/main.cpp | 23 +++++++++--------- src/src.pro | 3 +-- src/view/common/dbusadaptor.cpp | 4 +-- src/view/common/dbusadaptor.h | 8 +++--- 35 files changed, 39 insertions(+), 39 deletions(-) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/1.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/2.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/3.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/4.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/5.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/6.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/7.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/8.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/9.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/icon1.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/icon2.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/image/icon3.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/en_US/index.md (100%) rename data/guide/{kylin-wechat => kylin-messages}/kylin-ipmsg.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/1.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/2.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/3.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/4.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/5.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/6.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/icon1.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/icon2.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/image/icon3.png (100%) rename data/guide/{kylin-wechat => kylin-messages}/zh_CN/index.md (100%) rename data/{kylin-wechat.desktop => kylin-messages.desktop} (89%) rename data/schemas/{org.ukui.log4qt.kylin-ipmsg.gschema.xml => org.ukui.log4qt.kylin-messages.gschema.xml} (91%) rename kylin-wechat.pro => kylin-messages.pro (67%) diff --git a/README.md b/README.md index 85367b7..bf49ceb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ -# kylin-wechat +# kylin-messages Provide text chat and file transfer function with no server. -## Dependencies diff --git a/data/guide/kylin-wechat/en_US/image/1.png b/data/guide/kylin-messages/en_US/image/1.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/1.png rename to data/guide/kylin-messages/en_US/image/1.png diff --git a/data/guide/kylin-wechat/en_US/image/2.png b/data/guide/kylin-messages/en_US/image/2.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/2.png rename to data/guide/kylin-messages/en_US/image/2.png diff --git a/data/guide/kylin-wechat/en_US/image/3.png b/data/guide/kylin-messages/en_US/image/3.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/3.png rename to data/guide/kylin-messages/en_US/image/3.png diff --git a/data/guide/kylin-wechat/en_US/image/4.png b/data/guide/kylin-messages/en_US/image/4.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/4.png rename to data/guide/kylin-messages/en_US/image/4.png diff --git a/data/guide/kylin-wechat/en_US/image/5.png b/data/guide/kylin-messages/en_US/image/5.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/5.png rename to data/guide/kylin-messages/en_US/image/5.png diff --git a/data/guide/kylin-wechat/en_US/image/6.png b/data/guide/kylin-messages/en_US/image/6.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/6.png rename to data/guide/kylin-messages/en_US/image/6.png diff --git a/data/guide/kylin-wechat/en_US/image/7.png b/data/guide/kylin-messages/en_US/image/7.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/7.png rename to data/guide/kylin-messages/en_US/image/7.png diff --git a/data/guide/kylin-wechat/en_US/image/8.png b/data/guide/kylin-messages/en_US/image/8.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/8.png rename to data/guide/kylin-messages/en_US/image/8.png diff --git a/data/guide/kylin-wechat/en_US/image/9.png b/data/guide/kylin-messages/en_US/image/9.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/9.png rename to data/guide/kylin-messages/en_US/image/9.png diff --git a/data/guide/kylin-wechat/en_US/image/icon1.png b/data/guide/kylin-messages/en_US/image/icon1.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/icon1.png rename to data/guide/kylin-messages/en_US/image/icon1.png diff --git a/data/guide/kylin-wechat/en_US/image/icon2.png b/data/guide/kylin-messages/en_US/image/icon2.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/icon2.png rename to data/guide/kylin-messages/en_US/image/icon2.png diff --git a/data/guide/kylin-wechat/en_US/image/icon3.png b/data/guide/kylin-messages/en_US/image/icon3.png similarity index 100% rename from data/guide/kylin-wechat/en_US/image/icon3.png rename to data/guide/kylin-messages/en_US/image/icon3.png diff --git a/data/guide/kylin-wechat/en_US/index.md b/data/guide/kylin-messages/en_US/index.md similarity index 100% rename from data/guide/kylin-wechat/en_US/index.md rename to data/guide/kylin-messages/en_US/index.md diff --git a/data/guide/kylin-wechat/kylin-ipmsg.png b/data/guide/kylin-messages/kylin-ipmsg.png similarity index 100% rename from data/guide/kylin-wechat/kylin-ipmsg.png rename to data/guide/kylin-messages/kylin-ipmsg.png diff --git a/data/guide/kylin-wechat/zh_CN/image/1.png b/data/guide/kylin-messages/zh_CN/image/1.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/1.png rename to data/guide/kylin-messages/zh_CN/image/1.png diff --git a/data/guide/kylin-wechat/zh_CN/image/2.png b/data/guide/kylin-messages/zh_CN/image/2.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/2.png rename to data/guide/kylin-messages/zh_CN/image/2.png diff --git a/data/guide/kylin-wechat/zh_CN/image/3.png b/data/guide/kylin-messages/zh_CN/image/3.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/3.png rename to data/guide/kylin-messages/zh_CN/image/3.png diff --git a/data/guide/kylin-wechat/zh_CN/image/4.png b/data/guide/kylin-messages/zh_CN/image/4.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/4.png rename to data/guide/kylin-messages/zh_CN/image/4.png diff --git a/data/guide/kylin-wechat/zh_CN/image/5.png b/data/guide/kylin-messages/zh_CN/image/5.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/5.png rename to data/guide/kylin-messages/zh_CN/image/5.png diff --git a/data/guide/kylin-wechat/zh_CN/image/6.png b/data/guide/kylin-messages/zh_CN/image/6.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/6.png rename to data/guide/kylin-messages/zh_CN/image/6.png diff --git a/data/guide/kylin-wechat/zh_CN/image/icon1.png b/data/guide/kylin-messages/zh_CN/image/icon1.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/icon1.png rename to data/guide/kylin-messages/zh_CN/image/icon1.png diff --git a/data/guide/kylin-wechat/zh_CN/image/icon2.png b/data/guide/kylin-messages/zh_CN/image/icon2.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/icon2.png rename to data/guide/kylin-messages/zh_CN/image/icon2.png diff --git a/data/guide/kylin-wechat/zh_CN/image/icon3.png b/data/guide/kylin-messages/zh_CN/image/icon3.png similarity index 100% rename from data/guide/kylin-wechat/zh_CN/image/icon3.png rename to data/guide/kylin-messages/zh_CN/image/icon3.png diff --git a/data/guide/kylin-wechat/zh_CN/index.md b/data/guide/kylin-messages/zh_CN/index.md similarity index 100% rename from data/guide/kylin-wechat/zh_CN/index.md rename to data/guide/kylin-messages/zh_CN/index.md diff --git a/data/kylin-wechat.desktop b/data/kylin-messages.desktop similarity index 89% rename from data/kylin-wechat.desktop rename to data/kylin-messages.desktop index ab7322c..f0bc6d7 100644 --- a/data/kylin-wechat.desktop +++ b/data/kylin-messages.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Encoding=UTF-8 -Name=Kylin Wechat +Name=Kylin Messages Name[zh_CN]=新版传书 Name[zh_HK]=LAN 通訊工具 Name[zh_TW]=區域網路通訊工具 @@ -9,8 +9,8 @@ GenericName[bo_CN]=ཆི་ལིན་ཡིག་སྐྱལ། Comment=Beautiful LAN chat tool Comment[zh_CN]=麒麟局域网聊天工具,提供局域网聊天和文件传输功能,界面美观. Comment[bo_CN]=ཆི་ལིན་དྲ་ཆུང་དྲ་མོལ་ལག་ཆ། དྲ་ཆུང་དྲ་མོལ་དང་ཡིག་ཆ་བརྒྱུད་བསྒྲགས་ཀྱི་བྱེད་ནུས་འཆར་དངོས་མཛེས་བཟོ་སོགས་ཀྱི་བྱེད་ནུས་མཁོ་འདོན་བྱས་ཡོད། -Keywords=chat;talk;im;message;wechat; -Exec=/usr/bin/kylin-wechat +Keywords=chat;talk;im;message;messages; +Exec=/usr/bin/kylin-messages Icon=kylin-ipmsg StartupNotify=false Terminal=false diff --git a/data/schemas/org.ukui.log4qt.kylin-ipmsg.gschema.xml b/data/schemas/org.ukui.log4qt.kylin-messages.gschema.xml similarity index 91% rename from data/schemas/org.ukui.log4qt.kylin-ipmsg.gschema.xml rename to data/schemas/org.ukui.log4qt.kylin-messages.gschema.xml index 678c1c1..1852c61 100644 --- a/data/schemas/org.ukui.log4qt.kylin-ipmsg.gschema.xml +++ b/data/schemas/org.ukui.log4qt.kylin-messages.gschema.xml @@ -1,5 +1,5 @@ - - + + "true"

hook qt messages diff --git a/debian/control b/debian/control index ffd3c8d..07d60a5 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,8 @@ -Source: kylin-ipmsg +Source: kylin-messages Section: net Priority: optional -Maintainer: Kylin Development Team +Maintainer: caoliang + jishengjie Build-Depends: debhelper, qtbase5-dev (>= 5.6), qt5-qmake, @@ -19,11 +20,10 @@ Homepage: https://github.com/ubuntukylin/kylin-ipmsg Vcs-Browser: https://github.com/ubuntukylin/kylin-ipmsg Vcs-Bzr: lp://dev/kylin-ipmsg -Package: kylin-ipmsg +Package: kylin-messages Architecture: any Depends: ${misc:Depends}, wmctrl (>= 1.07-6) -Conflicts: kylin-dukto Description: Messages Messages is a LAN chat tool with beautiful Gui. . diff --git a/debian/copyright b/debian/copyright index 5f7d31c..7d494b2 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,10 +1,11 @@ Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: kylin-ipmsg -Upstream-Contact: Kylin Development Team +Upstream-Contact: caoliang + jishengjie Source: https://launchpad.dev/kylin-ipmsg Files: * -Copyright: 2016, National University of Defense Technology(NUDT) & Kylin Ltd +Copyright: Copyright (C) 2020, KylinSoft Co., Ltd. License: GPL-3 License: GPL-3 diff --git a/kylin-wechat.pro b/kylin-messages.pro similarity index 67% rename from kylin-wechat.pro rename to kylin-messages.pro index 4fb648d..a16e4a6 100644 --- a/kylin-wechat.pro +++ b/kylin-messages.pro @@ -5,18 +5,18 @@ SUBDIRS = \ # translations TRANSLATIONS += \ - data/translations/kylin-wechat_zh_CN.ts + data/translations/kylin-messages_zh_CN.ts !system($$PWD/data/translations/generate_translations_pm.sh): error("Failed to generate pm") qm_files.files = data/translations/*.qm -qm_files.path = /usr/share/kylin-wechat/data/translations/ +qm_files.path = /usr/share/kylin-messages/data/translations/ # gsettings schemes.files += \ - $$PWD/data/schemas/org.kylin-wechat-data.gschema.xml \ - $$PWD/data/schemas/org.ukui.log4qt.kylin-wechat.gschema.xml + $$PWD/data/schemas/org.kylin-messages-data.gschema.xml \ + $$PWD/data/schemas/org.ukui.log4qt.kylin-messages.gschema.xml schemes.path = /usr/share/glib-2.0/schemas/ -desktop.files = data/kylin-wechat.desktop +desktop.files = data/kylin-messages.desktop desktop.path = /usr/share/applications/ INSTALLS += \ @@ -29,7 +29,7 @@ greaterThan(QT_MAJOR_VERSION, 5) | greaterThan(QT_MINOR_VERSION, 9) { # message("QT_VERSION ("$$QT_VERSION")") DEFINES += __V10Pro__ guide.path = /usr/share/kylin-user-guide/data/guide/ - guide.files = data/guide/kylin-wechat/ + guide.files = data/guide/kylin-messages/ INSTALLS += guide } \ No newline at end of file diff --git a/run b/run index fbe9385..d7893e0 100755 --- a/run +++ b/run @@ -6,4 +6,4 @@ cd build qmake .. make -j8 sudo make install -./src/$1 +./src/kylin-messages diff --git a/src/main.cpp b/src/main.cpp index dad3078..fbaeec8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,26 +60,27 @@ int main(int argc, char *argv[]) app.setProperty("useFileDialog", false); // 连接DBus服务 - QDBusInterface interface(KYLIN_WECHAT_SERVICE, - KYLIN_WECHAT_PATH, - KYLIN_WECHAT_INTERFACE, + QDBusInterface interface(KYLIN_MESSAGES_SERVICE, + KYLIN_MESSAGES_PATH, + KYLIN_MESSAGES_INTERFACE, QDBusConnection::sessionBus()); if (interface.isValid()) { // 调用拉起主界面的method interface.call("showMainWindow"); + interface.call("showMainWindow"); } // 文件锁实现VNC单例 QStringList homePath = QStandardPaths::standardLocations(QStandardPaths::HomeLocation); // 需要给文件锁加一个DISPLAY标识 - int fd = open(QString(homePath.at(0) + "/.config/kylin-wechat%1.lock").arg(getenv("DISPLAY")).toUtf8().data(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + int fd = open(QString(homePath.at(0) + "/.config/kylin-messages%1.lock").arg(getenv("DISPLAY")).toUtf8().data(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { exit(1); } if (lockf(fd, F_TLOCK, 0)) { - syslog(LOG_ERR, "Can't lock single file, kylin-wechat is already running!"); + syslog(LOG_ERR, "Can't lock single file, kylin-messages is already running!"); exit(0); } @@ -87,23 +88,23 @@ int main(int argc, char *argv[]) QString qtTransPath; // /usr/share/qt5/translations qtTransPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); - QString kylinWechatTransPath; + QString kylinMessagesTransPath; #ifdef QT_NO_DEBUG - if (QDir("/usr/share/kylin-calculator/translations").exists()) { - kylinWechatTransPath = "/usr/share/kylin-calculator/translations"; + if (QDir("/usr/share/kylin-messages/translations").exists()) { + kylinMessagesTransPath = "/usr/share/kylin-messages/translations"; } else { - kylinWechatTransPath = qApp->applicationDirPath() + "/.qm"; + kylinMessagesTransPath = qApp->applicationDirPath() + "/.qm"; } #else - kylinWechatTransPath = "translations"; + kylinMessagesTransPath = "translations"; #endif QString locale = QLocale::system().name(); QTranslator trans_global, trans_qt; if (locale == "zh_CN") { - if(!trans_global.load(QLocale(), "kylin-calculator", "_", kylinWechatTransPath)) + if(!trans_global.load(QLocale(), "kylin-messages", "_", kylinMessagesTransPath)) qDebug() << "Load translations file" < #include @@ -35,7 +35,7 @@ class DbusAdaptor: public QObject { Q_OBJECT - Q_CLASSINFO("D-Bus Interface", KYLIN_WECHAT_SERVICE) + Q_CLASSINFO("D-Bus Interface", KYLIN_MESSAGES_SERVICE) public: DbusAdaptor(QObject *parent = 0); From 6954007c306304b1f82d4ee81e7c7cc496ced38c Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Thu, 22 Apr 2021 09:21:01 +0800 Subject: [PATCH 19/31] Update daemondbus --- src/view/common/daemondbus.cpp | 10 ++++++++++ src/view/common/daemondbus.h | 9 +++++---- src/view/kyview.cpp | 28 +++++++++++++++++++++++++++- src/view/kyview.h | 18 +++++++++++++++--- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/view/common/daemondbus.cpp b/src/view/common/daemondbus.cpp index c3d4df5..a87a068 100644 --- a/src/view/common/daemondbus.cpp +++ b/src/view/common/daemondbus.cpp @@ -17,6 +17,16 @@ #include "daemondbus.h" +// 生成静态实例 +DaemonDbus *DaemonDbus::getInstance() +{ + static DaemonDbus *instance = nullptr; + if (nullptr == instance) { + instance = new DaemonDbus(); + } + return instance; +} + int DaemonDbus::daemonIsNotRunning() { char service_name[SERVICE_NAME_SIZE]; diff --git a/src/view/common/daemondbus.h b/src/view/common/daemondbus.h index 3328dc7..39b8271 100644 --- a/src/view/common/daemondbus.h +++ b/src/view/common/daemondbus.h @@ -46,6 +46,9 @@ class DaemonDbus : public QObject DaemonDbus() {} + // 生成静态实例 + static DaemonDbus *getInstance(); + public slots: int daemonIsNotRunning(); @@ -55,11 +58,9 @@ public slots: /* // 使用方法 -DaemonIpcDbus *mDaemonIpcDbus; -mDaemonIpcDbus = new DaemonIpcDbus(); -if (!mDaemonIpcDbus->daemonIsNotRunning()){ +if (!DaemonDbus::getInstance()->daemonIsNotRunning()){ //增加标题栏帮助菜单、F1快捷键打开用户手册 - mDaemonIpcDbus->showGuide("kylin-ipmsg"); + DaemonDbus::getInstance()->showGuide("kylin-ipmsg"); } */ diff --git a/src/view/kyview.cpp b/src/view/kyview.cpp index 27117f7..727063b 100644 --- a/src/view/kyview.cpp +++ b/src/view/kyview.cpp @@ -20,7 +20,6 @@ // 生成静态实例 KyView *KyView::getInstance() { - static KyView *instance = nullptr; if (nullptr == instance) { instance = new KyView(); @@ -30,6 +29,11 @@ KyView *KyView::getInstance() KyView::KyView(QWidget *parent) { + // 初始化组件 + setWidgetUi(); + + // 设置组件样式 + setWidgetStyle(); } KyView::~KyView() @@ -42,4 +46,26 @@ void KyView::pullUpWindow() this->showNormal(); this->raise(); this->activateWindow(); +} + +// 初始化组件 +void KyView::setWidgetUi() +{ + this->setFixedSize(WINDOWW, WINDOWH); + + // mainWid = new QWidget(this); + + mainLayout = new QVBoxLayout(this); + +} + +// 设置组件样式 +void KyView::setWidgetStyle() +{ + this->setAutoFillBackground(true); + this->setBackgroundRole(QPalette::Base); + + // 毛玻璃效果 + this->setProperty("useSystemStyleBur", true); + this->setAttribute(Qt::WA_TranslucentBackground, true); } \ No newline at end of file diff --git a/src/view/kyview.h b/src/view/kyview.h index 4498825..ac80de4 100644 --- a/src/view/kyview.h +++ b/src/view/kyview.h @@ -18,8 +18,15 @@ #ifndef KYVIEW_H #define KYVIEW_H +#define WINDOWW 350 //窗口宽度 +#define WINDOWH 686 //窗口高度 +#define TITLEH 40 //标题栏高度 +#define LOCALINFOH 140 //本机信息高度 +#define FRIENDSLISTH 506 //好友列表高度 + #include #include +#include class KyView : public QWidget { @@ -33,15 +40,20 @@ class KyView : public QWidget static KyView *getInstance(); // 初始化组件 - // void setWidgetUi(); + void setWidgetUi(); // 设置组件样式 - // void setWidgetStyle(); + void setWidgetStyle(); // 最小化状态下拉起主界面 void pullUpWindow(); + private: - /* data */ + // 整体界面窗体 + QWidget *mainWid; + + // 整体界面布局 + QVBoxLayout *mainLayout; }; From 61ee7adfa997441c0b5e0d934082aca703669f54 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Thu, 22 Apr 2021 16:17:55 +0800 Subject: [PATCH 20/31] Update: create databse --- data/database/kylin-messages.db | Bin 0 -> 36864 bytes src/view/kyview.cpp | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 data/database/kylin-messages.db diff --git a/data/database/kylin-messages.db b/data/database/kylin-messages.db new file mode 100644 index 0000000000000000000000000000000000000000..dd30c22d9083e16797ae1efd474494ac2bc24e4d GIT binary patch literal 36864 zcmeI&K~EDw6u|MVNU>FliHDv@HsxT6L=eJRE3VpD5Nc~eVpzv^(T(l4?#>$ZVj81g z!%yTvFNSYnyqI`$rZCXbH4smh{F^MhJMYcx?C(tvlk#Y*;!Dro?SyS1?G@{?l}cH+ zY}>M|33X%+j+8q8Qpb69n2&Bd=`&$nzqvO({mq)nw$r)q7k}nH=bmTVxrOQ9m%g0T znK%LnAb`x)je^UgL$3ZaaEz&Xa3Zr&M$7 zTIqJhu?wcTU>CEQg35FKW+7AFs5$qXs=e{BW^dFh6}!Gs-l{tbDrGnHy`Y(xrNe&Y zMk+o!gbwQArQh}nnLBCG>_s?F#u~cmy5N^Kv68WE>s#)$Ot)Mazx+cSl3^n?n&qyIwdF*{qh=OVw@rfwNsS zVhaN<^V#_iPkK93`MJ5&r}zCL7_?xwGjMrsxD*4C{c4zo1kKTc#IY{iYZ0o7hQ-xm zXlAJHQOZhkO1Bd#{Y2XR%C|-1?}NmV0t>P&^fr=S`zU{TKfl`& zQty~X0^+rhB6Q=hbre#stDg~i4YhXkYCl+JO(8wK;B+t!LQgdN!5~({npeEz+%45B zHG4@V4VBiIH4BH;?IWxD=60;&X}9o2^VhDW zw)-pm;N2qcRqO=~@7V46p_P6tSk%j6LG_&1q%(o~^Yt{iW0NzjXL@;TrprVTKmY** z5I_I{1Q0*~0R#|0;2#9Cx)1yRe~_aK0tg_000IagfB*srAbsetBackgroundRole(QPalette::Base); // 毛玻璃效果 - this->setProperty("useSystemStyleBur", true); - this->setAttribute(Qt::WA_TranslucentBackground, true); + // this->setProperty("useSystemStyleBur", true); + // this->setAttribute(Qt::WA_TranslucentBackground, true); } \ No newline at end of file From 86315fce08d4d64aa3b12bf4a81b49a58949b541 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Fri, 23 Apr 2021 16:38:49 +0800 Subject: [PATCH 21/31] Update: titlebar & localinfo --- debian/control | 3 +- src/view/common/globaldata.cpp | 37 ++++++++++++++ src/view/common/globaldata.h | 49 ++++++++++++++++++ src/view/kyview.cpp | 13 ++++- src/view/kyview.h | 18 +++++-- src/view/localinfo/localinfo.cpp | 88 ++++++++++++++++++++++++++++++++ src/view/localinfo/localinfo.h | 62 ++++++++++++++++++++++ src/view/titlebar/titlebar.cpp | 30 +++++++++++ src/view/titlebar/titlebar.h | 31 +++++++++++ 9 files changed, 324 insertions(+), 7 deletions(-) create mode 100644 src/view/common/globaldata.cpp create mode 100644 src/view/common/globaldata.h create mode 100644 src/view/localinfo/localinfo.cpp create mode 100644 src/view/localinfo/localinfo.h diff --git a/debian/control b/debian/control index 07d60a5..aed6f19 100644 --- a/debian/control +++ b/debian/control @@ -14,7 +14,8 @@ Build-Depends: debhelper, qtbase5-dev-tools, pkgconf, libgsettings-qt-dev, - libukui-log4qt-dev + libukui-log4qt-dev, + libkf5windowsystem-dev Standards-Version: 4.4.0 Homepage: https://github.com/ubuntukylin/kylin-ipmsg Vcs-Browser: https://github.com/ubuntukylin/kylin-ipmsg diff --git a/src/view/common/globaldata.cpp b/src/view/common/globaldata.cpp new file mode 100644 index 0000000..e9695b5 --- /dev/null +++ b/src/view/common/globaldata.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "globaldata.h" + +// 主界面 +const int GlobalData::WINDOW_WIDTH = 350; +const int GlobalData::WINDOW_HEIGHT = 686; + +// 标题栏 +const int GlobalData::TITLEBAR_HEIGHT = 40; + +// 本机信息 +const int GlobalData::LOCALINFO_HEIGHT = 140; +const QSize AVATAR_LAB_SIZE = QSize(60, 60); +const QSize USER_NAME_LAB_SIZE = QSize(90, 20); +const QSize USER_IP_LAB_SIZE = QSize(170, 20); +const QSize CHANGE_NAME_BTN_SIZE = QSize(16, 16); +const QSize OPEN_FOLDER_BTN_SIZE = QSize(16, 16); +const QSize SEARCH_EDIT_SIZE = QSize(334, 36); + +// 好友列表 +const int GlobalData::FRIEND_LIST_HEIGHT = 506; \ No newline at end of file diff --git a/src/view/common/globaldata.h b/src/view/common/globaldata.h new file mode 100644 index 0000000..ea4ffa2 --- /dev/null +++ b/src/view/common/globaldata.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef GLOBALDATA_H +#define GLOBALDATA_H + +#include +#include +#include + +class GlobalData +{ +public: + // 主界面 + static const int WINDOW_WIDTH; //主界面宽度 + static const int WINDOW_HEIGHT; //主界面高度 + + // 标题栏 + static const int TITLEBAR_HEIGHT; //标题栏高度 + + // 本机信息 + static const int LOCALINFO_HEIGHT; //本机信息高度 + static const QSize AVATAR_LAB_SIZE; // 本机头像尺寸 + static const QSize USER_NAME_LAB_SIZE; // 本机昵称尺寸 + static const QSize USER_IP_LAB_SIZE; // 本机IP尺寸 + static const QSize CHANGE_NAME_BTN_SIZE;// 修改本机昵称按钮 + static const QSize OPEN_FOLDER_BTN_SIZE;// 打开文件保存目录按钮 + static const QSize SEARCH_EDIT_SIZE;// 打开文件保存目录按钮 + + // 好友列表 + static const int FRIEND_LIST_HEIGHT;//好友列表高度 + +}; + +#endif // GLOBALDATA_H \ No newline at end of file diff --git a/src/view/kyview.cpp b/src/view/kyview.cpp index eaa3904..0d7fe3f 100644 --- a/src/view/kyview.cpp +++ b/src/view/kyview.cpp @@ -28,6 +28,7 @@ KyView *KyView::getInstance() } KyView::KyView(QWidget *parent) + : QWidget(parent) { // 初始化组件 setWidgetUi(); @@ -55,7 +56,17 @@ void KyView::setWidgetUi() // mainWid = new QWidget(this); - mainLayout = new QVBoxLayout(this); + m_mainLayout = new QVBoxLayout(this); + + // 标题栏 + m_titleBar = new TitleBar(this); + m_titleBar->setFixedHeight(GlobalData::TITLEBAR_HEIGHT); + + // 本机信息 + m_localInfo = new LocalInfo(this); + + // 将组件添加到布局中 + m_mainLayout->addWidget(m_titleBar, Qt::AlignTop); } diff --git a/src/view/kyview.h b/src/view/kyview.h index ac80de4..0215568 100644 --- a/src/view/kyview.h +++ b/src/view/kyview.h @@ -24,16 +24,18 @@ #define LOCALINFOH 140 //本机信息高度 #define FRIENDSLISTH 506 //好友列表高度 -#include #include #include +#include "titlebar/titlebar.h" +#include "localinfo/localinfo.h" + class KyView : public QWidget { Q_OBJECT public: - explicit KyView(QWidget *parent = 0); + explicit KyView(QWidget *parent = nullptr); ~KyView(); // 生成静态实例 @@ -43,17 +45,23 @@ class KyView : public QWidget void setWidgetUi(); // 设置组件样式 - void setWidgetStyle(); + void setWidgetStyle(); // 最小化状态下拉起主界面 void pullUpWindow(); private: // 整体界面窗体 - QWidget *mainWid; + QWidget *m_mainWid; + + // 标题栏 + TitleBar *m_titleBar; + + // 本机信息 + LocalInfo *m_localInfo; // 整体界面布局 - QVBoxLayout *mainLayout; + QVBoxLayout *m_mainLayout; }; diff --git a/src/view/localinfo/localinfo.cpp b/src/view/localinfo/localinfo.cpp new file mode 100644 index 0000000..e7acf5a --- /dev/null +++ b/src/view/localinfo/localinfo.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "localinfo.h" + +LocalInfo::LocalInfo(QWidget *parent) + : QWidget(parent) +{ + // 初始化组件 + setWidgetUi(); + + // 设置组件样式 + setWidgetStyle(); +} + +LocalInfo::~LocalInfo() +{ +} + +// 初始化组件 +void LocalInfo::setWidgetUi() +{ + this->setFixedHeight(GlobalData::LOCALINFO_HEIGHT); + + // 初始化组件及布局 + m_avatarLab = new QLabel(this); + m_userIPLab = new QLabel(this); + m_userNameLab = new QLabel(this); + + m_changeNameBtn = new QPushButton(this); + m_openFolderBtn = new QPushButton(this); + + m_searchEdit = new QLineEdit(this); + + m_localInfoLayout = new QHBoxLayout(this); + m_nameLayout = new QHBoxLayout(); + m_ipLayout = new QVBoxLayout(); + m_avatarLayout = new QHBoxLayout(); + + // 对组件进行布局 + m_nameLayout->addWidget(m_userNameLab, Qt::AlignBottom); + m_nameLayout->addWidget(m_changeNameBtn, 1, Qt::AlignBottom); + m_nameLayout->addWidget(m_openFolderBtn, Qt::AlignBottom); + m_nameLayout->setMargin(0); + m_nameLayout->setSpacing(0); + + m_ipLayout->addLayout(m_nameLayout); + m_ipLayout->addWidget(m_userIPLab, Qt::AlignTop); + m_ipLayout->setMargin(0); + m_ipLayout->setSpacing(0); + + m_avatarLayout->addWidget(m_avatarLab); + m_avatarLayout->addLayout(m_ipLayout); + m_avatarLayout->setMargin(0); + m_avatarLayout->setSpacing(0); + + m_localInfoLayout->addLayout(m_avatarLayout); + m_localInfoLayout->addWidget(m_searchEdit); +} + +// 设置组件样式 +void LocalInfo::setWidgetStyle() +{ + this->setAutoFillBackground(true); + this->setBackgroundRole(QPalette::Base); + + // 本机头像 + m_avatarLab->setFixedSize(GlobalData::AVATAR_LAB_SIZE); + + QPalette avatarLabPe; + avatarLabPe.setColor(QPalette::Background, QColor("#3D6BE5")); + avatarLabPe.setColor(QPalette::WindowText, QColor("#FFFFFF")); + m_avatarLab->setPalette(avatarLabPe); +} \ No newline at end of file diff --git a/src/view/localinfo/localinfo.h b/src/view/localinfo/localinfo.h new file mode 100644 index 0000000..e391b96 --- /dev/null +++ b/src/view/localinfo/localinfo.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef LOCALINFO_H +#define LOCALINFO_H + +#include +#include +#include +#include +#include +#include + +#include "../common/globaldata.h" + +class LocalInfo : QWidget +{ + Q_OBJECT +public: + explicit LocalInfo(QWidget *parent = nullptr); + ~LocalInfo(); + + // 初始化组件 + void setWidgetUi(); + + // 设置组件样式 + void setWidgetStyle(); + + QLabel *m_avatarLab; // 头像 + QLabel *m_userIPLab; // IP地址 + QLabel *m_userNameLab; // 用户名 + + QPushButton *m_changeNameBtn; // 修改本机昵称 + QPushButton *m_openFolderBtn; // 打开文件保存目录 + + QLineEdit *m_searchEdit; // 搜索框 + +private: + QVBoxLayout *m_localInfoLayout; // 本机信息总体布局 + QHBoxLayout *m_nameLayout; // 本机昵称布局 + QVBoxLayout *m_ipLayout; // 本机IP布局 + QHBoxLayout *m_avatarLayout; // 本机头像布局 +}; + + + + +#endif // LOCALINFO_H \ No newline at end of file diff --git a/src/view/titlebar/titlebar.cpp b/src/view/titlebar/titlebar.cpp index 94910bb..256f4c6 100644 --- a/src/view/titlebar/titlebar.cpp +++ b/src/view/titlebar/titlebar.cpp @@ -15,3 +15,33 @@ * along with this program. If not, see . */ +#include "titlebar.h" + +TitleBar::TitleBar(QWidget *parent) + : QWidget(parent) +{ + // 初始化组件 + setWidgetUi(); + + // 设置组件样式 + setWidgetStyle(); +} + +TitleBar::~TitleBar() +{ +} + +// 初始化组件 +void TitleBar::setWidgetUi() +{ + this->setFixedHeight(GlobalData::TITLEBAR_HEIGHT); + + m_titleLayout = new QHBoxLayout(this); +} + +// 设置组件样式 +void TitleBar::setWidgetStyle() +{ + this->setAutoFillBackground(true); + this->setBackgroundRole(QPalette::Base); +} \ No newline at end of file diff --git a/src/view/titlebar/titlebar.h b/src/view/titlebar/titlebar.h index a9c3b6e..78f8aae 100644 --- a/src/view/titlebar/titlebar.h +++ b/src/view/titlebar/titlebar.h @@ -18,6 +18,37 @@ #ifndef TITLEBAR_H #define TITLEBAR_H +#include +#include +#include +#include + +#include "menumodule.h" +#include "../common/globaldata.h" + +class TitleBar : public QWidget +{ + Q_OBJECT +public: + explicit TitleBar(QWidget *parent = nullptr); + ~TitleBar(); + + // 初始化组件 + void setWidgetUi(); + + // 设置组件样式 + void setWidgetStyle(); + +private: + // 整体界面布局 + QHBoxLayout *m_titleLayout; + + QLabel *m_iconLab; + QLabel *m_nameLab; + + QPushButton *m_miniBtn;//最小化按钮 + QPushButton *m_closeBtn;//关闭 +}; #endif // TITLEBAR_H \ No newline at end of file From 3d688cb45e20ab7a9890b60a2b2fbc7f054b7d71 Mon Sep 17 00:00:00 2001 From: jishengjie <348240162@qq.com> Date: Mon, 26 Apr 2021 10:20:43 +0800 Subject: [PATCH 22/31] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global/declare/declare.h | 58 +++++ src/global/utils/global_data.cpp | 71 ++++++ src/global/utils/global_data.h | 36 +++ src/global/utils/tcp_link.cpp | 239 ++++++++++++++++++++ src/global/utils/tcp_link.h | 27 +++ src/network/protocol_analysis.cpp | 131 +++++++++++ src/network/protocol_analysis.h | 30 +++ src/network/{network.cpp => tcp_client.cpp} | 0 src/network/{network.h => tcp_client.h} | 0 src/network/tcp_module.cpp | 146 ++++++++++++ src/network/tcp_module.h | 45 ++++ src/network/tcp_server.cpp | 102 +++++++++ src/network/tcp_server.h | 34 +++ src/network/udp_socket.cpp | 138 +++++++++++ src/network/udp_socket.h | 27 +++ src/src.pro | 19 +- 16 files changed, 1101 insertions(+), 2 deletions(-) create mode 100644 src/global/declare/declare.h create mode 100644 src/global/utils/global_data.cpp create mode 100644 src/global/utils/global_data.h create mode 100644 src/global/utils/tcp_link.cpp create mode 100644 src/global/utils/tcp_link.h create mode 100644 src/network/protocol_analysis.cpp create mode 100644 src/network/protocol_analysis.h rename src/network/{network.cpp => tcp_client.cpp} (100%) rename src/network/{network.h => tcp_client.h} (100%) create mode 100644 src/network/tcp_module.cpp create mode 100644 src/network/tcp_module.h create mode 100644 src/network/tcp_server.cpp create mode 100644 src/network/tcp_server.h create mode 100644 src/network/udp_socket.cpp create mode 100644 src/network/udp_socket.h diff --git a/src/global/declare/declare.h b/src/global/declare/declare.h new file mode 100644 index 0000000..45316b4 --- /dev/null +++ b/src/global/declare/declare.h @@ -0,0 +1,58 @@ +#ifndef __DECLARE_H__ +#define __DECLARE_H__ + +#include + +class TcpModule; + +/* 代表tcp链接表的一条数据 */ +typedef struct TcpMaintain +{ + QString uuid; + QString selfIp; + QString selfPort; + QString peerIp; + QString peerPort; + QString peerListenIp; + QString peerListenPort; + TcpModule *module; +} g_tcpMaintain; + +/* tcp维护tcp链接表 */ +typedef struct TcpItem +{ + QString uuid; + QString selfIp; + QString selfPort; + QString peerIp; + QString peerPort; + TcpModule *module; +} g_tcpItem; + +/* udp维护tcp链接表 */ +typedef struct UdpItem +{ + QString uuid; + QString peerListenIp; + QString peerListenPort; +} g_udpItem; + +/* 发送数据结构 */ +typedef struct Send +{ + QString uuid; + QString type; + QString msgData; + QString fileName; + QString filePath; +} g_send; + +/* 接受数据结构 */ +typedef struct Recv +{ + QString uuid; + QString type; + QString msgData; + QString fileName; + QString filePath; +} g_recv; diff --git a/src/global/utils/global_data.cpp b/src/global/utils/global_data.cpp new file mode 100644 index 0000000..6732d92 --- /dev/null +++ b/src/global/utils/global_data.cpp @@ -0,0 +1,71 @@ +#include "global_data.h" + +#include +#include +#include +#include + +#define TCP_LISTEN_PORT "6066" +#define UDP_LISTEN_PORT "6067" + +GlobalData::GlobalData() +{ + init(); +} + +GlobalData::~GlobalData() +{ + +} + +GlobalData *GlobalData::getInstance(void) +{ + static GlobalData *s_globalData; + if (s_globalData == NULL) { + s_globalData = new GlobalData; + } + + return s_globalData; +} + +void GlobalData::init(void) +{ + getTcpListenIp(); + getTcpListenPort(); + getUuid(); + + return; +} + +/* 取第一个ipv4地址 , 进行监听 */ +void GlobalData::getTcpListenIp(void) +{ + QList ipList = QNetworkInterface::allAddresses(); + + for (int i = 0 ; i < ipList.count() ; i++) { + if (ipList.at(i) != QHostAddress::LocalHost && ipList.at(i).toIPv4Address()) { + this->m_tcpListenIP = ipList.at(i).toString(); + break; + } + } + return; +} + +void GlobalData::getTcpListenPort(void) +{ + this->m_tcpListenPort = QString(TCP_LISTEN_PORT); + return; +} + +void GlobalData::getUdpListenPort(void) +{ + this->m_udpListenPort = QString(UDP_LISTEN_PORT); + return; +} + +void GlobalData::getUuid(void) +{ + this->m_uuid = QString("0x666666"); + + return; +} diff --git a/src/global/utils/global_data.h b/src/global/utils/global_data.h new file mode 100644 index 0000000..199b9f6 --- /dev/null +++ b/src/global/utils/global_data.h @@ -0,0 +1,36 @@ +#ifndef __GLOBAL_DATA_H__ +#define __GLOBAL_DATA_H__ + +#include + +#include "tcp_link.h" + +class GlobalData +{ +public: + ~GlobalData(); + + /* 本机信息 */ + QString m_uuid; + QString m_tcpListenIP; + QString m_tcpListenPort; + QString m_udpListenPort; + + /* tcp链接表 */ + TcpLink m_tcpLink; + +private: + GlobalData(); +public: + static GlobalData *getInstance(); + +private: + void init(void); + void getTcpListenIp(void); + void getTcpListenPort(void); + void getUdpListenPort(void); + void getUuid(void); +}; + +#endif + diff --git a/src/global/utils/tcp_link.cpp b/src/global/utils/tcp_link.cpp new file mode 100644 index 0000000..46b87c6 --- /dev/null +++ b/src/global/utils/tcp_link.cpp @@ -0,0 +1,239 @@ +#include "tcp_link.h" + +TcpLink::TcpLink() +{ + if (init()) { + qDebug() << "Error : TcpLink , init fail\n"; + } +} + +TcpLink::~TcpLink() +{ + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + + if (tmp->module != NULL) { + delete tmp->module; + } + + delete tmp; + } +} + +int TcpLink::init() +{ + /* 初始化读写锁 */ + if (pthread_rwlock_init(&(this->m_rwLock) , NULL)) { + qDebug() << "Error : TcpLink , init , init rwLock fail"; + return -1; + } + + return 0; +} + +int TcpLink::tcpMaintainAdd(g_tcpItem item) +{ + int flag = -1; + + if (pthread_rwlock_wrlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , tcpMaintainAdd , lock rwLock fail"; + return -1; + } + + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + + if (tmp->uuid == item.uuid) { + tmp->selfIp = item.selfIp; + tmp->selfPort = item.selfPort; + tmp->peerIp = item.peerIp; + tmp->peerPort = item.peerPort; + tmp->module = item.module; + + flag = 0; + break; + } + } + + if (pthread_rwlock_unlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , tcpMaintainAdd , unlock rwLock fail"; + return -1; + } + + if (flag) { + qDebug() << "Waring : TcpLink , tcpMaintainAdd , uuid dont find!!!"; + } + + return 0; +} + + +/* 此函数并没有释放tcp module实例 , 释放的话函数返回会造成崩溃 , 不释放会造成内存泄露 , 有待优化 */ +int TcpLink::tcpMaintainDelete(QString uuid) +{ + int flag = -1; + + if (pthread_rwlock_wrlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , tcpMaintainDelete , lock rwLock fail"; + return -1; + } + + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + + if (tmp->uuid == uuid) { + tmp->selfIp.clear(); + tmp->selfPort.clear(); + tmp->peerIp.clear(); + tmp->peerPort.clear(); + tmp->module = NULL; + + flag = 0; + + break; + } + } + + if (pthread_rwlock_unlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , tcpMaintainDelete , unlock rwLock fail"; + return -1; + } + + if (flag) { + qDebug() << "Waring : TcpLink , tcpMaintainDelete , uuid dont find!!!"; + } + + return 0; +} + +int TcpLink::udpMaintainAdd(g_udpItem item) +{ + /* 变量没被改变 -> 不存在 , 新添 */ + /* 变量被置0 -> 存在 , 覆盖 */ + int flag = -1; + + if (pthread_rwlock_wrlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , udpMaintainAdd , lock rwLock fail"; + return -1; + } + + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + + if (tmp->uuid == item.uuid) { + tmp->uuid = item.uuid; + tmp->peerListenIp = item.peerListenIp; + tmp->peerListenPort = item.peerListenPort; + + flag = 0; + goto FLAG; + } + } + + /* 不存在相同uuid , 新增一条 */ + g_tcpMaintain *newItem = new g_tcpMaintain; + newItem->module = NULL; + + newItem->uuid = item.uuid; + newItem->peerListenIp = item.peerListenIp; + newItem->peerListenPort = item.peerListenPort; + + this->m_tcpMaintain.push_back(newItem); + +FLAG: + if (pthread_rwlock_unlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , udpMaintainAdd , unlock rwLock fail"; + return -1; + } + + if (flag == -1) { + return 1; + } else { + return 0; + } +} + +int TcpLink::udpMaintainDelete(QString uuid) +{ + int flag = -1; + + if (pthread_rwlock_wrlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , udpMaintainDelete , lock rwLock fail"; + return -1; + } + + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + if (tmp->uuid == uuid) { + if (tmp->module != NULL) { + /* 释放tcp module */ + delete tmp->module; + } + + /* 释放该条记录 */ + delete tmp; + + /* 从list中移除记录 */ + this->m_tcpMaintain.removeAt(i); + flag = 0; + + break; + } + } + + if (pthread_rwlock_unlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , udpMaintainDelete , unlock rwLock fail"; + return -1; + } + + if (flag) { + qDebug() << "Waring : TcpLink , udpMaintainDelete , uuid dont find!!!"; + } + + return 0; +} + +void TcpLink::ergodic() +{ + if (pthread_rwlock_rdlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , ergodic , lock rwLock fail"; + return; + } + + qDebug() << "Info : tcpMaintain ergodic ......"; + qDebug() << "uuid selfIp selfPort peerIp peerPort peerListenIp peerListenPort module"; + + for (int i = 0 ; i < this->m_tcpMaintain ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + + std::string stdUuid = tmp->uuid.toStdString(); + const char *uuid = stdUuid.c_str(); + + std::string stdSelfIp = tmp->selfIp.toStdString(); + const char *selfIp = stdSelfIp.c_str(); + + std::string stdSelfPort = tmp->selfPort.toStdString(); + const char *selfPort = stdSelfPort.c_str(); + + std::string stdPeerIP = tmp->peerIp.toStdString(); + const char *peerIp = stdPeerIP.c_str(); + + std::string stdPeerPort = tmp->peerPort.toStdString(); + const char *peerPort = stdPeerPort.c_str(); + + std::string stdPeerListenIp = tmp->peerListenIp.toStdString(); + const char *peerListenIp = stdPeerListenIp.c_str(); + + std::string stdPeerListenPort = tmp->peerListenPort.toStdString(); + const char *peerListenPort = stdPeerListenPort.c_str(); + + printf("[%s] [%s] [%s] [%s] [%s] [%s] [%s] [%x]\n" , uuid , selfIp , selfPort , peerIp , peerPort , peerListenIp , peerListenPort , tmp->module); + } + + if (pthread_rwlock_unlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , ergodic , unlock rwLock fail"; + return ; + } + + return ; +} diff --git a/src/global/utils/tcp_link.h b/src/global/utils/tcp_link.h new file mode 100644 index 0000000..29be993 --- /dev/null +++ b/src/global/utils/tcp_link.h @@ -0,0 +1,27 @@ +#ifndef __TCP_LINK_H__ +#define __TCP_LINK_H__ + +#include +#include + +#include "global/declare/declare.h" + +class TcpLink +{ +public: + TcpLink(); + ~TcpLink(); + + int init(); + void ergodic(void); + int tcpMaintainAdd(g_tcpItem); + int tcpMaintainDelete(QString uuid); + int udpMaintainAdd(g_udpItem); + int udpMaintainDelete(QString uuid); + +private: + pthread_rwlock_t m_rwLock; + QList m_tcpMaintain; +}; + +#endif diff --git a/src/network/protocol_analysis.cpp b/src/network/protocol_analysis.cpp new file mode 100644 index 0000000..2c4c86a --- /dev/null +++ b/src/network/protocol_analysis.cpp @@ -0,0 +1,131 @@ +#include "protocol_analysis.h" + +ProtocolAnalysis::ProtocolAnalysis() +{ + +} + +ProtocolAnalysis::~ProtocolAnalysis() +{ + +} + +QMap ProtocolAnalysis::analysisHeadBody(QString str) +{ + QMap dst; + QString key; + QString value; + dst.clear(); + key.clear(); + value.clear(); + + char *first = NULL; + char *separator = NULL; + char *end = NULL; + char *data = NULL; + char *tmp = NULL; + + if (str.isEmpty()) { + qDebug() << "Waring : ProtocolAnalysis , analysisHeadBody , orignal str is empty!!!"; + return dst; + } + + QByteArray originalStrTmp = str.toLatin1(); + char *originalStr = originalStrTmp.data(); + + /* 获取指向数据第一个字符的指针 */ + data = strstr(originalStr , "\r\n\r\n"); + if (data == NULL) { + qDebug() << "Error : ProtocolAnalysis , analysisHeadBody , package head error"; + return dst; + } + data = data + 4; + + /* 解析包头key */ + first = originalStr; + + while (first + 2 != data) { + separator = strchr(first , ':'); + end = strstr(first , "\r\n"); + + int size = separator - first + 1; + tmp = (char *)malloc(size); + memset(tmp , 0x00 , size); + + strncpy(tmp , first , separator - first); + + /* 保存key */ + key = QString(tmp); + + /* 解析value */ + size = end - separator; + tmp = (char *)realloc(tmp , size); + memset(tmp , 0x00 , tmp); + + strncpy(tmp , separator + 1 , end - separator - 1); + + /* 保存value */ + value = QString(tmp); + + /* 保存key , value */ + dst.insert(key , value); + + /* 释放堆内存 */ + free(tmp); + tmp = NULL; + + /* 重置first指针 */ + first = end + 2; + } + + /* 解析包体 */ + key = QString("body"); + value = QString(data); + + dst.insert(key , value); + + return dst; +} + +QString ProtocolAnalysis::encapsulationHeadBody(QMap map) +{ + + QString dst; + QString data; + + dst.clear(); + data.clear(); + + if (map.isEmpty()) { + qDebug() << "Waring : ProtocolAnalysis , encapsulationHeadBody , map is empty!!!"; + return dst; + } + + + data = map.value("body" , ""); + + /* 遍历map , 拼接包头 */ + QMap::iterator begin = map.begin(); + QMap::iterator end = map.end(); + + while (begin != end) { + QString key = begin.key(); + QString value = begin.value(); + + if (key != "body") { + dst.append(key); + dst.append(":"); + dst.append(value); + dst.append("\r\n"); + } + begin++; + } + + dst.append("\r\n"); + + if (!data.isEmpty()) { + dst.append(data); + } + + return dst; +} diff --git a/src/network/protocol_analysis.h b/src/network/protocol_analysis.h new file mode 100644 index 0000000..ba09a5a --- /dev/null +++ b/src/network/protocol_analysis.h @@ -0,0 +1,30 @@ +#ifndef __PROTOCOL_ANALYSIS_H__ +#define __PROTOCOL_ANALYSIS_H__ + +#include +#include + +class ProtocolAnalysis +{ +public: + ProtocolAnalysis(); + ~ProtocolAnalysis(); + + QMap analysisHeadBody(QString str); + QString encapsulationHeadBody(QMap map); + +private: +}; + +#endif + +/* + * 包头 + 包体 协议 + * uuid:xxx\r\n + * type:msg/file\r\n + * file_name:xx\r\n + * file_stat:info/data/end\r\n + * \r\n + * body + */ + diff --git a/src/network/network.cpp b/src/network/tcp_client.cpp similarity index 100% rename from src/network/network.cpp rename to src/network/tcp_client.cpp diff --git a/src/network/network.h b/src/network/tcp_client.h similarity index 100% rename from src/network/network.h rename to src/network/tcp_client.h diff --git a/src/network/tcp_module.cpp b/src/network/tcp_module.cpp new file mode 100644 index 0000000..3e2a3cb --- /dev/null +++ b/src/network/tcp_module.cpp @@ -0,0 +1,146 @@ +#include "global/utils/global_data.h" +#include "tcp_module.h" + +#include +#include + +/* 用于tcp server */ +TcpModule::TcpModule(QTcpSocket *socket) +{ + if (socket == NULL) { + qDebug() << "Error : TcpModule , call server , socket point is NULL"; + } + + this->m_flag = false; + this->m_uuid = ""; + this->m_socket = socket; +} + +/* 重载构造 , 用于tcp client */ +TcpModule::TcpModule(QTcpSocket *socket , g_send send) +{ + if (socket == NULL) { + qDebug() << "Error : TcpModule , call client , socket point is NULL"; + } + + this->m_flag = true; + this->m_uuid = send.uuid; + this->m_socket = socket; +} + +TcpModule::~TcpModule() +{ + if (this->m_socket != NULL) { + delete m_socket; + } +} + +void TcpModule::establishInterrupt(void) +{ + connect(this->m_socket , &QTcpSocket::readyRead , this , &TcpModule::slotReadSocket); + connect(this->m_socket , &QTcpSocket::disconnected , this , &TcpModule::slotSocketDisconnect); + + return; +} + +void TcpModule::tranMsg(g_send send) +{ + /* 协议封装 */ + QMap map; + map.clear(); + map.insert(QString("uuid") , this->m_uuid); + map.insert(QString("type") , QString("msg")); + map.insert(QString("body") , send.msgData); + + QString encapsulationtData = moduleProtocolAnalysis.encapsulationHeadBody(map); + + /* 发送 */ + this->m_socket->write(encapsulationtData.toStdString().c_str()); + this->m_socket->flush(); + + qDebug() << "Info : TcpModule , tranMsg , success ---> " << send.msgData; + + /* 发送消息发送成功信号 */ + emit sigSendMsgSuccess(send); + + return; +} + +int TcpModule::tranFile(g_send send) +{ + +} + +void TcpModule::slotReadSocket(void) +{ + qDebug() << "Info : TcpModule , slotReadSocket , uuid ---> " << this->m_uuid; + + /* 接收数据包 */ + QByteArray recvData = this->m_socket->readAll(); + + /* 解析协议 */ + QMap map = moduleProtocolAnalysis.analysisHeadBody(QString(recvData)); + + /* 判断tcp module 是否可用 */ + if (m_flag == false) { + this->m_uuid = map.value(QString("uuid")); + if (this->m_uuid.isEmpty()) { + qDebug() << "Error : TcpModule , slotReadSocket , recvData uuid is empty , recv data discard"; + return; + } + + /* 维护tcp链接表 */ + g_tcpMaintain item; + item.uuid = this->m_uuid; + item.selfIp = GlobalData::getInstance()->m_tcpListenIP; + item.selfPort = GlobalData::getInstance()->m_tcpListenPort; + item.peerIp = this->m_socket->peerAddress().toString(); + item.peerPort = QString(this->m_socket->peerPort()); + item.module = this; + + /* 同步调用槽 , 接收返回值 */ + emit sigMaintainTcpLinkAdd(item); + + this->m_flag = true; + } + + /* 判断数据包是否对应 */ + if (map.value(QString("uuid")) != this->m_uuid) { + qDebug() << "Error : TcpModule , slotReadSocket , recv uuid differ save uuid , recv data discard"; + return; + } + + /* 判断数据包种类 */ + if (map.value(QString("type")) == QString("msg")) { + /* 接收信息 */ + g_recv recv; + recv.uuid = this->m_uuid; + recv.type = QString("msg"); + recv.msgData = map.value(QString("body")); + + /* ---临时打印--- */ + qDebug() << "Info : TcpModule , slotReadSocket , recv msg ---> " << recv.msgData; + + emit sigRecvMsgSuccess(recv); + + } else if (map.value(QString("type")) == QString("file")) { + /* 接收文件 */ + + } + + return; +} + +void TcpModule::slotSocketDisconnect(void) +{ + /* 释放socket */ + if (this->m_socket != NULL) { + delete this->m_socket; + this->m_socket = NULL; + } + + /* 维护tcp链接表 */ + emit sigMaintainTcpLinkDelete(this->m_uuid); + + return 0; +} diff --git a/src/network/tcp_module.h b/src/network/tcp_module.h new file mode 100644 index 0000000..c782dff --- /dev/null +++ b/src/network/tcp_module.h @@ -0,0 +1,45 @@ +#ifndef __TCP_MODULE_H__ +#define __TCP_MODULE_H__ + +#include "global/declare/declare.h" +#include "protocol_analysis.h" + +#include +#include + +class TcpModule : public QObject +{ + Q_OBJECT + +public: + TcpModule(QTcpSocket *socket); + TcpModule(QTcpSocket *socket , g_send send); + ~TcpModule(); + + int tranFile(g_send send); + void tranMsg(g_send send); + +public: + ProtocolAnalysis moduleProtocolAnalysis; + +private: + void establishInterrupt(void); + +private: + bool m_flag; + QString m_uuid; + QTcpSocket *m_socket; + +signals: + void sigMaintainTcpLinkAdd(g_tcpMaintain item); + void sigMaintainTcpLinkDelete(QString uuid); + void sigSendMsgSuccess(g_send send); + void sigRecvMsgSuccess(g_recv recv); + +private slots: + void slotReadSocket(void); + void slotSocketDisconnect(void); + +}; + +#endif diff --git a/src/network/tcp_server.cpp b/src/network/tcp_server.cpp new file mode 100644 index 0000000..a3fa579 --- /dev/null +++ b/src/network/tcp_server.cpp @@ -0,0 +1,102 @@ +#include "tcp_server.h" +#include "global/utils/global_data.h" +#include "tcp_module.h" + +#include +#include +#include + +TcpServer::TcpServer() +{ + qDebug() << "Info : TcpServer , tcp server start up ..."; + establishInterrupt(); + startListen(); +} + +TcpServer::~TcpServer() +{ + +} + +void TcpServer::establishInterrupt(void) +{ + connect(this , &TcpServer::newConnection , this , &TcpServer::slotEstablishNewLink); + + return; +} + +int TcpServer::startListen(void) +{ + /* 获取需要监听的ip和port */ + QString ip = GlobalData::getInstance()->m_tcpListenIP; + QString port = GlobalData::getInstance()->m_tcpListenPort; + + if (ip.isEmpty() || port.isEmpty()) { + qDebug() << "Error : TcpServer , startListen , ip or port is empty"; + return -1; + } + + if (this->listen(QHostAddress(ip) , port.toUShort()) == false) { + qDebug() << "Error : TcpServer , startListen , listen fail"; + return -1; + } + + qDebug() << "Info : TcpServer , startListen , listen success , ip --- > " << ip << "port ---> " << port; + + return 0; +} + +void TcpServer::slotEstablishNewLink(void) +{ + qDebug() << "Info : TcpServer , slotEstablishNewLink , new link coming in ..."; + + /* 获取新链接 */ + QTcpSocket socket = this->nextPendingConnection(); + + /* 加载功能模块 */ + TcpModule *tcpModule = new TcpModule(socket); + + connect(tcpModule , &TcpModule::sigMaintainTcpLinkAdd , this , &TcpServer::slotMaintainTcpLinkAdd); + connect(tcpModule , &TcpModule::sigMaintainTcpLinkDelete , this , &TcpServer::slotMaintainTcpLinkDelete); + connect(tcpModule , &TcpModule::sigRecvMsgSuccess , this , &TcpServer::slotRecvMsgSuccess); + connect(tcpModule , &TcpModule::sigSendMsgSuccess , this , &TcpServer::slotSendMsgSuccess); + + /* 移至线程 */ + QThread *thread = new QThread; + tcpModule->moveToThread(thread); + thread->start(); + + return; +} + +void TcpServer::slotMaintainTcpLinkAdd(g_tcpMaintain item) +{ + qDebug() << "Info : TcpServer , slotMaintainTcpLinkAdd , uuid ---> " << item.uuid; + + if (GlobalData::getInstance()->m_tcpLink.tcpMaintainAdd(item)) { + qDebug() << "Waring , TcpServer , slotMaintainTcpLinkadd , maintain tcp link fail"; + } +} + +void TcpServer::slotMaintainTcpLinkDelete(QString uuid) +{ + qDebug() << "Info : TcpServer , slotMaintainTcpLinkDelete , uuid ---> " << uuid; + + if (GlobalData::getInstance()->m_tcpLink.tcpMaintainDelete(uuid)) { + qDebug() << "Waring , TcpServer , slotMaintainTcpLinkDelete , maintain tcp link fail"; + } +} + +void TcpServer::slotRecvMsgSuccess(g_recv recv) +{ + qDebug() << "Info : TcpServer , slotRecvMsgSuccess , uuid ---> " << recv.uuid << "msgData ---> " << recv.msgData; + + emit sigTcpServerRecvMsgSuccess(recv); +} + +void TcpServer::slotSendMsgSuccess(g_send send) +{ + qDebug() << "Info : TcpServer , slotSendMsgSuccess , uuid ---> " << send.uuid << "msgData ---> " << send.msgData; + + emit sigTcpServerSendMsgSuccess(send); +} diff --git a/src/network/tcp_server.h b/src/network/tcp_server.h new file mode 100644 index 0000000..1892920 --- /dev/null +++ b/src/network/tcp_server.h @@ -0,0 +1,34 @@ +#ifndef __TCP_SERVER_H__ +#define __TCP_SERVER_H__ + +#include +#include + +#include "global/declare/declare.h" + +class TcpServer : public QTcpServer +{ + Q_OBJECT + +public: + TcpServer(); + ~TcpServer(); + +private: + void establishInterrupt(void); + int startListen(void); + +/* 对外模块信号 */ +signals: + void sigTcpServerRecvMsgSuccess(g_recv recv); + void sigTcpServerSendMsgSuccess(g_send send); + +private slots: + void slotEstablishNewLink(void); + void slotRecvMsgSuccess(g_recv recv); + void slotSendMsgSuccess(g_send send); + void slotMaintainTcpLinkAdd(g_tcpMaintain item); + void slotMaintainTcpLinkDelete(QString uuid); +}; + +#endif diff --git a/src/network/udp_socket.cpp b/src/network/udp_socket.cpp new file mode 100644 index 0000000..8469562 --- /dev/null +++ b/src/network/udp_socket.cpp @@ -0,0 +1,138 @@ +#include "udp_socket.h" +#include "global/utils/global_data.h" + +#include + +UdpSocket::UdpSocket() +{ + init(); + slotOnline(); +} + +UdpSocket::~UdpSocket() +{ + if (this->m_timer != NULL) { + delete this->m_timer; + } + + if (this->m_udpSocket != NULL) { + delete this->m_udpSocket; + } +} + +void UdpSocket::init(void) +{ + /* 实例udpsocket */ + this->m_udpSocket = new QUdpSocket; + + /* 获取udp监听端口 */ + QString port = GlobalData::getInstance()->m_udpListenPort; + + if (this->m_udpSocket->bind(QHostAddress::AnyIPv4 , port.toUShort() , QUdpSocket::ReuseAddressHint) == true) { + qDebug() << "Info : UdpSocket , listen success"; + } + + connect(this->m_udpSocket , &QUdpSocket::readyRead , this , &UdpSocket::slotSocketRead); + + /* 启动定时器 */ + this->m_timer = new QTimer; + connect(this->m_timer , &QTimer::timeout , this , &UdpSocket::slotSocketOnline); + this->m_timer->start(10000); + + return; +} + +void UdpSocket::slotSocketRead(void) +{ + while (this->m_udpSocket->hasPendingDatagrams()) { + QByteArray package; + package.resize(65536); + QHostAddress peerIp; + int size = this->m_udpSocket->readDatagram(package.data() , package.size() , &peerIp); + package.resize(size); + + /* udp包接收完毕 , 解析upd包 */ + QString data = QString::fromUtf8(package); + QStringList dataList = data.split(" "); + if (dataList.at(0) == "true") { + /* 上线广播 */ + QString uuid = dataList.at(1); + QString peerListenIp = dataList.at(2); + QString peerListenPort = dataList.at(3); + + /* 维护tcp链接表 */ + g_tcpMaintain tmp; + tmp.uuid = uuid; + tmp.peerListenIp = peerListenIp; + tmp.peerListenPort = peerListenPort; + + GlobalData::getInstance()->m_tcpLink.udpMaintainAdd(tmp); + + /* 测试输出 */ + qDebug() << "Info : UdpSocket , slotUdpSocketRead , recv udp data"; + qDebug() << "uuid = " << uuid << "peerListenIp = " << peerListenIp << "peerListenPort = " << peerListenPort; + GlobalData::getInstance()->m_tcpLink.ergodic(); + } else if (dataList.at(0) == "false") { + QString uuid = dataList.at(1); + + /* 维护tcp链接表 */ + GlobalData::getInstance()->m_tcpLink.udpMaintainDelete(uuid); + GlobalData::getInstance()->m_tcpLink.ergodic(); + + qDebug() << "Info : UdpSocket , slotUdpSocketRead , recv udp offline"; + } + } +} + +void UdpSocket::udpSocketBroadcast(bool flag) +{ + QByteArray package; + QString udpListenPort = GlobalData::getInstance()->m_udpListenPort; + + /* 组装数据包 */ + QStirng uuid = GlobalData::getInstance()->m_uuid; + QString tcpListenIp = GlobalData::getInstance()->m_tcpListenIP; + QString tcpListenPort = GlobalData::getInstance()->m_tcpListenPort; + + if (flag == true) { + package.append(QString("true")); + package.append(QString(" ")); + package.append(uuid); + package.append(QString(" ")); + package.append(tcpListenIp); + package.append(QString(" ")); + package.append(tcpListenPort); + } else { + package.append(QString("false")); + package.append(QString(" ")); + package.append(QString(uuid)); + } + + /* 广播发送 */ + QList interface = QNetworkInterface::allInterfaces(); + for (int i = 0 ; i < interface.count() ; i++) { + QList addrs = interface.at(i).addressEntries(); + + for (int j = 0 ; j < addrs.count() ; j++) { + if (addrs.at(j).ip().protocol() == QAbstractSocket::IPv4Protocol && (addrs.at(j).broadcast().toString() != "")) { + this->m_udpSocket->writeDatagram(package.data() , package.length() , addrs.at(j).broadcast() , udpListenPort.toUShort()); + } + } + } + + return; +} + +void UdpSocket::slotOnline(void) +{ + udpSocketBroadcast(true); + + return; +} + +void UdpSocket::slotOffline(void) +{ + udpSocketBroadcast(false); + + return; +} diff --git a/src/network/udp_socket.h b/src/network/udp_socket.h new file mode 100644 index 0000000..f49f64b --- /dev/null +++ b/src/network/udp_socket.h @@ -0,0 +1,27 @@ +#ifndef __UDP_SOCKET_H__ +#define __UDP_SOCKET_H__ + +#include +#include + +class UdpSocket : public QObject +{ +public: + UdpSocket(); + ~UdpSocket(); + +private: + QUdpSocket *m_udpSocket; + QTimer *m_timer; + +private: + void init(void); + void udpSocketBroadcast(bool flag); + +private slots: + void slotSocketRead(void); + void slottOnline(void); + void slotOffline(void); +}; + +#endif diff --git a/src/src.pro b/src/src.pro index 0b41c7b..01a93fd 100644 --- a/src/src.pro +++ b/src/src.pro @@ -42,12 +42,27 @@ SOURCES += \ $$PWD/view/common/xatom-helper.cpp \ $$PWD/view/common/daemondbus.cpp \ $$PWD/view/common/dbusadaptor.cpp \ - $$PWD + $$PWD \ + global/utils/global_data.cpp \ + global/utils/tcp_link.cpp \ + network/protocol_analysis.cpp \ + network/tcp_client.cpp \ + network/tcp_module.cpp \ + network/tcp_server.cpp \ + network/udp_socket.cpp HEADERS += \ $$PWD/view/kyview.h \ $$PWD/view/common/xatom-helper.h \ $$PWD/view/common/daemondbus.h \ - $$PWD/view/common/dbusadaptor.h \ + $$PWD/view/common/dbusadaptor.h \ \ + global/declare/declare.h \ + global/utils/global_data.h \ + global/utils/tcp_link.h \ + network/protocol_analysis.h \ + network/tcp_client.h \ + network/tcp_module.h \ + network/tcp_server.h \ + network/udp_socket.h RESOURCES += \ From b0857fa971ec26262d643dd01a93bcf0ddd59049 Mon Sep 17 00:00:00 2001 From: jishengjie <348240162@qq.com> Date: Tue, 27 Apr 2021 16:57:38 +0800 Subject: [PATCH 23/31] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global/declare/declare.h | 2 + src/global/utils/global_data.cpp | 2 +- src/global/utils/global_data.h | 4 +- src/global/utils/tcp_link.cpp | 43 ++++++++++++++++- src/global/utils/tcp_link.h | 1 + src/main.cpp | 34 ++++++++++++++ src/network/protocol_analysis.cpp | 6 ++- src/network/protocol_analysis.h | 2 +- src/network/tcp_client.cpp | 77 +++++++++++++++++++++++++++++++ src/network/tcp_client.h | 27 +++++++++++ src/network/tcp_module.cpp | 14 +++++- src/network/tcp_module.h | 2 +- src/network/tcp_server.cpp | 12 ++--- src/network/tcp_server.h | 2 +- src/network/udp_socket.cpp | 20 ++++++-- src/network/udp_socket.h | 2 +- src/src.pro | 2 + 17 files changed, 229 insertions(+), 23 deletions(-) diff --git a/src/global/declare/declare.h b/src/global/declare/declare.h index 45316b4..c241885 100644 --- a/src/global/declare/declare.h +++ b/src/global/declare/declare.h @@ -56,3 +56,5 @@ typedef struct Recv QString fileName; QString filePath; } g_recv; + +#endif diff --git a/src/global/utils/global_data.cpp b/src/global/utils/global_data.cpp index 6732d92..8bf43e0 100644 --- a/src/global/utils/global_data.cpp +++ b/src/global/utils/global_data.cpp @@ -65,7 +65,7 @@ void GlobalData::getUdpListenPort(void) void GlobalData::getUuid(void) { - this->m_uuid = QString("0x666666"); + this->m_uuid = QString("0x7777777"); return; } diff --git a/src/global/utils/global_data.h b/src/global/utils/global_data.h index 199b9f6..92a9f6e 100644 --- a/src/global/utils/global_data.h +++ b/src/global/utils/global_data.h @@ -1,10 +1,10 @@ #ifndef __GLOBAL_DATA_H__ #define __GLOBAL_DATA_H__ -#include - #include "tcp_link.h" +#include + class GlobalData { public: diff --git a/src/global/utils/tcp_link.cpp b/src/global/utils/tcp_link.cpp index 46b87c6..ad7fe8e 100644 --- a/src/global/utils/tcp_link.cpp +++ b/src/global/utils/tcp_link.cpp @@ -1,5 +1,7 @@ #include "tcp_link.h" +#include + TcpLink::TcpLink() { if (init()) { @@ -112,6 +114,8 @@ int TcpLink::udpMaintainAdd(g_udpItem item) /* 变量被置0 -> 存在 , 覆盖 */ int flag = -1; + g_tcpMaintain *newItem; + if (pthread_rwlock_wrlock(&(this->m_rwLock))) { qDebug() << "Error : TcpLink , udpMaintainAdd , lock rwLock fail"; return -1; @@ -131,7 +135,7 @@ int TcpLink::udpMaintainAdd(g_udpItem item) } /* 不存在相同uuid , 新增一条 */ - g_tcpMaintain *newItem = new g_tcpMaintain; + newItem = new g_tcpMaintain; newItem->module = NULL; newItem->uuid = item.uuid; @@ -203,7 +207,7 @@ void TcpLink::ergodic() qDebug() << "Info : tcpMaintain ergodic ......"; qDebug() << "uuid selfIp selfPort peerIp peerPort peerListenIp peerListenPort module"; - for (int i = 0 ; i < this->m_tcpMaintain ; i++) { + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); std::string stdUuid = tmp->uuid.toStdString(); @@ -237,3 +241,38 @@ void TcpLink::ergodic() return ; } + +g_tcpMaintain TcpLink::select(QString uuid) +{ + g_tcpMaintain item; + item.module = NULL; + + if (pthread_rwlock_rdlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , select , lock rwLock fail"; + return item; + } + + for (int i = 0 ; i < this->m_tcpMaintain.count() ; i++) { + g_tcpMaintain *tmp = this->m_tcpMaintain.at(i); + + if (tmp->uuid == uuid) { + item.uuid = tmp->uuid; + item.selfIp = tmp->selfIp; + item.selfPort = tmp->selfPort; + item.peerIp = tmp->peerIp; + item.peerPort = tmp->peerPort; + item.peerListenIp = tmp->peerListenIp; + item.peerListenPort = tmp->peerListenPort; + item.module = tmp->module; + + break; + } + } + + if (pthread_rwlock_unlock(&(this->m_rwLock))) { + qDebug() << "Error : TcpLink , select , unlock rwLock fail"; + return item; + } + + return item; +} diff --git a/src/global/utils/tcp_link.h b/src/global/utils/tcp_link.h index 29be993..f1b8e80 100644 --- a/src/global/utils/tcp_link.h +++ b/src/global/utils/tcp_link.h @@ -18,6 +18,7 @@ class TcpLink int tcpMaintainDelete(QString uuid); int udpMaintainAdd(g_udpItem); int udpMaintainDelete(QString uuid); + g_tcpMaintain select(QString uuid); private: pthread_rwlock_t m_rwLock; diff --git a/src/main.cpp b/src/main.cpp index fbaeec8..1a57527 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,12 +34,46 @@ #include #include +#include "network/tcp_server.h" +#include "network/tcp_client.h" +#include "network/udp_socket.h" +#include "global/utils/global_data.h" +#include "global/declare/declare.h" + #include "view/kyview.h" #include "view/common/xatom-helper.h" #include "view/common/dbusadaptor.h" int main(int argc, char *argv[]) { +//#if 0 + /* 用于测试网络模块 */ + { + QApplication app(argc , argv); + + GlobalData::getInstance(); + UdpSocket *udp = new UdpSocket; + TcpServer *server = new TcpServer; + + + g_udpItem item; + item.uuid = QString("0x666666"); + item.peerListenIp = QString("172.20.3.251"); + item.peerListenPort = QString("6066"); + GlobalData::getInstance()->m_tcpLink.udpMaintainAdd(item); + + g_send send; + send.uuid = QString("0x666666"); + send.type = QString("msg"); + send.msgData = QString("HelloWorld"); + + TcpClient *client = new TcpClient; + client->tran(send); + + app.exec(); + } + +//#endif // 统一日志输出 initUkuiLog4qt("kylin-ipmsg"); diff --git a/src/network/protocol_analysis.cpp b/src/network/protocol_analysis.cpp index 2c4c86a..460d699 100644 --- a/src/network/protocol_analysis.cpp +++ b/src/network/protocol_analysis.cpp @@ -1,5 +1,7 @@ #include "protocol_analysis.h" +#include + ProtocolAnalysis::ProtocolAnalysis() { @@ -60,7 +62,7 @@ QMap ProtocolAnalysis::analysisHeadBody(QString str) /* 解析value */ size = end - separator; tmp = (char *)realloc(tmp , size); - memset(tmp , 0x00 , tmp); + memset(tmp , 0x00 , size); strncpy(tmp , separator + 1 , end - separator - 1); @@ -87,7 +89,7 @@ QMap ProtocolAnalysis::analysisHeadBody(QString str) return dst; } -QString ProtocolAnalysis::encapsulationHeadBody(QMap map) +QString ProtocolAnalysis::encapsulationHeadBody(QMap map) { QString dst; diff --git a/src/network/protocol_analysis.h b/src/network/protocol_analysis.h index ba09a5a..311d49b 100644 --- a/src/network/protocol_analysis.h +++ b/src/network/protocol_analysis.h @@ -11,7 +11,7 @@ class ProtocolAnalysis ~ProtocolAnalysis(); QMap analysisHeadBody(QString str); - QString encapsulationHeadBody(QMap map); + QString encapsulationHeadBody(QMap map); private: }; diff --git a/src/network/tcp_client.cpp b/src/network/tcp_client.cpp index e69de29..cf83375 100644 --- a/src/network/tcp_client.cpp +++ b/src/network/tcp_client.cpp @@ -0,0 +1,77 @@ +#include +#include + +#include "tcp_client.h" +#include "tcp_module.h" +#include "global/utils/global_data.h" + +TcpClient::TcpClient() +{ + +} + +TcpClient::~TcpClient() +{ + + +} + +int TcpClient::tran(g_send send) +{ + this->m_send = send; + + /* 检测链接是否建立 */ + g_tcpMaintain item = GlobalData::getInstance()->m_tcpLink.select(send.uuid); + + /* 链接已经建立 */ + if (item.module != NULL) { + if (send.type == QString("msg")) { + item.module->tranMsg(send); + + } else if (send.type == QString("file")) { + + } + + return 0; + } + + /* 链接未建立 */ + QString ip = item.peerListenIp; + QString port = item.peerListenPort; + + qDebug() << "Info : TcpClient , tran , connect peer ip ---> " << ip << "port ---> " << port; + + this->m_socket = new QTcpSocket; + connect(this->m_socket , &QTcpSocket::connected , this , &TcpClient::slotLinkSuccess); + this->m_socket->connectToHost(QHostAddress(ip) , port.toUShort() , QTcpSocket::ReadWrite); + + return 0; +} + +void TcpClient::slotLinkSuccess(void) +{ + qDebug() << "Info : TcpClient , slotLinkSuccess , client link success!!!"; + + /* 加载功能模块 */ + TcpModule *module = new TcpModule(this->m_socket , this->m_send); + + /* 维护tcp链接表 */ + g_tcpItem item; + item.uuid = this->m_send.uuid; + item.selfIp = this->m_socket->localAddress().toString(); + item.selfPort = QString::number(this->m_socket->localPort()); + item.peerIp = this->m_socket->peerAddress().toString(); + item.peerPort = QString::number(this->m_socket->peerPort()); + item.module = module; + + if (GlobalData::getInstance()->m_tcpLink.tcpMaintainAdd(item)) { + qDebug() << "Error : TcpClient , slotLinkSuccess , maintain tcp link fail"; + } + + /* 移至线程中 */ + QThread *thread = new QThread; + module->moveToThread(thread); + thread->start(); + + return; +} diff --git a/src/network/tcp_client.h b/src/network/tcp_client.h index e69de29..ca88a5b 100644 --- a/src/network/tcp_client.h +++ b/src/network/tcp_client.h @@ -0,0 +1,27 @@ +#ifndef __TCP_CLIENT_H__ +#define __TCP_CLIENT_H__ + +#include +#include + +#include "global/declare/declare.h" + +class TcpClient : public QObject +{ + Q_OBJECT + +public: + TcpClient(); + ~TcpClient(); + + int tran(g_send send); + +private: + QTcpSocket *m_socket; + g_send m_send; + +private slots: + void slotLinkSuccess(void); +}; + +#endif diff --git a/src/network/tcp_module.cpp b/src/network/tcp_module.cpp index 3e2a3cb..f113f63 100644 --- a/src/network/tcp_module.cpp +++ b/src/network/tcp_module.cpp @@ -14,6 +14,8 @@ TcpModule::TcpModule(QTcpSocket *socket) this->m_flag = false; this->m_uuid = ""; this->m_socket = socket; + + establishInterrupt(); } /* 重载构造 , 用于tcp client */ @@ -26,6 +28,14 @@ TcpModule::TcpModule(QTcpSocket *socket , g_send send) this->m_flag = true; this->m_uuid = send.uuid; this->m_socket = socket; + + establishInterrupt(); + + if (send.type == QString("msg")) { + tranMsg(send); + } else if (send.type == QString("file")) { + tranFile(send); + } } TcpModule::~TcpModule() @@ -90,7 +100,7 @@ void TcpModule::slotReadSocket(void) } /* 维护tcp链接表 */ - g_tcpMaintain item; + g_tcpItem item; item.uuid = this->m_uuid; item.selfIp = GlobalData::getInstance()->m_tcpListenIP; item.selfPort = GlobalData::getInstance()->m_tcpListenPort; @@ -142,5 +152,5 @@ void TcpModule::slotSocketDisconnect(void) /* 维护tcp链接表 */ emit sigMaintainTcpLinkDelete(this->m_uuid); - return 0; + return; } diff --git a/src/network/tcp_module.h b/src/network/tcp_module.h index c782dff..f468b3a 100644 --- a/src/network/tcp_module.h +++ b/src/network/tcp_module.h @@ -31,7 +31,7 @@ class TcpModule : public QObject QTcpSocket *m_socket; signals: - void sigMaintainTcpLinkAdd(g_tcpMaintain item); + void sigMaintainTcpLinkAdd(g_tcpItem item); void sigMaintainTcpLinkDelete(QString uuid); void sigSendMsgSuccess(g_send send); void sigRecvMsgSuccess(g_recv recv); diff --git a/src/network/tcp_server.cpp b/src/network/tcp_server.cpp index a3fa579..08823e3 100644 --- a/src/network/tcp_server.cpp +++ b/src/network/tcp_server.cpp @@ -51,15 +51,15 @@ void TcpServer::slotEstablishNewLink(void) qDebug() << "Info : TcpServer , slotEstablishNewLink , new link coming in ..."; /* 获取新链接 */ - QTcpSocket socket = this->nextPendingConnection(); + QTcpSocket *socket = this->nextPendingConnection(); /* 加载功能模块 */ TcpModule *tcpModule = new TcpModule(socket); - connect(tcpModule , &TcpModule::sigMaintainTcpLinkAdd , this , &TcpServer::slotMaintainTcpLinkAdd); - connect(tcpModule , &TcpModule::sigMaintainTcpLinkDelete , this , &TcpServer::slotMaintainTcpLinkDelete); - connect(tcpModule , &TcpModule::sigRecvMsgSuccess , this , &TcpServer::slotRecvMsgSuccess); - connect(tcpModule , &TcpModule::sigSendMsgSuccess , this , &TcpServer::slotSendMsgSuccess); + connect(tcpModule , &TcpModule::sigMaintainTcpLinkAdd , this , &TcpServer::slotMaintainTcpLinkAdd , Qt::BlockingQueuedConnection); + connect(tcpModule , &TcpModule::sigMaintainTcpLinkDelete , this , &TcpServer::slotMaintainTcpLinkDelete , Qt::BlockingQueuedConnection); + connect(tcpModule , &TcpModule::sigRecvMsgSuccess , this , &TcpServer::slotRecvMsgSuccess , Qt::BlockingQueuedConnection); + connect(tcpModule , &TcpModule::sigSendMsgSuccess , this , &TcpServer::slotSendMsgSuccess , Qt::BlockingQueuedConnection); /* 移至线程 */ QThread *thread = new QThread; @@ -69,7 +69,7 @@ void TcpServer::slotEstablishNewLink(void) return; } -void TcpServer::slotMaintainTcpLinkAdd(g_tcpMaintain item) +void TcpServer::slotMaintainTcpLinkAdd(g_tcpItem item) { qDebug() << "Info : TcpServer , slotMaintainTcpLinkAdd , uuid ---> " << item.uuid; diff --git a/src/network/tcp_server.h b/src/network/tcp_server.h index 1892920..52a6576 100644 --- a/src/network/tcp_server.h +++ b/src/network/tcp_server.h @@ -27,7 +27,7 @@ private slots: void slotEstablishNewLink(void); void slotRecvMsgSuccess(g_recv recv); void slotSendMsgSuccess(g_send send); - void slotMaintainTcpLinkAdd(g_tcpMaintain item); + void slotMaintainTcpLinkAdd(g_tcpItem item); void slotMaintainTcpLinkDelete(QString uuid); }; diff --git a/src/network/udp_socket.cpp b/src/network/udp_socket.cpp index 8469562..27b2f1f 100644 --- a/src/network/udp_socket.cpp +++ b/src/network/udp_socket.cpp @@ -18,6 +18,8 @@ UdpSocket::~UdpSocket() if (this->m_udpSocket != NULL) { delete this->m_udpSocket; } + + slotOffline(); } void UdpSocket::init(void) @@ -36,7 +38,7 @@ void UdpSocket::init(void) /* 启动定时器 */ this->m_timer = new QTimer; - connect(this->m_timer , &QTimer::timeout , this , &UdpSocket::slotSocketOnline); + connect(this->m_timer , &QTimer::timeout , this , &UdpSocket::slotOnline); this->m_timer->start(10000); return; @@ -44,6 +46,8 @@ void UdpSocket::init(void) void UdpSocket::slotSocketRead(void) { + qDebug() << "Info , UdpSocket , slotSocketRead , recv udp package"; + while (this->m_udpSocket->hasPendingDatagrams()) { QByteArray package; package.resize(65536); @@ -61,7 +65,7 @@ void UdpSocket::slotSocketRead(void) QString peerListenPort = dataList.at(3); /* 维护tcp链接表 */ - g_tcpMaintain tmp; + g_udpItem tmp; tmp.uuid = uuid; tmp.peerListenIp = peerListenIp; tmp.peerListenPort = peerListenPort; @@ -82,6 +86,8 @@ void UdpSocket::slotSocketRead(void) qDebug() << "Info : UdpSocket , slotUdpSocketRead , recv udp offline"; } } + + return; } void UdpSocket::udpSocketBroadcast(bool flag) @@ -90,7 +96,7 @@ void UdpSocket::udpSocketBroadcast(bool flag) QString udpListenPort = GlobalData::getInstance()->m_udpListenPort; /* 组装数据包 */ - QStirng uuid = GlobalData::getInstance()->m_uuid; + QString uuid = GlobalData::getInstance()->m_uuid; QString tcpListenIp = GlobalData::getInstance()->m_tcpListenIP; QString tcpListenPort = GlobalData::getInstance()->m_tcpListenPort; @@ -115,11 +121,17 @@ void UdpSocket::udpSocketBroadcast(bool flag) for (int j = 0 ; j < addrs.count() ; j++) { if (addrs.at(j).ip().protocol() == QAbstractSocket::IPv4Protocol && (addrs.at(j).broadcast().toString() != "")) { - this->m_udpSocket->writeDatagram(package.data() , package.length() , addrs.at(j).broadcast() , udpListenPort.toUShort()); + this->m_udpSocket->writeDatagram(package.data() , package.length() , addrs.at(j).broadcast() , udpListenPort.toUShort()); + + qDebug() << "Debug : UdpSocket , udpSocketBroadcast , broadcast addr ---> " << addrs.at(j).broadcast(); + + this->m_udpSocket->flush(); } } } + qDebug() << "Info : UdpSocket , udpSocketBroadcast , udp pkg ---> " << package; + return; } diff --git a/src/network/udp_socket.h b/src/network/udp_socket.h index f49f64b..b63c12f 100644 --- a/src/network/udp_socket.h +++ b/src/network/udp_socket.h @@ -20,7 +20,7 @@ class UdpSocket : public QObject private slots: void slotSocketRead(void); - void slottOnline(void); + void slotOnline(void); void slotOffline(void); }; diff --git a/src/src.pro b/src/src.pro index 2bc4dfa..99ff0f7 100644 --- a/src/src.pro +++ b/src/src.pro @@ -3,6 +3,8 @@ QT += x11extras KWindowSystem greaterThan(QT_MAJOR_VERSION, 4): QT += widgets +QMAKE_CXXFLAGS += -g + # 适配窗口管理器圆角阴影 LIBS +=-lpthread LIBS +=-lX11 From 952514849ab5c93199d884b543cc2049e3dc9b63 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 29 Apr 2021 14:18:29 +0800 Subject: [PATCH 24/31] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dudp=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E5=8C=85=E5=A4=B1=E8=B4=A5=E9=97=AE=E9=A2=98=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=8E=A7=E5=88=B6=E6=A8=A1=E5=9D=97=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller/control.cpp | 80 +++++++++++++++++++++++++++++++ src/controller/control.h | 34 +++++++++++++ src/global/utils/global_data.cpp | 1 + src/main.cpp | 20 ++++---- src/network/protocol_analysis.cpp | 4 +- src/network/tcp_client.cpp | 13 +++++ src/network/tcp_client.h | 6 +++ src/network/tcp_module.cpp | 2 +- src/network/tcp_server.cpp | 4 -- src/network/udp_socket.cpp | 6 +-- src/src.pro | 6 ++- 11 files changed, 153 insertions(+), 23 deletions(-) create mode 100644 src/controller/control.cpp create mode 100644 src/controller/control.h diff --git a/src/controller/control.cpp b/src/controller/control.cpp new file mode 100644 index 0000000..846be07 --- /dev/null +++ b/src/controller/control.cpp @@ -0,0 +1,80 @@ +#include "control.h" + +Control::Control() +{ + init(); + establishInterrupt(); + + /* 模拟客户端 */ + g_udpItem item; + item.uuid = QString("0x7777777"); + item.peerListenIp = QString("172.20.3.250"); + item.peerListenPort = QString("6066"); + GlobalData::getInstance()->m_tcpLink.udpMaintainAdd(item); + + g_send send; + send.uuid = QString("0x7777777"); + send.type = QString("msg"); + send.msgData = QString("阿萨德;放假啊商店里;放假啊搜到放假哦啊配送积分大设计费"); + + slotSend(send); + +} + +Control::~Control() +{ + if (this->m_client != NULL) { + delete this->m_client; + } + + if (this->m_server != NULL) { + delete this->m_server; + } + + if (this->m_udpSocket != NULL) { + delete this->m_udpSocket; + } + +} + +void Control::init(void) +{ + /* 实例全局数据模块 */ + GlobalData::getInstance(); + + this->m_server = new TcpServer; + this->m_client = new TcpClient; + this->m_udpSocket = new UdpSocket; + + return; +} + +void Control::establishInterrupt(void) +{ + connect(this->m_server , &TcpServer::sigTcpServerRecvMsgSuccess , this , &Control::slotRecvMsgSuccess); + connect(this->m_server , &TcpServer::sigTcpServerSendMsgSuccess , this , &Control::slotSendMsgSuccess); + connect(this->m_client , &TcpClient::sigTcpClientRecvMsgSuccess , this , &Control::slotRecvMsgSuccess); + connect(this->m_client , &TcpClient::sigTcpClientSendMsgSuccess , this , &Control::slotSendMsgSuccess); + + + return; +} + +void Control::slotSend(g_send send) +{ + this->m_client->tran(send); +} + +void Control::slotRecvMsgSuccess(g_recv recv) +{ + qDebug() << "Debug : Control , slotRecvMsgSuccess , recv msg ---> " << recv.msgData; + + return; +} + +void Control::slotSendMsgSuccess(g_send send) +{ + qDebug() << "Debug , Control , slotSendMsgSuccess , send msg ---> " << send.msgData; + + return; +} diff --git a/src/controller/control.h b/src/controller/control.h new file mode 100644 index 0000000..a19f024 --- /dev/null +++ b/src/controller/control.h @@ -0,0 +1,34 @@ +#ifndef __CONTROL_H__ +#define __CONTROL_H__ + +#include + +#include "global/utils/global_data.h" +#include "network/tcp_server.h" +#include "network/tcp_client.h" +#include "network/udp_socket.h" + +class Control : public QObject +{ + Q_OBJECT + +public: + Control(); + ~Control(); + + void init(void); + void establishInterrupt(void); + +private: + TcpServer *m_server; + TcpClient *m_client; + UdpSocket *m_udpSocket; + +private slots: + void slotSend(g_send send); + void slotRecvMsgSuccess(g_recv recv); + void slotSendMsgSuccess(g_send send); +}; + + +#endif diff --git a/src/global/utils/global_data.cpp b/src/global/utils/global_data.cpp index 8bf43e0..72a0075 100644 --- a/src/global/utils/global_data.cpp +++ b/src/global/utils/global_data.cpp @@ -32,6 +32,7 @@ void GlobalData::init(void) { getTcpListenIp(); getTcpListenPort(); + getUdpListenPort(); getUuid(); return; diff --git a/src/main.cpp b/src/main.cpp index 1a57527..4b3586e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,7 @@ #include #include -#include "network/tcp_server.h" +#include "controller/control.h" #include "network/tcp_client.h" #include "network/udp_socket.h" #include "global/utils/global_data.h" @@ -47,28 +47,26 @@ int main(int argc, char *argv[]) { //#if 0 - /* 用于测试网络模块 */ + /* 用于测试网络模块 模拟客户端*/ { QApplication app(argc , argv); - GlobalData::getInstance(); - UdpSocket *udp = new UdpSocket; - TcpServer *server = new TcpServer; - - + Control *control = new Control; +#if 0 g_udpItem item; - item.uuid = QString("0x666666"); - item.peerListenIp = QString("172.20.3.251"); + item.uuid = QString("0x7777777"); + item.peerListenIp = QString("172.20.3.250"); item.peerListenPort = QString("6066"); GlobalData::getInstance()->m_tcpLink.udpMaintainAdd(item); g_send send; - send.uuid = QString("0x666666"); + send.uuid = QString("0x7777777"); send.type = QString("msg"); - send.msgData = QString("HelloWorld"); + send.msgData = QString("阿萨德;放假啊商店里;放假啊搜到放假哦啊配送积分大设计费"); TcpClient *client = new TcpClient; client->tran(send); +#endif app.exec(); } diff --git a/src/network/protocol_analysis.cpp b/src/network/protocol_analysis.cpp index 460d699..94bb149 100644 --- a/src/network/protocol_analysis.cpp +++ b/src/network/protocol_analysis.cpp @@ -32,8 +32,8 @@ QMap ProtocolAnalysis::analysisHeadBody(QString str) return dst; } - QByteArray originalStrTmp = str.toLatin1(); - char *originalStr = originalStrTmp.data(); + std::string originalStrTmp = str.toStdString(); + char *originalStr = const_cast(originalStrTmp.c_str()); /* 获取指向数据第一个字符的指针 */ data = strstr(originalStr , "\r\n\r\n"); diff --git a/src/network/tcp_client.cpp b/src/network/tcp_client.cpp index cf83375..9fd9f62 100644 --- a/src/network/tcp_client.cpp +++ b/src/network/tcp_client.cpp @@ -55,6 +55,9 @@ void TcpClient::slotLinkSuccess(void) /* 加载功能模块 */ TcpModule *module = new TcpModule(this->m_socket , this->m_send); + connect(module , &TcpModule::sigSendMsgSuccess , this , &TcpClient::slotSendMsgSuccess); + connect(module , &TcpModule::sigRecvMsgSuccess , this , &TcpClient::slotRecvMsgSuccess); + /* 维护tcp链接表 */ g_tcpItem item; item.uuid = this->m_send.uuid; @@ -75,3 +78,13 @@ void TcpClient::slotLinkSuccess(void) return; } + +void TcpClient::slotSendMsgSuccess(g_send send) +{ + emit sigTcpClientSendMsgSuccess(send); +} + +void TcpClient::slotRecvMsgSuccess(g_recv recv) +{ + emit sigTcpClientRecvMsgSuccess(recv); +} diff --git a/src/network/tcp_client.h b/src/network/tcp_client.h index ca88a5b..188ee05 100644 --- a/src/network/tcp_client.h +++ b/src/network/tcp_client.h @@ -20,8 +20,14 @@ class TcpClient : public QObject QTcpSocket *m_socket; g_send m_send; +signals: + void sigTcpClientSendMsgSuccess(g_send send); + void sigTcpClientRecvMsgSuccess(g_recv recv); + private slots: void slotLinkSuccess(void); + void slotSendMsgSuccess(g_send send); + void slotRecvMsgSuccess(g_recv recv); }; #endif diff --git a/src/network/tcp_module.cpp b/src/network/tcp_module.cpp index f113f63..d0278a5 100644 --- a/src/network/tcp_module.cpp +++ b/src/network/tcp_module.cpp @@ -105,7 +105,7 @@ void TcpModule::slotReadSocket(void) item.selfIp = GlobalData::getInstance()->m_tcpListenIP; item.selfPort = GlobalData::getInstance()->m_tcpListenPort; item.peerIp = this->m_socket->peerAddress().toString(); - item.peerPort = QString(this->m_socket->peerPort()); + item.peerPort = QString::number(this->m_socket->peerPort()); item.module = this; /* 同步调用槽 , 接收返回值 */ diff --git a/src/network/tcp_server.cpp b/src/network/tcp_server.cpp index 08823e3..47c3680 100644 --- a/src/network/tcp_server.cpp +++ b/src/network/tcp_server.cpp @@ -89,14 +89,10 @@ void TcpServer::slotMaintainTcpLinkDelete(QString uuid) void TcpServer::slotRecvMsgSuccess(g_recv recv) { - qDebug() << "Info : TcpServer , slotRecvMsgSuccess , uuid ---> " << recv.uuid << "msgData ---> " << recv.msgData; - emit sigTcpServerRecvMsgSuccess(recv); } void TcpServer::slotSendMsgSuccess(g_send send) { - qDebug() << "Info : TcpServer , slotSendMsgSuccess , uuid ---> " << send.uuid << "msgData ---> " << send.msgData; - emit sigTcpServerSendMsgSuccess(send); } diff --git a/src/network/udp_socket.cpp b/src/network/udp_socket.cpp index 27b2f1f..aa0c775 100644 --- a/src/network/udp_socket.cpp +++ b/src/network/udp_socket.cpp @@ -6,7 +6,7 @@ UdpSocket::UdpSocket() { init(); - slotOnline(); + //slotOnline(); } UdpSocket::~UdpSocket() @@ -31,7 +31,7 @@ void UdpSocket::init(void) QString port = GlobalData::getInstance()->m_udpListenPort; if (this->m_udpSocket->bind(QHostAddress::AnyIPv4 , port.toUShort() , QUdpSocket::ReuseAddressHint) == true) { - qDebug() << "Info : UdpSocket , listen success"; + qDebug() << "Info : UdpSocket , bind success"; } connect(this->m_udpSocket , &QUdpSocket::readyRead , this , &UdpSocket::slotSocketRead); @@ -55,7 +55,7 @@ void UdpSocket::slotSocketRead(void) int size = this->m_udpSocket->readDatagram(package.data() , package.size() , &peerIp); package.resize(size); - /* udp包接收完毕 , 解析upd包 */ + /* udp包接收完毕 , 解析udp包 */ QString data = QString::fromUtf8(package); QStringList dataList = data.split(" "); if (dataList.at(0) == "true") { diff --git a/src/src.pro b/src/src.pro index 99ff0f7..e3bf245 100644 --- a/src/src.pro +++ b/src/src.pro @@ -50,7 +50,8 @@ SOURCES += \ $$PWD/network/tcp_client.cpp \ $$PWD/network/tcp_module.cpp \ $$PWD/network/tcp_server.cpp \ - $$PWD/network/udp_socket.cpp + $$PWD/network/udp_socket.cpp \ + controller/control.cpp HEADERS += \ $$PWD/view/kyview.h \ @@ -64,6 +65,7 @@ HEADERS += \ $$PWD/network/tcp_client.h \ $$PWD/network/tcp_module.h \ $$PWD/network/tcp_server.h \ - $$PWD/network/udp_socket.h + $$PWD/network/udp_socket.h \ + controller/control.h RESOURCES += \ From 70c8585c1f445f5ca5ade33bd0d4878d9a55c4e0 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Thu, 29 Apr 2021 15:27:39 +0800 Subject: [PATCH 25/31] Update local info module --- data/database/kylin-messages.db | Bin 36864 -> 45056 bytes src/model/friendlistmodel.cpp | 70 ++++++++++++ src/model/friendlistmodel.h | 72 ++++++++++++ src/model/friendsinfomodel.cpp | 0 src/model/friendsinfomodel.h | 0 src/src.pro | 14 +++ src/view/common/globaldata.cpp | 16 +-- src/view/common/globaldata.h | 9 +- src/view/friendlist/friendItemDelegate.cpp | 125 +++++++++++++++++++++ src/view/friendlist/friendItemDelegate.h | 53 +++++++++ src/view/friendlist/friendlist.cpp | 60 ++++++++++ src/view/friendlist/friendlist.h | 52 +++++++++ src/view/kyview.cpp | 8 ++ src/view/kyview.h | 5 + src/view/localinfo/localinfo.cpp | 35 +++++- src/view/localinfo/localinfo.h | 2 +- src/view/titlebar/menumodule.cpp | 4 +- src/view/titlebar/menumodule.h | 6 +- src/view/titlebar/titlebar.h | 2 +- 19 files changed, 512 insertions(+), 21 deletions(-) create mode 100644 src/model/friendlistmodel.cpp create mode 100644 src/model/friendlistmodel.h delete mode 100644 src/model/friendsinfomodel.cpp delete mode 100644 src/model/friendsinfomodel.h create mode 100644 src/view/friendlist/friendItemDelegate.cpp create mode 100644 src/view/friendlist/friendItemDelegate.h create mode 100644 src/view/friendlist/friendlist.cpp create mode 100644 src/view/friendlist/friendlist.h diff --git a/data/database/kylin-messages.db b/data/database/kylin-messages.db index dd30c22d9083e16797ae1efd474494ac2bc24e4d..5c754e72b9defb186f9cac09fe8f7a0468793be2 100644 GIT binary patch delta 236 zcmZozz|`=7X@ayMD+2=qHxP3IF(VNFo~UE2$jYE+f0LK@5(6jaA2z=0+@JX7^QCj; z^6BvY;{3yZi9cwwpnyHc=KUPfjQl`VlY#m`0Lbi^=qPNP*O9eHFV0)jk!9fKkjyj>$T zU=m82T$-D6xsI|hE}qyppIy5#jZNHMaxx>I1V6->ctZ%yy-9$(V6#HOYyOD=T#E!0 E0PW915dZ)H delta 104 zcmZp8z|^pSX@ayMGXnzyCloUR>F*PDjAfY_^z3i)@?K(K=gMW{yUzWIZ$4i-S1z9p z?=POSn*{}&IX3U-kY=1XVe;l&uA?lB7biBJT{J;qlL2=CCkN0FHXvpNs(Zr^05Pf? AFaQ7m diff --git a/src/model/friendlistmodel.cpp b/src/model/friendlistmodel.cpp new file mode 100644 index 0000000..da418ae --- /dev/null +++ b/src/model/friendlistmodel.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "friendlistmodel.h" + +FriendListModel::FriendListModel() : + QStandardItemModel(NULL) +{ + QHash roleNames; + roleNames[Id] = "id"; + roleNames[Uuid] = "uuid"; + roleNames[Ip] = "ip"; + roleNames[Port] = "port"; + roleNames[Mac] = "mac"; + roleNames[Username] = "username"; + roleNames[Username] = "nickname"; + roleNames[System] = "system"; + roleNames[Platform] = "platform"; + roleNames[Avatar] = "avatar"; + roleNames[RecentMsgContent] = "recentMsgContent"; + roleNames[RecentMsgTime] = "recentMsgTime"; + roleNames[UnreadMsgNum] = "unreadMsgNum"; + roleNames[OnlineState] = "onlineState"; + roleNames[Priority] = "priority"; + setItemRoleNames(roleNames); +} + +FriendListModel::~FriendListModel() +{ +} + +void FriendListModel::addFriend() +{ + QStandardItem *newItem = NULL; + + // Check if the same uuid is alreay in the friend list + + newItem = new QStandardItem(); + newItem->setData("Z", FriendListModel::Avatar); + newItem->setData("Zhangsan", FriendListModel::Nickname); + newItem->setData("listview", FriendListModel::RecentMsgContent); + newItem->setData("10:22", FriendListModel::RecentMsgTime); + newItem->setData("5", FriendListModel::UnreadMsgNum); + newItem->setData(true, FriendListModel::OnlineState); + + appendRow(newItem); +} +void FriendListModel::updateFriend() +{ + this->item(0)->setData("Zhaoyun", FriendListModel::Nickname); +} + +void removeFriend(QString uuid) +{ + +} \ No newline at end of file diff --git a/src/model/friendlistmodel.h b/src/model/friendlistmodel.h new file mode 100644 index 0000000..96a258d --- /dev/null +++ b/src/model/friendlistmodel.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef FRIENDLISTMODEL_H +#define FRIENDLISTMODEL_H + +#include +#include +#include + +class FriendListModel : public QStandardItemModel +{ + Q_OBJECT +public: + explicit FriendListModel(); + ~FriendListModel(); + + // 添加好友 + void addFriend(); + + // 更新好友信息 + void updateFriend(); + + // 更新好友状态 + // void updateFriendState(QString uuid, bool isOnline); + + // 删除好友 + void removeFriend(QString uuid); + + QStandardItem *friendById(QString id); + QStandardItem *friendByUuid(QString uuid); + + enum FriendRoles { + Id = Qt::UserRole + 1, + Uuid, + Ip, + Port, + Mac, + Username, + Nickname, + System, + Platform, + Avatar, + RecentMsgContent, + RecentMsgTime, + UnreadMsgNum, + OnlineState, + Priority, + }; + + /*<"uuid" , QStandardItem *>*/ + QHash m_ItemsMap; + +private: + +}; + +#endif // FRIENDLISTMODEL_H \ No newline at end of file diff --git a/src/model/friendsinfomodel.cpp b/src/model/friendsinfomodel.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/model/friendsinfomodel.h b/src/model/friendsinfomodel.h deleted file mode 100644 index e69de29..0000000 diff --git a/src/src.pro b/src/src.pro index b17903f..b9803b3 100644 --- a/src/src.pro +++ b/src/src.pro @@ -42,11 +42,25 @@ SOURCES += \ $$PWD/view/common/xatom-helper.cpp \ $$PWD/view/common/daemondbus.cpp \ $$PWD/view/common/dbusadaptor.cpp \ + $$PWD/view/common/globaldata.cpp \ +# $$PWD/view/titlebar/menumodule.cpp \ + $$PWD/view/titlebar/titlebar.cpp \ + $$PWD/view/localinfo/localinfo.cpp \ + $$PWD/view/friendlist/friendlist.cpp\ + $$PWD/view/friendlist/friendItemDelegate.cpp \ + $$PWD/model/friendlistmodel.cpp \ HEADERS += \ $$PWD/view/kyview.h \ $$PWD/view/common/xatom-helper.h \ $$PWD/view/common/daemondbus.h \ $$PWD/view/common/dbusadaptor.h \ + $$PWD/view/common/globaldata.h \ +# $$PWD/view/titlebar/menumodule.h \ + $$PWD/view/titlebar/titlebar.h \ + $$PWD/view/localinfo/localinfo.h \ + $$PWD/view/friendlist/friendlist.h \ + $$PWD/view/friendlist/friendItemDelegate.h \ + $$PWD/model/friendlistmodel.h \ RESOURCES += \ diff --git a/src/view/common/globaldata.cpp b/src/view/common/globaldata.cpp index e9695b5..be926ee 100644 --- a/src/view/common/globaldata.cpp +++ b/src/view/common/globaldata.cpp @@ -25,13 +25,15 @@ const int GlobalData::WINDOW_HEIGHT = 686; const int GlobalData::TITLEBAR_HEIGHT = 40; // 本机信息 -const int GlobalData::LOCALINFO_HEIGHT = 140; -const QSize AVATAR_LAB_SIZE = QSize(60, 60); -const QSize USER_NAME_LAB_SIZE = QSize(90, 20); -const QSize USER_IP_LAB_SIZE = QSize(170, 20); -const QSize CHANGE_NAME_BTN_SIZE = QSize(16, 16); -const QSize OPEN_FOLDER_BTN_SIZE = QSize(16, 16); -const QSize SEARCH_EDIT_SIZE = QSize(334, 36); +const int GlobalData::LOCALINFO_HEIGHT = 140; +const QSize GlobalData::AVATAR_LAB_SIZE = QSize(60, 60); +const QSize GlobalData::USER_NAME_LAB_SIZE = QSize(90, 20); +const QSize GlobalData::USER_IP_LAB_SIZE = QSize(170, 20); +const QSize GlobalData::CHANGE_NAME_BTN_SIZE = QSize(25, 25); +const QSize GlobalData::CHANGE_NAME_BTN_ICON = QSize(16, 16); +const QSize GlobalData::OPEN_FOLDER_BTN_SIZE = QSize(25, 25); +const QSize GlobalData::OPEN_FOLDER_BTN_ICON = QSize(16, 16); +const QSize GlobalData::SEARCH_EDIT_SIZE = QSize(334, 36); // 好友列表 const int GlobalData::FRIEND_LIST_HEIGHT = 506; \ No newline at end of file diff --git a/src/view/common/globaldata.h b/src/view/common/globaldata.h index ea4ffa2..34364cc 100644 --- a/src/view/common/globaldata.h +++ b/src/view/common/globaldata.h @@ -33,16 +33,19 @@ class GlobalData static const int TITLEBAR_HEIGHT; //标题栏高度 // 本机信息 - static const int LOCALINFO_HEIGHT; //本机信息高度 + static const int LOCALINFO_HEIGHT; //本机信息高度 static const QSize AVATAR_LAB_SIZE; // 本机头像尺寸 static const QSize USER_NAME_LAB_SIZE; // 本机昵称尺寸 static const QSize USER_IP_LAB_SIZE; // 本机IP尺寸 static const QSize CHANGE_NAME_BTN_SIZE;// 修改本机昵称按钮 + static const QSize CHANGE_NAME_BTN_ICON;// 修改本机昵称按钮图标 static const QSize OPEN_FOLDER_BTN_SIZE;// 打开文件保存目录按钮 - static const QSize SEARCH_EDIT_SIZE;// 打开文件保存目录按钮 + static const QSize OPEN_FOLDER_BTN_ICON;// 打开文件保存目录按钮图标 + static const QSize SEARCH_EDIT_SIZE; // 打开文件保存目录按钮 + static const QSize SEARCH_EDIT_ICON; // 打开文件保存目录按钮图标 // 好友列表 - static const int FRIEND_LIST_HEIGHT;//好友列表高度 + static const int FRIEND_LIST_HEIGHT; //好友列表高度 }; diff --git a/src/view/friendlist/friendItemDelegate.cpp b/src/view/friendlist/friendItemDelegate.cpp new file mode 100644 index 0000000..f1df4e0 --- /dev/null +++ b/src/view/friendlist/friendItemDelegate.cpp @@ -0,0 +1,125 @@ + + +#include "friendItemDelegate.h" + +FriendItemDelegate::FriendItemDelegate() +{ +} + +FriendItemDelegate::~FriendItemDelegate() +{ +} + +QSize FriendItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(index) + return QSize(350, 70); +} + +void FriendItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (index.isValid()) { + // QPainter *savePainter = new QPainter(); + // savePainter = painter; + painter->save(); + + // 反锯齿 + painter->setRenderHint(QPainter::Antialiasing); + + // 获取数据 + QString avatar = index.data(FriendListModel::Avatar).toString(); + QString nickname = index.data(FriendListModel::Nickname).toString(); + QString msgContent = index.data(FriendListModel::RecentMsgContent).toString(); + QString msgTime = index.data(FriendListModel::RecentMsgTime).toString(); + QString msgNum = index.data(FriendListModel::UnreadMsgNum).toString(); + + // item 矩形区域 + QRectF itemRect; + itemRect.setX(option.rect.x()); + itemRect.setY(option.rect.y()); + itemRect.setWidth(option.rect.width() - 1); + itemRect.setHeight(option.rect.height() - 1); + + QPainterPath path; + // 鼠标悬停或者选中时改变背景色 + if (option.state.testFlag(QStyle::State_MouseOver)) { + // painter->setPen(QPen(QColor("#ebeced"))); + path.setFillRule( Qt::WindingFill ); //设置填充方式 + path.addRoundedRect(itemRect, 0, 0); + painter->fillPath(path, QBrush(QColor("#ebeced"))); + } + + // 好友头像 + QPoint avatarPoint(itemRect.left() + 16, itemRect.top() + 10); + QSize avatarSize(50, 50); + QRectF avatarRect = QRect(avatarPoint, avatarSize); + // 画圆 + QPainterPath avatarPath; + avatarPath.setFillRule( Qt::WindingFill ); //设置填充方式 + avatarPath.addRoundedRect(avatarRect, 30, 30); + painter->fillPath(avatarPath, QBrush(QColor(55, 144, 250))); + + // // 设置背景色 + // painter->setBrush(Qt::blue); + // painter->drawRect(avatarRect); + + // 好友昵称或备注 + QPoint nicknamePoint(avatarRect.right() + 8, itemRect.top() + 10); + QSize nicknameSize(170, 25); + QRectF nicknameRect = QRect(nicknamePoint, nicknameSize); + + // 最近聊天内容 + QPoint contentPoint(avatarRect.right() + 8, avatarRect.bottom() - 26); + QSize contentSize(186, 20); + QRectF contentRect = QRect(contentPoint, contentSize); + + // 最近聊天时间 + QPoint timePoint(itemRect.right() - 80, itemRect.top() + 16); + QSize timeSize(60, 20); + QRectF timeRect = QRect(timePoint, timeSize); + timeRect.setRight(itemRect.right() - 20); + + // 未读消息数 + QPoint msgNumPoint(itemRect.right() - 50, itemRect.bottom() - 30); + QSize msgNumSize(30, 20); + QRectF msgNumRect = QRect(msgNumPoint, msgNumSize); + msgNumRect.setRight(itemRect.right() - 20); + // 画圆 + QPainterPath numPath; + numPath.setFillRule( Qt::WindingFill ); //设置填充方式 + numPath.addRoundedRect (msgNumRect, 10, 10); + painter->fillPath(numPath, QBrush(QColor(250, 55, 55))); + + //绘制文字 + QTextOption option; + + option.setAlignment(Qt::AlignLeft | Qt::AlignTop); + painter->setFont(QFont(painter->fontInfo().family(), 14)); + painter->drawText(nicknameRect, nickname, option); + painter->setFont(QFont(painter->fontInfo().family(), 12)); + painter->drawText(contentRect, msgContent, option); + + option.setAlignment(Qt::AlignRight | Qt::AlignTop); + painter->setFont(QFont(painter->fontInfo().family(), 12)); + painter->drawText(timeRect, msgTime, option); + + // 白色的字 + painter->setPen(QPen(Qt::white)); + option.setAlignment(Qt::AlignCenter); + + painter->setFont(QFont(painter->fontInfo().family(), 22)); + painter->drawText(avatarRect, avatar, option); + + painter->setFont(QFont(painter->fontInfo().family(), 12)); + painter->drawText(msgNumRect, msgNum, option); + + + + painter->restore(); + } +} + +// bool FriendItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) +// { + +// } \ No newline at end of file diff --git a/src/view/friendlist/friendItemDelegate.h b/src/view/friendlist/friendItemDelegate.h new file mode 100644 index 0000000..86e1ff0 --- /dev/null +++ b/src/view/friendlist/friendItemDelegate.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef FRIENDITEMDELEGATE_H +#define FRIENDITEMDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../../model/friendlistmodel.h" + +class FriendItemDelegate : public QAbstractItemDelegate +{ + Q_OBJECT +public: + FriendItemDelegate(); + ~FriendItemDelegate(); + + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + // bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index); + +}; + + + + + +#endif // FRIENDITEMDELEGATE_H \ No newline at end of file diff --git a/src/view/friendlist/friendlist.cpp b/src/view/friendlist/friendlist.cpp new file mode 100644 index 0000000..d8f3a06 --- /dev/null +++ b/src/view/friendlist/friendlist.cpp @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +#include "friendlist.h" + + +FriendListView::FriendListView(QListView *parent) : + QListView(parent) +{ + QStringListModel *strListModel = new QStringListModel(this); + QStringList *strList = new QStringList(); + + strList->append("aaaaaaaaaaa"); + strList->append("bbbbbbbbbbb"); + strList->append("ccccccccccc"); + + strListModel->setStringList(*strList); + + FriendListModel *friendListModel = new FriendListModel(); + friendListModel->addFriend(); + friendListModel->addFriend(); + friendListModel->addFriend(); + + FriendItemDelegate *myItemDelegate = new FriendItemDelegate(); + this->setItemDelegate(myItemDelegate); + + // this->setModel(strListModel); + this->setModel(friendListModel); + this->setSpacing(0); + this->setDragEnabled(false); + this->setFrameShape(QListView::NoFrame); + + // QThread::sleep(5); + + friendListModel->updateFriend(); + + delete strList; +} + +FriendListView::~FriendListView() +{ + +} \ No newline at end of file diff --git a/src/view/friendlist/friendlist.h b/src/view/friendlist/friendlist.h new file mode 100644 index 0000000..aa1bf31 --- /dev/null +++ b/src/view/friendlist/friendlist.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef FRIENDLIST_H +#define FRIENDLIST_H + +#include +#include +#include + +#include + +// #include "../../model/friendlistmodel.h" +#include "friendItemDelegate.h" + +typedef struct { + QString iconPath; + QString singer; + QString songsNb; +} MuItemData; + +Q_DECLARE_METATYPE(MuItemData) + +class FriendListView : public QListView +{ + +public: + FriendListView(QListView *parent = nullptr); + ~FriendListView(); + +private: + /* data */ +}; + + + + +#endif // FRIENDLIST_H \ No newline at end of file diff --git a/src/view/kyview.cpp b/src/view/kyview.cpp index 0d7fe3f..2b442af 100644 --- a/src/view/kyview.cpp +++ b/src/view/kyview.cpp @@ -65,8 +65,16 @@ void KyView::setWidgetUi() // 本机信息 m_localInfo = new LocalInfo(this); + // 好友列表 + m_friendListView = new FriendListView(); + // 将组件添加到布局中 m_mainLayout->addWidget(m_titleBar, Qt::AlignTop); + m_mainLayout->addWidget(m_localInfo, Qt::AlignTop); + m_mainLayout->addWidget(m_friendListView, Qt::AlignTop); + + m_mainLayout->setMargin(0); + m_mainLayout->setSpacing(0); } diff --git a/src/view/kyview.h b/src/view/kyview.h index 0215568..d00d3c2 100644 --- a/src/view/kyview.h +++ b/src/view/kyview.h @@ -29,6 +29,8 @@ #include "titlebar/titlebar.h" #include "localinfo/localinfo.h" +#include "common/globaldata.h" +#include "friendlist/friendlist.h" class KyView : public QWidget { @@ -60,6 +62,9 @@ class KyView : public QWidget // 本机信息 LocalInfo *m_localInfo; + // 好友列表 + FriendListView *m_friendListView; + // 整体界面布局 QVBoxLayout *m_mainLayout; }; diff --git a/src/view/localinfo/localinfo.cpp b/src/view/localinfo/localinfo.cpp index e7acf5a..1d8c192 100644 --- a/src/view/localinfo/localinfo.cpp +++ b/src/view/localinfo/localinfo.cpp @@ -46,15 +46,16 @@ void LocalInfo::setWidgetUi() m_searchEdit = new QLineEdit(this); - m_localInfoLayout = new QHBoxLayout(this); + m_localInfoLayout = new QVBoxLayout(this); m_nameLayout = new QHBoxLayout(); m_ipLayout = new QVBoxLayout(); m_avatarLayout = new QHBoxLayout(); // 对组件进行布局 m_nameLayout->addWidget(m_userNameLab, Qt::AlignBottom); - m_nameLayout->addWidget(m_changeNameBtn, 1, Qt::AlignBottom); - m_nameLayout->addWidget(m_openFolderBtn, Qt::AlignBottom); + m_nameLayout->addWidget(m_changeNameBtn, Qt::AlignBottom | Qt::AlignLeft); + m_nameLayout->addStretch(); + m_nameLayout->addWidget(m_openFolderBtn, Qt::AlignBottom | Qt::AlignRight); m_nameLayout->setMargin(0); m_nameLayout->setSpacing(0); @@ -85,4 +86,32 @@ void LocalInfo::setWidgetStyle() avatarLabPe.setColor(QPalette::Background, QColor("#3D6BE5")); avatarLabPe.setColor(QPalette::WindowText, QColor("#FFFFFF")); m_avatarLab->setPalette(avatarLabPe); + m_avatarLab->setStyleSheet("border-radius:30px;background:#3D6BE5;color:#FFFFFF;"); + + QFont avatarLabFont("SourceHanSansCN-Light", 28, 400); + m_avatarLab->setFont(avatarLabFont); + m_avatarLab->setAlignment(Qt::AlignCenter); + + m_userNameLab->setFixedSize(GlobalData::USER_NAME_LAB_SIZE); + + m_userIPLab->setFixedSize(GlobalData::USER_IP_LAB_SIZE); + + m_changeNameBtn->setIcon(QIcon::fromTheme("document-edit-symbolic")); + m_changeNameBtn->setIconSize(GlobalData::CHANGE_NAME_BTN_ICON); + m_changeNameBtn->setFixedSize(GlobalData::CHANGE_NAME_BTN_SIZE); + m_changeNameBtn->setProperty("isWindowButton", 0x1); + m_changeNameBtn->setProperty("useIconHighlightEffect", 0x2); + m_changeNameBtn->setFlat(true); + + m_openFolderBtn->setIcon(QIcon::fromTheme("document-open-symbolic")); + m_openFolderBtn->setIconSize(GlobalData::OPEN_FOLDER_BTN_ICON); + m_openFolderBtn->setFixedSize(GlobalData::OPEN_FOLDER_BTN_SIZE); + m_openFolderBtn->setProperty("isWindowButton", 0x1); + m_openFolderBtn->setProperty("useIconHighlightEffect", 0x2); + m_openFolderBtn->setFlat(true); + + m_avatarLab->setText("S"); + m_userNameLab->setText("沈剑心"); + m_userIPLab->setText("172.17.7.99"); + } \ No newline at end of file diff --git a/src/view/localinfo/localinfo.h b/src/view/localinfo/localinfo.h index e391b96..8e8c46b 100644 --- a/src/view/localinfo/localinfo.h +++ b/src/view/localinfo/localinfo.h @@ -27,7 +27,7 @@ #include "../common/globaldata.h" -class LocalInfo : QWidget +class LocalInfo : public QWidget { Q_OBJECT public: diff --git a/src/view/titlebar/menumodule.cpp b/src/view/titlebar/menumodule.cpp index 82d63ec..e28c70f 100644 --- a/src/view/titlebar/menumodule.cpp +++ b/src/view/titlebar/menumodule.cpp @@ -1,7 +1,5 @@ #include "menumodule.h" -#include "kyview.h" -#include "xatom-helper.h" -#include "sizedate.h" + menuModule::menuModule(QWidget *parent = nullptr) : QWidget(parent) { init(); diff --git a/src/view/titlebar/menumodule.h b/src/view/titlebar/menumodule.h index c377f17..55ca023 100644 --- a/src/view/titlebar/menumodule.h +++ b/src/view/titlebar/menumodule.h @@ -21,9 +21,9 @@ #include #include -//#include "titlebar.h" -//#include "kyview.h" -#include "daemondbus.h" +#include "../kyview.h" +#include "../common/xatom-helper.h" +#include "../common/daemondbus.h" class menuModule : public QWidget { diff --git a/src/view/titlebar/titlebar.h b/src/view/titlebar/titlebar.h index 78f8aae..fba2fec 100644 --- a/src/view/titlebar/titlebar.h +++ b/src/view/titlebar/titlebar.h @@ -23,7 +23,7 @@ #include #include -#include "menumodule.h" +// #include "menumodule.h" #include "../common/globaldata.h" class TitleBar : public QWidget From 653b2a36e5bab751c1c4bb1535726fb0cf4e3477 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Thu, 6 May 2021 16:29:29 +0800 Subject: [PATCH 26/31] Update databse --- data/database/kylin-messages.db | Bin 45056 -> 53248 bytes src/global/database/database.cpp | 343 ++++++++++++++++++ src/global/database/database.h | 146 ++++++++ src/main.cpp | 44 +-- src/model/friendlistmodel.cpp | 25 +- src/model/friendlistmodel.h | 3 + src/src.pro | 10 +- src/view/common/globaldata.cpp | 39 -- src/view/common/globalsizedata.cpp | 39 ++ .../common/{globaldata.h => globalsizedata.h} | 8 +- src/view/friendlist/friendItemDelegate.cpp | 38 +- src/view/friendlist/friendlist.cpp | 12 +- src/view/friendlist/friendlist.h | 3 +- src/view/kyview.cpp | 2 +- src/view/kyview.h | 2 +- src/view/localinfo/localinfo.cpp | 16 +- src/view/localinfo/localinfo.h | 2 +- src/view/titlebar/titlebar.cpp | 2 +- src/view/titlebar/titlebar.h | 2 +- 19 files changed, 632 insertions(+), 104 deletions(-) delete mode 100644 src/view/common/globaldata.cpp create mode 100644 src/view/common/globalsizedata.cpp rename src/view/common/{globaldata.h => globalsizedata.h} (94%) diff --git a/data/database/kylin-messages.db b/data/database/kylin-messages.db index 5c754e72b9defb186f9cac09fe8f7a0468793be2..7a35035a1f9c579d02504734b11eadf4ea07857f 100644 GIT binary patch literal 53248 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 diff --git a/src/global/database/database.cpp b/src/global/database/database.cpp index e69de29..12ea928 100644 --- a/src/global/database/database.cpp +++ b/src/global/database/database.cpp @@ -0,0 +1,343 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "database.h" + +FriendInfoData::FriendInfoData(int m_friendId, + QString m_friendUuid, + QString m_friendIp, + int m_friendPort, + QString m_friendMac, + QString m_username, + QString m_nickname, + QString m_system, + QString m_platform, + QString m_avatarUrl, + QString m_recentMsgCont, + QString m_recentMsgTime, + int m_unreadMsgNum, + int m_priority) +{ + this->m_friendId = m_friendId; + this->m_friendUuid = m_friendUuid; + this->m_friendIp = m_friendIp; + this->m_friendPort = m_friendPort; + this->m_friendMac = m_friendMac; + this->m_username = m_username; + this->m_nickname = m_nickname; + this->m_system = m_system; + this->m_platform = m_platform; + this->m_avatarUrl = m_avatarUrl; + this->m_recentMsgCont = m_recentMsgCont; + this->m_recentMsgTime = m_recentMsgTime; + this->m_unreadMsgNum = m_unreadMsgNum; + this->m_priority = m_priority; +} + +FriendInfoData::FriendInfoData(QMap strMap, QMap intMap) +{ + // if (strMap.isEmpty() || intMap.isEmpty()) { + // return ; + // } + + // QString类型变量赋值 + if (strMap.contains("m_friendUuid")) { + m_friendUuid = strMap["m_friendUuid"]; + } + if (strMap.contains("m_friendIp")) { + m_friendIp = strMap["m_friendIp"]; + } + if (strMap.contains("m_friendMac")) { + m_friendMac = strMap["m_friendMac"]; + } + if (strMap.contains("m_username")) { + m_username = strMap["m_username"]; + } + if (strMap.contains("m_nickname")) { + m_nickname = strMap["m_nickname"]; + } + if (strMap.contains("m_system")) { + m_system = strMap["m_system"]; + } + if (strMap.contains("m_platform")) { + m_platform = strMap["m_platform"]; + } + if (strMap.contains("m_avatarUrl")) { + m_avatarUrl = strMap["m_avatarUrl"]; + } + if (strMap.contains("m_recentMsgCont")) { + m_recentMsgCont = strMap["m_recentMsgCont"]; + } + if (strMap.contains("m_recentMsgTime")) { + m_recentMsgTime = strMap["m_recentMsgTime"]; + } + + // int类型变量赋值 + if (intMap.contains("m_friendId")) { + m_friendId = intMap["m_friendId"]; + } + if (intMap.contains("m_friendPort")) { + m_friendPort = intMap["m_friendPort"]; + } + if (intMap.contains("m_unreadMsgNum")) { + m_unreadMsgNum = intMap["m_unreadMsgNum"]; + } + if (intMap.contains("m_priority")) { + m_priority = intMap["m_priority"]; + } +} + +FriendInfoData::~FriendInfoData() +{ +} + + +FriendInfoDataBase::FriendInfoDataBase(QObject *parent) : QObject(parent) +{ + m_dbName = "kylin-messages.db"; + m_dbTableName = "friend_info"; + + // 打开数据库 + m_db = QSqlDatabase::addDatabase("QSQLITE"); + m_db.setDatabaseName(QApplication::applicationDirPath() + "/../../data/database/" + m_dbName); + + qDebug() << QApplication::applicationDirPath() + "/../../data/database/" + m_dbName; + + if (!m_db.open()) { + m_dbName = ""; + m_dbTableName = ""; + QMessageBox::warning(0, QObject::tr("Database Error"), + m_db.lastError().text()); + } + + // 使用model + m_model = new QSqlTableModel(this, m_db); + m_model->setTable(m_dbTableName); + // 提交后才修改数据库 + m_model->setEditStrategy(QSqlTableModel::OnManualSubmit); + + m_model->select(); +} + +FriendInfoDataBase::~FriendInfoDataBase() +{ + +} + +FriendInfoDataBase* FriendInfoDataBase::getInstance() +{ + static FriendInfoDataBase *instance = nullptr; + + if (instance == nullptr) { + try { + instance = new FriendInfoDataBase(); + } + catch (const std::runtime_error &re) + { + qDebug() << "runtime_error:" << re.what(); + } + } + + return instance; +} + +// 插入数据 +// TODO 数据加密处理 +bool FriendInfoDataBase::insertData(FriendInfoData *friendInfo) +{ + int col = m_model->columnCount(); + int row = m_model->rowCount(); + int index = 0; + + m_model->insertRow(row); + index++; + // m_model->setData(m_model->index(row, index++), friendInfo->m_friendId); + m_model->setData(m_model->index(row, index++), friendInfo->m_friendUuid); + m_model->setData(m_model->index(row, index++), friendInfo->m_friendIp); + m_model->setData(m_model->index(row, index++), friendInfo->m_friendPort); + m_model->setData(m_model->index(row, index++), friendInfo->m_friendMac); + m_model->setData(m_model->index(row, index++), friendInfo->m_username); + m_model->setData(m_model->index(row, index++), friendInfo->m_nickname); + m_model->setData(m_model->index(row, index++), friendInfo->m_system); + m_model->setData(m_model->index(row, index++), friendInfo->m_platform); + m_model->setData(m_model->index(row, index++), friendInfo->m_avatarUrl); + m_model->setData(m_model->index(row, index++), friendInfo->m_recentMsgCont); + m_model->setData(m_model->index(row, index++), friendInfo->m_recentMsgTime); + m_model->setData(m_model->index(row, index++), friendInfo->m_unreadMsgNum); + m_model->setData(m_model->index(row, index++), friendInfo->m_priority); + + // 提交修改 + m_model->submitAll(); + m_model->select(); + + return true; +} + +// 查询数据 +bool FriendInfoDataBase::queryData(FriendInfoData *friendInfo) +{ + return m_model->select(); +} + +// 更新数据 +// TODO 获取行号 +bool FriendInfoDataBase::updateData(FriendInfoData *friendInfo) +{ + // 示例 + // 使用model必须要获取到行号和列号 + int row = 0; + int col = 0; + + m_model->setData(m_model->index(row, col), friendInfo->m_priority); + + m_model->submitAll(); + + // TODO 使用query获取行号 + QString queryIndex = QString("SELECT rowid from %1 where friend_id = %2") + .arg(m_dbTableName).arg(friendInfo->m_friendId); + query.prepare(queryIndex); + return query.exec(); +} + +// 删除数据 +bool FriendInfoDataBase::deleteData(FriendInfoData *friendInfo) +{ + // 示例 + int delRow = 0; + + m_model->removeRow(delRow); + m_model->submitAll(); + return m_model->select(); +} + +/************************************************************************** +* 函数名称:updatePriority +* 函数功能:修改好友的优先级 +* 输入参数:FriendInfoData +* 返回数值:bool +* 创建人员: +* 创建时间:2021-05-06 +* 修改人员: +* 修改时间: +**************************************************************************/ +bool FriendInfoDataBase::updatePriority(FriendInfoData *friendInfo) +{ + // 使用query + QString updateSql = QString("update %1 set priority = %2 where friend_id = %3") + .arg(m_dbTableName).arg(friendInfo->m_priority).arg(friendInfo->m_friendId); + query.prepare(updateSql); + return query.exec(); +} + +/************************************************************************** +* 函数名称:updateNickname +* 函数功能:修改好友的备注名 +* 输入参数:FriendInfoData +* 返回数值:bool +* 创建人员: +* 创建时间:2021-05-06 +* 修改人员: +* 修改时间: +**************************************************************************/ +bool FriendInfoDataBase::updateNickname(FriendInfoData *friendInfo) +{ + // 使用query + QString updateSql = QString("update %1 set nickname = %2 where friend_id = %3") + .arg(m_dbTableName).arg(friendInfo->m_nickname).arg(friendInfo->m_friendId); + query.prepare(updateSql); + return query.exec(); +} + +/************************************************************************** +* 函数名称: queryInfoById +* 函数功能: 根据ID获取好友信息 +* 输入参数: friendId +* 返回数值: FriendInfoData +* 创建人员: +* 创建时间: 2021-05-06 +* 修改人员: +* 修改时间: +**************************************************************************/ +FriendInfoData *FriendInfoDataBase::queryInfoById(int friendId) +{ + // 使用query + QString querySql = QString("select * from %1 where friend_id = %2") + .arg(m_dbTableName).arg(friendId); + query.prepare(querySql); + query.exec(); + + FriendInfoData *friendInfo = new FriendInfoData(); + + if (query.next()) { + friendInfo->m_friendId = query.value("friend_id").toInt(); + friendInfo->m_friendUuid = query.value("friend_uuid").toString(); + friendInfo->m_friendIp = query.value("friend_ip").toString(); + friendInfo->m_friendPort = query.value("friend_port").toInt(); + friendInfo->m_friendMac = query.value("friend_mac").toString(); + friendInfo->m_username = query.value("user_name").toString(); + friendInfo->m_nickname = query.value("nickname").toString(); + friendInfo->m_system = query.value("system").toString(); + friendInfo->m_platform = query.value("platform").toString(); + friendInfo->m_avatarUrl = query.value("avatar_url").toString(); + friendInfo->m_recentMsgCont = query.value("recent_msg_content").toString(); + friendInfo->m_recentMsgTime = query.value("recent_msg_time").toString(); + friendInfo->m_unreadMsgNum = query.value("unread_msg_num").toInt(); + friendInfo->m_priority = query.value("priority").toInt(); + } + + return friendInfo; +} + +/************************************************************************** +* 函数名称: queryInfoByUuid +* 函数功能: 根据UUID获取好友信息 +* 输入参数: friendUuid +* 返回数值: FriendInfoData +* 创建人员: +* 创建时间: 2021-05-06 +* 修改人员: +* 修改时间: +**************************************************************************/ +FriendInfoData *FriendInfoDataBase::queryInfoByUuid(QString friendUuid) +{ + // 使用query + QString querySql = QString("select * from %1 where friend_uuid = %2") + .arg(m_dbTableName).arg(friendUuid); + query.prepare(querySql); + query.exec(); + + FriendInfoData *friendInfo = new FriendInfoData(); + + if (query.next()) { + friendInfo->m_friendId = query.value("friend_id").toInt(); + friendInfo->m_friendUuid = query.value("friend_uuid").toString(); + friendInfo->m_friendIp = query.value("friend_ip").toString(); + friendInfo->m_friendPort = query.value("friend_port").toInt(); + friendInfo->m_friendMac = query.value("friend_mac").toString(); + friendInfo->m_username = query.value("user_name").toString(); + friendInfo->m_nickname = query.value("nickname").toString(); + friendInfo->m_system = query.value("system").toString(); + friendInfo->m_platform = query.value("platform").toString(); + friendInfo->m_avatarUrl = query.value("avatar_url").toString(); + friendInfo->m_recentMsgCont = query.value("recent_msg_content").toString(); + friendInfo->m_recentMsgTime = query.value("recent_msg_time").toString(); + friendInfo->m_unreadMsgNum = query.value("unread_msg_num").toInt(); + friendInfo->m_priority = query.value("priority").toInt(); + } + + return friendInfo; +} \ No newline at end of file diff --git a/src/global/database/database.h b/src/global/database/database.h index e69de29..8ac9de8 100644 --- a/src/global/database/database.h +++ b/src/global/database/database.h @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef DATABASE_H +#define DATABASE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class FriendInfoData +{ +public: + FriendInfoData(int m_friendId = 0, + QString m_friendUuid = "", + QString m_friendIp = "", + int m_friendPort = 0, + QString m_friendMac = "", + QString m_username = "", + QString m_nickname = "", + QString m_system = "", + QString m_platform = "", + QString m_avatarUrl = "", + QString m_recentMsgCont = "", + QString m_recentMsgTime = "", + int m_unreadMsgNum = 0, + int m_priority = 0); + + FriendInfoData(QMap strMap, QMap intMap); + ~FriendInfoData(); + + int m_friendId = 0; + QString m_friendUuid = ""; + QString m_friendIp = ""; + int m_friendPort = 0; + QString m_friendMac = ""; + QString m_username = ""; + QString m_nickname = ""; + QString m_system = ""; + QString m_platform = ""; + QString m_avatarUrl = ""; + QString m_recentMsgCont = ""; + QString m_recentMsgTime = ""; + int m_unreadMsgNum = 0; + int m_priority = 0; + + enum strRole { + e_friendUuid = 0, + e_friendIp, + e_friendMac, + e_username, + e_nickname, + e_system, + e_platform, + e_avatarUrl, + e_recentMsgCont, + e_recentMsgTime, + }; + + enum intRole { + e_friendId = 0, + e_friendPort, + e_unreadMsgNum, + e_priority, + }; +}; + +class FriendInfoDataBase : public QObject +{ + Q_OBJECT +public: + explicit FriendInfoDataBase(QObject *parent = nullptr); + ~FriendInfoDataBase(); + + //单例,初始化返回指针,完成数据库文件建立 + static FriendInfoDataBase* getInstance(); + + // 插入数据 + bool insertData(FriendInfoData *friendInfo); + + // 查询数据 + bool queryData(FriendInfoData *friendInfo); + + // 更新数据 + bool updateData(FriendInfoData *friendInfo); + + // 删除数据 + bool deleteData(FriendInfoData *friendInfo); + + // 更新好友优先级 + bool updatePriority(FriendInfoData *friendInfo); + + // 更新好友备注 + bool updateNickname(FriendInfoData *friendInfo); + + // 根据ID获取好友信息 + FriendInfoData *queryInfoById(int friendId); + + // 根据UUID获取好友信息 + FriendInfoData *queryInfoByUuid(QString friendUuid); + + QSqlTableModel* m_model; + + QSqlQuery query; + +private: + QSqlDatabase m_db; + QString m_dbName; + QString m_dbTableName; + + + enum { + UPDATE = 0, + INSERT, + DELETE + }; + int m_operator; +}; + + + + +#endif // DATABASE_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 4b3586e..4c867c0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,32 +48,32 @@ int main(int argc, char *argv[]) { //#if 0 /* 用于测试网络模块 模拟客户端*/ - { - QApplication app(argc , argv); - - Control *control = new Control; -#if 0 - g_udpItem item; - item.uuid = QString("0x7777777"); - item.peerListenIp = QString("172.20.3.250"); - item.peerListenPort = QString("6066"); - GlobalData::getInstance()->m_tcpLink.udpMaintainAdd(item); - - g_send send; - send.uuid = QString("0x7777777"); - send.type = QString("msg"); - send.msgData = QString("阿萨德;放假啊商店里;放假啊搜到放假哦啊配送积分大设计费"); - - TcpClient *client = new TcpClient; - client->tran(send); -#endif +// { +// QApplication app(argc , argv); - app.exec(); - } +// Control *control = new Control; +// #if 0 +// g_udpItem item; +// item.uuid = QString("0x7777777"); +// item.peerListenIp = QString("172.20.3.250"); +// item.peerListenPort = QString("6066"); +// GlobalData::getInstance()->m_tcpLink.udpMaintainAdd(item); + +// g_send send; +// send.uuid = QString("0x7777777"); +// send.type = QString("msg"); +// send.msgData = QString("阿萨德;放假啊商店里;放假啊搜到放假哦啊配送积分大设计费"); + +// TcpClient *client = new TcpClient; +// client->tran(send); +// #endif + +// app.exec(); +// } //#endif // 统一日志输出 - initUkuiLog4qt("kylin-ipmsg"); + // initUkuiLog4qt("kylin-ipmsg"); // 适配4K屏以及分数缩放 #if (QT_VERSION >= QT_VERSION_CHECK(5, 12, 0)) diff --git a/src/model/friendlistmodel.cpp b/src/model/friendlistmodel.cpp index da418ae..aaa3b96 100644 --- a/src/model/friendlistmodel.cpp +++ b/src/model/friendlistmodel.cpp @@ -49,15 +49,30 @@ void FriendListModel::addFriend() // Check if the same uuid is alreay in the friend list + QString avatar = "Z"; + QString nickname = "Zhangsan"; + QString msgContent = "listview"; + QString msgTime = "10:22"; + QString msgNum = "5"; + newItem = new QStandardItem(); - newItem->setData("Z", FriendListModel::Avatar); - newItem->setData("Zhangsan", FriendListModel::Nickname); - newItem->setData("listview", FriendListModel::RecentMsgContent); - newItem->setData("10:22", FriendListModel::RecentMsgTime); - newItem->setData("5", FriendListModel::UnreadMsgNum); + newItem->setData(avatar, FriendListModel::Avatar); + newItem->setData(nickname, FriendListModel::Nickname); + newItem->setData(msgContent, FriendListModel::RecentMsgContent); + newItem->setData(msgTime, FriendListModel::RecentMsgTime); + newItem->setData(msgNum, FriendListModel::UnreadMsgNum); newItem->setData(true, FriendListModel::OnlineState); appendRow(newItem); + + FriendInfoDataBase::getInstance(); + + QMap strMap; + QMap intMap; + strMap.insert("m_friendUuid", QUuid::createUuid().toString()); + strMap.insert("m_avatarUrl", avatar); + strMap.insert("m_nickname", nickname); + FriendInfoDataBase::getInstance()->insertData(new FriendInfoData(strMap, intMap)); } void FriendListModel::updateFriend() { diff --git a/src/model/friendlistmodel.h b/src/model/friendlistmodel.h index 96a258d..f389803 100644 --- a/src/model/friendlistmodel.h +++ b/src/model/friendlistmodel.h @@ -21,6 +21,9 @@ #include #include #include +#include + +#include "../global/database/database.h" class FriendListModel : public QStandardItemModel { diff --git a/src/src.pro b/src/src.pro index 43f4994..29a3ec2 100644 --- a/src/src.pro +++ b/src/src.pro @@ -1,4 +1,4 @@ -QT += core gui network dbus +QT += core gui network dbus sql QT += x11extras KWindowSystem greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -44,13 +44,14 @@ SOURCES += \ $$PWD/view/common/xatom-helper.cpp \ $$PWD/view/common/daemondbus.cpp \ $$PWD/view/common/dbusadaptor.cpp \ - $$PWD/view/common/globaldata.cpp \ + $$PWD/view/common/globalsizedata.cpp\ # $$PWD/view/titlebar/menumodule.cpp \ $$PWD/view/titlebar/titlebar.cpp \ $$PWD/view/localinfo/localinfo.cpp \ $$PWD/view/friendlist/friendlist.cpp\ $$PWD/view/friendlist/friendItemDelegate.cpp \ $$PWD/model/friendlistmodel.cpp \ + $$PWD/global/database/database.cpp \ $$PWD/global/utils/global_data.cpp \ $$PWD/global/utils/tcp_link.cpp \ $$PWD/network/protocol_analysis.cpp \ @@ -65,14 +66,15 @@ HEADERS += \ $$PWD/view/common/xatom-helper.h \ $$PWD/view/common/daemondbus.h \ $$PWD/view/common/dbusadaptor.h \ - $$PWD/view/common/globaldata.h \ + $$PWD/view/common/globalsizedata.h \ # $$PWD/view/titlebar/menumodule.h \ $$PWD/view/titlebar/titlebar.h \ $$PWD/view/localinfo/localinfo.h \ $$PWD/view/friendlist/friendlist.h \ $$PWD/view/friendlist/friendItemDelegate.h \ $$PWD/model/friendlistmodel.h \ - $$PWD/view/common/dbusadaptor.h \ \ + $$PWD/view/common/dbusadaptor.h \ + $$PWD/global/database/database.h \ $$PWD/global/declare/declare.h \ $$PWD/global/utils/global_data.h \ $$PWD/global/utils/tcp_link.h \ diff --git a/src/view/common/globaldata.cpp b/src/view/common/globaldata.cpp deleted file mode 100644 index be926ee..0000000 --- a/src/view/common/globaldata.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2020, KylinSoft Co., Ltd. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "globaldata.h" - -// 主界面 -const int GlobalData::WINDOW_WIDTH = 350; -const int GlobalData::WINDOW_HEIGHT = 686; - -// 标题栏 -const int GlobalData::TITLEBAR_HEIGHT = 40; - -// 本机信息 -const int GlobalData::LOCALINFO_HEIGHT = 140; -const QSize GlobalData::AVATAR_LAB_SIZE = QSize(60, 60); -const QSize GlobalData::USER_NAME_LAB_SIZE = QSize(90, 20); -const QSize GlobalData::USER_IP_LAB_SIZE = QSize(170, 20); -const QSize GlobalData::CHANGE_NAME_BTN_SIZE = QSize(25, 25); -const QSize GlobalData::CHANGE_NAME_BTN_ICON = QSize(16, 16); -const QSize GlobalData::OPEN_FOLDER_BTN_SIZE = QSize(25, 25); -const QSize GlobalData::OPEN_FOLDER_BTN_ICON = QSize(16, 16); -const QSize GlobalData::SEARCH_EDIT_SIZE = QSize(334, 36); - -// 好友列表 -const int GlobalData::FRIEND_LIST_HEIGHT = 506; \ No newline at end of file diff --git a/src/view/common/globalsizedata.cpp b/src/view/common/globalsizedata.cpp new file mode 100644 index 0000000..b99f830 --- /dev/null +++ b/src/view/common/globalsizedata.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "globalsizedata.h" + +// 主界面 +const int GlobalSizeData::WINDOW_WIDTH = 350; +const int GlobalSizeData::WINDOW_HEIGHT = 686; + +// 标题栏 +const int GlobalSizeData::TITLEBAR_HEIGHT = 40; + +// 本机信息 +const int GlobalSizeData::LOCALINFO_HEIGHT = 140; +const QSize GlobalSizeData::AVATAR_LAB_SIZE = QSize(60, 60); +const QSize GlobalSizeData::USER_NAME_LAB_SIZE = QSize(90, 20); +const QSize GlobalSizeData::USER_IP_LAB_SIZE = QSize(170, 20); +const QSize GlobalSizeData::CHANGE_NAME_BTN_SIZE = QSize(25, 25); +const QSize GlobalSizeData::CHANGE_NAME_BTN_ICON = QSize(16, 16); +const QSize GlobalSizeData::OPEN_FOLDER_BTN_SIZE = QSize(25, 25); +const QSize GlobalSizeData::OPEN_FOLDER_BTN_ICON = QSize(16, 16); +const QSize GlobalSizeData::SEARCH_EDIT_SIZE = QSize(334, 36); + +// 好友列表 +const int GlobalSizeData::FRIEND_LIST_HEIGHT = 506; \ No newline at end of file diff --git a/src/view/common/globaldata.h b/src/view/common/globalsizedata.h similarity index 94% rename from src/view/common/globaldata.h rename to src/view/common/globalsizedata.h index 34364cc..94d0ad5 100644 --- a/src/view/common/globaldata.h +++ b/src/view/common/globalsizedata.h @@ -15,14 +15,14 @@ * along with this program. If not, see . */ -#ifndef GLOBALDATA_H -#define GLOBALDATA_H +#ifndef GLOBALSIZEDATA_H +#define GLOBALSIZEDATA_H #include #include #include -class GlobalData +class GlobalSizeData { public: // 主界面 @@ -49,4 +49,4 @@ class GlobalData }; -#endif // GLOBALDATA_H \ No newline at end of file +#endif // GLOBALSIZEDATA_H \ No newline at end of file diff --git a/src/view/friendlist/friendItemDelegate.cpp b/src/view/friendlist/friendItemDelegate.cpp index f1df4e0..1abeb60 100644 --- a/src/view/friendlist/friendItemDelegate.cpp +++ b/src/view/friendlist/friendItemDelegate.cpp @@ -46,7 +46,7 @@ void FriendItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op // painter->setPen(QPen(QColor("#ebeced"))); path.setFillRule( Qt::WindingFill ); //设置填充方式 path.addRoundedRect(itemRect, 0, 0); - painter->fillPath(path, QBrush(QColor("#ebeced"))); + painter->fillPath(path, QBrush(QColor("#EBEBEB"))); } // 好友头像 @@ -69,12 +69,13 @@ void FriendItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op QRectF nicknameRect = QRect(nicknamePoint, nicknameSize); // 最近聊天内容 - QPoint contentPoint(avatarRect.right() + 8, avatarRect.bottom() - 26); + QPoint contentPoint(avatarRect.right() + 8, itemRect.bottom() - 34); QSize contentSize(186, 20); QRectF contentRect = QRect(contentPoint, contentSize); + // contentRect.setBottom(itemRect.bottom() - 16); // 最近聊天时间 - QPoint timePoint(itemRect.right() - 80, itemRect.top() + 16); + QPoint timePoint(itemRect.right() - 80, itemRect.top() + 10); QSize timeSize(60, 20); QRectF timeRect = QRect(timePoint, timeSize); timeRect.setRight(itemRect.right() - 20); @@ -92,29 +93,40 @@ void FriendItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op //绘制文字 QTextOption option; + QFont textFont = painter->font(); option.setAlignment(Qt::AlignLeft | Qt::AlignTop); - painter->setFont(QFont(painter->fontInfo().family(), 14)); + textFont.setPixelSize(16); + painter->setFont(textFont); painter->drawText(nicknameRect, nickname, option); - painter->setFont(QFont(painter->fontInfo().family(), 12)); - painter->drawText(contentRect, msgContent, option); - - option.setAlignment(Qt::AlignRight | Qt::AlignTop); - painter->setFont(QFont(painter->fontInfo().family(), 12)); - painter->drawText(timeRect, msgTime, option); // 白色的字 painter->setPen(QPen(Qt::white)); option.setAlignment(Qt::AlignCenter); - painter->setFont(QFont(painter->fontInfo().family(), 22)); + textFont.setPixelSize(22); + painter->setFont(textFont); painter->drawText(avatarRect, avatar, option); - painter->setFont(QFont(painter->fontInfo().family(), 12)); + textFont.setPixelSize(12); + painter->setFont(textFont); painter->drawText(msgNumRect, msgNum, option); - + // 灰色的字 + painter->setPen(QPen(QColor("#8C8C8C"))); + + option.setAlignment(Qt::AlignLeft | Qt::AlignTop); + textFont.setPixelSize(14); + painter->setFont(textFont); + painter->drawText(contentRect, msgContent, option); + + option.setAlignment(Qt::AlignRight | Qt::AlignTop); + painter->setFont(QFont(painter->fontInfo().family(), 12)); + painter->drawText(timeRect, msgTime, option); + // QObject::setProperty("isWindowButton", 0x1); + // QObject::setProperty("useIconHighlightEffect", 0x2); + // setFlat(true); painter->restore(); } } diff --git a/src/view/friendlist/friendlist.cpp b/src/view/friendlist/friendlist.cpp index d8f3a06..ad2af78 100644 --- a/src/view/friendlist/friendlist.cpp +++ b/src/view/friendlist/friendlist.cpp @@ -30,13 +30,17 @@ FriendListView::FriendListView(QListView *parent) : strList->append("aaaaaaaaaaa"); strList->append("bbbbbbbbbbb"); strList->append("ccccccccccc"); + strList->insert(6, "66666666"); + + qDebug() << strList; strListModel->setStringList(*strList); FriendListModel *friendListModel = new FriendListModel(); - friendListModel->addFriend(); - friendListModel->addFriend(); - friendListModel->addFriend(); + + for (int i = 0; i < 10; i++) { + friendListModel->addFriend(); + } FriendItemDelegate *myItemDelegate = new FriendItemDelegate(); this->setItemDelegate(myItemDelegate); @@ -46,6 +50,8 @@ FriendListView::FriendListView(QListView *parent) : this->setSpacing(0); this->setDragEnabled(false); this->setFrameShape(QListView::NoFrame); + this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + this->verticalScrollBar()->setProperty("drawScrollBarGroove", false); // QThread::sleep(5); diff --git a/src/view/friendlist/friendlist.h b/src/view/friendlist/friendlist.h index aa1bf31..e3dadfa 100644 --- a/src/view/friendlist/friendlist.h +++ b/src/view/friendlist/friendlist.h @@ -21,7 +21,8 @@ #include #include #include - +#include +#include #include // #include "../../model/friendlistmodel.h" diff --git a/src/view/kyview.cpp b/src/view/kyview.cpp index 2b442af..1a3f699 100644 --- a/src/view/kyview.cpp +++ b/src/view/kyview.cpp @@ -60,7 +60,7 @@ void KyView::setWidgetUi() // 标题栏 m_titleBar = new TitleBar(this); - m_titleBar->setFixedHeight(GlobalData::TITLEBAR_HEIGHT); + m_titleBar->setFixedHeight(GlobalSizeData::TITLEBAR_HEIGHT); // 本机信息 m_localInfo = new LocalInfo(this); diff --git a/src/view/kyview.h b/src/view/kyview.h index d00d3c2..bb83171 100644 --- a/src/view/kyview.h +++ b/src/view/kyview.h @@ -29,7 +29,7 @@ #include "titlebar/titlebar.h" #include "localinfo/localinfo.h" -#include "common/globaldata.h" +#include "common/globalsizedata.h" #include "friendlist/friendlist.h" class KyView : public QWidget diff --git a/src/view/localinfo/localinfo.cpp b/src/view/localinfo/localinfo.cpp index 1d8c192..4fbd3a3 100644 --- a/src/view/localinfo/localinfo.cpp +++ b/src/view/localinfo/localinfo.cpp @@ -34,7 +34,7 @@ LocalInfo::~LocalInfo() // 初始化组件 void LocalInfo::setWidgetUi() { - this->setFixedHeight(GlobalData::LOCALINFO_HEIGHT); + this->setFixedHeight(GlobalSizeData::LOCALINFO_HEIGHT); // 初始化组件及布局 m_avatarLab = new QLabel(this); @@ -80,7 +80,7 @@ void LocalInfo::setWidgetStyle() this->setBackgroundRole(QPalette::Base); // 本机头像 - m_avatarLab->setFixedSize(GlobalData::AVATAR_LAB_SIZE); + m_avatarLab->setFixedSize(GlobalSizeData::AVATAR_LAB_SIZE); QPalette avatarLabPe; avatarLabPe.setColor(QPalette::Background, QColor("#3D6BE5")); @@ -92,20 +92,20 @@ void LocalInfo::setWidgetStyle() m_avatarLab->setFont(avatarLabFont); m_avatarLab->setAlignment(Qt::AlignCenter); - m_userNameLab->setFixedSize(GlobalData::USER_NAME_LAB_SIZE); + m_userNameLab->setFixedSize(GlobalSizeData::USER_NAME_LAB_SIZE); - m_userIPLab->setFixedSize(GlobalData::USER_IP_LAB_SIZE); + m_userIPLab->setFixedSize(GlobalSizeData::USER_IP_LAB_SIZE); m_changeNameBtn->setIcon(QIcon::fromTheme("document-edit-symbolic")); - m_changeNameBtn->setIconSize(GlobalData::CHANGE_NAME_BTN_ICON); - m_changeNameBtn->setFixedSize(GlobalData::CHANGE_NAME_BTN_SIZE); + m_changeNameBtn->setIconSize(GlobalSizeData::CHANGE_NAME_BTN_ICON); + m_changeNameBtn->setFixedSize(GlobalSizeData::CHANGE_NAME_BTN_SIZE); m_changeNameBtn->setProperty("isWindowButton", 0x1); m_changeNameBtn->setProperty("useIconHighlightEffect", 0x2); m_changeNameBtn->setFlat(true); m_openFolderBtn->setIcon(QIcon::fromTheme("document-open-symbolic")); - m_openFolderBtn->setIconSize(GlobalData::OPEN_FOLDER_BTN_ICON); - m_openFolderBtn->setFixedSize(GlobalData::OPEN_FOLDER_BTN_SIZE); + m_openFolderBtn->setIconSize(GlobalSizeData::OPEN_FOLDER_BTN_ICON); + m_openFolderBtn->setFixedSize(GlobalSizeData::OPEN_FOLDER_BTN_SIZE); m_openFolderBtn->setProperty("isWindowButton", 0x1); m_openFolderBtn->setProperty("useIconHighlightEffect", 0x2); m_openFolderBtn->setFlat(true); diff --git a/src/view/localinfo/localinfo.h b/src/view/localinfo/localinfo.h index 8e8c46b..50695e0 100644 --- a/src/view/localinfo/localinfo.h +++ b/src/view/localinfo/localinfo.h @@ -25,7 +25,7 @@ #include #include -#include "../common/globaldata.h" +#include "../common/globalsizedata.h" class LocalInfo : public QWidget { diff --git a/src/view/titlebar/titlebar.cpp b/src/view/titlebar/titlebar.cpp index 256f4c6..138afdd 100644 --- a/src/view/titlebar/titlebar.cpp +++ b/src/view/titlebar/titlebar.cpp @@ -34,7 +34,7 @@ TitleBar::~TitleBar() // 初始化组件 void TitleBar::setWidgetUi() { - this->setFixedHeight(GlobalData::TITLEBAR_HEIGHT); + this->setFixedHeight(GlobalSizeData::TITLEBAR_HEIGHT); m_titleLayout = new QHBoxLayout(this); } diff --git a/src/view/titlebar/titlebar.h b/src/view/titlebar/titlebar.h index fba2fec..677cfb8 100644 --- a/src/view/titlebar/titlebar.h +++ b/src/view/titlebar/titlebar.h @@ -24,7 +24,7 @@ #include // #include "menumodule.h" -#include "../common/globaldata.h" +#include "../common/globalsizedata.h" class TitleBar : public QWidget { From 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 Mon Sep 17 00:00:00 2001 From: mobaixin <13687162414@163.com> Date: Thu, 6 May 2021 20:33:59 +0800 Subject: [PATCH 27/31] Update menubutton --- src/src.pro | 4 +- src/view/titlebar/menumodule.cpp | 428 ++++++++++++++++++++----------- src/view/titlebar/menumodule.h | 85 +++--- 3 files changed, 335 insertions(+), 182 deletions(-) diff --git a/src/src.pro b/src/src.pro index 29a3ec2..8aaa4be 100644 --- a/src/src.pro +++ b/src/src.pro @@ -45,7 +45,7 @@ SOURCES += \ $$PWD/view/common/daemondbus.cpp \ $$PWD/view/common/dbusadaptor.cpp \ $$PWD/view/common/globalsizedata.cpp\ -# $$PWD/view/titlebar/menumodule.cpp \ + $$PWD/view/titlebar/menumodule.cpp \ $$PWD/view/titlebar/titlebar.cpp \ $$PWD/view/localinfo/localinfo.cpp \ $$PWD/view/friendlist/friendlist.cpp\ @@ -67,7 +67,7 @@ HEADERS += \ $$PWD/view/common/daemondbus.h \ $$PWD/view/common/dbusadaptor.h \ $$PWD/view/common/globalsizedata.h \ -# $$PWD/view/titlebar/menumodule.h \ + $$PWD/view/titlebar/menumodule.h \ $$PWD/view/titlebar/titlebar.h \ $$PWD/view/localinfo/localinfo.h \ $$PWD/view/friendlist/friendlist.h \ diff --git a/src/view/titlebar/menumodule.cpp b/src/view/titlebar/menumodule.cpp index e28c70f..a7b9bc5 100644 --- a/src/view/titlebar/menumodule.cpp +++ b/src/view/titlebar/menumodule.cpp @@ -1,44 +1,67 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + #include "menumodule.h" +#include "../common/xatom-helper.h" menuModule::menuModule(QWidget *parent = nullptr) : QWidget(parent) { init(); } - -void menuModule::init(){ +void menuModule::init() +{ initAction(); + setStyle(); } -void menuModule::initAction(){ - - m_bodyAppName = new QLabel(); - - m_bodyAppVersion = new QLabel(); - m_bodySupport = new QLabel(); - m_titleText = new QLabel(); - - m_bodySupport->setText(tr("Service & Support Team: ") + - "" - "support@kylinos.cn"); - m_bodyAppVersion->setText(tr("Version: ") + m_appVersion); - - menuButton = new QToolButton; - menuButton->setToolTip(tr("menu")); - menuButton->setIcon(QIcon::fromTheme("open-menu-symbolic")); +void menuModule::initAction() +{ + // aboutWindow = new QWidget(); + titleText = new QLabel(); + bodyAppName = new QLabel(); + bodyAppVersion = new QLabel(); + bodySupport = new QLabel(); + + iconSize = QSize(30,30); + menuButton = new QToolButton(this); + menuButton->setToolTip(tr("Menu")); menuButton->setProperty("isWindowButton", 0x1); - menuButton->setProperty("useIconHighlightEffect",0x2); - menuButton->setIconSize(SizeDate::MICONSIZES); + menuButton->setProperty("useIconHighlightEffect", 0x2); menuButton->setPopupMode(QToolButton::InstantPopup); - menuButton->setFixedSize(SizeDate::MBTNSIZE); + menuButton->setFixedSize(30,30); + menuButton->setIconSize(QSize(16, 16)); menuButton->setAutoRaise(true); - menuButton->setFocusPolicy(Qt::NoFocus); - m_menu = new QMenu(); + menuButton->setIcon(QIcon::fromTheme("open-menu-symbolic")); + m_menu = new QMenu(); QList actions ; - QAction *actionOpen = new QAction(m_menu); - actionOpen->setText(tr("Open..")); + QAction *actionStandard = new QAction(m_menu); + actionStandard->setText(tr("Standard")); + QAction *actionScientific = new QAction(m_menu); + actionScientific->setText(tr("Scientific")); + QAction *actionExchangeRate = new QAction(m_menu); + actionExchangeRate->setText(tr("Exchange Rate")); + + QAction *separator = new QAction(m_menu); + separator->setSeparator(true); + QAction *actionTheme = new QAction(m_menu); actionTheme->setText(tr("Theme")); QAction *actionHelp = new QAction(m_menu); @@ -47,196 +70,296 @@ void menuModule::initAction(){ actionAbout->setText(tr("About")); QAction *actionQuit = new QAction(m_menu); actionQuit->setText(tr("Quit")); - actions<addActions(actions); + // 互斥按钮组 - QMenu *m_themeMenu = new QMenu; - QActionGroup *m_themeMenuGroup = new QActionGroup(this); - QAction *autoTheme = new QAction("Auto",this); - m_themeMenuGroup->addAction(autoTheme); - m_themeMenu->addAction(autoTheme); + QMenu *themeMenu = new QMenu; + QActionGroup *themeMenuGroup = new QActionGroup(this); + QAction *autoTheme = new QAction(tr("Auto"),this); + themeMenuGroup->addAction(autoTheme); + themeMenu->addAction(autoTheme); autoTheme->setCheckable(true); - QAction *lightTheme = new QAction("Light",this); - m_themeMenuGroup->addAction(lightTheme); - m_themeMenu->addAction(lightTheme); + QAction *lightTheme = new QAction(tr("Light"),this); + themeMenuGroup->addAction(lightTheme); + themeMenu->addAction(lightTheme); lightTheme->setCheckable(true); - QAction *darkTheme = new QAction("Dark",this); - m_themeMenuGroup->addAction(darkTheme); - m_themeMenu->addAction(darkTheme); + QAction *darkTheme = new QAction(tr("Dark"),this); + themeMenuGroup->addAction(darkTheme); + themeMenu->addAction(darkTheme); darkTheme->setCheckable(true); QList themeActions; themeActions<setMenu(m_themeMenu); +// autoTheme->setChecked(true); + actionTheme->setMenu(themeMenu); menuButton->setMenu(m_menu); connect(m_menu,&QMenu::triggered,this,&menuModule::triggerMenu); - connect(this,&menuModule::menuModuleClose,KyView::mutual,&KyView::close); - initGsetting(); + setThemeFromLocalThemeSetting(themeActions); + themeUpdate(); + connect(themeMenu,&QMenu::triggered,this,&menuModule::triggerThemeMenu); } +void menuModule::setThemeFromLocalThemeSetting(QList themeActions) +{ + m_pGsettingThemeStatus = new QGSettings(confPath.toLocal8Bit()); + QString appConf = m_pGsettingThemeStatus->get("thememode").toString(); + if("lightonly" == appConf){ + themeStatus = themeLightOnly; + themeActions[1]->setChecked(true); //程序gsetting中为浅色only的时候就给浅色按钮设置checked + }else if("darkonly" == appConf){ + themeStatus = themeBlackOnly; + themeActions[2]->setChecked(true); + }else{ + themeStatus = themeAuto; + themeActions[0]->setChecked(true); + } +} +void menuModule::themeUpdate(){ + if(themeStatus == themeLightOnly) + { + setThemeLight(); + } + else if(themeStatus == themeBlackOnly){ + setThemeDark(); + } + else{ + setStyleByThemeGsetting(); + } +} void menuModule::setStyleByThemeGsetting(){ QString nowThemeStyle = m_pGsettingThemeData->get("styleName").toString(); - if("ukui-dark" == nowThemeStyle || "ukui-black" == nowThemeStyle) - { + if("ukui-dark" == nowThemeStyle || "ukui-black" == nowThemeStyle) { setThemeDark(); - }else if("ukui-default" == nowThemeStyle || "ukui-light" == nowThemeStyle || "ukui-white" == nowThemeStyle){ + } + else { setThemeLight(); - }else{ - return; } } -void menuModule::triggerMenu(QAction *act){ - - - +void menuModule::triggerMenu(QAction *act) +{ QString str = act->text(); if(tr("Quit") == str){ emit menuModuleClose(); - }else if(tr("About") == str){ + } + else if(tr("About") == str){ aboutAction(); - }else if(tr("Help") == str){ + } + else if(tr("Help") == str){ helpAction(); - }else if(tr("Open..") == str){ - emit openSignal(); + } + else if(tr("Standard") == str){ + emit menuModuleChanged(QString("standard")); + } + else if(tr("Scientific") == str){ + emit menuModuleChanged(QString("scientific")); + } + else if(tr("Exchange Rate") == str){ + emit menuModuleChanged(QString("exchange rate")); } } -void menuModule::aboutAction(){ -// 关于点击事件处理 +void menuModule::triggerThemeMenu(QAction *act) +{ + if(!m_pGsettingThemeStatus) + { + m_pGsettingThemeStatus = new QGSettings(confPath.toLocal8Bit()); //m_pGsettingThemeStatus指针重复使用避免占用栈空间 + } + QString str = act->text(); + if("Light" == str){ + themeStatus = themeLightOnly; + disconnect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); + m_pGsettingThemeStatus->set("thememode","lightonly"); +// disconnect() + setThemeLight(); + }else if("Dark" == str){ + themeStatus = themeBlackOnly; + disconnect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); + m_pGsettingThemeStatus->set("thememode","darkonly"); + setThemeDark(); + }else{ + themeStatus = themeAuto; + m_pGsettingThemeStatus->set("thememode","auto"); + initGsetting(); +// updateTheme(); + themeUpdate(); + } +} +void menuModule::aboutAction() +{ +// 关于点击事件处理 + // if (aboutWindow != nullptr) { + // aboutWindow->hide(); + + // QTime dieTime = QTime::currentTime().addMSecs(50); + // while( QTime::currentTime() < dieTime ) + // QCoreApplication::processEvents(QEventLoop::AllEvents, 100); + + + // aboutWindow->show(); + // // aboutWindow->activateWindow(); + // return ; + // } initAbout(); } -void menuModule::helpAction(){ -// 帮助点击事件处理 - - m_appName = SizeDate::USERGUIDE; - if(!m_ipcDbus){ - m_ipcDbus = new DaemonDbus(); - } - - if(!m_ipcDbus->daemonIsNotRunning()){ - m_ipcDbus->showGuide(m_appName); +void menuModule::helpAction() +{ + // 帮助点击事件处理 + if(!DaemonDbus::getInstance()->daemonIsNotRunning()){ + // qDebug() << "hahahahahaha" << appName; + DaemonDbus::getInstance()->showGuide(appName); } } - -void menuModule::initAbout(){ - - emit aboutShow(); - m_aboutWindow->deleteLater(); - m_aboutWindow = new QDialog(); - m_aboutWindow->installEventFilter(this); - m_aboutWindow->setWindowModality(Qt::ApplicationModal); - m_aboutWindow->setWindowFlag(Qt::Tool); - m_aboutWindow->setAutoFillBackground(true); - m_aboutWindow->setBackgroundRole(QPalette::Base); - - +#include +void menuModule::initAbout() +{ + aboutWindow = new QWidget(); + aboutWindow->setWindowFlag(Qt::Tool); + aboutWindow->setWindowIcon(QIcon::fromTheme("kylin-calculator")); + aboutWindow->setWindowModality(Qt::WindowModal); + aboutWindow->setWindowModality(Qt::ApplicationModal); + // aboutWindow->setModal(true); + // aboutWindow->setWindowFlags(Qt::FramelessWindowHint); MotifWmHints hints; + // aboutWindow->setWindowFlags(Qt::WindowStaysOnTopHint); hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; hints.functions = MWM_FUNC_ALL; hints.decorations = MWM_DECOR_BORDER; - XAtomHelper::getInstance()->setWindowMotifHint(m_aboutWindow->winId(), hints); - - m_aboutWindow->setFixedSize(SizeDate::MABOUT); - m_aboutWindow->setMinimumHeight(SizeDate::MABOUT.height()); + XAtomHelper::getInstance()->setWindowMotifHint(aboutWindow->winId(), hints); + aboutWindow->setFixedSize(420,324); + aboutWindow->setMinimumHeight(324); QVBoxLayout *mainlyt = new QVBoxLayout(); QHBoxLayout *titleLyt = initTitleBar(); QVBoxLayout *bodylyt = initBody(); - mainlyt->setMargin(0); + mainlyt->setContentsMargins(0,0,0,0); + mainlyt->setSpacing(0); mainlyt->addLayout(titleLyt); mainlyt->addLayout(bodylyt); mainlyt->addStretch(); - m_aboutWindow->setLayout(mainlyt); - //TODO:在中央显示 - QRect availableGeometry = this->parentWidget()->parentWidget()->geometry(); - m_aboutWindow->move(availableGeometry.center()-m_aboutWindow->rect().center()); - m_aboutWindow->show(); + aboutWindow->setLayout(mainlyt); + // 关于弹窗应用内居中 + QRect availableGeometry = this->parentWidget()->parentWidget()->parentWidget()->geometry(); + aboutWindow->move(availableGeometry.center() - aboutWindow->rect().center()); + // aboutWindow->setStyleSheet("background-color:rgba(255,255,255,1);"); + dealSystemGsettingChange("styleName"); + aboutWindow->show(); } -QHBoxLayout* menuModule::initTitleBar(){ +QHBoxLayout* menuModule::initTitleBar() +{ QLabel* titleIcon = new QLabel(); - titleIcon->setFixedSize(SizeDate::MICONSIZEM); - - m_appShowingName = tr("kylin photo view"); - m_iconPath = ":/res/res/kyview_logo.png"; - titleIcon->setPixmap(QPixmap::fromImage(QImage(m_iconPath))); + titleIcon->setPixmap(QIcon::fromTheme("kylin-calculator").pixmap(titleIcon->size())); + titleIcon->setFixedSize(QSize(24,24)); titleIcon->setScaledContents(true); QPushButton *titleBtnClose = new QPushButton; + titleBtnClose->setFixedSize(30,30); titleBtnClose->setIcon(QIcon::fromTheme("window-close-symbolic")); - titleBtnClose->setToolTip(tr("close")); - titleBtnClose->setFixedSize(SizeDate::MBTNSIZE); - titleBtnClose->setFocusPolicy(Qt::NoFocus);//设置焦点类型 - titleBtnClose->setProperty("isWindowButton", 0x2); - titleBtnClose->setProperty("useIconHighlightEffect", 0x8); + titleBtnClose->setProperty("isWindowButton",0x2); + titleBtnClose->setProperty("useIconHighlightEffect",0x8); titleBtnClose->setFlat(true); - connect(titleBtnClose,&QPushButton::clicked,[=](){m_aboutWindow->close();}); - + connect(titleBtnClose,&QPushButton::clicked,[=](){aboutWindow->close();}); + + titleText->setText(tr(appShowingName.toLocal8Bit())); + titleText->setStyleSheet("font-size:14px;"); + QHBoxLayout *hlyt = new QHBoxLayout; - m_titleText->setText(tr("Kylin Photo View")); hlyt->setSpacing(0); - hlyt->setMargin(4); + hlyt->setContentsMargins(4,4,4,4); hlyt->addSpacing(4); - hlyt->addWidget(titleIcon,0,Qt::AlignBottom); //居下显示 + hlyt->addWidget(titleIcon); //居下显示 hlyt->addSpacing(8); - hlyt->addWidget(m_titleText,0,Qt::AlignBottom); + hlyt->addWidget(titleText); hlyt->addStretch(); - hlyt->addWidget(titleBtnClose,0,Qt::AlignBottom); + hlyt->addWidget(titleBtnClose); + return hlyt; } -QVBoxLayout* menuModule::initBody(){ - m_appVersion = SizeDate::VERSIONNEM; +QVBoxLayout* menuModule::initBody() +{ + QLabel* bodyIcon = new QLabel(); - bodyIcon->setFixedSize(SizeDate::MICONSIZEB); - bodyIcon->setPixmap(QPixmap::fromImage(QImage(m_iconPath))); - bodyIcon->setStyleSheet("font-size:14px;"); - bodyIcon->setScaledContents(true); - m_bodyAppName->setFixedHeight(SizeDate::NAMEHEIGHT); - m_bodyAppName->setText(tr(m_appShowingName.toLocal8Bit())); - m_bodyAppVersion->setFixedHeight(SizeDate::VERSIONHEI); - m_bodyAppVersion->setText(tr("Version: ") + m_appVersion); - m_bodyAppVersion->setAlignment(Qt::AlignLeft); - - connect(m_bodySupport,&QLabel::linkActivated,this,[=](const QString url){ + bodyIcon->setFixedSize(96,96); + bodyIcon->setPixmap(QIcon::fromTheme("kylin-calculator").pixmap(bodyIcon->size())); + // bodyIcon->setStyleSheet("font-size:14px;"); + // bodyIcon->setScaledContents(true); + + bodyAppName->setFixedHeight(28); + bodyAppName->setText(tr(appShowingName.toLocal8Bit())); + bodyAppName->setStyleSheet("font-size:18px;"); + + bodyAppVersion->setFixedHeight(24); + bodyAppVersion->setText(tr("Version: ") + appVersion); + bodyAppVersion->setAlignment(Qt::AlignLeft); + bodyAppVersion->setStyleSheet("font-size:14px;"); + + connect(bodySupport,&QLabel::linkActivated,this,[=](const QString url){ QDesktopServices::openUrl(QUrl(url)); }); - m_bodySupport->setFixedHeight(SizeDate::VERSIONHEI); - m_bodySupport->setContextMenuPolicy(Qt::NoContextMenu); + bodySupport->setContextMenuPolicy(Qt::NoContextMenu); + bodySupport->setFixedHeight(24); + bodySupport->setStyleSheet("font-size:14px;"); QVBoxLayout *vlyt = new QVBoxLayout; vlyt->setMargin(0); vlyt->setSpacing(0); vlyt->addSpacing(20); vlyt->addWidget(bodyIcon,0,Qt::AlignHCenter); vlyt->addSpacing(16); - vlyt->addWidget(m_bodyAppName,0,Qt::AlignHCenter); + vlyt->addWidget(bodyAppName,0,Qt::AlignHCenter); vlyt->addSpacing(12); - vlyt->addWidget(m_bodyAppVersion,0,Qt::AlignHCenter); + vlyt->addWidget(bodyAppVersion,0,Qt::AlignHCenter); vlyt->addSpacing(12); - vlyt->addWidget(m_bodySupport,0,Qt::AlignHCenter); + vlyt->addWidget(bodySupport,0,Qt::AlignHCenter); vlyt->addStretch(); return vlyt; } +void menuModule::setStyle() +{ + // menuButton->setObjectName("menuButton"); + // // qDebug() << "menuButton->styleSheet" << menuButton->styleSheet(); + // menuButton->setStyleSheet("QPushButton::menu-indicator{image:None;}"); +} + void menuModule::initGsetting(){ - if(QGSettings::isSchemaInstalled(FITTHEMEWINDOW)){ - m_pGsettingThemeData = new QGSettings(FITTHEMEWINDOW); + if(QGSettings::isSchemaInstalled(UKUI_THEME_GSETTING_PATH)){ + m_pGsettingThemeData = new QGSettings(UKUI_THEME_GSETTING_PATH); connect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); } } -void menuModule::dealSystemGsettingChange(const QString key){ +void menuModule::keyPressEvent(QKeyEvent *event){ + if(event->key() == Qt::Key_F1){ + emit pullupHelp(); + }else{ + QWidget::keyPressEvent(event); + } +} + +void menuModule::dealSystemGsettingChange(const QString key) +{ if(key == "styleName"){ refreshThemeBySystemConf(); } } -void menuModule::refreshThemeBySystemConf(){ +void menuModule::refreshThemeBySystemConf() +{ QString themeNow = m_pGsettingThemeData->get("styleName").toString(); if("ukui-dark" == themeNow || "ukui-black" == themeNow){ setThemeDark(); @@ -245,32 +368,37 @@ void menuModule::refreshThemeBySystemConf(){ } } -void menuModule::setThemeDark(){ - - - m_titleText->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); - m_bodyAppName->setStyleSheet("color:rgba(255,255,255,1);font-size:18px;"); - m_bodyAppVersion->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); - m_bodySupport->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); - - m_bodySupport->setText(tr("Service & Support Team: ") + +void menuModule::setThemeDark() +{ + qDebug()<<"set theme dark"; + if(aboutWindow) + { + QPalette palette(this->palette()); + palette.setColor(QPalette::Background, QColor::fromRgb(13,13,14)); + aboutWindow->setPalette(palette); + // aboutWindow->setStyleSheet("background-color:rgba(13,13,14,1);"); + } + emit menuModuleSetThemeStyle("dark-theme"); + bodySupport->setText(tr("Service & Support: ") + "" + "style=\"color:rgba(225,225,225,1)\">" "support@kylinos.cn"); + // menuButton->setProperty("setIconHighlightEffectDefaultColor", QColor(Qt::white)); } -void menuModule::setThemeLight(){ - - - m_titleText->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); - m_bodyAppName->setStyleSheet("color:rgba(0,0,0,1);font-size:18px;"); - m_bodyAppVersion->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); - m_bodySupport->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); - - m_bodySupport->setText(tr("Service & Support Team: ") + +void menuModule::setThemeLight() +{ +// qDebug()<<"set theme light"; + if(aboutWindow) + { + QPalette palette(this->palette()); + palette.setColor(QPalette::Background, QColor::fromRgb(255,255,255)); + aboutWindow->setPalette(palette); + // aboutWindow->setStyleSheet("background-color:rgba(255,255,255,1);"); + } + emit menuModuleSetThemeStyle("light-theme"); + bodySupport->setText(tr("Service & Support: ") + "" "support@kylinos.cn"); } - - diff --git a/src/view/titlebar/menumodule.h b/src/view/titlebar/menumodule.h index 55ca023..d95d8e1 100644 --- a/src/view/titlebar/menumodule.h +++ b/src/view/titlebar/menumodule.h @@ -1,28 +1,46 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef MENUMODULE_H #define MENUMODULE_H -#define DEBUG_MENUMODULE 0 //DEBUG模式开关,代码上线之前务必关掉 -#define FITTHEMEWINDOW "org.ukui.style" -//#define APPDATA "org.kylin-photo-viewer-data.settings" 0301-cancel + +#ifndef UKUI_THEME_GSETTING_PATH +#define UKUI_THEME_GSETTING_PATH "org.ukui.style" +#endif + +#include #include #include #include #include +#include #include #include #include #include #include -#include #include #include #include +#include #include #include #include -#include -#include "../kyview.h" -#include "../common/xatom-helper.h" #include "../common/daemondbus.h" class menuModule : public QWidget @@ -31,30 +49,35 @@ class menuModule : public QWidget public: explicit menuModule(QWidget *); void themeUpdate(); -// void changeVolumePos(int posX, int posY, int width, int height); + signals: - void menuModuleClose();//从标题栏点击退出的信号 - void openSignal();//从标题栏进行打开图片的信号 - void aboutShow();//打开关于,主界面两栏的显示情况 -// void menuModuleSetThemeStyle(QString); + void menuModuleClose(); + void menuModuleChanged(QString); + void pullupHelp(); + + void menuModuleSetThemeStyle(QString); public: QToolButton *menuButton = nullptr; - QMenu *m_menu = nullptr; -private: - QString m_appShowingName; - QString m_appVersion; - QString m_appName; - QString m_appDesc = "appDesc字段未填充!"; - QString m_iconPath; - QString m_confPath = "org.china-weather-data.settings"; - QMenu *m_themeMenu = nullptr; - QDialog *m_aboutWindow = nullptr; +public: +// 程序在实例化的时候需要传递的信息字段,打开debug开关后这些字段会被自动填充 + QString appName = "tools/kylin-calculator"; //格式kylin-usb-creator + QString appShowingName = tr("Calculator"); //格式kylin usb creator ,用来在前端展示 + QString appVersion = qApp->applicationVersion(); + QString appDesc = "kylin calculator"; + QString confPath = "org.kylin-calculator-data.settings"; + QWidget *aboutWindow = nullptr; +private: + QMenu *m_menu = nullptr; + QMenu *themeMenu = nullptr; + QSize iconSize; + QString appPath = "tools/kylin-calculator"; //拉起帮助菜单时使用appName字段 + QGSettings *m_pGsettingThemeData = nullptr; QGSettings *m_pGsettingThemeStatus = nullptr; - DaemonDbus *m_ipcDbus = nullptr; - enum typeThemeStatus { - themeAuto = 0, + enum typeThemeStatus : int + { + themeAuto = 0, themeBlackOnly = 1, themeLightOnly = 2 } themeStatus; @@ -62,11 +85,13 @@ class menuModule : public QWidget public slots: void dealSystemGsettingChange(const QString); private: + void keyPressEvent(QKeyEvent *event); void init(); QHBoxLayout* initTitleBar(); //关于窗口标题栏初始化 QVBoxLayout* initBody(); // 关于窗口body初始化 void initGsetting(); void initAction(); + void setStyle(); void triggerMenu(QAction* act); //主菜单动作4 void triggerThemeMenu(QAction* act); //主题动作 void aboutAction(); @@ -77,13 +102,13 @@ public slots: void setThemeStyle(); void setThemeLight(); void setThemeDark(); +// void updateTheme(); //点击菜单中的主题设置后更新一次主题 + QLabel* titleText = nullptr; + QLabel* bodyAppName = nullptr; + QLabel* bodyAppVersion = nullptr; + QLabel* bodySupport = nullptr; void refreshThemeBySystemConf(); //通过系统配置更改主题 - - QLabel* m_titleText = nullptr; - QLabel* m_bodyAppVersion = nullptr; - QLabel* m_bodySupport = nullptr; - QLabel* m_bodyAppName = nullptr; }; #endif // MENUMODULE_H From b7d2eb3c7ef606984091b0e8a4ff1401c138de0b Mon Sep 17 00:00:00 2001 From: zxx Date: Fri, 7 May 2021 16:26:32 +0800 Subject: [PATCH 28/31] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E5=92=8C=E6=9C=AC=E6=9C=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 2 +- src/src.pro | 6 +- src/view/kyview.cpp | 4 +- src/view/localinfo/localinfo.cpp | 209 ++++++++++---- src/view/localinfo/localinfo.h | 28 +- src/view/titlebar/menumodule.cpp | 451 ++++++++++++++++++++----------- src/view/titlebar/menumodule.h | 83 ++++-- src/view/titlebar/titlebar.cpp | 116 +++++++- src/view/titlebar/titlebar.h | 30 +- 9 files changed, 669 insertions(+), 260 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4c867c0..be6593e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,7 +27,7 @@ #include #include -#include +//#include #include #include diff --git a/src/src.pro b/src/src.pro index 29a3ec2..1a2ba64 100644 --- a/src/src.pro +++ b/src/src.pro @@ -20,7 +20,7 @@ CONFIG += c++11 PKGCONFIG += gsettings-qt # 统一日志输出 -LIBS += -L/usr/lib/libukui-log4qt.so.1.0.0 -lukui-log4qt +#LIBS += -L/usr/lib/libukui-log4qt.so.1.0.0 -lukui-log4qt TARGET = kylin-messages TEMPLATE = app @@ -45,7 +45,7 @@ SOURCES += \ $$PWD/view/common/daemondbus.cpp \ $$PWD/view/common/dbusadaptor.cpp \ $$PWD/view/common/globalsizedata.cpp\ -# $$PWD/view/titlebar/menumodule.cpp \ + $$PWD/view/titlebar/menumodule.cpp \ $$PWD/view/titlebar/titlebar.cpp \ $$PWD/view/localinfo/localinfo.cpp \ $$PWD/view/friendlist/friendlist.cpp\ @@ -67,7 +67,7 @@ HEADERS += \ $$PWD/view/common/daemondbus.h \ $$PWD/view/common/dbusadaptor.h \ $$PWD/view/common/globalsizedata.h \ -# $$PWD/view/titlebar/menumodule.h \ + $$PWD/view/titlebar/menumodule.h \ $$PWD/view/titlebar/titlebar.h \ $$PWD/view/localinfo/localinfo.h \ $$PWD/view/friendlist/friendlist.h \ diff --git a/src/view/kyview.cpp b/src/view/kyview.cpp index 1a3f699..b3e9a95 100644 --- a/src/view/kyview.cpp +++ b/src/view/kyview.cpp @@ -30,6 +30,7 @@ KyView *KyView::getInstance() KyView::KyView(QWidget *parent) : QWidget(parent) { + // 初始化组件 setWidgetUi(); @@ -64,6 +65,7 @@ void KyView::setWidgetUi() // 本机信息 m_localInfo = new LocalInfo(this); + m_localInfo->setText("bb-本机","123.123.132.123"); // 好友列表 m_friendListView = new FriendListView(); @@ -87,4 +89,4 @@ void KyView::setWidgetStyle() // 毛玻璃效果 // this->setProperty("useSystemStyleBur", true); // this->setAttribute(Qt::WA_TranslucentBackground, true); -} \ No newline at end of file +} diff --git a/src/view/localinfo/localinfo.cpp b/src/view/localinfo/localinfo.cpp index 4fbd3a3..93b0d32 100644 --- a/src/view/localinfo/localinfo.cpp +++ b/src/view/localinfo/localinfo.cpp @@ -16,6 +16,8 @@ */ #include "localinfo.h" +#include +#include LocalInfo::LocalInfo(QWidget *parent) : QWidget(parent) @@ -37,40 +39,77 @@ void LocalInfo::setWidgetUi() this->setFixedHeight(GlobalSizeData::LOCALINFO_HEIGHT); // 初始化组件及布局 - m_avatarLab = new QLabel(this); - m_userIPLab = new QLabel(this); - m_userNameLab = new QLabel(this); + u_LabelIcon = new QLabel(this); + u_LabelName = new QLabel(this); + u_LabelIp = new QLabel(this); + u_ButtonUpdate = new QPushButton(this); + u_ButtonFile = new QPushButton(this); + + s_LabelIcon = new QLabel(this); + s_EditSearch=new QLineEdit(this); + + // 设置空间大小 + u_LabelIcon->setFixedSize(60,60); + u_ButtonUpdate->setFixedSize(20,20); + u_ButtonFile->setFixedSize(20,20); + s_EditSearch->setFixedSize(334, 36); + w = s_EditSearch->width(); + h = s_EditSearch->height(); + s_LabelIcon->setFixedSize(w/2-5,h); + + QMargins margins = s_EditSearch->textMargins(); + s_EditSearch->setTextMargins(margins.left(), margins.top(), s_LabelIcon->width(), margins.bottom()); + s_EditSearch->setPlaceholderText(tr("搜索"));//提示文字 + s_EditSearch->setMaxLength(30);//字数限制 + s_EditSearch->setTextMargins(s_LabelIcon->width(), 1, 1 , 1);// 设置输入框中文件输入区,不让输入的文字在被隐藏在按钮下 - m_changeNameBtn = new QPushButton(this); - m_openFolderBtn = new QPushButton(this); - - m_searchEdit = new QLineEdit(this); m_localInfoLayout = new QVBoxLayout(this); m_nameLayout = new QHBoxLayout(); m_ipLayout = new QVBoxLayout(); m_avatarLayout = new QHBoxLayout(); - + m_searchLayout = new QHBoxLayout(); // 对组件进行布局 - m_nameLayout->addWidget(m_userNameLab, Qt::AlignBottom); - m_nameLayout->addWidget(m_changeNameBtn, Qt::AlignBottom | Qt::AlignLeft); + m_nameLayout->addWidget(u_LabelName, Qt::AlignBottom); + m_nameLayout->addWidget(u_ButtonUpdate, Qt::AlignBottom | Qt::AlignLeft); m_nameLayout->addStretch(); - m_nameLayout->addWidget(m_openFolderBtn, Qt::AlignBottom | Qt::AlignRight); + m_nameLayout->addWidget(u_ButtonFile, Qt::AlignBottom | Qt::AlignRight); m_nameLayout->setMargin(0); m_nameLayout->setSpacing(0); m_ipLayout->addLayout(m_nameLayout); - m_ipLayout->addWidget(m_userIPLab, Qt::AlignTop); + m_ipLayout->addWidget(u_LabelIp, Qt::AlignTop); m_ipLayout->setMargin(0); m_ipLayout->setSpacing(0); - m_avatarLayout->addWidget(m_avatarLab); + m_avatarLayout->addWidget(u_LabelIcon); m_avatarLayout->addLayout(m_ipLayout); - m_avatarLayout->setMargin(0); - m_avatarLayout->setSpacing(0); +// m_avatarLayout->setMargin(0); +// m_avatarLayout->setSpacing(0); m_localInfoLayout->addLayout(m_avatarLayout); - m_localInfoLayout->addWidget(m_searchEdit); + m_localInfoLayout->addWidget(s_EditSearch); + + m_searchLayout->addWidget(s_LabelIcon); + m_searchLayout->addStretch(); + m_searchLayout->setSpacing(0);/*各部件的相邻距离*/ + m_searchLayout->setContentsMargins(0, 0, 0, 0); + s_EditSearch->setLayout(m_searchLayout); + + this->installEventFilter(this);//安装过滤器 + s_EditSearch->installEventFilter(this); + + + // 设置对象名 + u_LabelIcon->setObjectName("usericon"); + u_LabelIp->setObjectName("userip"); + u_LabelName->setObjectName("username"); + u_ButtonUpdate->setObjectName("updatename"); + u_ButtonFile->setObjectName("uploadfile"); + + // 设置信号和槽函数 + connect(u_ButtonUpdate, SIGNAL(clicked(bool)), this, SLOT(onClicked())); + connect(u_ButtonFile, SIGNAL(clicked(bool)), this, SLOT(onClicked())); } // 设置组件样式 @@ -79,39 +118,105 @@ void LocalInfo::setWidgetStyle() this->setAutoFillBackground(true); this->setBackgroundRole(QPalette::Base); - // 本机头像 - m_avatarLab->setFixedSize(GlobalSizeData::AVATAR_LAB_SIZE); - - QPalette avatarLabPe; - avatarLabPe.setColor(QPalette::Background, QColor("#3D6BE5")); - avatarLabPe.setColor(QPalette::WindowText, QColor("#FFFFFF")); - m_avatarLab->setPalette(avatarLabPe); - m_avatarLab->setStyleSheet("border-radius:30px;background:#3D6BE5;color:#FFFFFF;"); - - QFont avatarLabFont("SourceHanSansCN-Light", 28, 400); - m_avatarLab->setFont(avatarLabFont); - m_avatarLab->setAlignment(Qt::AlignCenter); - - m_userNameLab->setFixedSize(GlobalSizeData::USER_NAME_LAB_SIZE); - - m_userIPLab->setFixedSize(GlobalSizeData::USER_IP_LAB_SIZE); - - m_changeNameBtn->setIcon(QIcon::fromTheme("document-edit-symbolic")); - m_changeNameBtn->setIconSize(GlobalSizeData::CHANGE_NAME_BTN_ICON); - m_changeNameBtn->setFixedSize(GlobalSizeData::CHANGE_NAME_BTN_SIZE); - m_changeNameBtn->setProperty("isWindowButton", 0x1); - m_changeNameBtn->setProperty("useIconHighlightEffect", 0x2); - m_changeNameBtn->setFlat(true); - - m_openFolderBtn->setIcon(QIcon::fromTheme("document-open-symbolic")); - m_openFolderBtn->setIconSize(GlobalSizeData::OPEN_FOLDER_BTN_ICON); - m_openFolderBtn->setFixedSize(GlobalSizeData::OPEN_FOLDER_BTN_SIZE); - m_openFolderBtn->setProperty("isWindowButton", 0x1); - m_openFolderBtn->setProperty("useIconHighlightEffect", 0x2); - m_openFolderBtn->setFlat(true); - - m_avatarLab->setText("S"); - m_userNameLab->setText("沈剑心"); - m_userIPLab->setText("172.17.7.99"); - -} \ No newline at end of file + // 设置图片 + //u_LabelName->setText("王晓晓-本机"); +// u_LabelName->setStyleSheet("color:#262626;font:16px;"); + QFont fontName; + fontName.setPixelSize(16); + u_LabelName->setFont(fontName); + u_LabelName->setAlignment(Qt::AlignBottom);//文字向下对齐 + u_LabelName->setMargin(0); + u_LabelName->setFixedSize(GlobalSizeData::USER_NAME_LAB_SIZE); + + //u_LabelIp->setText("123.123.123.123"); + u_LabelIp->setStyleSheet("color:#8c8c8c;font:14px;"); + u_LabelIp->setFixedSize(GlobalSizeData::USER_IP_LAB_SIZE); + + //u_LabelIcon->setText("王"); + u_LabelIcon->setAlignment(Qt::AlignCenter); + u_LabelIcon->setStyleSheet("background-color: #6495ED;border-radius:30px;padding:2px 4px;border-style: outset;color:white;font:36px;"); + u_LabelIcon->setFixedSize(GlobalSizeData::AVATAR_LAB_SIZE); + + u_ButtonUpdate->setIcon(QIcon::fromTheme("document-edit-symbolic"));/*修改名字*/ + u_ButtonUpdate->setIconSize(GlobalSizeData::OPEN_FOLDER_BTN_ICON); + u_ButtonUpdate->setFixedSize(GlobalSizeData::OPEN_FOLDER_BTN_SIZE); + u_ButtonUpdate->setProperty("isWindowButton", 0x1); + u_ButtonUpdate->setProperty("useIconHighlightEffect", 0x2); + u_ButtonUpdate->setFlat(true); + + u_ButtonFile->setIcon(QIcon::fromTheme("document-open-symbolic"));/*传输文件*/ + u_ButtonFile->setIconSize(GlobalSizeData::OPEN_FOLDER_BTN_ICON); + u_ButtonFile->setFixedSize(GlobalSizeData::OPEN_FOLDER_BTN_SIZE); + u_ButtonFile->setProperty("isWindowButton", 0x1); + u_ButtonFile->setProperty("useIconHighlightEffect", 0x2); + u_ButtonFile->setFlat(true); + + QFont font; + font.setPixelSize(14); + s_EditSearch->setFont(font); + + QIcon searchIcon = QIcon::fromTheme("preferences-system-search-symbolic"); + s_LabelIcon->setPixmap(searchIcon.pixmap(searchIcon.actualSize(QSize(20,20)))); + s_LabelIcon->setProperty("isWindowButton", 0x1); + s_LabelIcon->setProperty("useIconHighlightEffect", 0x2); + s_LabelIcon->setAlignment(Qt::AlignRight|Qt::AlignVCenter); +} + +bool LocalInfo::eventFilter(QObject *watch,QEvent *e) +{ + if(e->type() == QEvent::MouseButtonPress && watch != s_EditSearch) + { + this->setFocus(); + s_LabelIcon->setFixedSize(w/2-5,h); + s_LabelIcon->setAlignment(Qt::AlignRight|Qt::AlignVCenter); + s_EditSearch->setAlignment(Qt::AlignLeft); + s_EditSearch->setTextMargins(s_LabelIcon->width(), 1, 1 , 1);//没有取消按钮的时候 + qDebug()<<"MouseButtonPress"; + } + if(e->type() == QEvent::MouseButtonPress && watch == s_EditSearch) + { + s_LabelIcon->setFixedSize(30, 30); + s_EditSearch->setAlignment(Qt::AlignLeft); + s_EditSearch->setTextMargins(s_LabelIcon->width(), 1, 1 , 1);//没有取消按钮的时候 + s_EditSearch->setFocus(); + s_EditSearch->setPlaceholderText("搜索");//提示文字 + qDebug()<<"youdian"; + } +} + +void LocalInfo::onClicked() +{ + QPushButton *pButton = qobject_cast(sender()); + QWidget *pWindow = this->window(); + if (pWindow->isTopLevel()) + { + if (pButton == u_ButtonUpdate) + { + qDebug()<<"~~~~~~~~~~~~修改名字~~~~~~~~~~~~"; + } + else if (pButton == u_ButtonFile) + { + qDebug()<<"~~~~~~~~~~~~文件夹~~~~~~~~~~~~"; + } + } +} + + +void LocalInfo::setText(QString name,QString IP) +{ + if(QString(name.at(0))>='a'&&QString(name.at(0))<='z'){ + + u_LabelIcon->setText(QString(name.at(0)).toUpper()); + u_LabelIcon->setStyleSheet("background-color: #6495ED;border-radius:30px;padding:2px 4px;border-style: outset;color:white;font:28px;"); + u_LabelIcon->setAlignment(Qt::AlignCenter); + + } + else{ + u_LabelIcon->setText(QString(name.at(0))); + u_LabelIcon->setStyleSheet("background-color: #6495ED;border-radius:30px;padding:2px 4px;border-style: outset;color:white;font:28px;"); + u_LabelIcon->setAlignment(Qt::AlignCenter); + } + u_LabelName->setText(name); + u_LabelIp->setText(IP); + +} diff --git a/src/view/localinfo/localinfo.h b/src/view/localinfo/localinfo.h index 50695e0..1aa3d17 100644 --- a/src/view/localinfo/localinfo.h +++ b/src/view/localinfo/localinfo.h @@ -39,24 +39,34 @@ class LocalInfo : public QWidget // 设置组件样式 void setWidgetStyle(); - - QLabel *m_avatarLab; // 头像 - QLabel *m_userIPLab; // IP地址 - QLabel *m_userNameLab; // 用户名 - - QPushButton *m_changeNameBtn; // 修改本机昵称 - QPushButton *m_openFolderBtn; // 打开文件保存目录 + int w; + int h; - QLineEdit *m_searchEdit; // 搜索框 + QLabel *u_LabelIcon;//头像 + QLabel *s_LabelIcon;//搜索图标 + QLabel *u_LabelName;/*名字*/ + QLabel *u_LabelIp;/*IP*/ + QPushButton *u_ButtonUpdate;/*修改本机昵称按钮*/ + QPushButton *u_ButtonFile;/*打开文件保存目录按钮*/ + + void setText(QString name,QString IP); + + QLineEdit *s_EditSearch; private: QVBoxLayout *m_localInfoLayout; // 本机信息总体布局 QHBoxLayout *m_nameLayout; // 本机昵称布局 QVBoxLayout *m_ipLayout; // 本机IP布局 QHBoxLayout *m_avatarLayout; // 本机头像布局 + QHBoxLayout *m_searchLayout; // 搜索图像布局文本框 + +private slots: + // 进行置顶、最小化、关闭操作 + void onClicked(); + bool eventFilter(QObject *watch,QEvent *e); }; -#endif // LOCALINFO_H \ No newline at end of file +#endif // LOCALINFO_H diff --git a/src/view/titlebar/menumodule.cpp b/src/view/titlebar/menumodule.cpp index e28c70f..abf4a6d 100644 --- a/src/view/titlebar/menumodule.cpp +++ b/src/view/titlebar/menumodule.cpp @@ -1,242 +1,380 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + #include "menumodule.h" +#include "../common/xatom-helper.h" menuModule::menuModule(QWidget *parent = nullptr) : QWidget(parent) { init(); } - -void menuModule::init(){ +void menuModule::init() +{ initAction(); + setStyle(); } -void menuModule::initAction(){ - - m_bodyAppName = new QLabel(); - - m_bodyAppVersion = new QLabel(); - m_bodySupport = new QLabel(); - m_titleText = new QLabel(); - - m_bodySupport->setText(tr("Service & Support Team: ") + - "" - "support@kylinos.cn"); - m_bodyAppVersion->setText(tr("Version: ") + m_appVersion); - - menuButton = new QToolButton; - menuButton->setToolTip(tr("menu")); - menuButton->setIcon(QIcon::fromTheme("open-menu-symbolic")); +void menuModule::initAction() +{ + // aboutWindow = new QWidget(); + titleText = new QLabel(); + bodyAppName = new QLabel(); + bodyAppVersion = new QLabel(); + bodySupport = new QLabel(); + + iconSize = QSize(30,30); + menuButton = new QToolButton(this); + menuButton->setToolTip(tr("Menu")); menuButton->setProperty("isWindowButton", 0x1); - menuButton->setProperty("useIconHighlightEffect",0x2); - menuButton->setIconSize(SizeDate::MICONSIZES); + menuButton->setProperty("useIconHighlightEffect", 0x2); menuButton->setPopupMode(QToolButton::InstantPopup); - menuButton->setFixedSize(SizeDate::MBTNSIZE); + menuButton->setFixedSize(30,30); + menuButton->setIconSize(QSize(16, 16)); menuButton->setAutoRaise(true); - menuButton->setFocusPolicy(Qt::NoFocus); - m_menu = new QMenu(); + menuButton->setIcon(QIcon::fromTheme("open-menu-symbolic")); + m_menu = new QMenu(); QList actions ; - QAction *actionOpen = new QAction(m_menu); - actionOpen->setText(tr("Open..")); +// QAction *actionStandard = new QAction(m_menu); +// actionStandard->setText(tr("Standard")); +// QAction *actionScientific = new QAction(m_menu); +// actionScientific->setText(tr("Scientific")); +// QAction *actionExchangeRate = new QAction(m_menu); +// actionExchangeRate->setText(tr("Exchange Rate")); + +// QAction *separator = new QAction(m_menu); +// separator->setSeparator(true); + QAction *actionSetUp = new QAction(m_menu); + actionSetUp->setText(tr("设置")); QAction *actionTheme = new QAction(m_menu); - actionTheme->setText(tr("Theme")); + actionTheme->setText(tr("主题")); QAction *actionHelp = new QAction(m_menu); - actionHelp->setText(tr("Help")); + actionHelp->setText(tr("帮助")); QAction *actionAbout = new QAction(m_menu); - actionAbout->setText(tr("About")); - QAction *actionQuit = new QAction(m_menu); - actionQuit->setText(tr("Quit")); - actions<setText(tr("关于")); +// QAction *actionQuit = new QAction(m_menu); +// actionQuit->setText(tr("Quit")); + actions +// << actionStandard +// << actionScientific +// << actionExchangeRate +// << separator + << actionSetUp +// << actionTheme// + << actionHelp + << actionAbout; +// << actionQuit; + m_menu->addActions(actions); + // 互斥按钮组 - QMenu *m_themeMenu = new QMenu; - QActionGroup *m_themeMenuGroup = new QActionGroup(this); - QAction *autoTheme = new QAction("Auto",this); - m_themeMenuGroup->addAction(autoTheme); - m_themeMenu->addAction(autoTheme); + QMenu *themeMenu = new QMenu; + QActionGroup *themeMenuGroup = new QActionGroup(this); + QAction *autoTheme = new QAction(tr("跟随主题"),this); + themeMenuGroup->addAction(autoTheme); + themeMenu->addAction(autoTheme); autoTheme->setCheckable(true); - QAction *lightTheme = new QAction("Light",this); - m_themeMenuGroup->addAction(lightTheme); - m_themeMenu->addAction(lightTheme); + QAction *lightTheme = new QAction(tr("浅色主题"),this); + themeMenuGroup->addAction(lightTheme); + themeMenu->addAction(lightTheme); lightTheme->setCheckable(true); - QAction *darkTheme = new QAction("Dark",this); - m_themeMenuGroup->addAction(darkTheme); - m_themeMenu->addAction(darkTheme); + QAction *darkTheme = new QAction(tr("深色主题"),this); + themeMenuGroup->addAction(darkTheme); + themeMenu->addAction(darkTheme); darkTheme->setCheckable(true); QList themeActions; themeActions<setMenu(m_themeMenu); +// autoTheme->setChecked(true); + actionTheme->setMenu(themeMenu); menuButton->setMenu(m_menu); connect(m_menu,&QMenu::triggered,this,&menuModule::triggerMenu); - connect(this,&menuModule::menuModuleClose,KyView::mutual,&KyView::close); - initGsetting(); + setThemeFromLocalThemeSetting(themeActions); + themeUpdate(); + connect(themeMenu,&QMenu::triggered,this,&menuModule::triggerThemeMenu); } +void menuModule::setThemeFromLocalThemeSetting(QList themeActions) +{ + m_pGsettingThemeStatus = new QGSettings(confPath.toLocal8Bit()); + QString appConf = m_pGsettingThemeStatus->get("thememode").toString(); + if("lightonly" == appConf){ + themeStatus = themeLightOnly; + themeActions[1]->setChecked(true); //程序gsetting中为浅色only的时候就给浅色按钮设置checked + }else if("darkonly" == appConf){ + themeStatus = themeBlackOnly; + themeActions[2]->setChecked(true); + }else{ + themeStatus = themeAuto; + themeActions[0]->setChecked(true); + } +} +void menuModule::themeUpdate(){ + if(themeStatus == themeLightOnly) + { + setThemeLight(); + } + else if(themeStatus == themeBlackOnly){ + setThemeDark(); + } + else{ + setStyleByThemeGsetting(); + } +} void menuModule::setStyleByThemeGsetting(){ QString nowThemeStyle = m_pGsettingThemeData->get("styleName").toString(); - if("ukui-dark" == nowThemeStyle || "ukui-black" == nowThemeStyle) - { + if("ukui-dark" == nowThemeStyle || "ukui-black" == nowThemeStyle) { setThemeDark(); - }else if("ukui-default" == nowThemeStyle || "ukui-light" == nowThemeStyle || "ukui-white" == nowThemeStyle){ + } + else { setThemeLight(); - }else{ - return; } } -void menuModule::triggerMenu(QAction *act){ - - - +void menuModule::triggerMenu(QAction *act) +{ QString str = act->text(); - if(tr("Quit") == str){ - emit menuModuleClose(); - }else if(tr("About") == str){ +// if(tr("Quit") == str){ +// emit menuModuleClose(); +// } +// else if(tr("About") == str){ +// aboutAction(); +// } +// else if(tr("Help") == str){ +// helpAction(); +// } +// else if(tr("Standard") == str){ +// emit menuModuleChanged(QString("standard")); +// } +// else if(tr("Scientific") == str){ +// emit menuModuleChanged(QString("scientific")); +// } +// else if(tr("Exchange Rate") == str){ +// emit menuModuleChanged(QString("exchange rate")); +// } + if(tr("关于") == str){ aboutAction(); - }else if(tr("Help") == str){ + } + else if(tr("帮助") == str){ helpAction(); - }else if(tr("Open..") == str){ - emit openSignal(); } -} - -void menuModule::aboutAction(){ -// 关于点击事件处理 + else if(tr("主题") == str){ + //emit menuModuleSetThemeStyle(QString("主题")); + } + else if(tr("设置") == str){ - initAbout(); + } } -void menuModule::helpAction(){ -// 帮助点击事件处理 - - m_appName = SizeDate::USERGUIDE; - if(!m_ipcDbus){ - m_ipcDbus = new DaemonDbus(); +void menuModule::triggerThemeMenu(QAction *act) +{ + if(!m_pGsettingThemeStatus) + { + m_pGsettingThemeStatus = new QGSettings(confPath.toLocal8Bit()); //m_pGsettingThemeStatus指针重复使用避免占用栈空间 } - - if(!m_ipcDbus->daemonIsNotRunning()){ - m_ipcDbus->showGuide(m_appName); + QString str = act->text(); + if("Light" == str){ + themeStatus = themeLightOnly; + disconnect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); + m_pGsettingThemeStatus->set("thememode","lightonly"); +// disconnect() + setThemeLight(); + }else if("Dark" == str){ + themeStatus = themeBlackOnly; + disconnect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); + m_pGsettingThemeStatus->set("thememode","darkonly"); + setThemeDark(); + }else{ + themeStatus = themeAuto; + m_pGsettingThemeStatus->set("thememode","auto"); + initGsetting(); +// updateTheme(); + themeUpdate(); } } -void menuModule::initAbout(){ +void menuModule::aboutAction() +{ +// 关于点击事件处理 + // if (aboutWindow != nullptr) { + // aboutWindow->hide(); + + // QTime dieTime = QTime::currentTime().addMSecs(50); + // while( QTime::currentTime() < dieTime ) + // QCoreApplication::processEvents(QEventLoop::AllEvents, 100); - emit aboutShow(); - m_aboutWindow->deleteLater(); - m_aboutWindow = new QDialog(); - m_aboutWindow->installEventFilter(this); - m_aboutWindow->setWindowModality(Qt::ApplicationModal); - m_aboutWindow->setWindowFlag(Qt::Tool); - m_aboutWindow->setAutoFillBackground(true); - m_aboutWindow->setBackgroundRole(QPalette::Base); + // aboutWindow->show(); + // // aboutWindow->activateWindow(); + // return ; + // } + initAbout(); +} +void menuModule::helpAction() +{ + // 帮助点击事件处理 + if(!DaemonDbus::getInstance()->daemonIsNotRunning()){ + // qDebug() << "hahahahahaha" << appName; + DaemonDbus::getInstance()->showGuide(appName); + } +} +#include +void menuModule::initAbout() +{ + aboutWindow = new QWidget(); + aboutWindow->setWindowFlag(Qt::Tool); + aboutWindow->setWindowIcon(QIcon::fromTheme("kylin-calculator")); + aboutWindow->setWindowModality(Qt::WindowModal); + aboutWindow->setWindowModality(Qt::ApplicationModal); + // aboutWindow->setModal(true); + // aboutWindow->setWindowFlags(Qt::FramelessWindowHint); MotifWmHints hints; + // aboutWindow->setWindowFlags(Qt::WindowStaysOnTopHint); hints.flags = MWM_HINTS_FUNCTIONS|MWM_HINTS_DECORATIONS; hints.functions = MWM_FUNC_ALL; hints.decorations = MWM_DECOR_BORDER; - XAtomHelper::getInstance()->setWindowMotifHint(m_aboutWindow->winId(), hints); - - m_aboutWindow->setFixedSize(SizeDate::MABOUT); - m_aboutWindow->setMinimumHeight(SizeDate::MABOUT.height()); + XAtomHelper::getInstance()->setWindowMotifHint(aboutWindow->winId(), hints); + aboutWindow->setFixedSize(420,324); + aboutWindow->setMinimumHeight(324); QVBoxLayout *mainlyt = new QVBoxLayout(); QHBoxLayout *titleLyt = initTitleBar(); QVBoxLayout *bodylyt = initBody(); - mainlyt->setMargin(0); + mainlyt->setContentsMargins(0,0,0,0); + mainlyt->setSpacing(0); mainlyt->addLayout(titleLyt); mainlyt->addLayout(bodylyt); mainlyt->addStretch(); - m_aboutWindow->setLayout(mainlyt); - //TODO:在中央显示 - QRect availableGeometry = this->parentWidget()->parentWidget()->geometry(); - m_aboutWindow->move(availableGeometry.center()-m_aboutWindow->rect().center()); - m_aboutWindow->show(); + aboutWindow->setLayout(mainlyt); + // 关于弹窗应用内居中 + QRect availableGeometry = this->parentWidget()->parentWidget()->parentWidget()->geometry(); + aboutWindow->move(availableGeometry.center() - aboutWindow->rect().center()); + // aboutWindow->setStyleSheet("background-color:rgba(255,255,255,1);"); + dealSystemGsettingChange("styleName"); + aboutWindow->show(); } -QHBoxLayout* menuModule::initTitleBar(){ +QHBoxLayout* menuModule::initTitleBar() +{ QLabel* titleIcon = new QLabel(); - titleIcon->setFixedSize(SizeDate::MICONSIZEM); - - m_appShowingName = tr("kylin photo view"); - m_iconPath = ":/res/res/kyview_logo.png"; - titleIcon->setPixmap(QPixmap::fromImage(QImage(m_iconPath))); + titleIcon->setPixmap(QIcon::fromTheme("kylin-ipmsg").pixmap(titleIcon->size())); + titleIcon->setFixedSize(QSize(24,24)); titleIcon->setScaledContents(true); QPushButton *titleBtnClose = new QPushButton; + titleBtnClose->setFixedSize(30,30); titleBtnClose->setIcon(QIcon::fromTheme("window-close-symbolic")); - titleBtnClose->setToolTip(tr("close")); - titleBtnClose->setFixedSize(SizeDate::MBTNSIZE); - titleBtnClose->setFocusPolicy(Qt::NoFocus);//设置焦点类型 - titleBtnClose->setProperty("isWindowButton", 0x2); - titleBtnClose->setProperty("useIconHighlightEffect", 0x8); + titleBtnClose->setProperty("isWindowButton",0x2); + titleBtnClose->setProperty("useIconHighlightEffect",0x8); titleBtnClose->setFlat(true); - connect(titleBtnClose,&QPushButton::clicked,[=](){m_aboutWindow->close();}); + connect(titleBtnClose,&QPushButton::clicked,[=](){aboutWindow->close();}); + + titleText->setText(tr(appShowingName.toLocal8Bit())); + titleText->setStyleSheet("font-size:14px;"); QHBoxLayout *hlyt = new QHBoxLayout; - m_titleText->setText(tr("Kylin Photo View")); hlyt->setSpacing(0); - hlyt->setMargin(4); + hlyt->setContentsMargins(4,4,4,4); hlyt->addSpacing(4); - hlyt->addWidget(titleIcon,0,Qt::AlignBottom); //居下显示 + hlyt->addWidget(titleIcon); //居下显示 hlyt->addSpacing(8); - hlyt->addWidget(m_titleText,0,Qt::AlignBottom); + hlyt->addWidget(titleText); hlyt->addStretch(); - hlyt->addWidget(titleBtnClose,0,Qt::AlignBottom); + hlyt->addWidget(titleBtnClose); + return hlyt; } -QVBoxLayout* menuModule::initBody(){ - m_appVersion = SizeDate::VERSIONNEM; +QVBoxLayout* menuModule::initBody() +{ + QLabel* bodyIcon = new QLabel(); - bodyIcon->setFixedSize(SizeDate::MICONSIZEB); - bodyIcon->setPixmap(QPixmap::fromImage(QImage(m_iconPath))); - bodyIcon->setStyleSheet("font-size:14px;"); - bodyIcon->setScaledContents(true); - m_bodyAppName->setFixedHeight(SizeDate::NAMEHEIGHT); - m_bodyAppName->setText(tr(m_appShowingName.toLocal8Bit())); - m_bodyAppVersion->setFixedHeight(SizeDate::VERSIONHEI); - m_bodyAppVersion->setText(tr("Version: ") + m_appVersion); - m_bodyAppVersion->setAlignment(Qt::AlignLeft); - - connect(m_bodySupport,&QLabel::linkActivated,this,[=](const QString url){ + bodyIcon->setFixedSize(96,96); + bodyIcon->setPixmap(QIcon::fromTheme("kylin-ipmsg").pixmap(bodyIcon->size())); + // bodyIcon->setStyleSheet("font-size:14px;"); + // bodyIcon->setScaledContents(true); + + bodyAppName->setFixedHeight(28); + bodyAppName->setText(tr(appShowingName.toLocal8Bit())); + bodyAppName->setStyleSheet("font-size:18px;"); + + bodyAppVersion->setFixedHeight(24); + bodyAppVersion->setText(tr("Version: ") + appVersion); + bodyAppVersion->setAlignment(Qt::AlignLeft); + bodyAppVersion->setStyleSheet("font-size:14px;"); + + connect(bodySupport,&QLabel::linkActivated,this,[=](const QString url){ QDesktopServices::openUrl(QUrl(url)); }); - m_bodySupport->setFixedHeight(SizeDate::VERSIONHEI); - m_bodySupport->setContextMenuPolicy(Qt::NoContextMenu); + bodySupport->setContextMenuPolicy(Qt::NoContextMenu); + bodySupport->setFixedHeight(24); + bodySupport->setStyleSheet("font-size:14px;"); QVBoxLayout *vlyt = new QVBoxLayout; vlyt->setMargin(0); vlyt->setSpacing(0); vlyt->addSpacing(20); vlyt->addWidget(bodyIcon,0,Qt::AlignHCenter); vlyt->addSpacing(16); - vlyt->addWidget(m_bodyAppName,0,Qt::AlignHCenter); + vlyt->addWidget(bodyAppName,0,Qt::AlignHCenter); vlyt->addSpacing(12); - vlyt->addWidget(m_bodyAppVersion,0,Qt::AlignHCenter); + vlyt->addWidget(bodyAppVersion,0,Qt::AlignHCenter); vlyt->addSpacing(12); - vlyt->addWidget(m_bodySupport,0,Qt::AlignHCenter); + vlyt->addWidget(bodySupport,0,Qt::AlignHCenter); vlyt->addStretch(); return vlyt; } +void menuModule::setStyle() +{ + // menuButton->setObjectName("menuButton"); + // // qDebug() << "menuButton->styleSheet" << menuButton->styleSheet(); + // menuButton->setStyleSheet("QPushButton::menu-indicator{image:None;}"); +} + void menuModule::initGsetting(){ - if(QGSettings::isSchemaInstalled(FITTHEMEWINDOW)){ - m_pGsettingThemeData = new QGSettings(FITTHEMEWINDOW); + if(QGSettings::isSchemaInstalled(UKUI_THEME_GSETTING_PATH)){ + m_pGsettingThemeData = new QGSettings(UKUI_THEME_GSETTING_PATH); connect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); } } -void menuModule::dealSystemGsettingChange(const QString key){ +void menuModule::keyPressEvent(QKeyEvent *event){ + if(event->key() == Qt::Key_F1){ + emit pullupHelp(); + }else{ + QWidget::keyPressEvent(event); + } +} + +void menuModule::dealSystemGsettingChange(const QString key) +{ if(key == "styleName"){ refreshThemeBySystemConf(); } } -void menuModule::refreshThemeBySystemConf(){ +void menuModule::refreshThemeBySystemConf() +{ QString themeNow = m_pGsettingThemeData->get("styleName").toString(); if("ukui-dark" == themeNow || "ukui-black" == themeNow){ setThemeDark(); @@ -245,32 +383,37 @@ void menuModule::refreshThemeBySystemConf(){ } } -void menuModule::setThemeDark(){ - - - m_titleText->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); - m_bodyAppName->setStyleSheet("color:rgba(255,255,255,1);font-size:18px;"); - m_bodyAppVersion->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); - m_bodySupport->setStyleSheet("color:rgba(255,255,255,1);font-size:14px;"); - - m_bodySupport->setText(tr("Service & Support Team: ") + +void menuModule::setThemeDark() +{ + qDebug()<<"set theme dark"; + if(aboutWindow) + { + QPalette palette(this->palette()); + palette.setColor(QPalette::Background, QColor::fromRgb(13,13,14)); + aboutWindow->setPalette(palette); + // aboutWindow->setStyleSheet("background-color:rgba(13,13,14,1);"); + } + emit menuModuleSetThemeStyle("dark-theme"); + bodySupport->setText(tr("Service & Support: ") + "" + "style=\"color:rgba(225,225,225,1)\">" "support@kylinos.cn"); + // menuButton->setProperty("setIconHighlightEffectDefaultColor", QColor(Qt::white)); } -void menuModule::setThemeLight(){ - - - m_titleText->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); - m_bodyAppName->setStyleSheet("color:rgba(0,0,0,1);font-size:18px;"); - m_bodyAppVersion->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); - m_bodySupport->setStyleSheet("color:rgba(0,0,0,1);font-size:14px;"); - - m_bodySupport->setText(tr("Service & Support Team: ") + +void menuModule::setThemeLight() +{ +// qDebug()<<"set theme light"; + if(aboutWindow) + { + QPalette palette(this->palette()); + palette.setColor(QPalette::Background, QColor::fromRgb(255,255,255)); + aboutWindow->setPalette(palette); + // aboutWindow->setStyleSheet("background-color:rgba(255,255,255,1);"); + } + emit menuModuleSetThemeStyle("light-theme"); + bodySupport->setText(tr("Service & Support: ") + "" "support@kylinos.cn"); } - - diff --git a/src/view/titlebar/menumodule.h b/src/view/titlebar/menumodule.h index 55ca023..4af1513 100644 --- a/src/view/titlebar/menumodule.h +++ b/src/view/titlebar/menumodule.h @@ -1,28 +1,46 @@ +/* + * Copyright (C) 2020, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #ifndef MENUMODULE_H #define MENUMODULE_H -#define DEBUG_MENUMODULE 0 //DEBUG模式开关,代码上线之前务必关掉 -#define FITTHEMEWINDOW "org.ukui.style" -//#define APPDATA "org.kylin-photo-viewer-data.settings" 0301-cancel + +#ifndef UKUI_THEME_GSETTING_PATH +#define UKUI_THEME_GSETTING_PATH "org.ukui.style" +#endif + +#include #include #include #include #include +#include #include #include #include #include #include -#include #include #include #include +#include #include #include #include -#include -#include "../kyview.h" -#include "../common/xatom-helper.h" #include "../common/daemondbus.h" class menuModule : public QWidget @@ -31,30 +49,35 @@ class menuModule : public QWidget public: explicit menuModule(QWidget *); void themeUpdate(); -// void changeVolumePos(int posX, int posY, int width, int height); + signals: - void menuModuleClose();//从标题栏点击退出的信号 - void openSignal();//从标题栏进行打开图片的信号 - void aboutShow();//打开关于,主界面两栏的显示情况 -// void menuModuleSetThemeStyle(QString); + void menuModuleClose(); + void menuModuleChanged(QString); + void pullupHelp(); + + void menuModuleSetThemeStyle(QString); public: QToolButton *menuButton = nullptr; - QMenu *m_menu = nullptr; + +public: +// 程序在实例化的时候需要传递的信息字段,打开debug开关后这些字段会被自动填充 + QString appName = "tools/kylin-calculator"; //格式kylin-usb-creator + QString appShowingName = tr("Calculator"); //格式kylin usb creator ,用来在前端展示 + QString appVersion = qApp->applicationVersion(); + QString appDesc = "kylin calculator"; + QString confPath = "org.kylin-calculator-data.settings"; + QWidget *aboutWindow = nullptr; private: - QString m_appShowingName; - QString m_appVersion; - QString m_appName; - QString m_appDesc = "appDesc字段未填充!"; - QString m_iconPath; - QString m_confPath = "org.china-weather-data.settings"; + QMenu *m_menu = nullptr; + QMenu *themeMenu = nullptr; + QSize iconSize; + QString appPath = "tools/kylin-calculator"; //拉起帮助菜单时使用appName字段 - QMenu *m_themeMenu = nullptr; - QDialog *m_aboutWindow = nullptr; QGSettings *m_pGsettingThemeData = nullptr; QGSettings *m_pGsettingThemeStatus = nullptr; - DaemonDbus *m_ipcDbus = nullptr; - enum typeThemeStatus { - themeAuto = 0, + enum typeThemeStatus : int + { + themeAuto = 0, themeBlackOnly = 1, themeLightOnly = 2 } themeStatus; @@ -62,11 +85,13 @@ class menuModule : public QWidget public slots: void dealSystemGsettingChange(const QString); private: + void keyPressEvent(QKeyEvent *event); void init(); QHBoxLayout* initTitleBar(); //关于窗口标题栏初始化 QVBoxLayout* initBody(); // 关于窗口body初始化 void initGsetting(); void initAction(); + void setStyle(); void triggerMenu(QAction* act); //主菜单动作4 void triggerThemeMenu(QAction* act); //主题动作 void aboutAction(); @@ -77,13 +102,13 @@ public slots: void setThemeStyle(); void setThemeLight(); void setThemeDark(); +// void updateTheme(); //点击菜单中的主题设置后更新一次主题 + QLabel* titleText = nullptr; + QLabel* bodyAppName = nullptr; + QLabel* bodyAppVersion = nullptr; + QLabel* bodySupport = nullptr; void refreshThemeBySystemConf(); //通过系统配置更改主题 - - QLabel* m_titleText = nullptr; - QLabel* m_bodyAppVersion = nullptr; - QLabel* m_bodySupport = nullptr; - QLabel* m_bodyAppName = nullptr; }; #endif // MENUMODULE_H diff --git a/src/view/titlebar/titlebar.cpp b/src/view/titlebar/titlebar.cpp index 138afdd..ae1224a 100644 --- a/src/view/titlebar/titlebar.cpp +++ b/src/view/titlebar/titlebar.cpp @@ -14,8 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - +#include +#include +#include +#include +#include +#include #include "titlebar.h" +#include "../kyview.h" +#include "../common/xatom-helper.h" TitleBar::TitleBar(QWidget *parent) : QWidget(parent) @@ -35,8 +42,42 @@ TitleBar::~TitleBar() void TitleBar::setWidgetUi() { this->setFixedHeight(GlobalSizeData::TITLEBAR_HEIGHT); + // 窗体透明 +// this->setAttribute(Qt::WA_TranslucentBackground, true); +// this->setFixedHeight(38); /*固定高度*/ + + // 按钮初始化 + + m_pIconBtn = new QPushButton(this); + m_pFuncLabel = new QLabel(this); + m_pMinimizeButton = new QPushButton(this); + m_pCloseButton = new QPushButton(this); + + // 设置空间大小 + + menuBar = new menuModule(this); + + // 设置按钮布局 + pLayout = new QHBoxLayout(this); + pLayout->setContentsMargins(0, 0, 0, 0); + pLayout->setSpacing(1);/*各部件的相邻距离*/ + pLayout->addSpacing(2);/*插入间距*/ + pLayout->addWidget(m_pIconBtn); + pLayout->addSpacing(4); + pLayout->addWidget(m_pFuncLabel); + pLayout->addStretch();/*表示加了弹簧*/ + pLayout->addWidget(menuBar->menuButton); + pLayout->addSpacing(4); + pLayout->addWidget(m_pMinimizeButton); + pLayout->addSpacing(4); + pLayout->addWidget(m_pCloseButton); - m_titleLayout = new QHBoxLayout(this); + + this->setLayout(pLayout); + + // 设置信号和槽函数 + connect(m_pMinimizeButton, SIGNAL(clicked(bool)), this, SLOT(onClicked())); + connect(m_pCloseButton, SIGNAL(clicked(bool)), this, SLOT(onClicked())); } // 设置组件样式 @@ -44,4 +85,73 @@ void TitleBar::setWidgetStyle() { this->setAutoFillBackground(true); this->setBackgroundRole(QPalette::Base); -} \ No newline at end of file + // 设置对象名 + m_pFuncLabel->setObjectName("whiteLabel"); + m_pMinimizeButton->setObjectName("minimizeButton"); + m_pCloseButton->setObjectName("closeButton"); + + // 设置悬浮提示 + m_pMinimizeButton->setToolTip(tr("Minimize")); + m_pCloseButton->setToolTip(tr("Close")); + + // 设置图片 + m_pFuncLabel->setText("麒麟传书");/*给label设置信息*/ + QFont font; + font.setPixelSize(14); + m_pFuncLabel->setFont(font); + + m_pIconBtn->setIconSize(QSize(21.11, 21.11));/*设置ico类型图片大小*/ + m_pIconBtn->setIcon(QIcon::fromTheme("kylin-ipmsg"));/*使用fromTheme函数调用库中的图片*/ + + m_pMinimizeButton->setIcon(QIcon::fromTheme("window-minimize-symbolic")); + m_pMinimizeButton->setIconSize(QSize(16, 16)); + m_pMinimizeButton->setProperty("isWindowButton", 0x1); + m_pMinimizeButton->setProperty("useIconHighlightEffect", 0x2); + m_pMinimizeButton->setFlat(true); + + m_pCloseButton->setIcon(QIcon::fromTheme("window-close-symbolic")); + m_pCloseButton->setIconSize (QSize(16, 16)); + m_pCloseButton->setProperty("isWindowButton", 0x2); + m_pCloseButton->setProperty("useIconHighlightEffect", 0x8); + m_pCloseButton->setFlat(true); + + // 设置按钮样式 + QString btnStyle = "QPushButton{border:0px;border-radius:4px;background:transparent;}" + "QPushButton:Hover{border:0px;border-radius:4px;background:transparent;background-color:rgba(0,0,0,0.1);}" + "QPushButton:Pressed{border:0px;border-radius:4px;background:transparent;background-color:rgba(0,0,0,0.15);}"; + m_pIconBtn->setStyleSheet(btnStyle); + +// if (WidgetStyle::themeColor == 0) { +// QString btnStyle = "QPushButton{border:0px;border-radius:4px;background:transparent;}" +// "QPushButton:Hover{border:0px;border-radius:4px;background:transparent;background-color:rgba(0,0,0,0.1);}" +// "QPushButton:Pressed{border:0px;border-radius:4px;background:transparent;background-color:rgba(0,0,0,0.15);}"; +// m_pIconBtn->setStyleSheet(btnStyle); +// } +// else if (WidgetStyle::themeColor == 1) { +// QString btnStyle = "QPushButton{border:0px;border-radius:4px;background:transparent;}" +// "QPushButton:Hover{border:0px;border-radius:4px;background:transparent;background-color:rgba(0,0,0,0.1);}" +// "QPushButton:Pressed{border:0px;border-radius:4px;background:transparent;background-color:rgba(0,0,0,0.15);}"; +// m_pIconBtn->setStyleSheet(btnStyle); + +// } + +} + +void TitleBar::onClicked() +{ + QPushButton *pButton = qobject_cast(sender()); + QWidget *pWindow = this->window(); + if (pWindow->isTopLevel()) + { + if (pButton == m_pMinimizeButton) + { + pWindow->showMinimized(); + m_pMinimizeButton->update(); + m_pCloseButton->update(); + } + else if (pButton == m_pCloseButton) + { + pWindow->close(); + } + } +} diff --git a/src/view/titlebar/titlebar.h b/src/view/titlebar/titlebar.h index 677cfb8..92bcddb 100644 --- a/src/view/titlebar/titlebar.h +++ b/src/view/titlebar/titlebar.h @@ -23,7 +23,7 @@ #include #include -// #include "menumodule.h" +#include "menumodule.h" #include "../common/globalsizedata.h" class TitleBar : public QWidget @@ -37,18 +37,32 @@ class TitleBar : public QWidget void setWidgetUi(); // 设置组件样式 - void setWidgetStyle(); + void setWidgetStyle(); private: // 整体界面布局 - QHBoxLayout *m_titleLayout; + QHBoxLayout *pLayout; - QLabel *m_iconLab; - QLabel *m_nameLab; + QPushButton *m_pIconBtn; // 应用图标 + QLabel *m_pFuncLabel; // 界面标识 + menuModule *menuBar; /*菜单按钮*/ + QPushButton *m_pMinimizeButton; /*最小化按钮*/ + QPushButton *m_pCloseButton; /*关闭按钮*/ - QPushButton *m_miniBtn;//最小化按钮 - QPushButton *m_closeBtn;//关闭 +protected: + +#ifdef __V10__ + // 进行鼠标界面的拖动 + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); +#endif + +private slots: + + // 进行置顶、最小化、关闭操作 + void onClicked(); }; -#endif // TITLEBAR_H \ No newline at end of file +#endif // TITLEBAR_H From aa734db7a578b89285b97cbca9ae727e4e01d3cb Mon Sep 17 00:00:00 2001 From: zxx Date: Fri, 7 May 2021 17:18:27 +0800 Subject: [PATCH 29/31] merge branch feature-refator --- src/view/titlebar/menumodule.cpp | 132 +------------------------------ src/view/titlebar/menumodule.h | 21 ----- 2 files changed, 3 insertions(+), 150 deletions(-) diff --git a/src/view/titlebar/menumodule.cpp b/src/view/titlebar/menumodule.cpp index b559faa..4283cc3 100644 --- a/src/view/titlebar/menumodule.cpp +++ b/src/view/titlebar/menumodule.cpp @@ -52,7 +52,7 @@ void menuModule::initAction() m_menu = new QMenu(); QList actions ; -<<<<<<< HEAD + // QAction *actionStandard = new QAction(m_menu); // actionStandard->setText(tr("Standard")); // QAction *actionScientific = new QAction(m_menu); @@ -64,24 +64,11 @@ void menuModule::initAction() // separator->setSeparator(true); QAction *actionSetUp = new QAction(m_menu); actionSetUp->setText(tr("设置")); -======= - QAction *actionStandard = new QAction(m_menu); - actionStandard->setText(tr("Standard")); - QAction *actionScientific = new QAction(m_menu); - actionScientific->setText(tr("Scientific")); - QAction *actionExchangeRate = new QAction(m_menu); - actionExchangeRate->setText(tr("Exchange Rate")); - - QAction *separator = new QAction(m_menu); - separator->setSeparator(true); - ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 QAction *actionTheme = new QAction(m_menu); actionTheme->setText(tr("主题")); QAction *actionHelp = new QAction(m_menu); actionHelp->setText(tr("帮助")); QAction *actionAbout = new QAction(m_menu); -<<<<<<< HEAD actionAbout->setText(tr("关于")); // QAction *actionQuit = new QAction(m_menu); // actionQuit->setText(tr("Quit")); @@ -95,26 +82,12 @@ void menuModule::initAction() << actionHelp << actionAbout; // << actionQuit; -======= - actionAbout->setText(tr("About")); - QAction *actionQuit = new QAction(m_menu); - actionQuit->setText(tr("Quit")); - actions << actionStandard - << actionScientific - << actionExchangeRate - << separator - // << actionTheme - << actionHelp - << actionAbout - << actionQuit; ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 m_menu->addActions(actions); // 互斥按钮组 QMenu *themeMenu = new QMenu; QActionGroup *themeMenuGroup = new QActionGroup(this); -<<<<<<< HEAD QAction *autoTheme = new QAction(tr("跟随主题"),this); themeMenuGroup->addAction(autoTheme); themeMenu->addAction(autoTheme); @@ -124,17 +97,7 @@ void menuModule::initAction() themeMenu->addAction(lightTheme); lightTheme->setCheckable(true); QAction *darkTheme = new QAction(tr("深色主题"),this); -======= - QAction *autoTheme = new QAction(tr("Auto"),this); - themeMenuGroup->addAction(autoTheme); - themeMenu->addAction(autoTheme); - autoTheme->setCheckable(true); - QAction *lightTheme = new QAction(tr("Light"),this); - themeMenuGroup->addAction(lightTheme); - themeMenu->addAction(lightTheme); - lightTheme->setCheckable(true); - QAction *darkTheme = new QAction(tr("Dark"),this); ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 + themeMenuGroup->addAction(darkTheme); themeMenu->addAction(darkTheme); darkTheme->setCheckable(true); @@ -192,7 +155,6 @@ void menuModule::setStyleByThemeGsetting(){ void menuModule::triggerMenu(QAction *act) { QString str = act->text(); -<<<<<<< HEAD // if(tr("Quit") == str){ // emit menuModuleClose(); // } @@ -278,81 +240,7 @@ void menuModule::helpAction() DaemonDbus::getInstance()->showGuide(appName); } } -======= - if(tr("Quit") == str){ - emit menuModuleClose(); - } - else if(tr("About") == str){ - aboutAction(); - } - else if(tr("Help") == str){ - helpAction(); - } - else if(tr("Standard") == str){ - emit menuModuleChanged(QString("standard")); - } - else if(tr("Scientific") == str){ - emit menuModuleChanged(QString("scientific")); - } - else if(tr("Exchange Rate") == str){ - emit menuModuleChanged(QString("exchange rate")); - } -} -void menuModule::triggerThemeMenu(QAction *act) -{ - if(!m_pGsettingThemeStatus) - { - m_pGsettingThemeStatus = new QGSettings(confPath.toLocal8Bit()); //m_pGsettingThemeStatus指针重复使用避免占用栈空间 - } - QString str = act->text(); - if("Light" == str){ - themeStatus = themeLightOnly; - disconnect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); - m_pGsettingThemeStatus->set("thememode","lightonly"); -// disconnect() - setThemeLight(); - }else if("Dark" == str){ - themeStatus = themeBlackOnly; - disconnect(m_pGsettingThemeData,&QGSettings::changed,this,&menuModule::dealSystemGsettingChange); - m_pGsettingThemeStatus->set("thememode","darkonly"); - setThemeDark(); - }else{ - themeStatus = themeAuto; - m_pGsettingThemeStatus->set("thememode","auto"); - initGsetting(); -// updateTheme(); - themeUpdate(); - } -} - -void menuModule::aboutAction() -{ -// 关于点击事件处理 - // if (aboutWindow != nullptr) { - // aboutWindow->hide(); - - // QTime dieTime = QTime::currentTime().addMSecs(50); - // while( QTime::currentTime() < dieTime ) - // QCoreApplication::processEvents(QEventLoop::AllEvents, 100); - - - // aboutWindow->show(); - // // aboutWindow->activateWindow(); - // return ; - // } - initAbout(); -} - -void menuModule::helpAction() -{ - // 帮助点击事件处理 - if(!DaemonDbus::getInstance()->daemonIsNotRunning()){ - // qDebug() << "hahahahahaha" << appName; - DaemonDbus::getInstance()->showGuide(appName); - } -} ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 #include void menuModule::initAbout() { @@ -391,11 +279,8 @@ void menuModule::initAbout() QHBoxLayout* menuModule::initTitleBar() { QLabel* titleIcon = new QLabel(); -<<<<<<< HEAD + titleIcon->setPixmap(QIcon::fromTheme("kylin-ipmsg").pixmap(titleIcon->size())); -======= - titleIcon->setPixmap(QIcon::fromTheme("kylin-calculator").pixmap(titleIcon->size())); ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 titleIcon->setFixedSize(QSize(24,24)); titleIcon->setScaledContents(true); @@ -406,17 +291,10 @@ QHBoxLayout* menuModule::initTitleBar() titleBtnClose->setProperty("useIconHighlightEffect",0x8); titleBtnClose->setFlat(true); connect(titleBtnClose,&QPushButton::clicked,[=](){aboutWindow->close();}); -<<<<<<< HEAD titleText->setText(tr(appShowingName.toLocal8Bit())); titleText->setStyleSheet("font-size:14px;"); -======= - - titleText->setText(tr(appShowingName.toLocal8Bit())); - titleText->setStyleSheet("font-size:14px;"); - ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 QHBoxLayout *hlyt = new QHBoxLayout; hlyt->setSpacing(0); hlyt->setContentsMargins(4,4,4,4); @@ -435,11 +313,7 @@ QVBoxLayout* menuModule::initBody() QLabel* bodyIcon = new QLabel(); bodyIcon->setFixedSize(96,96); -<<<<<<< HEAD bodyIcon->setPixmap(QIcon::fromTheme("kylin-ipmsg").pixmap(bodyIcon->size())); -======= - bodyIcon->setPixmap(QIcon::fromTheme("kylin-calculator").pixmap(bodyIcon->size())); ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 // bodyIcon->setStyleSheet("font-size:14px;"); // bodyIcon->setScaledContents(true); diff --git a/src/view/titlebar/menumodule.h b/src/view/titlebar/menumodule.h index 566b835..d95d8e1 100644 --- a/src/view/titlebar/menumodule.h +++ b/src/view/titlebar/menumodule.h @@ -58,26 +58,6 @@ class menuModule : public QWidget void menuModuleSetThemeStyle(QString); public: QToolButton *menuButton = nullptr; -<<<<<<< HEAD - -public: -// 程序在实例化的时候需要传递的信息字段,打开debug开关后这些字段会被自动填充 - QString appName = "tools/kylin-calculator"; //格式kylin-usb-creator - QString appShowingName = tr("Calculator"); //格式kylin usb creator ,用来在前端展示 - QString appVersion = qApp->applicationVersion(); - QString appDesc = "kylin calculator"; - QString confPath = "org.kylin-calculator-data.settings"; - QWidget *aboutWindow = nullptr; -private: - QMenu *m_menu = nullptr; - QMenu *themeMenu = nullptr; - QSize iconSize; - QString appPath = "tools/kylin-calculator"; //拉起帮助菜单时使用appName字段 - - QGSettings *m_pGsettingThemeData = nullptr; - QGSettings *m_pGsettingThemeStatus = nullptr; - enum typeThemeStatus : int -======= public: // 程序在实例化的时候需要传递的信息字段,打开debug开关后这些字段会被自动填充 @@ -96,7 +76,6 @@ class menuModule : public QWidget QGSettings *m_pGsettingThemeData = nullptr; QGSettings *m_pGsettingThemeStatus = nullptr; enum typeThemeStatus : int ->>>>>>> 8496cc2fe94aaecee783aa4dd4e84e4fa764d0c5 { themeAuto = 0, themeBlackOnly = 1, From bd21d7bb715b650a159f2f5463a8f0d1767521bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Dmobaixin=E2=80=9C?= <13687162414@163.com> Date: Thu, 25 Apr 2024 12:22:48 +0800 Subject: [PATCH 30/31] Update: gitignore and config files --- .gitignore | 3 +++ data/translations/generate_translations_pm.sh | 0 debian/rules | 0 debian/source/local-options | 0 run | 0 src/view/localinfo/localinfo.cpp | 6 ++++-- 6 files changed, 7 insertions(+), 2 deletions(-) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 data/translations/generate_translations_pm.sh mode change 100755 => 100644 debian/rules mode change 100755 => 100644 debian/source/local-options mode change 100755 => 100644 run diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 9a0a9f5..82a6259 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.gitignore +docs + # C++ objects and libs *.slo *.lo diff --git a/data/translations/generate_translations_pm.sh b/data/translations/generate_translations_pm.sh old mode 100755 new mode 100644 diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 diff --git a/debian/source/local-options b/debian/source/local-options old mode 100755 new mode 100644 diff --git a/run b/run old mode 100755 new mode 100644 diff --git a/src/view/localinfo/localinfo.cpp b/src/view/localinfo/localinfo.cpp index 93b0d32..8e2f25b 100644 --- a/src/view/localinfo/localinfo.cpp +++ b/src/view/localinfo/localinfo.cpp @@ -97,6 +97,8 @@ void LocalInfo::setWidgetUi() s_EditSearch->setLayout(m_searchLayout); this->installEventFilter(this);//安装过滤器 + u_ButtonUpdate->installEventFilter(this); + u_ButtonFile->installEventFilter(this); s_EditSearch->installEventFilter(this); @@ -171,7 +173,7 @@ bool LocalInfo::eventFilter(QObject *watch,QEvent *e) s_LabelIcon->setAlignment(Qt::AlignRight|Qt::AlignVCenter); s_EditSearch->setAlignment(Qt::AlignLeft); s_EditSearch->setTextMargins(s_LabelIcon->width(), 1, 1 , 1);//没有取消按钮的时候 - qDebug()<<"MouseButtonPress"; + qDebug()<<"MouseButtonPress不是lineedit"; } if(e->type() == QEvent::MouseButtonPress && watch == s_EditSearch) { @@ -180,7 +182,7 @@ bool LocalInfo::eventFilter(QObject *watch,QEvent *e) s_EditSearch->setTextMargins(s_LabelIcon->width(), 1, 1 , 1);//没有取消按钮的时候 s_EditSearch->setFocus(); s_EditSearch->setPlaceholderText("搜索");//提示文字 - qDebug()<<"youdian"; + qDebug()<<"MouseButtonPress是lineedit"; } } From 4e3fda1f2abd9e71bb15b415667fd5b3de96eaad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Dmobaixin=E2=80=9C?= <13687162414@163.com> Date: Thu, 25 Apr 2024 22:11:56 +0800 Subject: [PATCH 31/31] Update: git ignore docs files --- .gitignore | 3 +++ debian/rules | 0 debian/source/local-options | 0 run | 0 4 files changed, 3 insertions(+) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 debian/rules mode change 100755 => 100644 debian/source/local-options mode change 100755 => 100644 run diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index 9a0a9f5..82a6259 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.gitignore +docs + # C++ objects and libs *.slo *.lo diff --git a/debian/rules b/debian/rules old mode 100755 new mode 100644 diff --git a/debian/source/local-options b/debian/source/local-options old mode 100755 new mode 100644 diff --git a/run b/run old mode 100755 new mode 100644