merged with upstream/master
2
.gitignore
vendored
@ -11,4 +11,4 @@ Makefile*
|
||||
Thumbs.db
|
||||
*.pro.user
|
||||
.kdev4
|
||||
*.kdev4
|
||||
*.kdev4
|
@ -509,6 +509,7 @@ HEADERS += util/folderiterator.h \
|
||||
util/stacktrace.h \
|
||||
util/rsdeprecate.h \
|
||||
util/cxx11retrocompat.h \
|
||||
util/cxx17retrocompat.h \
|
||||
util/rsurl.h
|
||||
|
||||
SOURCES += ft/ftchunkmap.cc \
|
||||
|
@ -1170,8 +1170,8 @@ bool p3PeerMgrIMPL::addSslOnlyFriend(
|
||||
* previously known IP addresses */
|
||||
if(!dt.isHiddenNode)
|
||||
{
|
||||
for(const std::string& locator : dt.ipAddressList)
|
||||
addPeerLocator(sslId, locator);
|
||||
for(const std::string& ipStr : dt.ipAddressList)
|
||||
addPeerLocator(sslId, RsUrl(ipStr));
|
||||
|
||||
if(dt.extPort && !dt.extAddr.empty())
|
||||
{
|
||||
|
@ -3,7 +3,8 @@
|
||||
* *
|
||||
* libretroshare: retroshare core library *
|
||||
* *
|
||||
* Copyright 2012-2019 by Retroshare Team <contact@retroshare.cc> *
|
||||
* Copyright (C) 2012-2019 by Retroshare Team <contact@retroshare.cc> *
|
||||
* Copyright (C) 2019 Gioacchino Mazzurco <gio@eigenlab.org> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser General Public License as *
|
||||
@ -21,18 +22,129 @@
|
||||
*******************************************************************************/
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
#include <ostream>
|
||||
|
||||
/** Check if given type is a scoped enum */
|
||||
template<typename E>
|
||||
using rs_is_scoped_enum = std::integral_constant< bool,
|
||||
std::is_enum<E>::value && !std::is_convertible<E, int>::value >;
|
||||
|
||||
/**
|
||||
* @brief Register enum class as flags type
|
||||
* To use this macro define a scoped enum with your flag values, then register
|
||||
* it as flags type passing it as parameter of this macro.
|
||||
* The result will be type safe flags, that cannot be mixed up with flag of a
|
||||
* different type, but that are very comfortable to operate like plain old
|
||||
* integers.
|
||||
* This macro support flag fields of different lenght depending on what
|
||||
* underlining type (usually from uint8_t up to uint64_t) has been declared for
|
||||
* the enum class.
|
||||
* If you plan to serialize those flags it is important to specify the
|
||||
* underlining type of the enum otherwise different compilers may serialize a
|
||||
* flag variable with different lenght, potentially causing interoperability
|
||||
* issues between differents builds.
|
||||
* Usage example:
|
||||
@code{.cpp}
|
||||
enum class RsGrouterItemFlags : uint32_t
|
||||
{
|
||||
NONE = 0x0,
|
||||
ENCRYPTED = 0x1,
|
||||
SERVICE_UNKNOWN = 0x2
|
||||
};
|
||||
RS_REGISTER_ENUM_FLAGS_TYPE(RsGrouterItemFlags)
|
||||
@endcode
|
||||
*/
|
||||
#define RS_REGISTER_ENUM_FLAGS_TYPE(eft) \
|
||||
template<> struct Rs__BitFlagsOps<eft> \
|
||||
{ \
|
||||
static_assert( std::is_enum<eft>::value, \
|
||||
"Are you trying to register a non-enum type as flags?" ); \
|
||||
static_assert( rs_is_scoped_enum<eft>::value, \
|
||||
"Are you trying to register an unscoped enum as flags?" ); \
|
||||
static constexpr bool enabled = true; \
|
||||
};
|
||||
|
||||
// By defaults types are not valid flags, so bit flags operators are disabled
|
||||
template<typename> struct Rs__BitFlagsOps
|
||||
{ static constexpr bool enabled = false; };
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
/*EFT*/ operator &(EFT lhs, EFT rhs)
|
||||
{
|
||||
using u_t = typename std::underlying_type<EFT>::type;
|
||||
return static_cast<EFT>(static_cast<u_t>(lhs) & static_cast<u_t>(rhs));
|
||||
}
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
/*EFT*/ operator &=(EFT& lhs, EFT rhs) { lhs = lhs & rhs; return lhs; }
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
/*EFT*/ operator |(EFT lhs, EFT rhs)
|
||||
{
|
||||
using u_t = typename std::underlying_type<EFT>::type;
|
||||
return static_cast<EFT>(static_cast<u_t>(lhs) | static_cast<u_t>(rhs));
|
||||
}
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
/*EFT*/ operator |=(EFT& lhs, EFT rhs) { lhs = lhs | rhs; return lhs; }
|
||||
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
/*EFT*/ operator ^(EFT lhs, EFT rhs)
|
||||
{
|
||||
using u_t = typename std::underlying_type<EFT>::type;
|
||||
return static_cast<EFT>(static_cast<u_t>(lhs) ^ static_cast<u_t>(rhs));
|
||||
}
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
/*EFT*/ operator ^=(EFT& lhs, EFT rhs) { lhs = lhs ^ rhs; return lhs; }
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, EFT>::type
|
||||
operator ~(EFT val)
|
||||
{
|
||||
using u_t = typename std::underlying_type<EFT>::type;
|
||||
return static_cast<EFT>(~static_cast<u_t>(val));
|
||||
}
|
||||
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, bool>::type
|
||||
operator !(EFT val)
|
||||
{
|
||||
using u_t = typename std::underlying_type<EFT>::type;
|
||||
return static_cast<u_t>(val) == 0;
|
||||
}
|
||||
|
||||
/// Nicely print flags bits as 1 and 0
|
||||
template<typename EFT>
|
||||
typename std::enable_if<Rs__BitFlagsOps<EFT>::enabled, std::ostream>::type&
|
||||
operator <<(std::ostream& stream, EFT flags)
|
||||
{
|
||||
using u_t = typename std::underlying_type<EFT>::type;
|
||||
|
||||
for(int i = sizeof(u_t); i>=0; --i)
|
||||
{
|
||||
stream << (flags & ( 1 << i ) ? "1" : "0");
|
||||
if( i % 8 == 0 ) stream << " ";
|
||||
}
|
||||
return stream;
|
||||
}
|
||||
|
||||
#include <cstdint>
|
||||
#include "util/rsdeprecate.h"
|
||||
|
||||
/* G10h4ck: TODO we should redefine flags in a way that the flag declaration and
|
||||
* the flags values (bit fields) would be strongly logically linked.
|
||||
* A possible way is to take an enum class containing the names of each
|
||||
* bitfield and corresponding value as template parameter, this way would also
|
||||
* avoid the need of dumb template parameter that is used only to make the
|
||||
* types incompatible but that doesn't help finding what are the possible values
|
||||
* for a kind of flag. Another appealing approach seems the first one described
|
||||
* here https://softwareengineering.stackexchange.com/questions/194412/using-scoped-enums-for-bit-flags-in-c
|
||||
* a few simple macros could be used instead of the template class */
|
||||
|
||||
/**
|
||||
* @deprecated t_RsFlags32 has been deprecated because the newer
|
||||
* @see RS_REGISTER_ENUM_FLAGS_TYPE provide more convenient flags facilities.
|
||||
*
|
||||
// This class provides a representation for flags that can be combined with bitwise
|
||||
// operations. However, because the class is templated with an id, it's not possible to
|
||||
// mixup flags belonging to different classes. This avoids many bugs due to confusion of flags types
|
||||
@ -51,7 +163,8 @@
|
||||
// - an explicit constructor from uint32_t
|
||||
// - an implicit bool operator, that allows test like if(flags & FLAGS_VALUE)
|
||||
//
|
||||
template<int n> class t_RsFlags32
|
||||
*/
|
||||
template<int n> class RS_DEPRECATED_FOR(RS_REGISTER_ENUM_FLAGS_TYPE) t_RsFlags32
|
||||
{
|
||||
public:
|
||||
inline t_RsFlags32() : _bits(0) {}
|
||||
|
35
libretroshare/src/util/cxx17retrocompat.h
Normal file
@ -0,0 +1,35 @@
|
||||
/*******************************************************************************
|
||||
* libretroshare/src/util: cxx17retrocompat.h *
|
||||
* *
|
||||
* libretroshare: retroshare core library *
|
||||
* *
|
||||
* Copyright (C) 2019 Gioacchino Mazzurco <gio@eigenlab.org> *
|
||||
* *
|
||||
* This program is free software: you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU Lesser 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 Lesser General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Lesser General Public License *
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
*******************************************************************************/
|
||||
#pragma once
|
||||
|
||||
#if __cplusplus < 201703L
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
namespace std
|
||||
{
|
||||
using namespace std;
|
||||
template <class T> constexpr typename add_const<T>::type& as_const(T& t) noexcept
|
||||
{ return t; }
|
||||
template <class T> void as_const(const T&&) = delete;
|
||||
}
|
||||
#endif // __cplusplus < 201703L
|
@ -62,6 +62,35 @@ bool myFunnyFunction(
|
||||
*/
|
||||
#define RS_DEFAULT_STORAGE_PARAM(Type,...) *std::unique_ptr<Type>(new Type(__VA_ARGS__))
|
||||
|
||||
|
||||
/** @brief Safely dynamic cast between std::unique_ptr of different types
|
||||
* std::unique_ptr semantic rely on the invariant that only one instance own
|
||||
* the object, when casting between differents types one would be tempted to do
|
||||
* it in a one liner that easly end up breaking that condition ending up in a
|
||||
* double delete and crash or in a silent memleak.
|
||||
* With this function one can do that with same comfort of a plain dynamic_cast,
|
||||
* plus the std::unique_ptr safety.
|
||||
* @param[inout] src reference to source pointer. If the cast is successfull it
|
||||
* is released, otherwise it is left untouched.
|
||||
* @param[out] dst reference to destination pointer. If the cast is successful
|
||||
* it get reseated to the object address, otherwise it is left untouched.
|
||||
* @return true on success, false otherwise
|
||||
*/
|
||||
template <class T_SRC, class T_DST>
|
||||
bool rs_unique_cast(
|
||||
std::unique_ptr<T_SRC>& src, std::unique_ptr<T_DST>& dst )
|
||||
{
|
||||
T_DST* dstPtr = dynamic_cast<T_DST*>(src.get());
|
||||
if(dstPtr)
|
||||
{
|
||||
src.release();
|
||||
dst.reset(dstPtr);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void *rs_malloc(size_t size) ;
|
||||
|
||||
// This is a scope guard to release the memory block when going of of the current scope.
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* RetroShare
|
||||
* Copyright (C) 2018 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
* Copyright (C) 2018-2019 Gioacchino Mazzurco <gio@eigenlab.org>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
@ -17,15 +17,16 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "rsurl.h"
|
||||
#include "serialiser/rstypeserializer.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
#include "rsurl.h"
|
||||
#include "serialiser/rstypeserializer.h"
|
||||
#include "util/rsnet.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
RsUrl::RsUrl() : mPort(0), mHasPort(false) {}
|
||||
@ -33,6 +34,26 @@ RsUrl::RsUrl() : mPort(0), mHasPort(false) {}
|
||||
RsUrl::RsUrl(const std::string& urlStr) : mPort(0), mHasPort(false)
|
||||
{ fromString(urlStr); }
|
||||
|
||||
RsUrl::RsUrl(const sockaddr_storage& addr): mPort(0), mHasPort(false)
|
||||
{
|
||||
switch(addr.ss_family)
|
||||
{
|
||||
case AF_INET: setScheme("ipv4"); break;
|
||||
case AF_INET6: setScheme("ipv6"); break;
|
||||
default:
|
||||
{
|
||||
std::string addrDump;
|
||||
sockaddr_storage_dump(addr, &addrDump);
|
||||
RsErr() << __PRETTY_FUNCTION__ << " got invalid addr: " << addrDump
|
||||
<< std::endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
setHost(sockaddr_storage_iptostring(addr));
|
||||
setPort(sockaddr_storage_port(addr));
|
||||
}
|
||||
|
||||
RsUrl& RsUrl::fromString(const std::string& urlStr)
|
||||
{
|
||||
size_t endI = urlStr.size()-1;
|
||||
@ -55,7 +76,7 @@ RsUrl& RsUrl::fromString(const std::string& urlStr)
|
||||
{
|
||||
if(++hostBeginI >= endI) return *this;
|
||||
hostEndI = urlStr.find(ipv6WrapClose, hostBeginI);
|
||||
mHost = urlStr.substr(hostBeginI, hostEndI - hostBeginI - 1);
|
||||
mHost = urlStr.substr(hostBeginI, hostEndI - hostBeginI);
|
||||
++hostEndI;
|
||||
}
|
||||
else
|
||||
@ -250,10 +271,10 @@ RsUrl& RsUrl::setFragment(const std::string& fragment)
|
||||
size_t boundary = len-2; // % Encoded char must be at least 2 hex char
|
||||
for (size_t i = 0; i < len; ++i)
|
||||
{
|
||||
|
||||
if(str[i] == '%' && i < boundary)
|
||||
{
|
||||
decoded << static_cast<char>(std::stoi(str.substr(++i, 2), 0, 16));
|
||||
decoded << static_cast<char>(std::stoi(
|
||||
str.substr(++i, 2), nullptr, 16 ));
|
||||
++i;
|
||||
}
|
||||
else decoded << str[i];
|
||||
|
@ -22,6 +22,8 @@
|
||||
|
||||
#include "serialiser/rsserializable.h"
|
||||
|
||||
struct sockaddr_storage;
|
||||
|
||||
/**
|
||||
* Very simplistic and minimal URL helper class for RetroShare, after looking
|
||||
* for a small and self-contained C/C++ URL parsing and manipulation library,
|
||||
@ -36,7 +38,8 @@
|
||||
struct RsUrl : RsSerializable
|
||||
{
|
||||
RsUrl();
|
||||
RsUrl(const std::string& urlStr);
|
||||
explicit RsUrl(const std::string& urlStr);
|
||||
explicit RsUrl(const sockaddr_storage& ssas);
|
||||
|
||||
RsUrl& fromString(const std::string& urlStr);
|
||||
std::string toString() const;
|
||||
|
@ -44,5 +44,6 @@
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>NSRequiresAquaSystemAppearance</key> <true/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
@ -71,14 +71,14 @@
|
||||
#define IMAGE_CREATE ""
|
||||
#define IMAGE_PUBLIC ":/icons/png/chats.png"
|
||||
#define IMAGE_PRIVATE ":/icons/png/chats-private.png"
|
||||
#define IMAGE_SUBSCRIBE ":/images/edit_add24.png"
|
||||
#define IMAGE_UNSUBSCRIBE ":/images/cancel.png"
|
||||
#define IMAGE_SUBSCRIBE ":/icons/png/enter.png"
|
||||
#define IMAGE_UNSUBSCRIBE ":/icons/png/leave2.png"
|
||||
#define IMAGE_PEER_ENTERING ":images/user/add_user24.png"
|
||||
#define IMAGE_PEER_LEAVING ":images/user/remove_user24.png"
|
||||
#define IMAGE_TYPING ":images/typing.png"
|
||||
#define IMAGE_TYPING ":images/typing.png"
|
||||
#define IMAGE_MESSAGE ":images/chat.png"
|
||||
#define IMAGE_AUTOSUBSCRIBE ":images/accepted16.png"
|
||||
#define IMAGE_COPYRSLINK ":/images/copyrslink.png"
|
||||
#define IMAGE_COPYRSLINK ":/icons/png/copy.png"
|
||||
|
||||
ChatLobbyWidget::ChatLobbyWidget(QWidget *parent, Qt::WindowFlags flags)
|
||||
: RsAutoUpdatePage(5000, parent, flags)
|
||||
|
@ -121,8 +121,11 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#define IMAGE_QUIT ":/icons/png/exit.png"
|
||||
#define IMAGE_PREFERENCES ":/icons/png/options.png"
|
||||
#define IMAGE_PREFERENCES ":/icons/png/options2.png"
|
||||
#define IMAGE_ABOUT ":/icons/png/info.png"
|
||||
#define IMAGE_STATS ":/icons/png/netgraph2.png"
|
||||
#define IMAGE_CLOSE ":/icons/png/exit2.png"
|
||||
|
||||
#define IMAGE_ADDFRIEND ":/icons/png/invite.png"
|
||||
#define IMAGE_RETROSHARE ":/icons/logo_128.png"
|
||||
#define IMAGE_NOONLINE ":/icons/logo_0_connected_128.png"
|
||||
@ -130,9 +133,8 @@
|
||||
#define IMAGE_TWOONLINE ":/icons/logo_2_connected_128.png"
|
||||
#define IMAGE_OVERLAY ":/icons/star_overlay_128.png"
|
||||
|
||||
#define IMAGE_BWGRAPH ":/images/ksysguard.png"
|
||||
#define IMAGE_BWGRAPH ":/icons/png/bandwidth.png"
|
||||
#define IMAGE_MESSENGER ":/images/rsmessenger48.png"
|
||||
#define IMAGE_CLOSE ":/images/close_normal.png"
|
||||
#define IMAGE_BLOCK ":/images/blockdevice.png"
|
||||
#define IMAGE_COLOR ":/images/highlight.png"
|
||||
#define IMAGE_GAMES ":/images/kgames.png"
|
||||
@ -146,7 +148,6 @@
|
||||
|
||||
#define IMAGE_PLUGINS ":/images/extension_32.png"
|
||||
#define IMAGE_BLOGS ":/images/kblogger.png"
|
||||
#define IMAGE_DHT ":/images/dht16.png"
|
||||
|
||||
/*static*/ bool MainWindow::hiddenmode = false;
|
||||
|
||||
@ -609,7 +610,7 @@ void MainWindow::createTrayIcon()
|
||||
trayMenu->addAction(QIcon(":/images/emblem-web.png"), tr("Show web interface"), this, SLOT(showWebinterface()));
|
||||
#endif
|
||||
trayMenu->addAction(QIcon(IMAGE_BWGRAPH), tr("Bandwidth Graph"), this, SLOT(showBandwidthGraph()));
|
||||
trayMenu->addAction(QIcon(IMAGE_DHT), tr("Statistics"), this, SLOT(showStatisticsWindow()));
|
||||
trayMenu->addAction(QIcon(IMAGE_STATS), tr("Statistics"), this, SLOT(showStatisticsWindow()));
|
||||
|
||||
|
||||
#ifdef UNFINISHED
|
||||
|
@ -132,8 +132,8 @@ ChatLobbyDialog::ChatLobbyDialog(const ChatLobbyId& lid, QWidget *parent, Qt::Wi
|
||||
// Add a button to invite friends.
|
||||
//
|
||||
inviteFriendsButton = new QToolButton ;
|
||||
inviteFriendsButton->setMinimumSize(icon_size);
|
||||
inviteFriendsButton->setMaximumSize(icon_size);
|
||||
//inviteFriendsButton->setMinimumSize(icon_size);
|
||||
//inviteFriendsButton->setMaximumSize(icon_size);
|
||||
inviteFriendsButton->setText(QString()) ;
|
||||
inviteFriendsButton->setAutoRaise(true) ;
|
||||
inviteFriendsButton->setToolTip(tr("Invite friends to this lobby"));
|
||||
@ -177,8 +177,8 @@ ChatLobbyDialog::ChatLobbyDialog(const ChatLobbyId& lid, QWidget *parent, Qt::Wi
|
||||
connect(ownIdChooser,SIGNAL(currentIndexChanged(int)),this,SLOT(changeNickname())) ;
|
||||
|
||||
unsubscribeButton = new QToolButton;
|
||||
unsubscribeButton->setMinimumSize(icon_size);
|
||||
unsubscribeButton->setMaximumSize(icon_size);
|
||||
//unsubscribeButton->setMinimumSize(icon_size);
|
||||
//unsubscribeButton->setMaximumSize(icon_size);
|
||||
unsubscribeButton->setText(QString()) ;
|
||||
unsubscribeButton->setAutoRaise(true) ;
|
||||
unsubscribeButton->setToolTip(tr("Leave this chat room (Unsubscribe)"));
|
||||
|
@ -92,26 +92,26 @@ ChatWidget::ChatWidget(QWidget *parent)
|
||||
lastMsgDate = QDate::currentDate();
|
||||
|
||||
//Resize Tool buttons
|
||||
ui->emoteiconButton->setFixedSize(buttonSize);
|
||||
//ui->emoteiconButton->setFixedSize(buttonSize);
|
||||
ui->emoteiconButton->setIconSize(iconSize);
|
||||
ui->stickerButton->setFixedSize(buttonSize);
|
||||
//ui->stickerButton->setFixedSize(buttonSize);
|
||||
ui->stickerButton->setIconSize(iconSize);
|
||||
ui->attachPictureButton->setFixedSize(buttonSize);
|
||||
//ui->attachPictureButton->setFixedSize(buttonSize);
|
||||
ui->attachPictureButton->setIconSize(iconSize);
|
||||
ui->addFileButton->setFixedSize(buttonSize);
|
||||
//ui->addFileButton->setFixedSize(buttonSize);
|
||||
ui->addFileButton->setIconSize(iconSize);
|
||||
ui->pushtoolsButton->setFixedSize(buttonSize);
|
||||
//ui->pushtoolsButton->setFixedSize(buttonSize);
|
||||
ui->pushtoolsButton->setIconSize(iconSize);
|
||||
ui->notifyButton->setFixedSize(buttonSize);
|
||||
//ui->notifyButton->setFixedSize(buttonSize);
|
||||
ui->notifyButton->setIconSize(iconSize);
|
||||
ui->markButton->setFixedSize(buttonSize);
|
||||
//ui->markButton->setFixedSize(buttonSize);
|
||||
ui->markButton->setIconSize(iconSize);
|
||||
ui->leSearch->setFixedHeight(iconHeight);
|
||||
ui->searchBefore->setFixedHeight(iconHeight);
|
||||
ui->searchAfter->setFixedHeight(iconHeight);
|
||||
ui->searchButton->setFixedSize(buttonSize);
|
||||
//ui->searchButton->setFixedSize(buttonSize);
|
||||
ui->searchButton->setIconSize(iconSize);
|
||||
ui->sendButton->setFixedHeight(iconHeight);
|
||||
//ui->sendButton->setFixedHeight(iconHeight);
|
||||
ui->sendButton->setIconSize(iconSize);
|
||||
ui->typingLabel->setMaximumHeight(QFontMetricsF(font()).height()*1.2);
|
||||
|
||||
|
@ -332,6 +332,9 @@ border-image: url(:/images/closepressed.png)
|
||||
<enum>QFrame::Sunken</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="toolBarFrameHLayout">
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
@ -804,17 +807,20 @@ border-image: url(:/images/closepressed.png)
|
||||
<enum>QFrame::Plain</enum>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="pluginTitleFrameHLayout">
|
||||
<property name="spacing">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>2</number>
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>2</number>
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
|
@ -80,9 +80,6 @@ ConnectFriendWizard::ConnectFriendWizard(QWidget *parent) :
|
||||
|
||||
mTitleFontSize = 0; // Standard
|
||||
mTitleFontWeight = 0; // Standard
|
||||
|
||||
// (csoler) I'm hiding this, since it is not needed anymore with the new Home page.
|
||||
ui->userFrame->hide();
|
||||
|
||||
// ui->userFileFrame->hide(); // in homepage dropmenu now
|
||||
|
||||
@ -138,7 +135,6 @@ ConnectFriendWizard::ConnectFriendWizard(QWidget *parent) :
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->userFrame->hide(); // certificates page - top half with own cert and it's functions
|
||||
ui->cp_Frame->hide(); // Advanced options - key sign, whitelist, direct source ...
|
||||
AdvancedVisible=false;
|
||||
ui->trustLabel->hide();
|
||||
@ -302,6 +298,7 @@ void ConnectFriendWizard::setCertificate(const QString &certificate, bool friend
|
||||
ui->requestinfolabel->show();
|
||||
setTitleText(ui->ConclusionPage, tr("Friend request"));
|
||||
ui->ConclusionPage->setSubTitle(tr("Details about the request"));
|
||||
setButtonText(QWizard::FinishButton , tr("Accept"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -326,6 +323,7 @@ void ConnectFriendWizard::setCertificate(const QString &certificate, bool friend
|
||||
ui->requestinfolabel->show();
|
||||
setTitleText(ui->ConclusionPage, tr("Friend request"));
|
||||
ui->ConclusionPage->setSubTitle(tr("Details about the request"));
|
||||
setButtonText(QWizard::FinishButton , tr("Accept"));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -351,10 +349,11 @@ void ConnectFriendWizard::setGpgId(const RsPgpId &gpgId, const RsPeerId &sslId,
|
||||
//setStartId(friendRequest ? Page_FriendRequest : Page_Conclusion);
|
||||
setStartId(Page_Conclusion);
|
||||
if (friendRequest){
|
||||
ui->cp_Label->show();
|
||||
ui->requestinfolabel->show();
|
||||
setTitleText(ui->ConclusionPage,tr("Friend request"));
|
||||
ui->ConclusionPage->setSubTitle(tr("Details about the request"));
|
||||
ui->cp_Label->show();
|
||||
ui->requestinfolabel->show();
|
||||
setTitleText(ui->ConclusionPage,tr("Friend request"));
|
||||
ui->ConclusionPage->setSubTitle(tr("Details about the request"));
|
||||
setButtonText(QWizard::FinishButton , tr("Accept"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -383,14 +382,9 @@ void ConnectFriendWizard::initializePage(int id)
|
||||
{
|
||||
switch ((Page) id) {
|
||||
case Page_Text:
|
||||
connect(ui->userCertHelpButton, SIGNAL( clicked()), this, SLOT(showHelpUserCert()));
|
||||
connect(ui->userCertIncludeSignaturesButton, SIGNAL(clicked()), this, SLOT(toggleSignatureState()));
|
||||
connect(ui->userCertOldFormatButton, SIGNAL(clicked()), this, SLOT(toggleFormatState()));
|
||||
connect(ui->userCertCopyButton, SIGNAL(clicked()), this, SLOT(copyCert()));
|
||||
|
||||
connect(ui->userCertPasteButton, SIGNAL(clicked()), this, SLOT(pasteCert()));
|
||||
connect(ui->userCertOpenButton, SIGNAL(clicked()), this, SLOT(openCert()));
|
||||
connect(ui->userCertSaveButton, SIGNAL(clicked()), this, SLOT(saveCert()));
|
||||
connect(ui->userCertMailButton, SIGNAL(clicked()), this, SLOT(runEmailClient()));
|
||||
connect(ui->friendCertEdit, SIGNAL(textChanged()), this, SLOT(friendCertChanged()));
|
||||
|
||||
cleanfriendCertTimer = new QTimer(this);
|
||||
@ -398,13 +392,6 @@ void ConnectFriendWizard::initializePage(int id)
|
||||
cleanfriendCertTimer->setInterval(1000); // 1 second
|
||||
connect(cleanfriendCertTimer, SIGNAL(timeout()), this, SLOT(cleanFriendCert()));
|
||||
|
||||
ui->userCertOldFormatButton->setChecked(false);
|
||||
ui->userCertOldFormatButton->hide() ;
|
||||
|
||||
toggleFormatState(true);
|
||||
toggleSignatureState(false);
|
||||
updateOwnCert();
|
||||
|
||||
cleanFriendCert();
|
||||
|
||||
break;
|
||||
@ -780,52 +767,6 @@ void ConnectFriendWizard::accept()
|
||||
|
||||
//============================= TextPage =====================================
|
||||
|
||||
void ConnectFriendWizard::updateOwnCert()
|
||||
{
|
||||
std::string invite = rsPeers->GetRetroshareInvite( rsPeers->getOwnId(),
|
||||
ui->userCertIncludeSignaturesButton->isChecked() );
|
||||
|
||||
std::cerr << "TextPage() getting Invite: " << invite << std::endl;
|
||||
|
||||
ui->userCertEdit->setPlainText(QString::fromUtf8(invite.c_str()));
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::toggleFormatState(bool doUpdate)
|
||||
{
|
||||
if (ui->userCertOldFormatButton->isChecked())
|
||||
{
|
||||
ui->userCertOldFormatButton->setToolTip(tr("Use new certificate format (safer, more robust)"));
|
||||
ui->userCertOldFormatButton->setIcon(QIcon(":/images/ledoff1.png")) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
ui->userCertOldFormatButton->setToolTip(tr("Use old (backward compatible) certificate format"));
|
||||
ui->userCertOldFormatButton->setIcon(QIcon(":/images/ledon1.png")) ;
|
||||
}
|
||||
|
||||
if (doUpdate) {
|
||||
updateOwnCert();
|
||||
}
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::toggleSignatureState(bool doUpdate)
|
||||
{
|
||||
if (ui->userCertIncludeSignaturesButton->isChecked()) {
|
||||
ui->userCertIncludeSignaturesButton->setToolTip(tr("Remove signatures"));
|
||||
} else {
|
||||
ui->userCertIncludeSignaturesButton->setToolTip(tr("Include signatures"));
|
||||
}
|
||||
|
||||
if (doUpdate) {
|
||||
updateOwnCert();
|
||||
}
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::runEmailClient()
|
||||
{
|
||||
sendMail("", tr("RetroShare Invite"), ui->userCertEdit->toPlainText());
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::friendCertChanged()
|
||||
{
|
||||
ui->TextPage->setComplete(false);
|
||||
@ -893,18 +834,6 @@ void ConnectFriendWizard::cleanFriendCert()
|
||||
ui->TextPage->setComplete(certValid);
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::showHelpUserCert()
|
||||
{
|
||||
QMessageBox::information(this, tr("Connect Friend Help"), tr("You can copy this text and send it to your friend via email or some other way"));
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::copyCert()
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
clipboard->setText(ui->userCertEdit->toPlainText());
|
||||
QMessageBox::information(this, "RetroShare", tr("Your Cert is copied to Clipboard, paste and send it to your friend via email or some other way"));
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::pasteCert()
|
||||
{
|
||||
QClipboard *clipboard = QApplication::clipboard();
|
||||
@ -927,23 +856,6 @@ void ConnectFriendWizard::openCert()
|
||||
}
|
||||
}
|
||||
|
||||
void ConnectFriendWizard::saveCert()
|
||||
{
|
||||
QString fileName = QFileDialog::getSaveFileName(this, tr("Save as..."), "", tr("RetroShare Certificate (*.rsc );;All Files (*)"));
|
||||
if (fileName.isEmpty())
|
||||
return;
|
||||
|
||||
QFile file(fileName);
|
||||
if (!file.open(QFile::WriteOnly))
|
||||
return;
|
||||
|
||||
//Todo: move save to file to p3Peers::SaveCertificateToFile
|
||||
|
||||
QTextStream ts(&file);
|
||||
ts.setCodec(QTextCodec::codecForName("UTF-8"));
|
||||
ts << ui->userCertEdit->document()->toPlainText();
|
||||
}
|
||||
|
||||
#ifdef TO_BE_REMOVED
|
||||
//========================== CertificatePage =================================
|
||||
|
||||
|
@ -78,16 +78,9 @@ protected:
|
||||
|
||||
private slots:
|
||||
/* TextPage */
|
||||
void updateOwnCert();
|
||||
void toggleSignatureState(bool doUpdate = true);
|
||||
void toggleFormatState(bool doUpdate = true);
|
||||
void runEmailClient();
|
||||
void runEmailClient2();
|
||||
void showHelpUserCert();
|
||||
void copyCert();
|
||||
void pasteCert();
|
||||
void openCert();
|
||||
void saveCert();
|
||||
void friendCertChanged();
|
||||
void cleanFriendCert();
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>600</width>
|
||||
<height>500</height>
|
||||
<height>437</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -28,192 +28,6 @@
|
||||
<string notr="true">ConnectFriendWizard::Page_Text</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="TextPageVLayout">
|
||||
<item>
|
||||
<widget class="QFrame" name="userFrame">
|
||||
<layout class="QGridLayout" name="userFrameGLayout">
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="userCertButtonVLayout">
|
||||
<item>
|
||||
<widget class="QToolButton" name="userCertHelpButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>20</horstretch>
|
||||
<verstretch>20</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/info16.png</normaloff>:/images/info16.png</iconset>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="userCertIncludeSignaturesButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>20</horstretch>
|
||||
<verstretch>20</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Include signatures</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/gpgp_key_generate.png</normaloff>:/images/gpgp_key_generate.png</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="userCertCopyButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>20</horstretch>
|
||||
<verstretch>20</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Copy your Cert to Clipboard</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/copyrslink.png</normaloff>:/images/copyrslink.png</iconset>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="userCertSaveButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>20</horstretch>
|
||||
<verstretch>20</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Save your Cert into a File</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/document_save.png</normaloff>:/images/document_save.png</iconset>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="userCertMailButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>20</horstretch>
|
||||
<verstretch>20</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Run Email program</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/mail_send.png</normaloff>:/images/mail_send.png</iconset>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="userCertOldFormatButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>20</horstretch>
|
||||
<verstretch>20</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="focusPolicy">
|
||||
<enum>Qt::NoFocus</enum>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/ledon1.png</normaloff>:/images/ledon1.png</iconset>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="autoRaise">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="userCertButtonVSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPlainTextEdit" name="userCertEdit">
|
||||
<property name="font">
|
||||
<font>
|
||||
<family>Courier New</family>
|
||||
</font>
|
||||
</property>
|
||||
<property name="lineWrapMode">
|
||||
<enum>QPlainTextEdit::NoWrap</enum>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="tabStopWidth">
|
||||
<number>80</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="userCertLabel">
|
||||
<property name="text">
|
||||
<string>The text below is your Retroshare ID. You have to provide it to your friend</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="friendFrame">
|
||||
<layout class="QGridLayout" name="friendFrameGLayout">
|
||||
@ -938,7 +752,7 @@
|
||||
<enum>QFrame::Box</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>To accept the Friend Request, click the Finish button.</string>
|
||||
<string>To accept the Friend Request, click the Accept button.</string>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>2</number>
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <QMenu>
|
||||
#include <QDir>
|
||||
#include <QMimeData>
|
||||
#include <QTextDocumentFragment>
|
||||
|
||||
#include "CreateGxsChannelMsg.h"
|
||||
#include "gui/gxs/GxsIdDetails.h"
|
||||
@ -72,7 +73,8 @@ CreateGxsChannelMsg::CreateGxsChannelMsg(const RsGxsGroupId &cId, RsGxsMessageId
|
||||
connect(thumbNailCb, SIGNAL(toggled(bool)), this, SLOT(allowAutoMediaThumbNail(bool)));
|
||||
connect(tabWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenu(QPoint)));
|
||||
connect(generateCheckBox, SIGNAL(toggled(bool)), generateSpinBox, SLOT(setEnabled(bool)));
|
||||
|
||||
connect(addPictureButton, SIGNAL(clicked()), this, SLOT(addPicture()));
|
||||
connect(msgEdit, SIGNAL(textChanged()), this, SLOT(checkLength()));
|
||||
generateSpinBox->setEnabled(false);
|
||||
|
||||
thumbNailCb->setVisible(false);
|
||||
@ -94,6 +96,26 @@ CreateGxsChannelMsg::CreateGxsChannelMsg(const RsGxsGroupId &cId, RsGxsMessageId
|
||||
#endif
|
||||
}
|
||||
|
||||
static const uint32_t MAX_ALLOWED_GXS_MESSAGE_SIZE = 199000;
|
||||
|
||||
void CreateGxsChannelMsg::checkLength()
|
||||
{
|
||||
QString text;
|
||||
RsHtml::optimizeHtml(msgEdit, text);
|
||||
std::wstring msg = text.toStdWString();
|
||||
int charRemains = MAX_ALLOWED_GXS_MESSAGE_SIZE - msg.length();
|
||||
if(charRemains >= 0) {
|
||||
text = tr("It remains %1 characters after HTML conversion.").arg(charRemains);
|
||||
infoLabel->setStyleSheet("QLabel#infoLabel { }");
|
||||
}else{
|
||||
text = tr("Warning: This message is too big of %1 characters after HTML conversion.").arg((0-charRemains));
|
||||
infoLabel->setStyleSheet("QLabel#infoLabel {color: red; font: bold; }");
|
||||
}
|
||||
buttonBox->button(QDialogButtonBox::Ok)->setToolTip(text);
|
||||
buttonBox->button(QDialogButtonBox::Ok)->setEnabled(charRemains>=0);
|
||||
infoLabel->setText(text);
|
||||
}
|
||||
|
||||
CreateGxsChannelMsg::~CreateGxsChannelMsg()
|
||||
{
|
||||
Settings->saveWidgetInformation(this);
|
||||
@ -741,6 +763,18 @@ void CreateGxsChannelMsg::addThumbnail()
|
||||
thumbnail_label->setPixmap(picture);
|
||||
}
|
||||
|
||||
void CreateGxsChannelMsg::addPicture()
|
||||
{
|
||||
QString file;
|
||||
if (misc::getOpenFileName(window(), RshareSettings::LASTDIR_IMAGES, tr("Load Picture File"), "Pictures (*.png *.xpm *.jpg *.jpeg)", file)) {
|
||||
QString encodedImage;
|
||||
if (RsHtml::makeEmbeddedImage(file, encodedImage, 640*480, MAX_ALLOWED_GXS_MESSAGE_SIZE - 200)) {
|
||||
QTextDocumentFragment fragment = QTextDocumentFragment::fromHtml(encodedImage);
|
||||
msgEdit->textCursor().insertFragment(fragment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CreateGxsChannelMsg::loadChannelPostInfo(const uint32_t &token)
|
||||
{
|
||||
#ifdef DEBUG_CREATE_GXS_MSG
|
||||
|
@ -69,6 +69,8 @@ private slots:
|
||||
void contextMenu(QPoint) ;
|
||||
|
||||
void addThumbnail();
|
||||
void addPicture();
|
||||
void checkLength();
|
||||
void allowAutoMediaThumbNail(bool);
|
||||
|
||||
private:
|
||||
|
@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>875</width>
|
||||
<height>659</height>
|
||||
<width>671</width>
|
||||
<height>513</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="acceptDrops">
|
||||
@ -96,19 +96,6 @@
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<layout class="QGridLayout" name="channelAttachGLayout">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="channelAttachLabel">
|
||||
<property name="text">
|
||||
<string><!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:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">Attachments:</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/images/feedback_arrow.png" /><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;"> Use Drag and Drop / Add Files button, to Hash new files.</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/images/feedback_arrow.png" /><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;"> Copy/Paste RetroShare links from your shares</span></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QPushButton" name="addfilepushButton">
|
||||
<property name="text">
|
||||
@ -131,6 +118,30 @@ p, li { white-space: pre-wrap; }
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QPushButton" name="addPictureButton">
|
||||
<property name="text">
|
||||
<string>Add Picture</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset resource="../images.qrc">
|
||||
<normaloff>:/images/add_image24.png</normaloff>:/images/add_image24.png</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="channelAttachLabel">
|
||||
<property name="text">
|
||||
<string><!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:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'MS Shell Dlg 2'; font-size:10pt; font-weight:600;">Attachments:</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/images/feedback_arrow.png" /><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;"> Use Drag and Drop / Add Files button, to Hash new files.</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/images/feedback_arrow.png" /><span style=" font-family:'MS Shell Dlg 2'; font-size:8pt;"> Copy/Paste RetroShare links from your shares</span></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
@ -194,6 +205,13 @@ p, li { white-space: pre-wrap; }
|
||||
<item>
|
||||
<widget class="MimeTextEdit" name="msgEdit"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="infoLabel">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@ -302,8 +320,8 @@ p, li { white-space: pre-wrap; }
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>767</width>
|
||||
<height>42</height>
|
||||
<width>812</width>
|
||||
<height>24</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@ -390,17 +408,17 @@ p, li { white-space: pre-wrap; }
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>MimeTextEdit</class>
|
||||
<extends>QTextEdit</extends>
|
||||
<header location="global">gui/common/MimeTextEdit.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>HeaderFrame</class>
|
||||
<extends>QFrame</extends>
|
||||
<header>gui/common/HeaderFrame.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>MimeTextEdit</class>
|
||||
<extends>QTextEdit</extends>
|
||||
<header location="global">gui/common/MimeTextEdit.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources>
|
||||
<include location="../images.qrc"/>
|
||||
|
@ -80,6 +80,7 @@
|
||||
<file>icons/png/chat-lobbies.png</file>
|
||||
<file>icons/png/circles.png</file>
|
||||
<file>icons/png/empty-circle.png</file>
|
||||
<file>icons/png/enter.png</file>
|
||||
<file>icons/png/exit.png</file>
|
||||
<file>icons/png/feedreader-notify.png</file>
|
||||
<file>icons/png/feedreader.png</file>
|
||||
@ -98,14 +99,16 @@
|
||||
<file>icons/png/invite.png</file>
|
||||
<file>icons/png/keyring.png</file>
|
||||
<file>icons/png/leave.png</file>
|
||||
<file>icons/png/leave2.png</file>
|
||||
<file>icons/png/messages-notify.png</file>
|
||||
<file>icons/png/messages.png</file>
|
||||
<file>icons/png/microphone_mute.png</file>
|
||||
<file>icons/png/microphone.png</file>
|
||||
<file>icons/png/netgraph.png</file>
|
||||
<file>icons/png/netgraph2.png</file>
|
||||
<file>icons/png/network-notify.png</file>
|
||||
<file>icons/png/network.png</file>
|
||||
<file>icons/png/network2.png</file>
|
||||
<file>icons/png/network2.png</file>
|
||||
<file>icons/png/network-puplic.png</file>
|
||||
<file>icons/png/newsfeed-notify.png</file>
|
||||
<file>icons/png/newsfeed.png</file>
|
||||
@ -271,12 +274,16 @@
|
||||
<file>icons/png/correct.png</file>
|
||||
<file>icons/png/comment.png</file>
|
||||
<file>icons/png/chats.png</file>
|
||||
<file>icons/png/chats-private.png</file>
|
||||
<file>icons/png/chats-private.png</file>
|
||||
<file>icons/png/fileshare.png</file>
|
||||
<file>icons/png/forum.png</file>
|
||||
<file>icons/png/message.png</file>
|
||||
<file>icons/png/newsfeed2.png</file>
|
||||
<file>icons/png/postedlinks.png</file>
|
||||
<file>icons/png/people2.png</file>
|
||||
<file>icons/png/bandwidth.png</file>
|
||||
<file>icons/png/netgraph2.png</file>
|
||||
<file>icons/png/options2.png</file>
|
||||
<file>icons/png/exit2.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
BIN
retroshare-gui/src/gui/icons/png/bandwidth.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
retroshare-gui/src/gui/icons/png/enter.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
retroshare-gui/src/gui/icons/png/exit2.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
retroshare-gui/src/gui/icons/png/leave2.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
retroshare-gui/src/gui/icons/png/netgraph2.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
retroshare-gui/src/gui/icons/png/options2.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
51
retroshare-gui/src/gui/icons/svg/netgraph2.svg
Normal file
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg4155"
|
||||
version="1.1"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
xml:space="preserve"
|
||||
width="128"
|
||||
height="128"
|
||||
viewBox="0 0 128 128"
|
||||
sodipodi:docname="netgraph2.svg"><metadata
|
||||
id="metadata4161"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4159" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1152"
|
||||
inkscape:window-height="801"
|
||||
id="namedview4157"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.8097514"
|
||||
inkscape:cx="63.846549"
|
||||
inkscape:cy="58.330325"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g4163"
|
||||
units="in" /><g
|
||||
id="g4163"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="ink_ext_XXXXXX"
|
||||
transform="matrix(1.25,0,0,-1.25,0,128)"><path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#039bd5;fill-opacity:1;stroke-width:1.91469252"
|
||||
d="m 87.283675,52.339305 c -2.372068,0 -4.470776,-1.187702 -5.736989,-2.99843 l -5.158733,0.893867 c 0.0065,0.193773 0.01609,0.387455 0.01609,0.582848 0,2.289997 -0.454194,4.47511 -1.271842,6.47457 l 8.737195,5.271507 c 1.1757,-0.895385 2.641125,-1.428095 4.229609,-1.428095 3.858487,0 6.997575,3.139087 6.997575,6.997575 0,3.858262 -3.139088,6.997058 -6.997575,6.997058 -3.858262,0 -6.997056,-3.138796 -6.997056,-6.997058 0,-0.40997 0.0372,-0.810983 0.105442,-1.20177 l -8.69366,-5.245174 c -2.637827,3.21579 -6.418577,5.458977 -10.715697,6.103967 v 10.734103 c 3.206344,1.07263 5.525225,4.102248 5.525225,7.665087 3.3e-5,4.456963 -3.626019,8.083242 -8.08269,8.083242 -4.456477,0 -8.082238,-3.62602 -8.082238,-8.083242 0,-3.562839 2.318139,-6.592197 5.524709,-7.665087 V 67.79017 C 50.827458,66.911417 45.934189,63.062376 43.581823,57.83205 l -16.009198,4.917303 c 0.04821,0.395645 0.07571,0.79769 0.07571,1.20611 0,5.490449 -4.466442,9.957376 -9.956633,9.957376 -5.490676,0 -9.9573769,-4.466927 -9.9573769,-9.957376 0,-5.490191 4.4667009,-9.956859 9.9576379,-9.956859 3.253152,0 6.146183,1.568526 7.964322,3.988437 l 16.552158,-5.084068 c -0.08313,-0.684139 -0.131348,-1.379019 -0.131348,-2.085123 0,-4.603511 1.825545,-8.786308 4.786126,-11.871691 L 39.65233,31.271628 c -1.052413,0.469817 -2.216854,0.733246 -3.442141,0.733246 -4.674841,0 -8.477591,-3.803007 -8.477591,-8.477623 0,-4.674097 3.80275,-8.476845 8.477591,-8.476845 4.674095,0 8.477103,3.802748 8.477103,8.476845 0,1.589747 -0.440674,3.077945 -1.204845,4.350823 l 7.449502,7.928771 c 2.463619,-1.369022 5.295799,-2.151894 8.308787,-2.151894 2.878217,0 5.59148,0.715585 7.976874,1.973129 l 7.433106,-11.302363 c -1.810958,-1.804065 -2.933699,-4.298674 -2.933699,-7.050534 0,-5.490449 4.46693,-9.9573763 9.95738,-9.9573763 5.49045,0 9.957376,4.4666663 9.957376,9.9573763 0,5.490192 -4.466926,9.956861 -9.957376,9.956861 -0.894609,0 -1.761625,-0.120338 -2.58694,-0.342945 l -7.742821,11.77293 c 1.829879,1.821986 3.248527,4.054399 4.112468,6.543896 l 4.90223,-0.84935 c 0.480528,-3.393035 3.40274,-6.011415 6.926209,-6.011415 3.858522,0 6.997577,3.139085 6.997577,6.997573 -4.22e-4,3.857746 -3.139574,6.996572 -6.998095,6.996572 z M 47.190515,50.81785 c 0,6.6436 5.405014,12.048647 12.048388,12.048647 6.643858,0 12.048644,-5.405047 12.048644,-12.048647 0,-6.643375 -5.405046,-12.04813 -12.048644,-12.04813 -6.643374,0 -12.048388,5.404755 -12.048388,12.04813 z"
|
||||
id="path3" /></g></svg>
|
After Width: | Height: | Size: 4.1 KiB |
59
retroshare-gui/src/gui/icons/svg/options-blank.svg
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg4155"
|
||||
version="1.1"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
xml:space="preserve"
|
||||
width="80"
|
||||
height="80"
|
||||
viewBox="0 0 80 80"
|
||||
sodipodi:docname="options-blank.svg"><metadata
|
||||
id="metadata4161"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4159" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1152"
|
||||
inkscape:window-height="801"
|
||||
id="namedview4157"
|
||||
showgrid="true"
|
||||
inkscape:zoom="5.11875"
|
||||
inkscape:cx="41.764889"
|
||||
inkscape:cy="40.251477"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g4163"><inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4144" /></sodipodi:namedview><g
|
||||
id="g4163"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="ink_ext_XXXXXX"
|
||||
transform="matrix(1.25,0,0,-1.25,0,80)"><g
|
||||
id="g3"
|
||||
transform="matrix(1.03345,0,0,-1.03345,4.1240623,60.304676)"
|
||||
style="fill:#039bd5;fill-opacity:1"><path
|
||||
d="M 53.188,23.518 50.06,22.916 c -1.842,-0.354 -3.351,-1.607 -4.035,-3.354 -0.686,-1.745 -0.433,-3.69 0.677,-5.203 l 1.964,-2.679 c 0.292,-0.397 0.249,-0.949 -0.1,-1.298 L 44.324,6.14 C 43.985,5.801 43.453,5.75 43.056,6.019 l -2.638,1.786 c -0.91,0.616 -1.958,0.942 -3.033,0.942 -2.713,0 -4.98,-1.941 -5.393,-4.617 L 31.487,0.847 C 31.414,0.36 30.994,0 30.5,0 h -6 c -0.479,0 -0.892,0.341 -0.982,0.812 l -0.777,4.041 c -0.492,2.559 -2.746,4.416 -5.357,4.416 -1.075,0 -2.125,-0.325 -3.033,-0.941 L 10.944,6.02 C 10.547,5.752 10.015,5.802 9.676,6.141 l -4.243,4.242 c -0.349,0.349 -0.391,0.9 -0.1,1.299 l 1.964,2.679 c 1.109,1.512 1.362,3.457 0.677,5.203 -0.686,1.745 -2.194,2.999 -4.036,3.353 L 0.81,23.519 C 0.34,23.608 0,24.021 0,24.5 v 6 c 0,0.493 0.36,0.913 0.848,0.988 l 3.283,0.505 c 1.853,0.285 3.408,1.481 4.157,3.2 0.75,1.72 0.57,3.673 -0.482,5.226 L 6.02,43.057 c -0.269,0.396 -0.218,0.929 0.121,1.268 l 4.242,4.242 c 0.349,0.348 0.899,0.393 1.298,0.1 l 2.679,-1.964 c 0.944,-0.692 2.05,-1.059 3.197,-1.059 2.613,0 4.867,1.857 5.359,4.416 l 0.602,3.129 C 23.608,53.659 24.021,54 24.5,54 h 6 c 0.494,0 0.913,-0.36 0.988,-0.848 l 0.355,-2.309 c 0.466,-3.032 3.067,-4.618 5.396,-4.618 1.146,0 2.25,0.366 3.196,1.06 l 1.884,1.381 c 0.399,0.293 0.95,0.248 1.298,-0.1 l 4.242,-4.242 c 0.339,-0.339 0.39,-0.871 0.121,-1.268 l -1.786,-2.638 c -1.052,-1.553 -1.232,-3.506 -0.482,-5.226 0.75,-1.719 2.304,-2.915 4.157,-3.2 l 3.283,-0.505 C 53.64,31.413 54,30.993 54,30.5 v -6 c 0,-0.479 -0.34,-0.892 -0.812,-0.982 z M 36,27.5 C 36,32.187 32.187,36 27.5,36 22.813,36 19,32.187 19,27.5 19,22.813 22.813,19 27.5,19 c 4.687,0 8.5,3.813 8.5,8.5 z"
|
||||
id="path5"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#039bd5;fill-opacity:1" /><path
|
||||
d="M 27.5,22 C 24.467,22 22,24.468 22,27.5 22,30.532 24.467,33 27.5,33 30.533,33 33,30.532 33,27.5 33,24.468 30.533,22 27.5,22 Z"
|
||||
id="path7"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#039bd5;fill-opacity:1" /></g></g></svg>
|
After Width: | Height: | Size: 3.8 KiB |
@ -26,7 +26,7 @@
|
||||
#include "mainpage.h"
|
||||
#include "ui_MessagesDialog.h"
|
||||
|
||||
#define IMAGE_MESSAGES ":/icons/png/messages.png"
|
||||
#define IMAGE_MESSAGES ":/icons/png/message.png"
|
||||
|
||||
class RSTreeWidgetItemCompareRole;
|
||||
class MessageWidget;
|
||||
|
@ -320,13 +320,13 @@ GenCertDialog > QFrame#headerFrame > QLabel#headerLabel {
|
||||
/* ConnectFriendWizard */
|
||||
|
||||
ConnectFriendWizard QWizardPage#ConclusionPage > QGroupBox#peerDetailsFrame {
|
||||
border: 2px solid #CCCCCC;
|
||||
border: 2px solid #039bd5;
|
||||
border-radius:6px;
|
||||
background: white;
|
||||
padding: 12 12px;
|
||||
}
|
||||
|
||||
ConnectFriendWizard QLabel#fr_label, QLabel#requestinfolabel
|
||||
ConnectFriendWizard QLabel#fr_label, QLabel#requestinfolabel, QLabel#cp_Label
|
||||
{
|
||||
border: 1px solid #DCDC41;
|
||||
border-radius: 6px;
|
||||
@ -334,6 +334,15 @@ ConnectFriendWizard QLabel#fr_label, QLabel#requestinfolabel
|
||||
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #FFFFD7, stop:1 #FFFFB2);
|
||||
}
|
||||
|
||||
ConnectFriendWizard QGroupBox::title#peerDetailsFrame
|
||||
{
|
||||
padding: 4 12px;
|
||||
background: transparent;
|
||||
padding: 4 12px;
|
||||
background: #039bd5;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Toaster */
|
||||
|
||||
ChatToaster > QFrame#windowFrame,
|
||||
|
@ -159,6 +159,7 @@ rs_macos10.10:CONFIG -= rs_macos10.11
|
||||
rs_macos10.12:CONFIG -= rs_macos10.11
|
||||
rs_macos10.13:CONFIG -= rs_macos10.11
|
||||
rs_macos10.14:CONFIG -= rs_macos10.11
|
||||
rs_macos10.15:CONFIG -= rs_macos10.11
|
||||
|
||||
# To enable JSON API append the following assignation to qmake command line
|
||||
# "CONFIG+=rs_jsonapi"
|
||||
@ -764,6 +765,13 @@ macx-* {
|
||||
QMAKE_CXXFLAGS += -Wno-nullability-completeness
|
||||
QMAKE_CFLAGS += -Wno-nullability-completeness
|
||||
}
|
||||
rs_macos10.15 {
|
||||
message(***retroshare.pri: Set Target and SDK to MacOS 10.15 )
|
||||
QMAKE_MACOSX_DEPLOYMENT_TARGET=10.15
|
||||
QMAKE_MAC_SDK = macosx10.15
|
||||
QMAKE_CXXFLAGS += -Wno-nullability-completeness
|
||||
QMAKE_CFLAGS += -Wno-nullability-completeness
|
||||
}
|
||||
|
||||
|
||||
|
||||
|