From 5d1f4cc36fae2ab0f649aaad8ce5eef0d92d75e6 Mon Sep 17 00:00:00 2001 From: shunf4 Date: Wed, 7 Jul 2021 21:45:08 +0800 Subject: [PATCH] wip --- CMakeLists.txt | 54 +++++++++++++++++++++++++++------ core/CMakeLists.txt | 10 ++++++- core/squawk.cpp | 3 +- core/squawk.h | 2 +- main.cpp | 1 + shared/utils.cpp | 8 ++--- shared/utils.h | 1 - signalcatcher_win32.cpp | 42 ++++++++++++++++++++++++++ squawk.rc | 1 + ui/CMakeLists.txt | 4 +++ ui/squawk.cpp | 2 ++ ui/utils/badge.cpp | 3 ++ ui/utils/message.cpp | 11 +++++-- ui/utils/messageline.cpp | 12 ++++++-- ui/utils/messageline.h | 1 + ui/widgets/CMakeLists.txt | 9 ++++++ ui/widgets/conversation.cpp | 60 +++++++++++++++++++++++++++++++++++-- ui/widgets/conversation.h | 4 +++ ui/widgets/conversation.ui | 26 ++++++++-------- 19 files changed, 217 insertions(+), 37 deletions(-) create mode 100644 signalcatcher_win32.cpp create mode 100644 squawk.rc diff --git a/CMakeLists.txt b/CMakeLists.txt index 771481f..d968e41 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,15 +18,17 @@ if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif() -set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra") -set(CMAKE_CXX_FLAGS_RELEASE "-O3") +if(CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -Wextra") + set(CMAKE_CXX_FLAGS_RELEASE "-O3") +endif(CMAKE_COMPILER_IS_GNUCXX) + message("Build type: ${CMAKE_BUILD_TYPE}") set(squawk_SRC main.cpp exception.cpp - signalcatcher.cpp shared/global.cpp shared/utils.cpp shared/message.cpp @@ -34,6 +36,12 @@ set(squawk_SRC shared/icons.cpp ) +if (WIN32) + list(APPEND squawk_SRC signalcatcher_win32.cpp) +else (WIN32) + list(APPEND squawk_SRC signalcatcher.cpp) +endif (WIN32) + set(squawk_HEAD exception.h signalcatcher.h @@ -47,10 +55,39 @@ set(squawk_HEAD ) configure_file(resources/images/logo.svg squawk.svg COPYONLY) -execute_process(COMMAND convert -background none -size 48x48 squawk.svg squawk48.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -execute_process(COMMAND convert -background none -size 64x64 squawk.svg squawk64.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -execute_process(COMMAND convert -background none -size 128x128 squawk.svg squawk128.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -execute_process(COMMAND convert -background none -size 256x256 squawk.svg squawk256.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +configure_file(squawk.rc squawk.rc COPYONLY) +if (WIN32) + execute_process(COMMAND magick convert -background none -size 48x48 squawk.svg squawk48.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND magick convert -background none -size 64x64 squawk.svg squawk64.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND magick convert -background none -size 128x128 squawk.svg squawk128.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND magick convert -background none -size 256x256 squawk.svg squawk256.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND magick convert squawk48.png squawk64.png squawk256.png squawk.ico WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set(SQUAWK_WIN_RC "${CMAKE_CURRENT_BINARY_DIR}/squawk.rc") +else (WIN32) + execute_process(COMMAND convert -background none -size 48x48 squawk.svg squawk48.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND convert -background none -size 64x64 squawk.svg squawk64.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND convert -background none -size 128x128 squawk.svg squawk128.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + execute_process(COMMAND convert -background none -size 256x256 squawk.svg squawk256.png WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +endif (WIN32) + +if (APPLE) + file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/icns") + execute_process(COMMAND convert -background none -resize "!16x16" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_16x16.png") + execute_process(COMMAND convert -background none -resize "!32x32" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_16x16@2x.png") + execute_process(COMMAND convert -background none -resize "!32x32" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_32x32.png") + execute_process(COMMAND convert -background none -resize "!64x64" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_32x32@2x.png") + execute_process(COMMAND convert -background none -resize "!128x128" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_128x128.png") + execute_process(COMMAND convert -background none -resize "!256x256" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_128x128@2x.png") + execute_process(COMMAND convert -background none -resize "!256x256" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_256x256.png") + execute_process(COMMAND convert -background none -resize "!512x512" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_256x256@2x.png") + execute_process(COMMAND convert -background none -resize "!512x512" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_512x512.png") + execute_process(COMMAND convert -background none -resize "!1024x1024" squawk.svg "${CMAKE_CURRENT_BINARY_DIR}/icns/icon_512x512@2x.png") + execute_process(COMMAND iconutil -c icns "icns" -o "squawk.icns" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + set(MACOSX_BUNDLE_ICON_FILE squawk.icns) + set(APP_ICON_MACOSX ${CMAKE_CURRENT_BINARY_DIR}/squawk.icns) + set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES + MACOSX_PACKAGE_LOCATION "Resources") +endif (APPLE) configure_file(packaging/squawk.desktop squawk.desktop COPYONLY) @@ -92,7 +129,7 @@ if (WITH_KWALLET) endif() endif() -add_executable(squawk ${squawk_SRC} ${squawk_HEAD} ${RCC}) +add_executable(squawk WIN32 ${squawk_SRC} ${squawk_HEAD} ${RCC} ${SQUAWK_WIN_RC} ${APP_ICON_MACOSX}) target_link_libraries(squawk Qt5::Widgets) add_subdirectory(ui) @@ -102,7 +139,6 @@ add_subdirectory(external/simpleCrypt) target_link_libraries(squawk squawkUI) target_link_libraries(squawk squawkCORE) -target_link_libraries(squawk uuid) add_dependencies(${CMAKE_PROJECT_NAME} translations) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index b74a055..a5ba6fd 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -8,6 +8,12 @@ find_package(Qt5Gui CONFIG REQUIRED) find_package(Qt5Network CONFIG REQUIRED) find_package(Qt5Xml CONFIG REQUIRED) +find_path(LMDB_INCLUDE_DIR NAMES lmdb.h PATHS "${LMDB_DIR}/include") +set(LMDB_LIBRARIES "${LMDB_DIR}/lib/liblmdb.a" ) + +message(${LMDB_INCLUDE_DIR}) +message(${LMDB_LIBRARIES}) + set(squawkCORE_SRC squawk.cpp account.cpp @@ -27,6 +33,7 @@ add_subdirectory(passwordStorageEngines) # Tell CMake to create the helloworld executable add_library(squawkCORE ${squawkCORE_SRC}) +target_include_directories(squawkCORE PUBLIC ${LMDB_INCLUDE_DIR}) if(SYSTEM_QXMPP) get_target_property(QXMPP_INTERFACE_INCLUDE_DIRECTORIES QXmpp::QXmpp INTERFACE_INCLUDE_DIRECTORIES) @@ -39,7 +46,8 @@ target_link_libraries(squawkCORE Qt5::Network) target_link_libraries(squawkCORE Qt5::Gui) target_link_libraries(squawkCORE Qt5::Xml) target_link_libraries(squawkCORE qxmpp) -target_link_libraries(squawkCORE lmdb) +# target_link_libraries(squawkCORE lmdb) +target_link_libraries(squawkCORE ${LMDB_LIBRARIES}) target_link_libraries(squawkCORE simpleCrypt) if (WITH_KWALLET) target_link_libraries(squawkCORE kwalletPSE) diff --git a/core/squawk.cpp b/core/squawk.cpp index 1689d71..42e5cee 100644 --- a/core/squawk.cpp +++ b/core/squawk.cpp @@ -119,8 +119,9 @@ void Core::Squawk::newAccountRequest(const QMap& map) QString server = map.value("server").toString(); QString password = map.value("password").toString(); QString resource = map.value("resource").toString(); + int passwordType = map.value("passwordType").toInt(); - addAccount(login, server, password, name, resource, Shared::AccountPassword::plain); + addAccount(login, server, password, name, resource, Shared::Global::fromInt(passwordType)); } void Core::Squawk::addAccount( diff --git a/core/squawk.h b/core/squawk.h index 31812d2..604a941 100644 --- a/core/squawk.h +++ b/core/squawk.h @@ -171,7 +171,7 @@ private: Shared::AccountPassword passwordType ); - static const quint64 passwordHash = 0x08d054225ac4871d; + static const quint64 passwordHash = 0x3c5bb27570f50e11; }; } diff --git a/main.cpp b/main.cpp index 4c4b3ea..4ab6253 100644 --- a/main.cpp +++ b/main.cpp @@ -40,6 +40,7 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); SignalCatcher sc(&app); + QApplication::setOrganizationName("squawk"); QApplication::setApplicationName("squawk"); QApplication::setApplicationDisplayName("Squawk"); QApplication::setApplicationVersion("0.1.5"); diff --git a/shared/utils.cpp b/shared/utils.cpp index 924be85..a7a4ecb 100644 --- a/shared/utils.cpp +++ b/shared/utils.cpp @@ -17,15 +17,11 @@ */ #include "utils.h" +#include QString Shared::generateUUID() { - uuid_t uuid; - uuid_generate(uuid); - - char uuid_str[36]; - uuid_unparse_lower(uuid, uuid_str); - return uuid_str; + return QUuid::createUuid().toString(); } diff --git a/shared/utils.h b/shared/utils.h index e9e3d29..8e1e6dd 100644 --- a/shared/utils.h +++ b/shared/utils.h @@ -23,7 +23,6 @@ #include #include -#include #include namespace Shared { diff --git a/signalcatcher_win32.cpp b/signalcatcher_win32.cpp new file mode 100644 index 0000000..61d43df --- /dev/null +++ b/signalcatcher_win32.cpp @@ -0,0 +1,42 @@ +/* + * Squawk messenger. + * Copyright (C) 2019 Yury Gubich + * + * 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 "signalcatcher.h" +#include + +SignalCatcher::SignalCatcher(QCoreApplication *p_app, QObject *parent): + QObject(parent), + app(p_app) +{ +} + +SignalCatcher::~SignalCatcher() +{} + +void SignalCatcher::handleSigInt() +{ +} + +void SignalCatcher::intSignalHandler(int unused) +{ +} + +int SignalCatcher::setup_unix_signal_handlers() +{ + return 0; +} diff --git a/squawk.rc b/squawk.rc new file mode 100644 index 0000000..bf45d51 --- /dev/null +++ b/squawk.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON "squawk.ico" \ No newline at end of file diff --git a/ui/CMakeLists.txt b/ui/CMakeLists.txt index 52913a8..a68ff16 100644 --- a/ui/CMakeLists.txt +++ b/ui/CMakeLists.txt @@ -36,6 +36,10 @@ set(squawkUI_SRC utils/dropshadoweffect.cpp ) +qt5_wrap_ui(squawkUI_SRC + squawk.ui +) + # Tell CMake to create the helloworld executable add_library(squawkUI ${squawkUI_SRC}) diff --git a/ui/squawk.cpp b/ui/squawk.cpp index 41634ad..2058e3d 100644 --- a/ui/squawk.cpp +++ b/ui/squawk.cpp @@ -982,6 +982,7 @@ void Squawk::readSettings() void Squawk::writeSettings() { QSettings settings; + qDebug() << "settings.fileName: " << settings.fileName(); settings.beginGroup("ui"); settings.beginGroup("window"); settings.setValue("geometry", saveGeometry()); @@ -1023,6 +1024,7 @@ void Squawk::writeSettings() } settings.endGroup(); settings.endGroup(); + } void Squawk::onItemCollepsed(const QModelIndex& index) diff --git a/ui/utils/badge.cpp b/ui/utils/badge.cpp index ef15bd2..164e0ad 100644 --- a/ui/utils/badge.cpp +++ b/ui/utils/badge.cpp @@ -33,6 +33,9 @@ Badge::Badge(const QString& p_id, const QString& p_text, const QIcon& icon, QWid image->setPixmap(icon.pixmap(25, 25)); closeButton->setIcon(QIcon::fromTheme("tab-close")); + QIcon qIcon; + qIcon.addFile(QString::fromUtf8(":/images/fallback/dark/big/edit-none.svg"), QSize(), QIcon::Normal, QIcon::Off); + closeButton->setIcon(qIcon); closeButton->setMaximumHeight(25); closeButton->setMaximumWidth(25); diff --git a/ui/utils/message.cpp b/ui/utils/message.cpp index 7a004bb..ae354ac 100644 --- a/ui/utils/message.cpp +++ b/ui/utils/message.cpp @@ -203,16 +203,23 @@ void Message::showFile(const QString& path) file = new Image(path); } else { file = new QLabel(); - file->setPixmap(QIcon::fromTheme(type.iconName()).pixmap(50)); + QIcon qIcon = QIcon::fromTheme(type.iconName()); + if (qIcon.isNull()) { + qIcon.addFile(QString::fromUtf8(":/images/fallback/dark/big/mail-attachment.svg"), QSize(), QIcon::Normal, QIcon::Off); + } + file->setPixmap(qIcon.pixmap(50)); file->setAlignment(Qt::AlignCenter); showComment(info.fileName(), true); } file->setContextMenuPolicy(Qt::ActionsContextMenu); - QAction* openAction = new QAction(QIcon::fromTheme("document-new-from-template"), tr("Open"), file); + QAction* openAction = new QAction(QIcon::fromTheme("document-new-from-template"), tr("Open"), this); connect(openAction, &QAction::triggered, [path]() { //TODO need to get rid of this shame QDesktopServices::openUrl(QUrl::fromLocalFile(path)); }); file->addAction(openAction); + fileComment->setContextMenuPolicy(Qt::ActionsContextMenu); + fileComment->addAction(openAction); + bodyLayout->insertWidget(2, file); hasFile = true; } diff --git a/ui/utils/messageline.cpp b/ui/utils/messageline.cpp index fec0037..0f55bdf 100644 --- a/ui/utils/messageline.cpp +++ b/ui/utils/messageline.cpp @@ -38,7 +38,8 @@ MessageLine::MessageLine(bool p_room, QWidget* parent): downloading(), room(p_room), busyShown(false), - progress() + progress(), + lastHeight(0) { setContentsMargins(0, 0, 0, 0); layout->setContentsMargins(0, 0, 0, 0); @@ -163,6 +164,7 @@ MessageLine::Position MessageLine::message(const Shared::Message& msg, bool forc emit requestLocalFile(msg.getId(), msg.getOutOfBandUrl()); connect(message, &Message::buttonClicked, this, &MessageLine::onDownload); } + qDebug() << "inserted message " << id; return res; } @@ -309,7 +311,11 @@ void MessageLine::movePalAvatarToEx(const QString& name) void MessageLine::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); - emit resize(event->size().height() - event->oldSize().height()); + + qDebug() << "Resize(unordered): " << event->size().height() << event->oldSize().height(); + qDebug() << "Resize: " << height() << lastHeight; + emit resize(height() - lastHeight); + lastHeight = height(); } @@ -328,6 +334,7 @@ void MessageLine::showBusyIndicator() layout->insertWidget(0, &progress); progress.start(); busyShown = true; + qDebug() << "showBusyIndicator"; } } @@ -337,6 +344,7 @@ void MessageLine::hideBusyIndicator() progress.stop(); layout->removeWidget(&progress); busyShown = false; + qDebug() << "hideBusyIndicator"; } } diff --git a/ui/utils/messageline.h b/ui/utils/messageline.h index a0a7b6c..2a25ac0 100644 --- a/ui/utils/messageline.h +++ b/ui/utils/messageline.h @@ -103,6 +103,7 @@ private: bool room; bool busyShown; Progress progress; + int lastHeight; }; #endif // MESSAGELINE_H diff --git a/ui/widgets/CMakeLists.txt b/ui/widgets/CMakeLists.txt index 29e2dbc..0338778 100644 --- a/ui/widgets/CMakeLists.txt +++ b/ui/widgets/CMakeLists.txt @@ -21,6 +21,15 @@ set(squawkWidgets_SRC joinconference.cpp ) +qt5_wrap_ui(squawkWidgets_SRC + account.ui + accounts.ui + conversation.ui + joinconference.ui + newcontact.ui + vcard/vcard.ui +) + # Tell CMake to create the helloworld executable add_library(squawkWidgets ${squawkWidgets_SRC}) diff --git a/ui/widgets/conversation.cpp b/ui/widgets/conversation.cpp index fd87d9f..731915a 100644 --- a/ui/widgets/conversation.cpp +++ b/ui/widgets/conversation.cpp @@ -21,6 +21,7 @@ #include "ui/utils/dropshadoweffect.h" #include +#include #include #include #include @@ -28,6 +29,9 @@ #include #include #include +#include +#include +#include Conversation::Conversation(bool muc, Models::Account* acc, const QString pJid, const QString pRes, QWidget* parent): QWidget(parent), @@ -50,7 +54,8 @@ Conversation::Conversation(bool muc, Models::Account* acc, const QString pJid, c manualSliderChange(false), requestingHistory(false), everShown(false), - tsb(QApplication::style()->styleHint(QStyle::SH_ScrollBar_Transient) == 1) + tsb(QApplication::style()->styleHint(QStyle::SH_ScrollBar_Transient) == 1), + pasteImageAction(nullptr) { m_ui->setupUi(this); @@ -63,6 +68,7 @@ Conversation::Conversation(bool muc, Models::Account* acc, const QString pJid, c statusLabel = m_ui->statusLabel; connect(&ker, &KeyEnterReceiver::enterPressed, this, &Conversation::onEnterPressed); + connect(&ker, &KeyEnterReceiver::imagePasted, this, &Conversation::onImagePasted); connect(&scrollResizeCatcher, &Resizer::resized, this, &Conversation::onScrollResize); connect(&vis, &VisibilityCatcher::shown, this, &Conversation::onScrollResize); connect(&vis, &VisibilityCatcher::hidden, this, &Conversation::onScrollResize); @@ -77,6 +83,17 @@ Conversation::Conversation(bool muc, Models::Account* acc, const QString pJid, c this, &Conversation::onTextEditDocSizeChanged); m_ui->messageEditor->installEventFilter(&ker); + + QMenu *editorMenu = m_ui->messageEditor->createStandardContextMenu(); + editorMenu->addSeparator(); + QAction* pasteImageAction = new QAction(tr("Paste Image"), this); + connect(pasteImageAction, &QAction::triggered, this, &Conversation::onImagePasted); + editorMenu->addAction(pasteImageAction); + m_ui->messageEditor->setContextMenuPolicy(Qt::CustomContextMenu); + connect(m_ui->messageEditor, &QTextEdit::customContextMenuRequested, this, [this, pasteImageAction, editorMenu](const QPoint &pos) { + pasteImageAction->setEnabled(Conversation::checkClipboardImage()); + editorMenu->exec(this->m_ui->messageEditor->mapToGlobal(pos)); + }); QScrollBar* vs = m_ui->scrollArea->verticalScrollBar(); m_ui->scrollArea->setWidget(line); @@ -204,10 +221,20 @@ bool KeyEnterReceiver::eventFilter(QObject* obj, QEvent* event) } } } + if (k == Qt::Key_V && key->modifiers() & Qt::CTRL) { + if (Conversation::checkClipboardImage()) { + emit imagePasted(); + return true; + } + } } return QObject::eventFilter(obj, event); } +bool Conversation::checkClipboardImage() { + return !QApplication::clipboard()->image().isNull(); +} + QString Conversation::getPalResource() const { return activePalResource; @@ -239,6 +266,20 @@ void Conversation::onEnterPressed() } } +void Conversation::onImagePasted() +{ + QImage image = QApplication::clipboard()->image(); + if (image.isNull()) { + return; + } + QTemporaryFile *tempFile = new QTemporaryFile(QDir::tempPath() + QStringLiteral("/squawk_img_attach_XXXXXX.png"), QApplication::instance()); + tempFile->open(); + image.save(tempFile, "PNG"); + tempFile->close(); + qDebug() << "image on paste temp file: " << tempFile->fileName(); + addAttachedFile(tempFile->fileName()); +} + void Conversation::appendMessageWithUpload(const Shared::Message& data, const QString& path) { line->appendMessageWithUploadNoSiganl(data, path); @@ -247,18 +288,28 @@ void Conversation::appendMessageWithUpload(const Shared::Message& data, const QS void Conversation::onMessagesResize(int amount) { manualSliderChange = true; + qDebug() << "Scroll: " << scroll; switch (scroll) { case down: + qDebug() << "setValue 1: " << m_ui->scrollArea->verticalScrollBar()->maximum(); m_ui->scrollArea->verticalScrollBar()->setValue(m_ui->scrollArea->verticalScrollBar()->maximum()); break; case keep: { int max = m_ui->scrollArea->verticalScrollBar()->maximum(); int value = m_ui->scrollArea->verticalScrollBar()->value() + amount; m_ui->scrollArea->verticalScrollBar()->setValue(value); + qDebug() << "setValue 2 max: " << max; + qDebug() << "setValue 2 value: " << m_ui->scrollArea->verticalScrollBar()->value(); + qDebug() << "setValue 2 amount: " << amount; + qDebug() << "setValue 2: " << value; + qDebug() << "isMax: " << (value > max); - if (value == max) { + if (value > max) { + qDebug() << "setValue 2 scroll = down"; scroll = down; + m_ui->scrollArea->verticalScrollBar()->setValue(max); } else { + qDebug() << "setValue 2 scroll = nothing"; scroll = nothing; } } @@ -273,14 +324,17 @@ void Conversation::onSliderValueChanged(int value) { if (!manualSliderChange) { if (value == m_ui->scrollArea->verticalScrollBar()->maximum()) { + qDebug() << "onSliderValueChanged: scroll = down"; scroll = down; } else { if (!requestingHistory && value == 0) { requestingHistory = true; line->showBusyIndicator(); emit requestArchive(line->firstMessageId()); + qDebug() << "onSliderValueChanged: scroll = keep"; scroll = keep; } else { + qDebug() << "onSliderValueChanged: scroll = nothing"; scroll = nothing; } } @@ -290,6 +344,7 @@ void Conversation::onSliderValueChanged(int value) void Conversation::responseArchive(const std::list list) { requestingHistory = false; + qDebug() << "responseArchive scroll = keep"; scroll = keep; line->hideBusyIndicator(); @@ -304,6 +359,7 @@ void Conversation::showEvent(QShowEvent* event) everShown = true; line->showBusyIndicator(); requestingHistory = true; + qDebug() << "showEvent scroll = keep"; scroll = keep; emit requestArchive(line->firstMessageId()); } diff --git a/ui/widgets/conversation.h b/ui/widgets/conversation.h index ea87607..0a366a8 100644 --- a/ui/widgets/conversation.h +++ b/ui/widgets/conversation.h @@ -52,6 +52,7 @@ protected: signals: void enterPressed(); + void imagePasted(); }; class VisibilityCatcher : public QObject { @@ -90,6 +91,7 @@ public: void changeMessage(const QString& id, const QMap& data); void setFeedFrames(bool top, bool right, bool bottom, bool left); virtual void appendMessageWithUpload(const Shared::Message& data, const QString& path); + static bool checkClipboardImage(); signals: void sendMessage(const Shared::Message& message); @@ -113,6 +115,7 @@ protected: protected slots: void onEnterPressed(); + void onImagePasted(); void onMessagesResize(int amount); void onSliderValueChanged(int value); void onAttach(); @@ -151,6 +154,7 @@ protected: bool requestingHistory; bool everShown; bool tsb; //transient scroll bars + QAction *pasteImageAction; }; #endif // CONVERSATION_H diff --git a/ui/widgets/conversation.ui b/ui/widgets/conversation.ui index 7093bcb..902ed86 100644 --- a/ui/widgets/conversation.ui +++ b/ui/widgets/conversation.ui @@ -243,7 +243,7 @@ 0 0 520 - 385 + 380 @@ -325,8 +325,8 @@ - - .. + + :/images/fallback/dark/big/unfavorite.svg:/images/fallback/dark/big/unfavorite.svg true @@ -352,8 +352,8 @@ - - .. + + :/images/fallback/dark/big/mail-attachment.svg:/images/fallback/dark/big/mail-attachment.svg true @@ -366,8 +366,8 @@ - - .. + + :/images/fallback/dark/big/clean.svg:/images/fallback/dark/big/clean.svg true @@ -386,8 +386,8 @@ - - .. + + :/images/fallback/dark/big/send.svg:/images/fallback/dark/big/send.svg true @@ -454,8 +454,8 @@ background-color: transparent <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Liberation Sans'; font-size:10pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> +</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Liberation Sans'; font-size:10pt;"><br /></p></body></html> false @@ -473,6 +473,8 @@ p, li { white-space: pre-wrap; } - + + +