From 13f6eedcb2e43153576309fea31ab13f6e15bd0e Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 6 Oct 2015 22:49:23 +0300 Subject: [PATCH] half of all boxes redesigned --- Telegram/Resources/lang.strings | 25 +- Telegram/Resources/style.txt | 306 ++-- Telegram/Resources/style_classes.txt | 67 + Telegram/SourceFiles/apiwrap.cpp | 6 +- Telegram/SourceFiles/app.cpp | 44 +- Telegram/SourceFiles/app.h | 4 +- Telegram/SourceFiles/application.cpp | 2 +- Telegram/SourceFiles/art/sprite.png | Bin 178684 -> 179158 bytes Telegram/SourceFiles/art/sprite_200x.png | Bin 239881 -> 240705 bytes Telegram/SourceFiles/boxes/abstractbox.cpp | 25 +- Telegram/SourceFiles/boxes/abstractbox.h | 4 +- Telegram/SourceFiles/boxes/addcontactbox.cpp | 345 ++-- Telegram/SourceFiles/boxes/addcontactbox.h | 64 +- Telegram/SourceFiles/boxes/autolockbox.cpp | 22 +- Telegram/SourceFiles/boxes/autolockbox.h | 4 +- Telegram/SourceFiles/boxes/backgroundbox.cpp | 2 +- Telegram/SourceFiles/boxes/confirmbox.cpp | 14 +- Telegram/SourceFiles/boxes/connectionbox.cpp | 122 +- Telegram/SourceFiles/boxes/connectionbox.h | 14 +- Telegram/SourceFiles/boxes/contactsbox.cpp | 331 ++-- Telegram/SourceFiles/boxes/contactsbox.h | 56 +- .../SourceFiles/boxes/downloadpathbox.cpp | 111 +- Telegram/SourceFiles/boxes/downloadpathbox.h | 8 +- Telegram/SourceFiles/boxes/emojibox.cpp | 2 +- Telegram/SourceFiles/boxes/languagebox.cpp | 31 +- Telegram/SourceFiles/boxes/languagebox.h | 5 +- Telegram/SourceFiles/boxes/passcodebox.cpp | 34 +- Telegram/SourceFiles/boxes/sessionsbox.cpp | 12 +- Telegram/SourceFiles/boxes/stickersetbox.cpp | 10 +- Telegram/SourceFiles/boxes/usernamebox.cpp | 193 ++- Telegram/SourceFiles/boxes/usernamebox.h | 14 +- Telegram/SourceFiles/dialogswidget.cpp | 8 +- Telegram/SourceFiles/dropdown.cpp | 13 +- Telegram/SourceFiles/fileuploader.cpp | 2 +- Telegram/SourceFiles/gui/countryinput.cpp | 8 +- Telegram/SourceFiles/gui/flatbutton.cpp | 9 +- Telegram/SourceFiles/gui/flatcheckbox.cpp | 372 +++- Telegram/SourceFiles/gui/flatcheckbox.h | 90 +- Telegram/SourceFiles/gui/flatinput.cpp | 1529 +++++++++++++++-- Telegram/SourceFiles/gui/flatinput.h | 418 ++++- Telegram/SourceFiles/gui/flattextarea.cpp | 75 +- Telegram/SourceFiles/gui/flattextarea.h | 13 +- Telegram/SourceFiles/gui/phoneinput.cpp | 168 -- Telegram/SourceFiles/gui/phoneinput.h | 64 - Telegram/SourceFiles/gui/text.cpp | 2 +- Telegram/SourceFiles/gui/twidget.h | 8 +- Telegram/SourceFiles/historywidget.cpp | 18 +- Telegram/SourceFiles/intro/introcode.cpp | 20 +- Telegram/SourceFiles/intro/introcode.h | 2 +- Telegram/SourceFiles/intro/introphone.cpp | 2 +- Telegram/SourceFiles/intro/introphone.h | 1 - Telegram/SourceFiles/intro/intropwdcheck.cpp | 4 +- Telegram/SourceFiles/intro/introsignup.cpp | 2 +- Telegram/SourceFiles/mainwidget.cpp | 20 +- Telegram/SourceFiles/mediaview.cpp | 22 +- Telegram/SourceFiles/mtproto/mtp.cpp | 6 +- Telegram/SourceFiles/mtproto/mtpDC.cpp | 2 +- .../SourceFiles/mtproto/mtpFileLoader.cpp | 2 +- Telegram/SourceFiles/overviewwidget.cpp | 2 +- Telegram/SourceFiles/passcodewidget.cpp | 4 +- Telegram/SourceFiles/profilewidget.cpp | 4 +- Telegram/SourceFiles/settings.cpp | 4 +- Telegram/SourceFiles/settingswidget.cpp | 5 +- Telegram/Telegram.vcxproj | 29 +- Telegram/Telegram.vcxproj.filters | 15 - 65 files changed, 3361 insertions(+), 1459 deletions(-) delete mode 100644 Telegram/SourceFiles/gui/phoneinput.cpp delete mode 100644 Telegram/SourceFiles/gui/phoneinput.h diff --git a/Telegram/Resources/lang.strings b/Telegram/Resources/lang.strings index 308aa3226..ccf6a8ce0 100644 --- a/Telegram/Resources/lang.strings +++ b/Telegram/Resources/lang.strings @@ -177,19 +177,23 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_dlg_search_chat" = "Search in this chat"; "lng_dlg_search_for_messages" = "Search for messages"; -"lng_settings_save" = "Save"; +"lng_settings_save" = "SAVE"; "lng_settings_upload" = "Set Profile Photo"; "lng_settings_crop_profile" = "Select a square area for your profile photo"; "lng_settings_uploading_photo" = "Uploading photo.."; -"lng_username_title" = "Change username"; +"lng_username_title" = "Username"; "lng_username_about" = "You can choose a username on Telegram.\nIf you do, other people will be able to find\nyou by this username and contact you\nwithout knowing your phone number.\n\nYou can use a-z, 0-9 and underscores.\nMinimum length is 5 characters."; +"lng_username_choose" = "Choose your username."; "lng_username_invalid" = "This username is invalid."; "lng_username_occupied" = "This username is already occupied."; "lng_username_too_short" = "This username is too short."; "lng_username_bad_symbols" = "This username has bad symbols."; "lng_username_available" = "This username is available."; "lng_username_not_found" = "User @{user} not found."; +"lng_username_link_willbe" = "Such link will open a chat with you:"; +"lng_username_link" = "This link opens a chat with you:"; +"lng_username_copied" = "Link copied to clipboard."; "lng_settings_section_contact_info" = "Contact info"; "lng_settings_phone_number" = "Phone number:"; @@ -228,9 +232,9 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_settings_scale_auto" = "Auto ({cur})"; "lng_settings_section_chat" = "Chat options"; -"lng_settings_replace_emojis" = "Replace emojis"; +"lng_settings_replace_emojis" = "Replace emoji"; "lng_settings_view_emojis" = "View list"; -"lng_settings_emoji_list" = "List of supported emojis"; +"lng_settings_emoji_list" = "List of supported emoji"; "lng_settings_send_enter" = "Send by Enter"; "lng_settings_send_ctrlenter" = "Send by Ctrl+Enter"; "lng_settings_send_cmdenter" = "Send by Cmd+Enter"; @@ -334,7 +338,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_connection_port_ph" = "Port"; "lng_connection_user_ph" = "Username"; "lng_connection_password_ph" = "Password"; -"lng_connection_save" = "Save"; +"lng_connection_save" = "SAVE"; "lng_settings_show_sessions" = "Show all sessions"; "lng_settings_reset" = "Terminate all other sessions"; "lng_settings_reset_sure" = "Are you sure you want to terminate\nall other sessions?"; @@ -425,11 +429,11 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_participant_filter" = "Search"; "lng_participant_invite" = "Invite"; "lng_participant_invite_sorry" = "Sorry, you can only add the first {count:_not_used|# member|# members} to a channel personally.\n\nFrom now on, people will need to join via your invite link."; -"lng_create_group_back" = "Back"; -"lng_create_group_next" = "Next"; -"lng_create_group_create" = "Create"; +"lng_create_group_back" = "BACK"; +"lng_create_group_next" = "NEXT"; +"lng_create_group_create" = "CREATE"; "lng_create_group_title" = "New Group"; -"lng_create_group_about" = "Groups are ideal for smaller communities, they can have up to {count:_not_used|# member|# members}"; +"lng_create_group_about" = "Groups are ideal for smaller communities,\nthey can have up to {count:_not_used|# member|# members}"; "lng_create_channel_title" = "New Channel"; "lng_create_channel_about" = "Channels are a tool for broadcasting your messages to unlimited audiences"; "lng_create_public_channel_title" = "Public Channel"; @@ -438,8 +442,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org "lng_create_private_channel_about" = "Only people with a special invite link may join"; "lng_create_channel_comments" = "Enable Comments"; "lng_create_channel_comments_about" = "If you enable comments, members will be able to discuss your posts in the channel"; -"lng_create_group_save" = "Save"; -"lng_create_group_skip" = "Skip"; +"lng_create_group_skip" = "SKIP"; "lng_create_channel_link_invalid" = "This link is invalid"; "lng_create_channel_link_occupied" = "Sorry, this link is already occupied"; diff --git a/Telegram/Resources/style.txt b/Telegram/Resources/style.txt index b7f9ccbec..c33cbb9a2 100644 --- a/Telegram/Resources/style.txt +++ b/Telegram/Resources/style.txt @@ -61,49 +61,24 @@ wndShadowShift: 1px; layerAlpha: 0.5; layerBG: black; -defaultInputField: InputField { - textFg: black; - textMargins: margins(5px, 5px, 5px, 5px); - textAlign: align(left); - - placeholderFg: #999; - placeholderFgActive: #aaa; - placeholderMargins: margins(2px, 0px, 2px, 0px); - placeholderAlign: align(topleft); - placeholderShift: 50px; - duration: 100; - - borderFg: #e0e0e0; - borderFgActive: #62c0f7; - borderFgError: #e48383; - - border: 1px; - borderActive: 2px; - borderError: 2px; - - font: normalFont; - - height: 32px; -} -dialogsSearchField: InputField(defaultInputField) { - textMargins: margins(34px, 7px, 34px, 7px); - - iconSprite: sprite(227px, 21px, 24px, 24px); - iconPosition: point(6px, 5px); - - width: 240px; - height: 34px; -} - boxWidth: 320px; boxWideWidth: 364px; -boxPadding: margins(26px, 30px, 26px, 16px); +boxPadding: margins(26px, 30px, 26px, 8px); boxMaxListHeight: 600px; -boxFontSize: 13px; +boxFontSize: 14px; boxTextFont: font(boxFontSize); + boxTitleFont: font(boxFontSize semibold); -boxButtonFont: font(boxFontSize semibold); +boxTitlePosition: point(26px, 28px); boxTitleHeight: 54px; + +boxBlueTitleHeight: 54px; +boxBlueTitleBg: #6393b5; +boxBlueTitleAdditionalFg: #dae9f5; +boxBlueTitleAdditionalSkip: 12px; +boxBlueTitlePosition: point(23px, 18px); + +boxButtonFont: font(boxFontSize semibold); defaultBoxButton: BoxButton { textFg: #2f9fea; textFgOver: #2f9fea; @@ -113,7 +88,7 @@ defaultBoxButton: BoxButton { width: -24px; height: 36px; - textTop: 9px; + textTop: 8px; font: boxButtonFont; duration: 200; @@ -127,6 +102,109 @@ attentionBoxButton: BoxButton(defaultBoxButton) { textBgOver: #fff0ed; } boxButtonPadding: margins(12px, 16px, 22px, 16px); +defaultBoxLinkButton: linkButton { + color: #0080c0; + overColor: #0080c0; + downColor: #0073ad; + font: boxTextFont; + overFont: font(boxFontSize underline); +} + +defaultInputArea: InputArea { + textFg: black; + textMargins: margins(5px, 6px, 5px, 4px); + + placeholderFg: #999; + placeholderFgActive: #aaa; + placeholderMargins: margins(2px, 0px, 2px, 0px); + placeholderAlign: align(topleft); + placeholderShift: 50px; + duration: 120; + + borderFg: #e0e0e0; + borderFgActive: #62c0f7; + borderFgError: #e48383; + + border: 1px; + borderActive: 2px; + borderError: 2px; + + font: boxTextFont; + + heightMin: 32px; + heightMax: 128px; +} +defaultInputField: InputField { + textFg: black; + textMargins: margins(5px, 5px, 5px, 5px); + textAlign: align(topleft); + + placeholderFg: #999; + placeholderFgActive: #aaa; + placeholderMargins: margins(2px, 0px, 2px, 0px); + placeholderAlign: align(topleft); + placeholderShift: 50px; + duration: 120; + + borderFg: #e0e0e0; + borderFgActive: #62c0f7; + borderFgError: #e48383; + + border: 1px; + borderActive: 2px; + borderError: 2px; + + font: boxTextFont; + + height: 32px; +} +dialogsSearchField: InputField(defaultInputField) { + textMargins: margins(34px, 7px, 34px, 7px); + + iconSprite: sprite(227px, 21px, 24px, 24px); + iconPosition: point(6px, 5px); + + width: 240px; + height: 34px; +} +defaultCheckbox: Checkbox { + textFg: black; + textBg: white; + + checkFg: #d9d9d9; + checkFgOver: #bfbfbf; + checkFgActive: #4eb3ee; + + width: -46px; + height: 22px; + + textPosition: point(34px, 0px); + diameter: 22px; + thickness: 2px; + checkIcon: sprite(106px, 136px, 14px, 10px); + + font: boxTextFont; + duration: 120; +} +defaultRadiobutton: Radiobutton { + textFg: black; + textBg: white; + + checkFg: #d9d9d9; + checkFgOver: #bfbfbf; + checkFgActive: #4eb3ee; + + width: -46px; + height: 22px; + + textPosition: point(34px, 0px); + diameter: 22px; + thickness: 2px; + checkSkip: 65px; // * 0.1 + + font: boxTextFont; + duration: 120; +} titleBG: #6389a8; titleColor: #0f8dcc;//rgb(20, 136, 210); @@ -643,7 +721,7 @@ setNameInput: flatInput(inpDefFlat) { textMrg: margins(3px, 3px, 3px, 3px); } setErrBG: #ffa5a5; -setErrColor: #800000; +setErrColor: #d84d4d; setErrHeight: 30px; setErrFont: font(fsize); setGoodColor: #008000; @@ -756,9 +834,9 @@ dlgActiveSendImg: sprite(142px, 25px, 17px, 11px); dlgChatImgPos: point(1px, 4px); dlgChatImg: sprite(104px, 26px, 16px, 11px); dlgActiveChatImg: sprite(104px, 37px, 16px, 11px); -dlgChannelImgPos: point(2px, 3px); -dlgChannelImg: sprite(104px, 0px, 14px, 13px); -dlgActiveChannelImg: sprite(104px, 13px, 14px, 13px); +dlgChannelImgPos: point(3px, 4px); +dlgChannelImg: sprite(105px, 1px, 12px, 11px); +dlgActiveChannelImg: sprite(105px, 14px, 12px, 11px); dlgImgSkip: 22px; dlgCheckLeft: 5px; @@ -1259,7 +1337,7 @@ old_boxTitleHeight: 52px; confirmMaxHeight: 320px; confirmCompressedSkip: 10px; addContactPadding: margins(18px, 24px, 18px, 24px); -addContactDelta: 14px; +addContactSkip: 14px; inpAddContact: flatInput(inpDefGray) { height: 42px; textMrg: margins(10px, 5px, 10px, 5px); @@ -1349,8 +1427,6 @@ profileListStatusBottom: 6px; profileHoverBG: #f5f5f5; profileActiveBG: #6294b9; profileSubFont: font(fsize); -profileCheckRect: sprite(78px, 114px, 24px, 24px); -profileCheckActiveRect: sprite(128px, 108px, 24px, 24px); profileCheckDeltaX: 18px; profileCheckDeltaY: 1px; profileListNameFont: font(fsize semibold); @@ -1461,82 +1537,55 @@ contactsFilter: flatInput(dlgFilter) { } inpCountry: flatInput(contactsFilter) { } -newGroupName: flatInput(inpDefGray) { - width: 340px; - height: 42px; - font: font(15px); - textMrg: margins(12px, 4px, 12px, 4px); -} -newGroupLink: flatInput(inpDefFlat) { - width: 340px; - height: 42px; - font: boxTextFont; - textMrg: margins(12px, 4px, 12px, 4px); - bgColor: transparent; - bgActive: transparent; - borderWidth: 2px; - borderColor: #f2f2f2; - borderActive: #80cff9; - borderError: #ed8080; - phColor: #828282; - phFocusColor: #949494; -} + +old_newGroupNamePadding: margins(12px, 15px, 12px, 13px); + newGroupLimitFg: #a4a4a4; newGroupAboutFg: #808080; -newGroupNamePadding: margins(12px, 15px, 12px, 13px); -newGroupPadding: margins(26px, 28px, 26px, 24px); -newGroupSkip: 15px; -newGroupLinkPadding: margins(26px, 27px, 26px, 27px); +newGroupPadding: margins(4px, 6px, 4px, 3px); +newGroupSkip: 17px; +newGroupInfoPadding: margins(0px, -4px, 0px, 1px); + +newGroupLink: InputField(defaultInputField) { + textMargins: margins(0px, 6px, 0px, 4px); +} +newGroupLinkPadding: margins(4px, 27px, 4px, 27px); newGroupLinkTop: -3px; newGroupLinkFont: font(16px); -newGroupPhoto: flatButton(btnDefNext, btnDefBig) { - width: 199px; - height: 42px; - textTop: 9px; - overTextTop: 9px; - downTextTop: 10px; +newGroupPhotoSize: 76px; +newGroupPhotoBg: #4eb5f0; +newGroupPhotoBgOver: #3fa9e7; +newGroupPhotoIcon: sprite(74px, 104px, 30px, 27px); +newGroupPhotoIconPosition: point(23px, 25px); - font: font(17px); - overFont: font(17px); +newGroupNamePosition: point(27px, 20px); +newGroupName: InputField(defaultInputField) { + textMargins: margins(1px, 6px, 1px, 4px); } -newGroupPhotoSize: 96px; -newGroupPhotoSkip: 18px; -newGroupDescriptionSkip: 28px; -newGroupPublicLinkSkip: 27px; -newGroupDescription: flatTextarea(taDefFlat) { - font: font(15px); - bgColor: transparent; - phColor: #828282; - phFocusColor: #949494; + +newGroupDescriptionPadding: margins(0px, 23px, 0px, 14px); +newGroupDescription: InputArea(defaultInputArea) { + textMargins: margins(1px, 6px, 1px, 4px); + heightMax: 115px; } -newGroupDescriptionPadding: margins(5px, 6px, 5px, 6px); + +newGroupPublicLinkPadding: margins(0px, 20px, 0px, 5px); newGroupLinkFadeDuration: 5000; -connectionSkip: 20px; -inpConnectionHost: flatInput(inpDefGray) { - font: font(fsize); - height: 34px; - bgColor: #f2f2f2; - phColor: #949494; - phFocusColor: #a4a4a4; - textMrg: margins(4px, 2px, 5px, 4px); - width: 205px; - - borderWidth: 2px; - borderColor: #f2f2f2; - borderActive: #80cff9; - borderError: #ed8080; +connectionHostInputField: InputField(defaultInputField) { + width: 160px; } -inpConnectionPort: flatInput(inpConnectionHost) { - width: 80px; +connectionPortInputField: InputField(defaultInputField) { + width: 55px; } -inpConnectionUser: flatInput(inpConnectionHost) { - width: 130px; +connectionUserInputField: InputField(defaultInputField) { + width: 95px; } -inpConnectionPassword: flatInput(inpConnectionHost) { - width: 155px; +connectionPasswordInputField: InputField(defaultInputField) { + width: 120px; } +connectionIPv6Skip: 11px; contactsClose: flatButton { color: btnYesColor; @@ -1669,18 +1718,6 @@ dragPadding: margins(20px, 10px, 20px, 10px); dragHeight: 72px; -downloadSkip: 20px; -inpDownloadDir: flatInput(inpDefGray) { - font: font(fsize); - height: 34px; - bgColor: #fff; - textMrg: margins(5px, 2px, 5px, 4px); - width: 295px; - - borderWidth: 2px; - borderColor: #f2f2f2; -} - dpiSlider: slider { color: #ccc; thikness: 2px; @@ -2087,34 +2124,29 @@ minPhotoSize: 100px; maxMediaSize: 420px; maxStickerSize: 256px; -usernameFont: font(14px); -usernameColor: #777; -usernameWidth: 336px; -usernameSkip: 32px; -usernameInput: flatInput(inpAddContact) { - bgColor: transparent; +downloadPathSkip: 10px; + +usernamePadding: margins(23px, 22px, 21px, 12px); +usernameSkip: 49px; +usernameTextStyle: textStyle(defaultTextStyle) { + lineHeight: 20px; } -usernameDone: flatButton(btnSelectDone) { - width: 168px; -} -usernameCancel: flatButton(btnSelectCancel) { - width: 167px; +usernameField: InputField(defaultInputField) { + textMargins: margins(0px, 6px, 0px, 4px); } +usernameDefaultFg: #777; youtubeIcon: sprite(336px, 221px, 60px, 60px); vimeoIcon: sprite(336px, 283px, 60px, 60px); videoIcon: sprite(0px, 340px, 60px, 60px); locationSize: size(320, 240); -langsWidth: 220px; -langsPadding: margins(10px, 10px, 10px, 10px); -langPadding: margins(10px, 10px, 10px, 10px); -langButton: flatCheckbox(rbDefFlat) { +boxOptionListPadding: margins(2px, 20px, 2px, 2px); + +langsWidth: 256px; +langsButton: Radiobutton(defaultRadiobutton) { width: 200px; } -langsCloseButton: flatButton(aboutCloseButton) { - width: langsWidth; -} backgroundPadding: 10px; backgroundSize: size(108px, 193px); diff --git a/Telegram/Resources/style_classes.txt b/Telegram/Resources/style_classes.txt index 715c5a7d8..567967127 100644 --- a/Telegram/Resources/style_classes.txt +++ b/Telegram/Resources/style_classes.txt @@ -286,6 +286,73 @@ BoxButton { duration: number; } +Checkbox { + textFg: color; + textBg: color; + + checkFg: color; + checkFgOver: color; + checkFgActive: color; + + width: number; + height: number; + + textPosition: point; + diameter: number; + thickness: number; + checkIcon: sprite; + + font: font; + duration: number; +} + +Radiobutton { + textFg: color; + textBg: color; + + checkFg: color; + checkFgOver: color; + checkFgActive: color; + + width: number; + height: number; + + textPosition: point; + diameter: number; + thickness: number; + checkSkip: number; + + font: font; + duration: number; +} + +InputArea { + textFg: color; + textMargins: margins; + + placeholderFg: color; + placeholderFgActive: color; + placeholderMargins: margins; + placeholderAlign: align; + placeholderShift: number; + + duration: number; + + borderFg: color; + borderFgActive: color; + borderFgError: color; + + border: number; + borderActive: number; + borderError: number; + + font: font; + + width: number; + heightMin: number; + heightMax: number; +} + InputField { textFg: color; textMargins: margins; diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index ad156f5e7..4f30a9fdd 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -324,7 +324,7 @@ void ApiWrap::gotUserFull(PeerData *peer, const MTPUserFull &result) { } bool ApiWrap::gotPeerFullFailed(PeerData *peer, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _fullPeerRequests.remove(peer); return true; @@ -408,7 +408,7 @@ void ApiWrap::gotUsers(const MTPVector &result) { } bool ApiWrap::gotPeerFailed(PeerData *peer, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _peerRequests.remove(peer); return true; @@ -582,7 +582,7 @@ void ApiWrap::gotStickerSet(uint64 setId, const MTPmessages_StickerSet &result) } bool ApiWrap::gotStickerSetFail(uint64 setId, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _stickerSetRequests.remove(setId); return true; diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index d87e88342..44067891d 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -94,7 +94,7 @@ namespace { HistoryItem *hoveredItem = 0, *pressedItem = 0, *hoveredLinkItem = 0, *pressedLinkItem = 0, *contextItem = 0, *mousedItem = 0; - QPixmap *sprite = 0, *emojis = 0, *emojisLarge = 0; + QPixmap *sprite = 0, *emoji = 0, *emojiLarge = 0; struct CornersPixmaps { CornersPixmaps() { @@ -107,9 +107,9 @@ namespace { CornersMap cornersMap; QImage *cornersMask[4] = { 0 }; - typedef QMap EmojisMap; - EmojisMap mainEmojisMap; - QMap otherEmojisMap; + typedef QMap EmojiMap; + EmojiMap mainEmojiMap; + QMap otherEmojiMap; int32 serviceImageCacheSize = 0; @@ -1919,13 +1919,13 @@ namespace App { if (cRetina()) ::sprite->setDevicePixelRatio(cRetinaFactor()); } emojiInit(); - if (!::emojis) { - ::emojis = new QPixmap(QLatin1String(EName)); - if (cRetina()) ::emojis->setDevicePixelRatio(cRetinaFactor()); + if (!::emoji) { + ::emoji = new QPixmap(QLatin1String(EName)); + if (cRetina()) ::emoji->setDevicePixelRatio(cRetinaFactor()); } - if (!::emojisLarge) { - ::emojisLarge = new QPixmap(QLatin1String(EmojiNames[EIndex + 1])); - if (cRetina()) ::emojisLarge->setDevicePixelRatio(cRetinaFactor()); + if (!::emojiLarge) { + ::emojiLarge = new QPixmap(QLatin1String(EmojiNames[EIndex + 1])); + if (cRetina()) ::emojiLarge->setDevicePixelRatio(cRetinaFactor()); } QImage mask[4]; @@ -1975,10 +1975,10 @@ namespace App { delete ::sprite; ::sprite = 0; - delete ::emojis; - ::emojis = 0; - delete ::emojisLarge; - ::emojisLarge = 0; + delete ::emoji; + ::emoji = 0; + delete ::emojiLarge; + ::emojiLarge = 0; for (int32 j = 0; j < 4; ++j) { for (int32 i = 0; i < RoundCornersCount; ++i) { delete ::corners[i].p[j]; ::corners[i].p[j] = 0; @@ -1991,8 +1991,8 @@ namespace App { } } ::cornersMap.clear(); - mainEmojisMap.clear(); - otherEmojisMap.clear(); + mainEmojiMap.clear(); + otherEmojiMap.clear(); clearAllImages(); } else { @@ -2055,17 +2055,17 @@ namespace App { return *::sprite; } - const QPixmap &emojis() { - return *::emojis; + const QPixmap &emoji() { + return *::emoji; } - const QPixmap &emojisLarge() { - return *::emojisLarge; + const QPixmap &emojiLarge() { + return *::emojiLarge; } const QPixmap &emojiSingle(EmojiPtr emoji, int32 fontHeight) { - EmojisMap *map = &(fontHeight == st::taDefFlat.font->height ? mainEmojisMap : otherEmojisMap[fontHeight]); - EmojisMap::const_iterator i = map->constFind(emojiKey(emoji)); + EmojiMap *map = &(fontHeight == st::taDefFlat.font->height ? mainEmojiMap : otherEmojiMap[fontHeight]); + EmojiMap::const_iterator i = map->constFind(emojiKey(emoji)); if (i == map->cend()) { QImage img(ESize + st::emojiPadding * cIntRetinaFactor() * 2, fontHeight * cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied); if (cRetina()) img.setDevicePixelRatio(cRetinaFactor()); diff --git a/Telegram/SourceFiles/app.h b/Telegram/SourceFiles/app.h index 9fdcfaa6c..3c429b0b4 100644 --- a/Telegram/SourceFiles/app.h +++ b/Telegram/SourceFiles/app.h @@ -205,8 +205,8 @@ namespace App { HistoryItem *mousedItem(); const QPixmap &sprite(); - const QPixmap &emojis(); - const QPixmap &emojisLarge(); + const QPixmap &emoji(); + const QPixmap &emojiLarge(); const QPixmap &emojiSingle(EmojiPtr emoji, int32 fontHeight); void initMedia(); diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index 8e410f1ff..44d6f1855 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -328,7 +328,7 @@ void Application::chatPhotoDone(PeerId peer, const MTPUpdates &updates) { } bool Application::peerPhotoFail(PeerId peer, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; LOG(("Application Error: update photo failed %1: %2").arg(error.type()).arg(error.description())); cancelPhotoUpdate(peer); diff --git a/Telegram/SourceFiles/art/sprite.png b/Telegram/SourceFiles/art/sprite.png index 59ccef9780c59b5d384a3519e4a86e5fabc46f6d..8a40fcf6bd3e9d09743abee40473cf012f48edd2 100644 GIT binary patch delta 57349 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
tl1h^T|Rsh%tT5&W&qzHkh{ ze%Sny^qZ=GGdLplY23mvc9gZ0gLphV_i{}31!UsOIruXR1>AKJo#@jk{vJh(_C`u+ z+#?mP&UceoLTfV=!N|ck|4zsSG(_R@a0oWc^!{R;>o433WFK2k(UTFpezEw8Ck@A$ z(+{Xi0vM^4)zwvhPRqF1Ck`3v_mIq7n9~c6GRkhycihn%?Mv;Z@f@&Kq=vwzW56c) zjAIq%k9?Yr_~_{1!o$NOF1IOte;5g6EMT+PDF zjMCNBb#~d1_a~1*8RX$`!P-zf;Jz`T-ABK;yaZ*|tiRYeIEt>W+yQ}s8pg(0pcDrT zZ2|+@KbdZ5XsCH^FMF1B0&OTUbtI%eANM)+Ax$LGDr-XNr|l9tX`fp?j?^6c;1H%` zVxIz*C<@5{pRs7JE@6+0pQEQZ)Z)T7lR_I0OF*o$>!c*jc5ur;0c;?k=K7^&UYV$5b*Nv^_`-yxE&Yknp>z zb3p&n{G;QQqYYVRso}&oEM$bJs3@mQ8%mDt=$IHll?{%~P%s<<$b0{tK!Bm%{r(M^ zgZ^}9!PN|#`}6a2@S=u6(Hg`Q_PW6~*4E~L9uQmhm5PeWKPjfH?xm%rcFK=dH5#-0 zv7m@2nAZ=$tt=91uZ3+{co-b~G*wma>NA--8+SwohS?-`)DNXx+i_wicc(yP?qnUj zy$0Bx(7KQ14{#K({B>zDAdi5vqmD~&@yiok3CkoKKhbe#k|kEmnBKaSTivzU=azb4 z1IUA~>vHYQ63%#B@=(m41=prcsYspvG(T|~#+8LVG=Tl9D!H8FJH|&=n+M>88R^go z`#bPt*lMJyGVArPl1t4dPu?C2jZ1QbyMSsXI2pb5K*LcU=s$Y0y`fXC_ua~U_6BjL z!y(H&-3AOC3($j4)bCl3z_8RMKzk6?<~eM>fyn4z{0O3PliCm9XN96KS)7Bs@4kWm zLU|gn8mKKIEzSSDKxQQEb>FLKVHV=bn zm`D1G6M)Ctq4Hik{{ggNM{*?mo9}=m?b_VpNM9Jux^G)9Z6wijK#O0J78BL8xzNGl zXiLX~ii)7ShZGdiYUJ_4l;yw3X97pI$Y15~gNNbR4Zx;R15 zA5&i$7uENDJ%n^Oh_omQ(j_Hn0HSm^N_U5s4k-~qLO?)7q(NGwq(n+m8c{k$x}H7X z-~Ywq2YE5T+&kx%9r z9EQXUtnI=1YKEZ_Fk*+#_4mC7j*5U2&wF|55YYh4$tERr1?6;5!x00`G@lgbeEdiN zF(NuoF)r4|iL|T6PUJP&DnzwJ5*7l?_IfN)gG1 zsGmeN1R`KS)!^y?St~w#_>eHxe&DSv0I_!2HmUwF(E+j{G@*fxmE4yffy2Z{Cr5xm z0t)v(iX)U}P3krU#mm41tW2p#z3C)26t`Sy^9HTQq4XvIcSe|PZvbYnAWHzrYge}#N0u2G87aPv^f?lx?Berj(1L_sW-#12H z%Xm1}`ZOUklLVs5V3rqISx#OqS?o~fx$vt!8X!3IL>VR+p?L+!9LCoGj9x(=bm>4g z1F{OGTypp#YP*xCE}K8Z3YHQS2nsOwn4E#(IXnQ_Vr_O&QCheUl3qUtR;tSZE;gB=hM>M>(mV~jzS`n3+(Ld zW`+HShu)T!mMm;+n2;AzQ&U6Mi`F12DJc=QmaPwAyZzoWi`h_T)G z8&ZrXomJC6s}z1ndKy3=ubk>nf@0pW5-8TAaDDuk9QX~FqrX;~Iy#~U>1k;b+|BH4 zY-x!%e+X@828KS!b3GETC|C3QI8}_9gMke~ z&0Y9oxhj3e_b|>$Cg4xDx)a?H>>X8xBML9?FITo@&O6YZZ=z_jx z#OwO!L-}gCur<&Dl2GKqtapxDkDh0=-Ze$EA@03dGh!;$@j+yknsOW8h<|dRW1}%XHHTC&eGA*(Tz$2$ml{mL6jJrX}5b7 zRU+?Sm}NY~4L57%BZ2_qx2sR|T3ZD-h<5_tzvs*s7#SQbxtYW!HGHpqnLff40nh<&&eAkgyaMSRW& z?YehU)A{(2G*sKZCM6<56Db(YAD@{0coa@V|HC{TgeThC$?~8PgKZ4iQBZ%!5|vW5qS>EZ=E)Aer}z@A^Ls)?cYY% z>In*X^-~-1nj@@{l_9!nFtlcsBGRa1j1)XmX_Rt{k3W3)mJPbLN2tY{Q{t$2-i+5@ zhEvaqpZq5j=+Bh8@+7$t_+Jo_y!ocRRw8}Hh7{0h%ubhHn@>Dp30E;(7$acJEm+%c zToq+X47p0N6}InffJy!z4M9#%ANB0)xDMIF_}f+KM`?q6e7(40)gv?AW`* z5VwG)2Z0GjlNdZd%H6RQTAi6UefKlo)-Hd2ETovH!SdT^hmnX|=bi8e(tv-5!9&4q zP0D72-`2&0ZMr$|PT;;X9rDj~QKXo)S9JWHEWi`b4s|T#FFg2$NCjR}MwaqQT|6&n zF1>b-Z^I4JNz0c#MJy6S$LQQDtQznBI{b9jPHlkCy3 zfA=@1qlbqP&GafUy6_f=H6Z`D@FVeydU2nK zvk_GW9HYE1`7?dsg(X1BGD5R4`P^1M-~88P=<8YU+AdY4AN%Ib8=6HfyTZ1l2Um~( ztt_}I{oF^RNlX1%0OXmz-mu1`M*t#0<2D3h&RQA;MMdbC0WbItU|{4lG>gtEY-Zjx zW4(Ugyuie*d{UT*ejll@#fq=pj!7%7H565om70ZA8F{q`{kt4!_lA|I@~i{P+a0!> z!K5tR1*&#%ifZ&pD<3Tt+FuqH$^$$?7mlGi1X9>XH#0oey#hn(f~Ww-Dy;S*#>V*D-QG`c*;7Tv#_zdH~T! z!JM7OtJ+%TMt9@eLmd_!fu$`jUwBR?If%&F6k3;O=sY?Xq}g!}ViUUjgYg;2sW@1% zgG`@uOnf%&>2l%j%zm>FBaFOBDCBR|)zNxv@Nc$;sf4Pu_8`PsZJq(%!(Bd`-!k%d zw$1L5HI@FY#G~tJTHe9IuLN`I0tu8?_riU(gi*uGnrUd#c4z3 zwu~vH13!n20@c9tgQFWtAVasV-{oVZCf*f#!y`NYxRs0<3n6DKxdmCD+l;L^_|^c= zBQZ8nhGuz`bZ63Pr1oQhX)_$#{1aQkk08t=BkhkBjb?KXiRm+UC77 zdi%!|X1F;+2IxOgq^bF7_fJWNp{4_QVJ(E}x2(dG6NvW?77REmTcCo@cWrlXw7ju9 zo?Pu=nPGU`hQ2wkc{62CTt4C=o>Z;??=U8@(q2OFLr0BK{^w>MWTb! zFfvzEcdF#o_{I&as>)_?vYA^eN~xgf4cKiF}FB?=aPT) zmlEa)O3~O=Vv@iFD}E6va*gnJVw11&{#zLZzegZ~eEAZMfKE-n8;t3{#bEY3utgTe zMzxDIW>q=BZwImje*UXJ#h;y381R2j&Y=Y$EuGtVMC^>4!fZ&YIW6ieWvj;ch3pMJ#{Mj%v^%txqrS``Ga)xc|XJ38+c&@ z6~bw6D=}(l=KJh(9aMTyezE;EX5wE$u$NrAMM&B7XQR9SM&{jHY=mM?J8WVr5U#QA zI!0Kmq*7=YQx-rVydx ztr~ppB8unjwLgM!8%Gv#W+28zeGzopCB4|IQMl;Ldet`e`j_U7Kr0EOh5v1F9gd=w zz$+4-5Y%FzK*P`fXKc0i!9Rf}Y<0aVTqil7R}S8qC_qhnsjVC`YpW`^zNQc2;1mR^{sNBa8Dfzk=y{cbLB z;kkZ!V0tU*lS#dRefzgpb6eU94{%6cmc_>2?law{v-$5BMry-Nv_T;aOJX+)b?MS2 zG2ee5u91usChj+Wq#|i27CjC-s}N_~-m9^Er~dP+uuwDQIeJZzNHQ~O^uy?g#Zukn zT0$!>03G&XGADZ@C=cpDDs0ZM8Zx~oSd@@SsWBvn{Q*1kO=qd=4co@z*82Sg zBSjKJF_GQ4ituif=tx?^liPE13P0H@eJHdRpZE48-)KZLX|AkH`qPW6Fx$Ci%L%uP?oOOl+reUdQH?)-{cra?0rPd+-1c*LB7LDfxhY64Em_zciN>WOy2$MJNRzM+#~v+ zJ$4(8qraDpr5wIK_b-ey)LtHQF@3KLqGSBU$Jb^9W?&<4OZu3pMi$*@GiJ~}kI0{R&UgD}ZMM0Xp}I@tOUhc- z=U;`%IV@YebXY*N;cIY%tfgh&yaN(Qn-Z|u#n z=jmHtUVN;*_@n?fz=rx!Va(p%LxfK6d`#Jl;{9eJif}Cu%ExANSbfv$98dBxV#H@dt!1|jI?vUA@uEi zAv+o)mBKmqyK$O-?QT_TU@LZa-O0P_FZ4evBRFX7kV^@(MTn=*e(@_R9>bj%Ivkq? zVCAb1zLS#;W|3SR_@8agh{D|7-=vMaApdeJVeoP**E;m znN~t=VTe5vm@dKc5(+$MIpHc|RXS9`*}f4N(z@e`Wzwp3I@GB5 zZoo*^w~|8SqS19a3mHHm)<0%V!byzPe*D4D1$3&eu8xmx!ek+1K@2Sn%+AJu5E|WI z%WaRJJOjz%HLRW6KQROY30SDH)`2)5-$2jPZr`U20T!HxO)eD+q(&Tsl=o1~-Z#zo zUiVaeeBMf%HtX$=UF zf*cC1s)r)V9Gy~QHXHAjfWGee#OUzQP!^EkJ;v%Rc zHUJ#sqF`8H4#xf|>#I$?v0j~{D&l=P-4qlN7C3Yh8X?gi)E4v17RGBSGI zQ=ksjosi)H;H99Tz{16abhCGM_w=+uCcOVF(-E=nt=y5DJUc> z^iJ8EJ8D;>9zPcPb!L<<4^01EF?F-AGGRom)Yy*57FST#*Gd|(Izz{24hE;%)1o{k zWy7Cp9^thJ3)=+HPW8Gnt_}S=yTL=J^x!(xMgL4{#9gfnBYT3MryIhqcGIUd>i24{~8X%86DOBR8_TC zZxj9cH7$^!;SMk3mwZ4)kzHI|yu?67F#qSzC7{>0x1A}7t^s%*s$aZWlL3N?h^h=X zH@6dqr@*&>$Eu->@gcjE;^ET=F z#j8WUfgApRzEOYB{3tys4*MKHFKG?FDoyW0JXKZpC3Cve*$+51|YQY$;mX{-rg+0eez7yy?ciZ=%%!^ zbc#TGm5BXXcdM9&Q)~K?`)*^*DIKI_~<$ecnkIX9N1h-xr>P=>_e zd{?C?;o_OURLKXG$Xyzi)@a!e*P?w`F%2KPbd~V6ntYpEtPLW)??LC|uVwp{_UdAi zXOD$KEvr6W>I;`Egl!%!jjRP|C9l2jE^~a{J5JiRLt520B#TxfjfH=}^Ud z`}W|~Yvi^3jU;n0AdVw_AYlp9E^H6Qr!=(n{#a-_?6G~gfKTksIX8jF`YcmyF6sW^ z(;%jZo3StO0{04-@Dfrhnc^h~^cp$N(~ro`$<3X9PlN7-`ldSA3}#NYMU znZN7bzNll(NalyA;GMdDq%)xLovW);zs{|#qIEf<_gd9;EmHgR$CF!Wf~F{ixPRQNPE&5jO{EabEKDv}(Do z<<{jO#5xet5SqQReAd6%H&YAWm3fGGQ4sZ2h}TIpdQ3D0Ow3}*Zb<4gmI`~l zAHuryLaff+gpJRH6m`uuwsEnprYq3I%FER0@l(>%%s8*!%4?3Xlx8lq1N&DLc^LPT z80-a`r73VS*>K?Zt%vs=C}4H63FNcP%@i$uCm5MAKAPD1oZ|3vaJFKKWG!|ucnPYdOwms@Fl&?kNxKByl}|;Iv4ZZC5))@yCmj;}*uWqf#A~QPUGD1k6pAPXApd+D znLteinxJYHci;-!7VoPNkpj34rO@S7Zoomqy0X%wca8%)tFN#B$i##cOiR*(Fd%-u zBJJ(54uul}Gg~~H27DA}*w?LB8}IIY;?{8x-4-Ftwab)=rS+&_IhJtDdW!s>OzM^I zGX10A)^PlQUQ$$tfReN<<|l24JthTFK5)I^kY=LLo|T)sXi~RMfvw!j? zBshkv61UQxHiqMpvV6eh-Sj0U#kmtWU033>uN0BcIZfH_z5AJ@*q2G4GTv*~z1FLO zZr+%i4u|aJgBY=O-FkYvcY5JwXvPjMC4EhsK3rB;7aA<4VTU7T_K$7x$KHcK0N(%{ zF3t6dCQl&mJAZd4w(t=_vJS0i#Gb5mG6c&P&`%vcFv4}}DXoz-k;rZ9*sALK$Tz`# zxhnJS!#wiK$iT0v%6jA7^;iMn2${3DSh!66y-DWJK9EV0Qi-@74#nSwjkqjSD*GaA zo(eV@Di8sG34A5#;caGSX0Y|yAn$@no)BK-UTY(s5C^6T0|Nu=OW)WSEr=N5naZlF z#>)3cO7IW9RxC(si(+6mr!vpqJ({U_Y4ehokZGB}->x-m+~a;cDevlzk#IDM6o;5$ zrrLhL!`iIW2eY~RHs!6Vl(+ntzLcb~2>A!=g@K%fa(1mbhp}xj zy{B@G;hj^a7^A((zmBgzhPzz+Q)Tk{@{Umzxy*3ti%Dy_=sx?fDXIJRaaS&xI!2;) z<$E#bSuN*yH=5RNIC)GFxhyhN@J)SUFZVp{!~SSNhXZLitX2?kXv@7xbmD30=?+&e zOeg9<*#(~8q9P-gn)~G$atW;IyvZfsqSV#eq#fBHracCx?sH6oz%Mg@-~8?|e_8sq zK$7`>!dt!0T)n56%!3TQg-NIHh+eK^Qm=~7HP}{qRM-cT$yR)sJXaTtAmzRNMPea> zmiW+zEhH)~jEOuhBrDTSsnCO_Fk;U%xl=ztpv%C|zNT_-qMWhA3K_BFAI%z=(~TuJ z$6$;*asSl8cwjSPxl^{-EfCoBDhQEL4(uOGe>7=E^U~_^nU?_~p6l_g{-fj4_G>}? zQy%%nE~^Qb?IFQ9F00{{?}>I4QD0Xii^lYK*$heTwrg5KX_-kk7}+egA5~yGWe&|d z=aKtTI*)xlXYbjpw?vxD8Qd&?M!dY55sXc8Hxnypsh4RI<*Z!vVRpF!#kjGZ(IHdH z=lgDAm|AW%UR>jOKAyP+!x|q|mD|O4JgT__D*SU7*$4|^rQgD7d=k2W;1jWXzO#ye z30}SJ%~;6)%QE99{X;g?sLF;o(UJ4-pUhetj0EZ8pxp)xWJ?QVE`)*f0e94bzqLbsmfi50C$4P(xH+RHm@dHuz_Tt_eI*+B!WubI=a2 zTJQ=5j{j42b?eX&B{W|7XIXn4?10G4-0Eu2M;nY36atQGJJA$aOud718--FVA#99AnUQ8;1?v;@34;?|rj z=jSH@%r(l?u!+jhTF7G}-@M-nD~Fo<{l5iqhm7xWdrXIZi(Gj=cEj}~OvY@c;PL09 z>?oZw5jw6f#R6L=8FTE-SQ_nA9QE*=ief8Jv{%mU%VCb{^63w4!6_De8i+Mp1 z^kX4Bk4yc?E{I5=(y-j22nNk|R)6fU z7Mj2u*SmHH3lp=$e|)W60n$A0%m}ERRxBX~t5#a-RO4AvPyoIa^kTpcc4`?_EqmLG z7ld?l9oTs2c00_K`Lv7#d@6pUon|^0Skt$%Z7q|tGvB^xZgw^Q$J`6kE=3|Z8}_HN z(FpEKjuc96R3}zgFXtQev^kz9Wo*^E&&AhBdAxv#TT)-5c$L^@N@vSG@LK zjaja8(zx=6Xe#FieC`MpX*lB&QeyInMczBg-yN0wM>FVcnT9>&OBUPugk)B8@5}e< zwiYf*yZmB7jLH7B?bs$%o^7A@q8)p^mj$z-&|GbXsZSIg$6;CIff@N0&z&OCNt-A~ zHS?W@)R)hs1|rfRqrSE+*$Fh1W)>v-5#TQ* z;QSbZUELs^CZnPXg%ctqDmq#HtE##ZI&{E{^4e#t+be&QxoHKxS+xjEqK*!UA4_J+ zWN&aVJd?scAUrT1{2=^OVWG4!vg4qtL%N4@{cV2D>x`Xdukvt|spliFL46U~NKT%o zlLXbh%?m1x-4v$-C{{aUe6;?%l+lB9&mr?CL>5z@(rk^FFRUl?7{t-g z(9~;&s?2+@Jc=w=g@7sw;pI3YEaOwLCY*WAz*ZJ@$#kaWmasygJk3%AIN$2+h5acy z9y#OOZV_B_%2+D=_dk7{Mc0n^TTQ5>w;l8KdKSDLW*aacZX#wC()umt)An3_qAAx7 z8Pc?@eEPTN8X(K5g_<`ejpp@oeliBr zEo=wM`)Ro~zRURC^DBtM<=U3D6z=KXXOe44oVvV(341fe+$6O75@wD(yYmm&&z%jU zKX=SrVt>%LUxx(WxOyjWZ}*+|^*Yd{r#id0=cFsrGHsr%7M2F(R%7ia;MKF}$8yg#w5g57gqlMZA2A4s>0;=7&kFLL&cn0z*Yd=rGRN7GMlj!n5o{M)?shze)a#AY@>KRL8IJ-aW0HYW zIF$QItB;4xET4M4jv7~+yJk- zbux;da;44R-=7SWMeuse)q7kS6n<*WPM^UOOftJPPkS! zoPn>yLm(C5D1CVobX%__LFqrnB<+9r1;(R(|F^q)`ERU@;l2(76Vt=SRk6VE?QoY` zHq8MWaURo5mKjg&h^3|b%>YF+xDpNp@dfkm<yB=A5}E0(tRUsWnt@MT0*};UB_~v>Z~!nR@Z+IA=$jV^pDTA z`3Jt-6xDRVt(L*7rIo?hx}pZ=23JRi9#LA9TNY8y$qSpwr124jz*L4qkWx;cwBRyN zrM-M9z+py)_8&yMcV5!HWHMd{KBQA zrMO_K^MN!xn`oR2=CgNr=Ia!&=HoSce81guIzlt+l?q<8P!3(iTM?M=6+oJw>ylft z;S_R4;ha`q40)4_F};W$3I{(2AE@cJRh2 zN>DA37w@v)bWT=Q)>A{nH@x_;ssS&TuQl)Pz8g=--};^6S@*~G^x92)Y3@z6)mt>$ zzdq}I^^rK=NAAjPDQh7`g4xJpyP58-1gh?`qDL>$sHXbiJzrWP@CD3E_x-4Zy}}m6 z96^_LG+FI%vIDaWg*oW3Wr@0e9JU#9-4aT3hL6-k!%WDum{*A}4aN+wzE=-~_c@{4 zWSEt~m&iyL#!iUt;GMp+xXXRZu=cGXv}c*e!X+`Zv9lW@RYWr3{rKZjR(Y32*E_A} z?sd84I6-ti0TXat|1HGJ^cBKk{UN42`~aK3V|#ns+ghk8Yw4&-ZPutI{t12G481su zhHT+TT&kxiL+pE_2G2hZGoO#Fjg2#1#lD1Khp^z~Fuzk@5kcjD(%)z@EVh^IXP1y@ zu!b2lofVZxrE>Ug18j?6mSdV|T8vYM!236ns%@$!)C}|Np@7D53S|7{P@_ZxN)DUw zlav2`*OxXrA9dRD_c3aY7Numw2S}Vp+ZEC0=*yYUneW_08LX285YCkha#O;bg?ozc zuePw@1=FSIo)R^u2lhs6Qw37%7gt*#pT4=D9`5`lzAWPJ2Q8x1fyH5r6?kDv28=okjXpG#@bw4%qz`am0YYox=&SzvsB4KDw-^&O#&B-b zE-YqVsenr0A?wXq)nHk&uikCAcL)NVa9C&xP|~=ju>mj>=ytI-Wb?tnSLejyW*fYm zX6#BE_ZL94^3A9~;65w~U12C{oRo#3Sq?>ey!=6f+r}zcevhW-*SC8#z*Om0J?TyB z_u87t5Y?QQ45uJ)dPw#)P_M>u`gb%fuQVKfHl|{M?}W*}sxD!?AUO6|oWU|>KslkZ zF!9zExj8Y#Ebk+@s2dP8{Z%@inSs(gw=D>^=yj+FDTsnuaJ~9Qhixv2e|I&1_6=isNGw8MY*@^PG1nPFr1ynG#j?8lw>Z+h#SY6}1!dDu8Tao7> zeD+XE$-Q9>%8P&bGE$sW1np4bx;-Dk%tXH;@SOyCITx!K^n!qHSw+&*#Aa>lmP0CFDKbgR+J1%-sUt z30}>qN|by5vc`%VBf0K8hl@J5KR7ajZm8Q>&I9I9>51QbqgdN7@c-V)`)~I(gi^$5 z=Ck&7s^_ZELar^Gc=E11_e}lbN8QsWbLM7$=usx)0ndn=y-+WCvV2gaP<7Qf{0n^s z#abxUBooT4dT0uD=|ml;Y6D=Q*l&|d4)s+GxJhP8P6S$1kwkEaV$|a5=-iJ&aZF@f zRKW+iRwahE6jIx}Sr?LsI%i^eKver^vB4NYm|T=1_xUk=D53&gm3`{m(y)huSXaI6 z9J}E!!^&%G2U;B4XeFIg~`q^+alNOFtdhSn}2G5Q9_jPqgq7DuYO_QH&Gz8FB zxYY(nhqGz7PeSeDa3Q|w)jf{sggn&IC9z^8!W2jkh&mHS<+c1=gV3Ch2%|2UroNCXcnzDz=0!PMWo`(k8xPE8V2I zO9g=~$d7w^qHr;mmh>@fxhLe&vy2YSUc&O#g2p0&2Pj4y=MC!`#XENbhmVn1rQDOI zi<2gMooAk1L+LCX^svp(JEJJCF-1Rrp7!e1E1?s(WD2fUWIn`hE`7*eyYjN&l2O8b(StN*O|)2GDcW?5Gz7u^M^w z%DH*E?&-en!i#9d#ZJXF7hy~BtSW(L0W}rGEz+|PyatQAEqX8g{w;+3WHzaHw`qp* ztlT(e8RJUmL}-ihKA84Wey^5QQbrpMD1CW+e0*71ne)B2g6MX0rP8t8#*Bue#dLWP zqgmmSFn(BBX-EYMF!Pz51ud`2vlIpSX?^?lS4I(L}dr`Ty-6^xLdkl0bn9 zezpS4n&<5{KB7*S({SR;(uqBPayps(>{E5QX#$X)cG}rlpQVfl^j{q=Wg*YPz>!NI z&V@)^zyZGh-%TGZ$rUx^>ccB(q z#@^AfdLyaad0uW7or=}tQ*wqr;GiH!0hU%>YEZMe3qrnESk3D{E2+0&$RMH$bu;s9 z3HMBG(DP!rN{k57+|K4EKNX<_N8GaZlWD23V)%5XVuM(UW79DXYE!9;j9%p-~i zHOo}{m1*AG7!s9dQE$b zk)zNNbP+C-H_LR|YbkI(TsLm4GQ(am`3;qT&l(iiR`^B63pDa?fv4XVTzi`Kk2BIm zT2k0+b81W(3RS>y9mlsk536j`h<~OLPwAnLNCxXR2INV3_!(lW zMUO#}QCk8h0uIPf{qwLtepK4!x|L5<-``;&13+kLanTqEV)Y693=SS1q_@+U8|I2? z#!LR~x(j3EkNVOaSBDGA_m2|6phSgBi-_!3f$_+=QY>JtD*4Rg9h10L+YOontKyi8 zF5kYt7boEl0F5|5`m7jD(|GnnnRla-37zsnF&PdzMyJ&-(k;(g5KC+)XxoC}l4`DQ zZqdayySuwLH8c>78aRIit)sG)+>=n_Qvp8U!jHr$=hq&0I~kj<&OQ67V8D(G1~Sv$H>Gs}dFf@3;w zzP9~By};fd^59b7g)SKkp<90o$jCHJ_xGzgI(eM_qHP*KfsaewD!FA&qg$-qWdE}w z16;w4ii>kK>7#ecv7$4&<{8ldWDiWa_VAbhqQ&k29jPf%AS}xMQ_`?GfiQ!N$M#_Q z5(p<4Q1|ZNf2fzbK*(ed zrDuih=H+-Os4#N2g_uoPO>*a}LScK03!@Vs-5~;ah|nn9c$+7wo?aNrc}P{XeF8sZ z1wB(82L;7Zq&1bd-BG}5Ic!n@5`PXh6$9eZTgd57rx%!i2U^q=z(4!tp9Tg7-d4V& z^g)74#=$>Srx>0f5WGngt%^Ns@ph$i`>Da)7TthU_zUTdNm_vkunZlpfi^8?n)W?7*lv#7(<>l>%);lK3dFllLdJ~hA zK=cat9?T*aMeu}7py`Pulnw{K|g$UgZdH>vPQ; zNx<_7MFSmEQ&U5W0#)1kz21Y3RR`=;P!!%AWXys^fpZJ4|q&s@H!ZyS3g4` z#4~W#)%b*+E{5R$%8g4!`%?HV*bo%dPb;3DA2h|6RcikO?{}uA(+@qkA^LSn?q~|v z;4YHf{VsU2=iAs~DUb?XHax&$?*#Z=tA)kSK<{lZDsVqujFR5lmT*jEGQEFAsUn-K&IQVoiC(hA4c9O9n&HqPk6ziRiDA6{T!^+xtG zyIh=ND}Zeit+)p~mqlz3d{>sTyb&rBbt$)wzFQ+_AGOG?jl+;xxk5o zq6!p|YzfdhmI?qGkW_^j-r5>z2H%KhJ|(EV_{vv4cW~}Uo-#-#*E}EQ4?)?dY@T{H zR20HtNfC2_&V71}Uv6$9xCUGa zt_N3z{@mz-d#EyHxO^FERf7WqQIL~3ugGGDe>A769qa9x$u)%?_(sBu1Tsn?A*w`9 z)nMHzpHdE}TZJ!(gJ5fAL*)~k5HYt!qW7xl;cwrvP{agnA1!6!c3D>Jp-PY{#@kba zgXPcKpHmZSO0*3;4!*5ot~oo}srggl_U#wx>4cd}P@^0KXw<*-1YK?=S62aSOblp8 zlaQVs4eb-UEEiGrmNEyeP(t?7Qb3Qjry{!AmU8K2hF+;VxUy5|GrKJle7juh4;5mK*F(n2nG}JwF1}dS$;P&+N zeg?)xgr}V`q^GB247@vtOw7n=3|=~t!HD#f`?~6#iHHjd?mC<-=;`TE(ueMOb{S7Je`2EL1UxpssWw#f_A7>cZN?zQ#XEaGi^h=lj{+!q8` z4K3ZTznH?!X3Xf6TKQB60?nvnu2*tL~jr(JjB> zy`#AJ_`3iU*8FR{LL2qnzzLFVikQd2AwCN<`Q?<+4%|KG6UqFYRm5KNrNc>Y-{+C6 zL=loxlg(GhJ~B3rJ3jXPo*_YNhM1W->YO(*`Ib(W-%Xy9S^mV{3oc=JV|?0cR%-dv z!WAH>LRwI{gVt;RHh97^KiB%*eo9SX$0UD?uIDwc+MG{jcVFKvm^6-KTi>@WIorY) zGi6gXUmFhC*Hrp|9a1ik74lr$eoewaP{fH_xqfNGCTo~e0;sV(OrCU2i<*3pp+8bQlhq2 z49el}aMQ?_j-kcFKnDih<7f@OMCePMz)BkfGOF#TnLbZ;pggtD@n^*!Ycn%e@j7B2 z^Ki3UWw*+CkVYcYQEm13Ao8yFr9 z{+Mh#TqAPFuC_iQ@%6CX!0f`>8X=S%LSt4SyC-)5rKh5y`2}U-pqUJhh`<$Mh;{gB z@9yrN?_X4y3%xKR?(%`pB1V<@?yatXON>T*j{dw>Tc4^E)G5%c9$FCa)=k!`Rrk?M z(>^^ImR5;>&@nYmPgb^B7gz*@Cv3NSDk=(a2E~7o%d?PhTL07kAnfo#XDs)jQG8mm zzBN&rbSWiC3)}aBfk)8T2Hn= z+cFsV-9Mt-!DedS-n9pXrC)rfA=1lt8ZVpgf`eTG+Se7Mau+vOSMSUvEeLI;(`CM#lU-It%}FkEG78snkkHo79_{PbvhX9q)8jDrG)q>lRNgT~El zdxtv>B@UY3ApM@(Lbl?eDF$>;Hie+K+6@|3K~bkD0RaK<8FO1(PL=AQtGEFzq`ZL{ zsA)Qw@w>U$pC!{0HfbOi|9MxaN_as==A1NNxwoZniW(>nfc98qWM+%ELg;)}M|#B` zpJF{=cyL#hy9g|Y91Gdo`g#Uvoj_ug4*dJ-Dq@R=9sDr!7yA>hO75Qjcr56?eTm3M4|=jg*M1OIfdPfyLYI(9*U1?u zmqz!YhL_+6@MDJ{+@Qz0+Bczb8$@dg6U8+%X|<38EI@wH?G|=KoVnCwMfXI!f0q!o zz96>ApKR5%o+s$@-L)5Ut%`j-p#a0X{FZc=aiO~T!NG;1eygEMY|47|l{?U739>8n zQDbLi4f0iJMQkJ$)DL^G$TqK_JI1wC^Q~qMhk|g>uG!kzWsj|~lHu`rtPVfS?!BwXR|J;t=rd&LqNnRmWuTX+ zSz8U%mERh%t?C%OLE6T57lZq$9^!c=FaR1OOuq&LOVI2YZnn-76#+4DeZRSIab<(& zy8*0wi(;E<@Nj;8lOYS~j&!=kBySTy|0AC}IA38gS;ifDGyShhn*e6suelIQ$hu!` z?qQ}py~grY0`E)a%!~W)L|m44#081f4roEM6((mk=~DXnGvl8>$e)1sTMnI#j}c{6 zW##m3Ks{y}Ejr`UL5wS9%cKcAJ>4f$roUo6r>LlCiMvz!TUXaMBzl4|N((VDF+^GL zEgr>k^X8g(vK8%)BqGhuZc&NVD)hlP(duU)IE7RAZ{U-O(&8#x?GA4x(GQIoHeWzN4o8XJL&_S@iRVL4^9AKkI$ zihpz+=62kH?qLw|^1;+RW0U8GtwZTndi#)|r1?Swf7O1ndgE|^W3nIOnD|4KSpRO5 z1>GV`PsL@JVg3Ze`?{cDr6VL5Pmy99cqJI)b8p3Z@2DN)DM`2)&R8k4q&J`I&k8GQ z`20=M?#l!BldWd0=#;uDieBHm2*mN5b!QHhn14=E3^oM<57%Sg?C9y3-#?#bHG2N} zmedUc>7}Xxnhgf|OYgk^1ZG8!f${303qK09`Uy+g#1BhG6^Jl%-(M6U5{x#ZBk$k! zknEpLPfb0l3d!i@k?b#B@R^yf$|q|3d5WoJ!>(yg%UZh{+rhXRoL7nod;25G&JFLZc9I2Q1P>fWiqSgX3=-?e(r6yIA|v^v=<_cP~E5f z)z>ZH9Yr@rON89S$HzZ+YC7A0o^(@(6JX4p258w4GfsC0eaq+sLNisRI>YMcBt48# zd@->iJ6C%F7F}}vyLK_GP8Qaoe`L=aQq!QDU(9&!r9^YhCr%wl@KQwaLH|CckV^8< z2K7PP*6>{0PxOZmJL7a#c1|%bvHh9W@vmEdfLsP)W@;)uvOJLOCj+RDfrh%e68HYs z=hQbDV3zq-t^ZNQxTQdzUVOUB`%mC;qXpsBw*ieOoWs}Xy!sm2H`>{t)gPb~Qc;)q z7Y|uVa}#yP4X!Z%_Na{y8!QNv%bv^h+q_=~P|<>Mz~0D~iT_SJxk2mkTnH%xf_ejU zVlYtLdKJI1rJe+^n_fz}EI~PRO$AtoXUSIR&=a~74ZXR<&)Mz7C+6Sh(3*a7bmY^~ z-hQMm*l-KO_!-*jKQrE(RzXYdWe{o5+ZH^IA`iGve_!SE!jhpepIF=ibP7msa+s`U z2H$NYAD^@artXPS9%B0NJ5deEL?<87dzI8+z;4vHWz7}%(x4mlKe7rr>wgTdc}tZE z(LL;50dy)OIU!5f>1Nt;zMahVLi`Uys5friUI0K~P|wfC!V<`kMCVDQMCsZ?=$w6< z*je=7MI{ue3Mf)U5GgVd zDG`xo0Ynm-73rdQk=|4!bOA*`iV>tsGZg=ZZQ>p2Pg+9eXq7^B=V48vqk}N1t$#-HSmi-zSn*nM z>?)W;kO(!p8$S6;l+qbwhxO{RLbIFQZ{s7nV!<`tu)=g zm&+0g86cqp;PjVp8!qNo=d62|0mzVrX`;trgI^LC<=2$mbwpry$oZ_jrS55?I zHCxISU73>tSn>V{2}?et7vcwU{QdfUMl4Shod7W&*SqVno9Q&K-}YW!rG5i9f@L1$ z?CnPl#7y{w90Fpw%jv^ms2}r{Ux93J(!h-ooo}V;s}`C0r`3od;O+^M!D;B|(HJ;h z)ETS}9m&WVwl!C%RX3t`FAsSW57`dwA1)=^Mh>1--K-)uJ#u!F$B`**t3<*%2gf^4 z8_T4QMP@}uFl;}jrnbsWK0f~y1o4!AhA7GePATO3ho(nw^G5U) zFWa@J7T1RE+p%Z6>;;81vmXbS2ZQiOKaRS0QbfHgul!zFXgXF{ykj%z<|u>ECX0`p zGI=KMNk3Qr&Ps#XJ|Z}{P5(iR<;I*Bgk!Cap*QfGg+yW+r}Vv3T^HA=P(|^2vdWqI zixw7>&1QYgH_qy-PR6gH`%Co%~QT z>&yx?bfvR8%?pLO98BqK>)wEyl|q(_0OzyqJ9k!D zp@nw7I@flC9ugpi025QdJGmSr(*xe$YM4+4kaTgnUdln4peg~bezgzCm->f?JI2NC zqqFkdA<9j)7s3LwA3Q6%^NZ}Fq(mf+$%@RMGK6f!5|}mtjkruoCg;?PVNaXp_V%GE zG6oMx*KJjAQVWVE0#jM10cuwvWXsn_4cCXgUwg=w#bUp96;Whj|A+(tB!Z&G8C#+2 zJ$K<*owEvSRB-cW)w@^KQJ(M<($YHOT)tA-LdSL;Y>H2Lb!=r*$jQl+hwMwF#PIVdXQC(641?+}!Eqs?Xh%NbJrV+>?c?K_c$HY_$ok#l^(z z@|p0Bh*64wK)1_E>8lILZGF?9f8UMnW@nvq#ZlXv5r*cE$-4}Few1AT>(7^eCE>KI z({%VG)w^51yE#3zK3Mmp`EBFL^~_F2PC?|Tr@)*=ubIx=0UGu`Y3wZ=a6An< zUOmn!jBH30;r({rWMxoR?5Mp33XdoHIu`QbDYKn1{_xkq8+Fb0<)pjj?t7v~BlVqP z=M2+H#VC7Q3&Cb3&Xt!B65Z%QdzJfsoj<3hzVFMPd$2FtY`eH$h)(*SjpQ*sH@6Of ztP(-M@hb3$n}*8~x6;e%IWjUW(rX*R4?Lj3-N4uwK|rqzcyhia|Ea@R85lfGX@vzO zm)=`{5~%#%v^0h9B-GnVrBzn&>j{*3^Pf+lRHJ8FAUxWoQc*wt1L_MQtA|(vYJs3w zbOT&t$_v+)SkwXSF=#2SBf!_c$90i(dY95`(xS^e(Y@1T&&!0R-c_zkynL_y+j-JR0it;mir0x`jc`PoW4oyw(~`A8yjnZiI|3{9Z1}=3e1-d zP$@9;4X$;RomyC^2P{AUB7Qn6?f6p+_W-A1__!(c7@!r2l)O~*HYL_R*7eWEyA?Fi zSfT@_U66m;ysXlf5yZl8pi&%r-}t{Agao4+z&;X0-I5D)@|AzCx^xRcMqJ`(yzxU& z8yk3g7r4u{8dWJrxgXq!KrmFPTxuu^nEn5b5gfQGfzmhj&Ye&L^rnczubE*=Sr9p= zbl%D&MfESpftBnkWeKukf3|860Q1Y6(xbqSx*v38RS+7+#>HKO&Y6(GYbz!AiOq{% z=;9ON721StRYwd4@4MwxMv3lK2DKO<6EyvF&4|E%kVmh|VQP^8cW`1G1E~w+8pR$+ zCcLZ}N`bPGijfMp&@Gazn7Y>d%box4l!2-p+72B%+52u7tsRCPO52Q-z`o4?o~o?a z%0)Hm3Mh~?|GQI(D3MZGVVjGsnQ)7PQX$enALI6IVIF%W@Z%81nT*EEZmjTwQ)_5zYcq}FskEnDrl_JC zy<>6y>S)Ka7kLrY^&Tr5xIP9-SP|ze7FwREEaG9wa`<1i`n@ zbv1q_fmL}oLLY5<_jSE+M<4WJNh*$eQm$hv4vwtZr+C60Qjb4nANdVT*!&I=z43DB zW+}|wzYp=NoIb}bN;L%tM$*{S6!kRW3HNi|&drL`kD|_Hw#0O^lLZ9G%XaA!B~5m& z)EKvNvuSl$i7@MDnC1N6#Q+}p_uqdt+rS$vZS&15;G;rACH42~B9m}=33W>tDI#!m zdS#(613byo+yXv1r7P}r{y;Epkl9jU_U3ia2K(LF@iN>YUa=tW4X&+fuZ}G?k*@~T zL13vfI3IKKiWm5oO6bXoOmY_Q)6girj@_QP@npXVoAPr3$p}N$cju5d8OkkEp&6&p z4HW3qNWk$H*=)YMz886@$?QXqIGb@5!qnmf6>DT!Q$r&KU&k)63X!HcXm1}Y`2o&l zGJrG3u)to<$43R2Bq)fH7T^xwRxtikLtHVB!b3)sG9N#78{=~3qe_jn&LDIX_{Fl@ zu9~+AgL0(~{CuZ7EbQj4D4|eb1`fYt2l&Gsfa8jIa{)#O500Xsdk_gk-rS|rSKXx& zx_2|0IVmZ0dRbwz+3~ga07p-LNViq7#$Vu4fPmj#6{dy(&X&M7*2iKBQn;5cF_uoZ-52XK6ahPQc)2mL5_br8#}8S1t@N5k z%tn}5xpD*q;wzXmMJH<0d3?J=L9}lYvEkF|KP6+Bh(`d`tHz(0U)`#Oy+uE{p?raZ z`{K5&@0=wC82_xpd%*j(4ZiiSJXf*n>tFL>9R#_S`h;IZs}FYCzQF@Y;eR z=2HI4e^um;ss1cilNLb>Y3n%q9TX~cq%@?zXVU+d+$<|0kU33Y~HcbddBNsyAp%N|LC}@5o9#!YRN=h`@ZSEv%l2N z`UMrqxqB{uVOHfu)?MeL)#i%lp~e9N`Uy?-Yrj}{bOi2s;gStkzbdk`p>NYYr&Ax( zCbwo>i>x!dxsI6b$E{s5+-JutzgG;K1jX+gk>0!|8&5$RTQXXLQ^1uxzy3q8AY*>3 zSe|fbPPKXURuROE?`KbKtoB+wD9>5pk*H9DOXaMHRQecN+L4cPXz%}UNsI$2A?n7D zr@GoF);PXRTMN~sMJp7LntM$FH;bmPN_7T#3T`SLF6@do^p@(JRZ$-nal}Y66b!%?X=vm`#Z%dTnpi7KH<0)FE&8x_FlUe-ClMbU0+cy@piE9 zp4-^E?*eEJ(=$qbvPwPTYgkq=VQowt&EwHd|HA4-E?kyjG$N~x3;ywPll1SZl^V@* zubA4w*ubd{Jtxq~cP1f|eoBu#@c8R?z0nArEa-wmXzE$lPfNKwZH;U?N)i2mEHfuA zrO8dM)>H*E(_hKG(w?LbogTTbwDFt6Qxz1c$1TUNEfTCJ5#&=R9)8I`f&_olmekU7 z@tibH96Zng!(xTJ(C9PJ>pbvGD%_VZBWf+W_1}r>;V%6908wH-PtYNrZ_P+Gz z@8c~VaypU(S`H4Tx_+qXcQjiY|FgPEAL3lbukO^uE9b_zeZwtEsV;e-JcgYm=wgct2I`qVIsUv*4{o$<{h+roWYDvOT@<`{=L+XY`V#&tJDhFSFRfw{jeH zmK?A-BFw;1cz$Y%P`eWb6cZCNKKhZJCtdPIH0t95YH~9CYIZc;zpP3%EO}5ESvP{C zh`f-(_R2(IsN9$ zThF-=N7&?w&2gGw1(1x&QzG delta 57114 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

LLG4xY)sa4{F#t@Oy(Ww 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%0A4Sbr2ymfAqa&DW-^#(VihgDjf~O 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%0ADe~*m68*&11&5V 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%0D|;~!;t+Yt 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%0Aj3`^ZDIxKzIh|eN|cl)~Zm-36hC+iX5;v) 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 z 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 U=>GR{1b+4#9Ws2P?|9|^0Xa-JWB>pF delta 116667 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 @@ -77,6 +77,29 @@ void AbstractBox::paintTitle(Painter &p, const QString &title, bool withShadow) p.drawTextLeft(st::old_boxTitlePos.x(), st::old_boxTitlePos.y(), width(), title); } +void AbstractBox::paintTitle(Painter &p, const QString &title) { + // paint box title + p.setFont(st::boxTitleFont); + p.setPen(st::black); + p.drawTextLeft(st::boxTitlePosition.x(), st::boxTitlePosition.y(), width(), title); +} + +void AbstractBox::paintBlueTitle(Painter &p, const QString &title, const QString &additional) { + // paint box title + p.fillRect(0, 0, width(), st::boxBlueTitleHeight, st::boxBlueTitleBg->b); + p.setFont(st::boxTitleFont); + p.setPen(st::white); + + int32 titleWidth = st::boxTitleFont->width(title); + p.drawTextLeft(st::boxBlueTitlePosition.x(), st::boxBlueTitlePosition.y(), width(), title, titleWidth); + + if (!additional.isEmpty()) { + p.setFont(st::boxTextFont); + p.setPen(st::boxBlueTitleAdditionalFg); + p.drawTextLeft(st::boxBlueTitlePosition.x() + titleWidth + st::boxBlueTitleAdditionalSkip, st::boxBlueTitlePosition.y(), width(), additional); + } +} + void AbstractBox::paintGrayTitle(QPainter &p, const QString &title) { // draw box title p.setFont(st::boxFont->f); diff --git a/Telegram/SourceFiles/boxes/abstractbox.h b/Telegram/SourceFiles/boxes/abstractbox.h index 6029a65e0..d2306587f 100644 --- a/Telegram/SourceFiles/boxes/abstractbox.h +++ b/Telegram/SourceFiles/boxes/abstractbox.h @@ -42,7 +42,9 @@ protected: void prepare(); bool paint(QPainter &p); - void paintTitle(Painter &p, const QString &title, bool withShadow); + void paintTitle(Painter &p, const QString &title); + void paintBlueTitle(Painter &p, const QString &title, const QString &additional = QString()); + void paintOldTitle(Painter &p, const QString &title, bool withShadow); void paintGrayTitle(QPainter &p, const QString &title); void setMaxHeight(int32 maxHeight); void resizeMaxHeight(int32 newWidth, int32 maxHeight); diff --git a/Telegram/SourceFiles/boxes/addcontactbox.cpp b/Telegram/SourceFiles/boxes/addcontactbox.cpp index f426106a9..9fff7163c 100644 --- a/Telegram/SourceFiles/boxes/addcontactbox.cpp +++ b/Telegram/SourceFiles/boxes/addcontactbox.cpp @@ -31,7 +31,7 @@ AddContactBox::AddContactBox(QString fname, QString lname, QString phone) : _peer(0), _addButton(this, lang(lng_add_contact), st::btnSelectDone), _retryButton(this, lang(lng_try_other_contact), st::btnSelectDone), - _cancelButton(this, lang(lng_cancel), st::btnSelectCancel), + _cancelButton(this, lang(lng_box_cancel), st::btnSelectCancel), _firstInput(this, st::inpAddContact, lang(lng_signup_firstname), fname), _lastInput(this, st::inpAddContact, lang(lng_signup_lastname), lname), _phoneInput(this, st::inpAddContact, lang(lng_contact_phone), phone.isEmpty() ? phone : App::formatPhone(phone)), @@ -49,7 +49,7 @@ AddContactBox::AddContactBox(PeerData *peer) : _peer(peer), _addButton(this, lang(lng_settings_save), st::btnSelectDone), _retryButton(this, lang(lng_try_other_contact), st::btnSelectDone), - _cancelButton(this, lang(lng_cancel), st::btnSelectCancel), + _cancelButton(this, lang(lng_box_cancel), st::btnSelectCancel), _firstInput(this, st::inpAddContact, lang(peer->isUser() ? lng_signup_firstname : lng_dlg_new_group_name), peer->isUser() ? peer->asUser()->firstName : peer->name), _lastInput(this, st::inpAddContact, lang(lng_signup_lastname), peer->isUser() ? peer->asUser()->lastName : QString()), _phoneInput(this, st::inpAddContact, lang(lng_contact_phone)), @@ -66,7 +66,7 @@ void AddContactBox::initBox() { if (_peer) { if (_peer->isUser()) { _boxTitle = lang(_peer == App::self() ? lng_edit_self_title : lng_edit_contact_title); - setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 2 * _firstInput.height() + 1 * st::addContactDelta + st::addContactPadding.bottom() + _addButton.height()); + setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 2 * _firstInput.height() + 1 * st::addContactSkip + st::addContactPadding.bottom() + _addButton.height()); } else if (_peer->isChat()) { _boxTitle = lang(lng_edit_group_title); setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 1 * _firstInput.height() + st::addContactPadding.bottom() + _addButton.height()); @@ -74,7 +74,7 @@ void AddContactBox::initBox() { } else { bool readyToAdd = !_phoneInput.text().isEmpty() && (!_firstInput.text().isEmpty() || !_lastInput.text().isEmpty()); _boxTitle = lang(readyToAdd ? lng_confirm_contact_data : lng_enter_contact_data); - setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 3 * _firstInput.height() + 2 * st::addContactDelta + st::addContactPadding.bottom() + _addButton.height()); + setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 3 * _firstInput.height() + 2 * st::addContactSkip + st::addContactPadding.bottom() + _addButton.height()); } _retryButton.hide(); @@ -168,7 +168,7 @@ void AddContactBox::paintEvent(QPaintEvent *e) { if (paint(p)) return; if (_retryButton.isHidden()) { - paintTitle(p, _boxTitle, true); + paintOldTitle(p, _boxTitle, true); } else { // draw box text p.setPen(st::black->p); @@ -187,12 +187,12 @@ void AddContactBox::paintEvent(QPaintEvent *e) { void AddContactBox::resizeEvent(QResizeEvent *e) { if (_invertOrder) { _lastInput.setGeometry(st::addContactPadding.left(), st::old_boxTitleHeight + st::addContactPadding.top(), width() - st::addContactPadding.left() - st::addContactPadding.right(), _lastInput.height()); - _firstInput.setGeometry(st::addContactPadding.left(), _lastInput.y() + _lastInput.height() + st::addContactDelta, _lastInput.width(), _lastInput.height()); - _phoneInput.setGeometry(st::addContactPadding.left(), _firstInput.y() + _firstInput.height() + st::addContactDelta, _lastInput.width(), _lastInput.height()); + _firstInput.setGeometry(st::addContactPadding.left(), _lastInput.y() + _lastInput.height() + st::addContactSkip, _lastInput.width(), _lastInput.height()); + _phoneInput.setGeometry(st::addContactPadding.left(), _firstInput.y() + _firstInput.height() + st::addContactSkip, _lastInput.width(), _lastInput.height()); } else { _firstInput.setGeometry(st::addContactPadding.left(), st::old_boxTitleHeight + st::addContactPadding.top(), width() - st::addContactPadding.left() - st::addContactPadding.right(), _firstInput.height()); - _lastInput.setGeometry(st::addContactPadding.left(), _firstInput.y() + _firstInput.height() + st::addContactDelta, _firstInput.width(), _firstInput.height()); - _phoneInput.setGeometry(st::addContactPadding.left(), _lastInput.y() + _lastInput.height() + st::addContactDelta, _lastInput.width(), _lastInput.height()); + _lastInput.setGeometry(st::addContactPadding.left(), _firstInput.y() + _firstInput.height() + st::addContactSkip, _firstInput.width(), _firstInput.height()); + _phoneInput.setGeometry(st::addContactPadding.left(), _lastInput.y() + _lastInput.height() + st::addContactSkip, _lastInput.width(), _lastInput.height()); } _cancelButton.move(0, height() - _cancelButton.height()); @@ -246,7 +246,7 @@ void AddContactBox::onSaveSelfDone(const MTPUser &user) { } bool AddContactBox::onSaveSelfFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; QString err(error.type()); QString firstName = textOneLine(_firstInput.text()), lastName = textOneLine(_lastInput.text()); @@ -268,7 +268,7 @@ bool AddContactBox::onSaveSelfFail(const RPCError &error) { } bool AddContactBox::onSaveFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _addRequest = 0; QString err(error.type()); @@ -345,42 +345,207 @@ void AddContactBox::onRetry() { _phoneInput.setDisabled(false); _retryButton.hide(); _firstInput.setFocus(); - setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 3 * _firstInput.height() + 2 * st::addContactDelta + st::addContactPadding.bottom() + _addButton.height()); + setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 3 * _firstInput.height() + 2 * st::addContactSkip + st::addContactPadding.bottom() + _addButton.height()); update(); } +EditNameTitleBox::EditNameTitleBox(PeerData *peer) : +_peer(peer), +_save(this, lang(lng_settings_save), st::defaultBoxButton), +_cancel(this, lang(lng_box_cancel), st::cancelBoxButton), +_first(this, st::defaultInputField, lang(peer->isUser() ? lng_signup_firstname : lng_dlg_new_group_name), peer->isUser() ? peer->asUser()->firstName : peer->name), +_last(this, st::defaultInputField, lang(lng_signup_lastname), peer->isUser() ? peer->asUser()->lastName : QString()), +_invertOrder(!peer->isChat() && langFirstNameGoesSecond()), +_requestId(0) { + if (_invertOrder) { + setTabOrder(&_last, &_first); + } + int32 h = st::boxTitleHeight + st::addContactPadding.top() + _first.height(); + if (_peer->isUser()) { + _boxTitle = lang(_peer == App::self() ? lng_edit_self_title : lng_edit_contact_title); + h += st::addContactSkip + _last.height(); + } else if (_peer->isChat()) { + _boxTitle = lang(lng_edit_group_title); + } + h += st::boxPadding.bottom() + st::addContactPadding.bottom() + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom(); + setMaxHeight(h); + + connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); + + connect(&_first, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + connect(&_last, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + + prepare(); +} + +void EditNameTitleBox::hideAll() { + _first.hide(); + _last.hide(); + _save.hide(); + _cancel.hide(); +} + +void EditNameTitleBox::showAll() { + _first.show(); + if (_peer->isChat()) { + _last.hide(); + } else { + _last.show(); + } + _save.show(); + _cancel.show(); +} + +void EditNameTitleBox::showDone() { + (_invertOrder ? _last : _first).setFocus(); +} + +void EditNameTitleBox::onSubmit() { + if (_first.hasFocus()) { + if (_peer->isChat()) { + if (_first.getLastText().trimmed().isEmpty()) { + _first.setFocus(); + _first.showError(); + } else { + onSave(); + } + } else { + _last.setFocus(); + } + } else if (_last.hasFocus()) { + if (_first.getLastText().trimmed().isEmpty()) { + _first.setFocus(); + _first.showError(); + } else if (_last.getLastText().trimmed().isEmpty()) { + _last.setFocus(); + _last.showError(); + } else { + onSave(); + } + } +} + +void EditNameTitleBox::paintEvent(QPaintEvent *e) { + Painter p(this); + if (paint(p)) return; + + paintTitle(p, _boxTitle); +} + +void EditNameTitleBox::resizeEvent(QResizeEvent *e) { + _first.resize(width() - st::boxPadding.left() - st::newGroupInfoPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)), _first.height()); + _last.resize(_first.size()); + if (_invertOrder) { + _last.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), st::boxTitleHeight + st::addContactPadding.top()); + _first.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), _last.y() + _last.height() + st::addContactSkip); + } else { + _first.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), st::boxTitleHeight + st::addContactPadding.top()); + _last.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), _first.y() + _first.height() + st::addContactSkip); + } + + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); +} + +void EditNameTitleBox::onSave() { + if (_requestId) return; + + QString first = _first.getLastText().trimmed(), last = _last.getLastText().trimmed(); + if (first.isEmpty() && last.isEmpty()) { + if (_invertOrder) { + _last.setFocus(); + _last.showError(); + } else { + _first.setFocus(); + _first.showError(); + } + return; + } + if (first.isEmpty()) { + first = last; + last = QString(); + } + _sentName = first; + if (_peer == App::self()) { + _requestId = MTP::send(MTPaccount_UpdateProfile(MTP_string(first), MTP_string(last)), rpcDone(&EditNameTitleBox::onSaveSelfDone), rpcFail(&EditNameTitleBox::onSaveSelfFail)); + } else if (_peer->isChat()) { + _requestId = MTP::send(MTPmessages_EditChatTitle(_peer->asChat()->inputChat, MTP_string(first)), rpcDone(&EditNameTitleBox::onSaveChatDone), rpcFail(&EditNameTitleBox::onSaveChatFail)); + } +} + +void EditNameTitleBox::onSaveSelfDone(const MTPUser &user) { + App::feedUsers(MTP_vector(1, user)); + emit closed(); +} + +bool EditNameTitleBox::onSaveSelfFail(const RPCError &error) { + if (mtpIsFlood(error)) return false; + + QString err(error.type()); + QString first = textOneLine(_first.getLastText().trimmed()), last = textOneLine(_last.getLastText().trimmed()); + if (err == "NAME_NOT_MODIFIED") { + App::self()->setName(first, last, QString(), textOneLine(App::self()->username)); + emit closed(); + return true; + } else if (err == "FIRSTNAME_INVALID") { + _first.setFocus(); + _first.showError(); + return true; + } else if (err == "LASTNAME_INVALID") { + _last.setFocus(); + _last.showError(); + return true; + } + _first.setFocus(); + return true; +} + +bool EditNameTitleBox::onSaveChatFail(const RPCError &error) { + if (mtpIsFlood(error)) return false; + + _requestId = 0; + QString err(error.type()); + if (err == qstr("CHAT_TITLE_NOT_MODIFIED") || err == qstr("CHAT_NOT_MODIFIED")) { + _peer->updateName(_sentName, QString(), QString()); + emit closed(); + return true; + } else if (err == qstr("NO_CHAT_TITLE")) { + _first.setFocus(); + _first.showError(); + return true; + } + _first.setFocus(); + return true; +} + +void EditNameTitleBox::onSaveChatDone(const MTPUpdates &updates) { + App::main()->sentUpdatesReceived(updates); + emit closed(); +} + EditChannelBox::EditChannelBox(ChannelData *channel) : _channel(channel), -_saveButton(this, lang(lng_settings_save), st::btnSelectDone), -_cancelButton(this, lang(lng_cancel), st::btnSelectCancel), -_title(this, st::inpAddContact, lang(lng_dlg_new_channel_name), _channel->name), -_descriptionOver(false), -a_descriptionBg(st::newGroupName.bgColor->c, st::newGroupName.bgColor->c), -a_descriptionBorder(st::newGroupName.borderColor->c, st::newGroupName.borderColor->c), -a_description(animFunc(this, &EditChannelBox::descriptionAnimStep)), +_save(this, lang(lng_settings_save), st::defaultBoxButton), +_cancel(this, lang(lng_box_cancel), st::cancelBoxButton), +_title(this, st::newGroupName, lang(lng_dlg_new_channel_name), _channel->name), _description(this, st::newGroupDescription, lang(lng_create_group_description), _channel->about), -_publicLink(this, lang(channel->isPublic() ? lng_profile_edit_public_link : lng_profile_create_public_link)), +_publicLink(this, lang(channel->isPublic() ? lng_profile_edit_public_link : lng_profile_create_public_link), st::defaultBoxLinkButton), _saveTitleRequestId(0), _saveDescriptionRequestId(0) { - _boxTitle = lang(lng_edit_channel_title); - - _description.installEventFilter(this); - connect(App::main(), SIGNAL(peerNameChanged(PeerData*, const PeerData::Names&, const PeerData::NameFirstChars&)), this, SLOT(peerUpdated(PeerData*))); setMouseTracking(true); - _description.resize(width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::newGroupDescriptionPadding.left() - st::newGroupDescriptionPadding.right(), _title.height() - st::newGroupDescriptionPadding.top() - st::newGroupDescriptionPadding.bottom()); - _description.setMinHeight(_description.height()); - _description.setMaxHeight(3 * _description.height() + 2 * st::newGroupDescriptionPadding.top() + 2 * st::newGroupDescriptionPadding.bottom()); + _description.setMaxLength(MaxChannelDescription); + _description.resize(width() - st::boxPadding.left() - st::newGroupInfoPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)), _description.height()); updateMaxHeight(); - _description.setMaxLength(MaxChannelDescription); connect(&_description, SIGNAL(resized()), this, SLOT(onDescriptionResized())); - connect(&_description, SIGNAL(submitted(bool)), this, SLOT(onSave())); + connect(&_description, SIGNAL(submitted(bool)), this, SLOT(onNext())); connect(&_description, SIGNAL(cancelled()), this, SLOT(onClose())); - connect(&_saveButton, SIGNAL(clicked()), this, SLOT(onSave())); - connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(&_publicLink, SIGNAL(clicked()), this, SLOT(onPublicLink())); @@ -390,16 +555,16 @@ _saveTitleRequestId(0), _saveDescriptionRequestId(0) { void EditChannelBox::hideAll() { _title.hide(); _description.hide(); - _saveButton.hide(); - _cancelButton.hide(); + _save.hide(); + _cancel.hide(); _publicLink.hide(); } void EditChannelBox::showAll() { _title.show(); _description.show(); - _saveButton.show(); - _cancelButton.show(); + _save.show(); + _cancel.show(); _publicLink.show(); } @@ -421,43 +586,7 @@ void EditChannelBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, _boxTitle, true); - - QRect descRect(descriptionRect()); - if (descRect.intersects(e->rect())) { - p.fillRect(descRect, a_descriptionBg.current()); - if (st::newGroupName.borderWidth) { - QBrush b(a_descriptionBorder.current()); - p.fillRect(descRect.x(), descRect.y(), descRect.width() - st::newGroupName.borderWidth, st::newGroupName.borderWidth, b); - p.fillRect(descRect.x() + descRect.width() - st::newGroupName.borderWidth, descRect.y(), st::newGroupName.borderWidth, descRect.height() - st::newGroupName.borderWidth, b); - p.fillRect(descRect.x() + st::newGroupName.borderWidth, descRect.y() + descRect.height() - st::newGroupName.borderWidth, descRect.width() - st::newGroupName.borderWidth, st::newGroupName.borderWidth, b); - p.fillRect(descRect.x(), descRect.y() + st::newGroupName.borderWidth, st::newGroupName.borderWidth, descRect.height() - st::newGroupName.borderWidth, b); - } - if (descRect.contains(e->rect())) { - return; - } - } - - // paint shadows - p.fillRect(0, size().height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::btnSelectCancel.width, size().height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); -} - -bool EditChannelBox::descriptionAnimStep(float64 ms) { - float dt = ms / st::newGroupName.phDuration; - bool res = true; - if (dt >= 1) { - res = false; - a_descriptionBg.finish(); - a_descriptionBorder.finish(); - } else { - a_descriptionBg.update(dt, st::newGroupName.phColorFunc); - a_descriptionBorder.update(dt, st::newGroupName.phColorFunc); - } - update(descriptionRect()); - return res; + paintTitle(p, lang(lng_edit_channel_title)); } void EditChannelBox::peerUpdated(PeerData *peer) { @@ -471,79 +600,33 @@ void EditChannelBox::onDescriptionResized() { update(); } -QRect EditChannelBox::descriptionRect() const { - return rtlrect(_description.x() - st::newGroupDescriptionPadding.left(), _description.y() - st::newGroupDescriptionPadding.top(), _description.width() + st::newGroupDescriptionPadding.left() + st::newGroupDescriptionPadding.right(), _description.height() + st::newGroupDescriptionPadding.top() + st::newGroupDescriptionPadding.bottom(), width()); -} - void EditChannelBox::updateMaxHeight() { - int32 h = st::old_boxTitleHeight + st::newGroupPadding.top() + _title.height(); - h += st::newGroupDescriptionSkip + st::newGroupDescriptionPadding.top() + _description.height() + st::newGroupDescriptionPadding.bottom(); - h += st::newGroupPublicLinkSkip + _publicLink.height(); - h += st::newGroupPadding.bottom() + _saveButton.height(); + int32 h = st::boxTitleHeight + st::newGroupInfoPadding.top() + _title.height(); + h += st::newGroupDescriptionPadding.top() + _description.height() + st::newGroupDescriptionPadding.bottom(); + h += st::newGroupPublicLinkPadding.top() + _publicLink.height() + st::newGroupPublicLinkPadding.bottom(); + h += st::boxPadding.bottom() + st::newGroupInfoPadding.bottom() + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom(); setMaxHeight(h); } -bool EditChannelBox::eventFilter(QObject *obj, QEvent *e) { - if (obj == &_description) { - if (e->type() == QEvent::FocusIn) { - a_descriptionBorder.start(st::newGroupName.borderActive->c); - a_descriptionBg.start(st::newGroupName.bgActive->c); - a_description.start(); - } else if (e->type() == QEvent::FocusOut) { - a_descriptionBorder.start(st::newGroupName.borderColor->c); - a_descriptionBg.start(st::newGroupName.bgColor->c); - a_description.start(); - } - } - return AbstractBox::eventFilter(obj, e); -} - void EditChannelBox::resizeEvent(QResizeEvent *e) { - _title.resize(width() - st::newGroupPadding.left() - st::newGroupPadding.right(), _title.height()); - _title.moveToLeft(st::newGroupPadding.left(), st::old_boxTitleHeight + st::newGroupPadding.top(), width()); + _title.resize(width() - st::boxPadding.left() - st::newGroupInfoPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)), _title.height()); + _title.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), st::boxTitleHeight + st::newGroupInfoPadding.top() + st::newGroupNamePosition.y()); - _description.moveToLeft(st::newGroupPadding.left() + st::newGroupDescriptionPadding.left(), _title.y() + _title.height() + st::newGroupDescriptionSkip + st::newGroupDescriptionPadding.top(), width()); + _description.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), _title.y() + _title.height() + st::newGroupDescriptionPadding.top()); - _publicLink.moveToLeft(st::newGroupPadding.left(), _description.y() + _description.height() + st::newGroupDescriptionPadding.bottom() + st::newGroupPublicLinkSkip, width()); + _publicLink.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), _description.y() + _description.height() + st::newGroupDescriptionPadding.bottom() + st::newGroupPublicLinkPadding.top()); - int32 buttonTop = _publicLink.y() + _publicLink.height() + st::newGroupPadding.bottom(); - _cancelButton.move(0, buttonTop); - _saveButton.move(width() - _saveButton.width(), buttonTop); -} - -void EditChannelBox::mouseMoveEvent(QMouseEvent *e) { - updateSelected(e->globalPos()); -} - -void EditChannelBox::updateSelected(const QPoint &cursorGlobalPosition) { - QPoint p(mapFromGlobal(cursorGlobalPosition)); - - bool descriptionOver = descriptionRect().contains(p); - if (descriptionOver != _descriptionOver) { - _descriptionOver = descriptionOver; - } - - setCursor(_descriptionOver ? style::cur_text : style::cur_default); -} - -void EditChannelBox::mousePressEvent(QMouseEvent *e) { - mouseMoveEvent(e); - if (_descriptionOver) { - _description.setFocus(); - } -} - -void EditChannelBox::leaveEvent(QEvent *e) { - updateSelected(QCursor::pos()); + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); } void EditChannelBox::onSave() { if (_saveTitleRequestId || _saveDescriptionRequestId) return; - QString title = _title.text().trimmed(), description = _description.getLastText().trimmed(); + QString title = _title.getLastText().trimmed(), description = _description.getLastText().trimmed(); if (title.isEmpty()) { _title.setFocus(); - _title.notaBene(); + _title.showError(); return; } _sentTitle = title; @@ -571,7 +654,7 @@ bool EditChannelBox::onSaveFail(const RPCError &error, mtpRequestId req) { return true; } else if (err == qstr("NO_CHAT_TITLE")) { _title.setFocus(); - _title.notaBene(); + _title.showError(); return true; } else { _title.setFocus(); diff --git a/Telegram/SourceFiles/boxes/addcontactbox.h b/Telegram/SourceFiles/boxes/addcontactbox.h index 29f452a61..509cf11e6 100644 --- a/Telegram/SourceFiles/boxes/addcontactbox.h +++ b/Telegram/SourceFiles/boxes/addcontactbox.h @@ -75,6 +75,50 @@ private: QString _sentName; }; +class EditNameTitleBox : public AbstractBox, public RPCSender { + Q_OBJECT + +public: + + EditNameTitleBox(PeerData *peer); + void paintEvent(QPaintEvent *e); + void resizeEvent(QResizeEvent *e); + + void setInnerFocus() { + _first.setFocus(); + } + +public slots: + + void onSave(); + void onSubmit(); + +protected: + + void hideAll(); + void showAll(); + void showDone(); + +private: + + void onSaveSelfDone(const MTPUser &user); + bool onSaveSelfFail(const RPCError &error); + + void onSaveChatDone(const MTPUpdates &updates); + bool onSaveChatFail(const RPCError &e); + + PeerData *_peer; + QString _boxTitle; + + BoxButton _save, _cancel; + InputField _first, _last; + + bool _invertOrder; + + mtpRequestId _requestId; + QString _sentName; +}; + class EditChannelBox : public AbstractBox, public RPCSender { Q_OBJECT @@ -84,13 +128,6 @@ public: void keyPressEvent(QKeyEvent *e); void paintEvent(QPaintEvent *e); void resizeEvent(QResizeEvent *e); - void mouseMoveEvent(QMouseEvent *e); - void mousePressEvent(QMouseEvent *e); - void leaveEvent(QEvent *e); - - bool eventFilter(QObject *obj, QEvent *e); - - bool descriptionAnimStep(float64 ms); void setInnerFocus() { if (!_description.hasFocus()) { @@ -114,9 +151,7 @@ protected: private: - QRect descriptionRect() const; void updateMaxHeight(); - void updateSelected(const QPoint &cursorGlobalPosition); void onSaveTitleDone(const MTPUpdates &updates); void onSaveDescriptionDone(const MTPBool &result); @@ -125,15 +160,10 @@ private: void saveDescription(); ChannelData *_channel; - QString _boxTitle; - FlatButton _saveButton, _cancelButton; - FlatInput _title; - - bool _descriptionOver; - anim::cvalue a_descriptionBg, a_descriptionBorder; - Animation a_description; - FlatTextarea _description; + BoxButton _save, _cancel; + InputField _title; + InputArea _description; LinkButton _publicLink; diff --git a/Telegram/SourceFiles/boxes/autolockbox.cpp b/Telegram/SourceFiles/boxes/autolockbox.cpp index 0f271b6c6..93675868c 100644 --- a/Telegram/SourceFiles/boxes/autolockbox.cpp +++ b/Telegram/SourceFiles/boxes/autolockbox.cpp @@ -29,39 +29,39 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "window.h" AutoLockBox::AutoLockBox() : -_done(this, lang(lng_about_done), st::langsCloseButton) { +_close(this, lang(lng_box_ok), st::defaultBoxButton) { bool haveTestLang = (cLang() == languageTest); int32 opts[] = { 60, 300, 3600, 18000 }, cnt = sizeof(opts) / sizeof(opts[0]); - resizeMaxHeight(st::langsWidth, st::old_boxTitleHeight + st::langsPadding.top() + st::langsPadding.bottom() + cnt * (st::langPadding.top() + st::rbDefFlat.height + st::langPadding.bottom()) + _done.height()); + resizeMaxHeight(st::langsWidth, st::boxTitleHeight + cnt * (st::boxOptionListPadding.top() + st::langsButton.height) + st::boxOptionListPadding.bottom() + st::boxPadding.bottom() + st::boxButtonPadding.top() + _close.height() + st::boxButtonPadding.bottom()); - int32 y = st::old_boxTitleHeight + st::langsPadding.top(); + int32 y = st::boxTitleHeight + st::boxOptionListPadding.top(); _options.reserve(cnt); for (int32 i = 0; i < cnt; ++i) { int32 v = opts[i]; - _options.push_back(new FlatRadiobutton(this, qsl("autolock"), v, (v % 3600) ? lng_passcode_autolock_minutes(lt_count, v / 60) : lng_passcode_autolock_hours(lt_count, v / 3600), (cAutoLock() == v), st::langButton)); - _options.back()->move(st::langsPadding.left() + st::langPadding.left(), y + st::langPadding.top()); - y += st::langPadding.top() + _options.back()->height() + st::langPadding.bottom(); + _options.push_back(new Radiobutton(this, qsl("autolock"), v, (v % 3600) ? lng_passcode_autolock_minutes(lt_count, v / 60) : lng_passcode_autolock_hours(lt_count, v / 3600), (cAutoLock() == v), st::langsButton)); + _options.back()->move(st::boxPadding.left() + st::boxOptionListPadding.left(), y); + y += _options.back()->height() + st::boxOptionListPadding.top(); connect(_options.back(), SIGNAL(changed()), this, SLOT(onChange())); } - connect(&_done, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_close, SIGNAL(clicked()), this, SLOT(onClose())); - _done.move(0, height() - _done.height()); + _close.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _close.height()); prepare(); } void AutoLockBox::hideAll() { - _done.hide(); + _close.hide(); for (int32 i = 0, l = _options.size(); i < l; ++i) { _options[i]->hide(); } } void AutoLockBox::showAll() { - _done.show(); + _close.show(); for (int32 i = 0, l = _options.size(); i < l; ++i) { _options[i]->show(); } @@ -71,7 +71,7 @@ void AutoLockBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_passcode_autolock), true); + paintTitle(p, lang(lng_passcode_autolock)); } void AutoLockBox::onChange() { diff --git a/Telegram/SourceFiles/boxes/autolockbox.h b/Telegram/SourceFiles/boxes/autolockbox.h index 12edab8e4..827e10365 100644 --- a/Telegram/SourceFiles/boxes/autolockbox.h +++ b/Telegram/SourceFiles/boxes/autolockbox.h @@ -42,6 +42,6 @@ protected: private: - QVector _options; - BottomButton _done; + QVector _options; + BoxButton _close; }; diff --git a/Telegram/SourceFiles/boxes/backgroundbox.cpp b/Telegram/SourceFiles/boxes/backgroundbox.cpp index 7c523c157..b62830b10 100644 --- a/Telegram/SourceFiles/boxes/backgroundbox.cpp +++ b/Telegram/SourceFiles/boxes/backgroundbox.cpp @@ -177,7 +177,7 @@ void BackgroundInner::resizeEvent(QResizeEvent *e) { BackgroundBox::BackgroundBox() : ItemListBox(st::boxScroll), _inner(), _close(this, lang(lng_cancel), st::contactsClose) { - init(&_inner, _close.height(), st::boxFont->height + st::newGroupNamePadding.top() + st::newGroupNamePadding.bottom()); + init(&_inner, _close.height(), st::boxFont->height + st::old_newGroupNamePadding.top() + st::old_newGroupNamePadding.bottom()); connect(&_close, SIGNAL(clicked()), this, SLOT(onClose())); connect(&_inner, SIGNAL(backgroundChosen(int)), this, SLOT(onBackgroundChosen(int))); diff --git a/Telegram/SourceFiles/boxes/confirmbox.cpp b/Telegram/SourceFiles/boxes/confirmbox.cpp index bbb158c6b..ffaa620c1 100644 --- a/Telegram/SourceFiles/boxes/confirmbox.cpp +++ b/Telegram/SourceFiles/boxes/confirmbox.cpp @@ -170,8 +170,8 @@ void ConfirmBox::paintEvent(QPaintEvent *e) { } void ConfirmBox::resizeEvent(QResizeEvent *e) { - _confirm.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _confirm.height(), width()); - _cancel.moveToRight(st::boxButtonPadding.right() + _confirm.width() + st::boxButtonPadding.left(), _confirm.y(), width()); + _confirm.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _confirm.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _confirm.width() + st::boxButtonPadding.left(), _confirm.y()); } ConfirmLinkBox::ConfirmLinkBox(const QString &url) : ConfirmBox(lang(lng_open_this_link) + qsl("\n\n") + url, lang(lng_open_link)), _url(url) { @@ -196,7 +196,7 @@ a_goodOpacity(0, 0), a_good(animFunc(this, &MaxInviteBox::goodAnimStep)) { _textWidth = st::boxWidth - st::boxPadding.left() - st::boxPadding.right(); _textHeight = qMin(_text.countHeight(_textWidth), 16 * int(st::boxTextStyle.lineHeight)); - setMaxHeight(st::boxPadding.top() + _textHeight + st::newGroupLinkPadding.top() + st::newGroupLink.height + st::newGroupLinkPadding.bottom() + _close.height() + st::boxButtonPadding.bottom()); + setMaxHeight(st::boxPadding.top() + _textHeight + st::boxTextFont->height + st::boxTextFont->height * 2 + st::newGroupLinkPadding.bottom() + _close.height() + st::boxButtonPadding.bottom()); connect(&_close, SIGNAL(clicked()), this, SLOT(onClose())); @@ -269,13 +269,13 @@ void MaxInviteBox::paintEvent(QPaintEvent *e) { if (!_goodTextLink.isEmpty() && a_goodOpacity.current() > 0) { p.setOpacity(a_goodOpacity.current()); p.setPen(st::setGoodColor->p); - p.setFont(st::setErrFont->f); - p.drawText(QRect(st::newGroupPadding.left(), st::boxPadding.top() + _textHeight + st::newGroupLinkTop + st::newGroupLinkFont->height - st::setErrFont->ascent, width() - st::newGroupPadding.left() - st::newGroupPadding.right(), st::setErrFont->height), _goodTextLink, style::al_top); + p.setFont(st::boxTextFont->f); + p.drawTextLeft(st::boxPadding.left(), height() - st::boxButtonPadding.bottom() - _close.height() + st::defaultBoxButton.textTop + st::defaultBoxButton.font->ascent - st::boxTextFont->ascent, width(), _goodTextLink); p.setOpacity(1); } } void MaxInviteBox::resizeEvent(QResizeEvent *e) { - _close.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _close.height(), width()); - _invitationLink = QRect(st::newGroupPadding.left(), st::boxPadding.top() + _textHeight + st::newGroupLinkPadding.top() + (st::newGroupLink.height / 2) - st::newGroupLinkFont->height, width() - st::newGroupPadding.left() - st::newGroupPadding.right(), 2 * st::newGroupLinkFont->height); + _close.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _close.height()); + _invitationLink = myrtlrect(st::boxPadding.left(), st::boxPadding.top() + _textHeight + st::boxTextFont->height, width() - st::boxPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)), 2 * st::boxTextFont->height); } diff --git a/Telegram/SourceFiles/boxes/connectionbox.cpp b/Telegram/SourceFiles/boxes/connectionbox.cpp index b1b69c796..e6c6ca81d 100644 --- a/Telegram/SourceFiles/boxes/connectionbox.cpp +++ b/Telegram/SourceFiles/boxes/connectionbox.cpp @@ -27,25 +27,30 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "window.h" -ConnectionBox::ConnectionBox() : - _saveButton(this, lang(lng_connection_save), st::btnSelectDone), - _cancelButton(this, lang(lng_cancel), st::btnSelectCancel), - _hostInput(this, st::inpConnectionHost, lang(lng_connection_host_ph), cConnectionProxy().host), - _portInput(this, st::inpConnectionPort, lang(lng_connection_port_ph), QString::number(cConnectionProxy().port)), - _userInput(this, st::inpConnectionUser, lang(lng_connection_user_ph), cConnectionProxy().user), - _passwordInput(this, st::inpConnectionPassword, lang(lng_connection_password_ph), cConnectionProxy().password), - _autoRadio(this, qsl("conn_type"), dbictAuto, lang(lng_connection_auto_rb), (cConnectionType() == dbictAuto)), - _httpProxyRadio(this, qsl("conn_type"), dbictHttpProxy, lang(lng_connection_http_proxy_rb), (cConnectionType() == dbictHttpProxy)), - _tcpProxyRadio(this, qsl("conn_type"), dbictTcpProxy, lang(lng_connection_tcp_proxy_rb), (cConnectionType() == dbictTcpProxy)), - _tryIPv6(this, lang(lng_connection_try_ipv6), cTryIPv6()) { +ConnectionBox::ConnectionBox() : AbstractBox(st::boxWidth), +_hostInput(this, st::connectionHostInputField, lang(lng_connection_host_ph), cConnectionProxy().host), +_portInput(this, st::connectionPortInputField, lang(lng_connection_port_ph), QString::number(cConnectionProxy().port)), +_userInput(this, st::connectionUserInputField, lang(lng_connection_user_ph), cConnectionProxy().user), +_passwordInput(this, st::connectionPasswordInputField, lang(lng_connection_password_ph), cConnectionProxy().password), +_autoRadio(this, qsl("conn_type"), dbictAuto, lang(lng_connection_auto_rb), (cConnectionType() == dbictAuto)), +_httpProxyRadio(this, qsl("conn_type"), dbictHttpProxy, lang(lng_connection_http_proxy_rb), (cConnectionType() == dbictHttpProxy)), +_tcpProxyRadio(this, qsl("conn_type"), dbictTcpProxy, lang(lng_connection_tcp_proxy_rb), (cConnectionType() == dbictTcpProxy)), +_tryIPv6(this, lang(lng_connection_try_ipv6), cTryIPv6()), +_save(this, lang(lng_connection_save), st::defaultBoxButton), +_cancel(this, lang(lng_box_cancel), st::cancelBoxButton) { - connect(&_saveButton, SIGNAL(clicked()), this, SLOT(onSave())); - connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); connect(&_autoRadio, SIGNAL(changed()), this, SLOT(onChange())); connect(&_httpProxyRadio, SIGNAL(changed()), this, SLOT(onChange())); connect(&_tcpProxyRadio, SIGNAL(changed()), this, SLOT(onChange())); + connect(&_hostInput, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + connect(&_portInput, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + connect(&_userInput, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + connect(&_passwordInput, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); + _passwordInput.setEchoMode(QLineEdit::Password); prepare(); @@ -62,8 +67,8 @@ void ConnectionBox::hideAll() { _userInput.hide(); _passwordInput.hide(); - _saveButton.hide(); - _cancelButton.hide(); + _save.hide(); + _cancel.hide(); } void ConnectionBox::showAll() { @@ -72,9 +77,9 @@ void ConnectionBox::showAll() { _tcpProxyRadio.show(); _tryIPv6.show(); - int32 h = st::old_boxTitleHeight + st::connectionSkip + _autoRadio.height() + st::connectionSkip + _httpProxyRadio.height() + st::connectionSkip + _tcpProxyRadio.height() + st::connectionSkip + st::lineWidth + st::connectionSkip + _tryIPv6.height() + st::connectionSkip; + int32 h = st::boxTitleHeight + st::boxOptionListPadding.top() + _autoRadio.height() + st::boxOptionListPadding.top() + _httpProxyRadio.height() + st::boxOptionListPadding.top() + _tcpProxyRadio.height() + st::boxOptionListPadding.top() + st::connectionIPv6Skip + _tryIPv6.height() + st::boxOptionListPadding.bottom() + st::boxPadding.bottom() + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom(); if (_httpProxyRadio.checked() || _tcpProxyRadio.checked()) { - h += 2 * st::boxPadding.top() + 2 * _hostInput.height(); + h += 2 * st::boxOptionListPadding.top() + 2 * _hostInput.height(); _hostInput.show(); _portInput.show(); _userInput.show(); @@ -86,10 +91,10 @@ void ConnectionBox::showAll() { _passwordInput.hide(); } - _saveButton.show(); - _cancelButton.show(); + _save.show(); + _cancel.show(); - setMaxHeight(h + _saveButton.height()); + setMaxHeight(h); resizeEvent(0); } @@ -103,52 +108,43 @@ void ConnectionBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_connection_header), true); - - // paint separator - p.fillRect(st::boxPadding.left(), _tryIPv6.y() - st::connectionSkip - st::lineWidth, width() - st::boxPadding.left() - st::boxPadding.right(), st::lineWidth, st::scrollDef.shColor->b); - - // paint shadow - p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::btnSelectCancel.width, height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); + paintTitle(p, lang(lng_connection_header)); } void ConnectionBox::resizeEvent(QResizeEvent *e) { - _autoRadio.move(st::boxPadding.left(), st::old_boxTitleHeight + st::connectionSkip); - _httpProxyRadio.move(st::boxPadding.left(), _autoRadio.y() + _autoRadio.height() + st::connectionSkip); + _autoRadio.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), st::boxTitleHeight + st::boxOptionListPadding.top()); + _httpProxyRadio.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), _autoRadio.y() + _autoRadio.height() + st::boxOptionListPadding.top()); int32 inputy = 0; if (_httpProxyRadio.checked()) { - inputy = _httpProxyRadio.y() + _httpProxyRadio.height() + st::boxPadding.top(); - _tcpProxyRadio.move(st::boxPadding.left(), inputy + st::boxPadding.top() + 2 * _hostInput.height() + st::connectionSkip); + inputy = _httpProxyRadio.y() + _httpProxyRadio.height() + st::boxOptionListPadding.top(); + _tcpProxyRadio.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), inputy + st::boxOptionListPadding.top() + 2 * _hostInput.height() + st::boxOptionListPadding.top()); } else { - _tcpProxyRadio.move(st::boxPadding.left(), _httpProxyRadio.y() + _httpProxyRadio.height() + st::connectionSkip); + _tcpProxyRadio.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), _httpProxyRadio.y() + _httpProxyRadio.height() + st::boxOptionListPadding.top()); if (_tcpProxyRadio.checked()) { - inputy = _tcpProxyRadio.y() + _tcpProxyRadio.height() + st::boxPadding.top(); + inputy = _tcpProxyRadio.y() + _tcpProxyRadio.height() + st::boxOptionListPadding.top(); } } if (inputy) { - _hostInput.move(st::boxPadding.left() + st::rbDefFlat.textLeft, inputy); - _portInput.move(width() - st::boxPadding.right() - _portInput.width(), inputy); - _userInput.move(st::boxPadding.left() + st::rbDefFlat.textLeft, _hostInput.y() + _hostInput.height() + st::boxPadding.top()); - _passwordInput.move(width() - st::boxPadding.right() - _passwordInput.width(), _userInput.y()); + _hostInput.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left() + st::defaultRadiobutton.textPosition.x() - st::defaultInputField.textMargins.left(), inputy); + _portInput.moveToRight(st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2), inputy); + _userInput.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left() + st::defaultRadiobutton.textPosition.x() - st::defaultInputField.textMargins.left(), _hostInput.y() + _hostInput.height() + st::boxOptionListPadding.top()); + _passwordInput.moveToRight(st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2), _userInput.y()); } - int32 tryipv6y = (_tcpProxyRadio.checked() ? (_userInput.y() + _userInput.height()) : (_tcpProxyRadio.y() + _tcpProxyRadio.height())) + st::connectionSkip + st::lineWidth + st::connectionSkip; - _tryIPv6.move(st::boxPadding.left(), tryipv6y); + int32 tryipv6y = (_tcpProxyRadio.checked() ? (_userInput.y() + _userInput.height()) : (_tcpProxyRadio.y() + _tcpProxyRadio.height())) + st::boxOptionListPadding.top() + st::connectionIPv6Skip; + _tryIPv6.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), tryipv6y); - _saveButton.move(width() - _saveButton.width(), _tryIPv6.y() + _tryIPv6.height() + st::connectionSkip); - _cancelButton.move(0, _saveButton.y()); + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); } void ConnectionBox::onChange() { showAll(); if (_httpProxyRadio.checked() || _tcpProxyRadio.checked()) { _hostInput.setFocus(); - if (_httpProxyRadio.checked() && !_portInput.text().toInt()) { + if (_httpProxyRadio.checked() && !_portInput.getLastText().toInt()) { _portInput.setText(qsl("80")); _portInput.updatePlaceholder(); } @@ -156,13 +152,41 @@ void ConnectionBox::onChange() { update(); } +void ConnectionBox::onSubmit() { + if (_hostInput.hasFocus()) { + if (!_hostInput.getLastText().trimmed().isEmpty()) { + _portInput.setFocus(); + } else { + _hostInput.showError(); + } + } else if (_portInput.hasFocus()) { + if (_portInput.getLastText().trimmed().toInt() > 0) { + _userInput.setFocus(); + } else { + _portInput.showError(); + } + } else if (_userInput.hasFocus()) { + _passwordInput.setFocus(); + } else if (_passwordInput.hasFocus()) { + if (_hostInput.getLastText().trimmed().isEmpty()) { + _hostInput.setFocus(); + _hostInput.showError(); + } else if (_portInput.getLastText().trimmed().toInt() <= 0) { + _portInput.setFocus(); + _portInput.showError(); + } else { + onSave(); + } + } +} + void ConnectionBox::onSave() { if (_httpProxyRadio.checked() || _tcpProxyRadio.checked()) { ConnectionProxy p; - p.host = _hostInput.text().trimmed(); - p.user = _userInput.text().trimmed(); - p.password = _passwordInput.text().trimmed(); - p.port = _portInput.text().toInt(); + p.host = _hostInput.getLastText().trimmed(); + p.user = _userInput.getLastText().trimmed(); + p.password = _passwordInput.getLastText().trimmed(); + p.port = _portInput.getLastText().toInt(); if (p.host.isEmpty()) { _hostInput.setFocus(); return; diff --git a/Telegram/SourceFiles/boxes/connectionbox.h b/Telegram/SourceFiles/boxes/connectionbox.h index b15060a78..7def2ba77 100644 --- a/Telegram/SourceFiles/boxes/connectionbox.h +++ b/Telegram/SourceFiles/boxes/connectionbox.h @@ -20,7 +20,6 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org */ #pragma once -#include "gui/phoneinput.h" #include "abstractbox.h" class ConnectionBox : public AbstractBox { @@ -35,6 +34,7 @@ public: public slots: void onChange(); + void onSubmit(); void onSave(); protected: @@ -45,10 +45,12 @@ protected: private: - FlatButton _saveButton, _cancelButton; - FlatInput _hostInput; + InputField _hostInput; PortInput _portInput; - FlatInput _userInput, _passwordInput; - FlatRadiobutton _autoRadio, _httpProxyRadio, _tcpProxyRadio; - FlatCheckbox _tryIPv6; + InputField _userInput; + MaskedInputField _passwordInput; + Radiobutton _autoRadio, _httpProxyRadio, _tcpProxyRadio; + Checkbox _tryIPv6; + + BoxButton _save, _cancel; }; diff --git a/Telegram/SourceFiles/boxes/contactsbox.cpp b/Telegram/SourceFiles/boxes/contactsbox.cpp index 86b86da3c..fe3cd490d 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.cpp +++ b/Telegram/SourceFiles/boxes/contactsbox.cpp @@ -300,7 +300,7 @@ void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, b } else { p.setPen(st::profileListNameColor->p); } - int32 iconw = (_chat || _creating != CreatingGroupNone) ? st::profileCheckRect.pxWidth() : st::contactsImg.pxWidth(); + int32 iconw = (_chat || _creating != CreatingGroupNone) ? st::inviteCheckIcon.pxWidth() : st::contactsImg.pxWidth(); int32 namew = width() - left - st::profileListPhotoSize - st::profileListPadding.width() - st::participantDelta - st::scrollDef.width - iconw; if (peer->isChannel() && peer->asChannel()->isVerified()) { namew -= st::verifiedCheck.pxWidth() + st::verifiedCheckPos.x(); @@ -314,7 +314,7 @@ void ContactsInner::paintDialog(Painter &p, PeerData *peer, ContactData *data, b } } else if (_chat || _creating != CreatingGroupNone) { if (sel || data->check) { - p.drawPixmap(QPoint(width() - st::profileCheckRect.pxWidth() - st::profileCheckDeltaX, st::profileListPadding.height() + (st::profileListPhotoSize - st::profileCheckRect.pxHeight()) / 2 - st::profileCheckDeltaY), App::sprite(), (data->check ? st::profileCheckActiveRect : st::profileCheckRect)); + p.drawPixmap(QPoint(width() - st::inviteCheckIcon.pxWidth() - st::profileCheckDeltaX, st::profileListPadding.height() + (st::profileListPhotoSize - st::inviteCheckIcon.pxHeight()) / 2 - st::profileCheckDeltaY), App::sprite(), (data->check ? st::inviteCheckActiveIcon : st::inviteCheckIcon)); } } else if (sel) { p.drawPixmap(QPoint(width() - st::contactsImg.pxWidth() - st::profileCheckDeltaX, st::profileListPadding.height() + (st::profileListPhotoSize - st::contactsImg.pxHeight()) / 2 - st::profileCheckDeltaY), App::sprite(), st::contactsImg); @@ -1109,7 +1109,7 @@ ContactsBox::ContactsBox(ChannelData *channel, MembersFilter filter, const Membe _addContact(this, lang(lng_add_contact_button), st::contactsAdd), _filter(this, st::contactsFilter, lang(lng_participant_filter)), _next(this, lang(lng_participant_invite), st::btnSelectDone), -_cancel(this, lang(filter == MembersFilterAdmins ? lng_contacts_done : lng_cancel), (filter == MembersFilterAdmins ? st::contactsClose : st::btnSelectCancel)), +_cancel(this, lang(filter == MembersFilterAdmins ? lng_contacts_done : lng_box_cancel), (filter == MembersFilterAdmins ? st::contactsClose : st::btnSelectCancel)), _creationRequestId(0) { init(); } @@ -1118,7 +1118,7 @@ ContactsBox::ContactsBox(ChatData *chat) : ItemListBox(st::boxNoTopScroll), _inn _addContact(this, lang(lng_add_contact_button), st::contactsAdd), _filter(this, st::contactsFilter, lang(lng_participant_filter)), _next(this, lang(lng_participant_invite), st::btnSelectDone), -_cancel(this, lang(lng_cancel), st::btnSelectCancel), +_cancel(this, lang(lng_box_cancel), st::btnSelectCancel), _creationRequestId(0) { init(); } @@ -1127,13 +1127,13 @@ ContactsBox::ContactsBox(UserData *bot) : ItemListBox(st::boxNoTopScroll), _inne _addContact(this, lang(lng_add_contact_button), st::contactsAdd), _filter(this, st::contactsFilter, lang(lng_participant_filter)), _next(this, lang(lng_create_group_next), st::btnSelectDone), -_cancel(this, lang(lng_cancel), st::contactsClose), +_cancel(this, lang(lng_box_cancel), st::contactsClose), _creationRequestId(0) { init(); } void ContactsBox::init() { - ItemListBox::init(&_inner, _cancel.height(), st::contactsAdd.height + st::newGroupNamePadding.top() + _filter.height() + st::newGroupNamePadding.bottom()); + ItemListBox::init(&_inner, _cancel.height(), st::contactsAdd.height + st::old_newGroupNamePadding.top() + _filter.height() + st::old_newGroupNamePadding.bottom()); connect(&_inner, SIGNAL(chosenChanged()), this, SLOT(update())); if (_inner.chat()) { @@ -1224,7 +1224,7 @@ void ContactsBox::peopleReceived(const MTPcontacts_Found &result, mtpRequestId r } bool ContactsBox::peopleFailed(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (_peopleRequest == req) { _peopleRequest = 0; @@ -1299,26 +1299,26 @@ void ContactsBox::paintEvent(QPaintEvent *e) { bool addingAdmin = _inner.channel() && _inner.channelFilter() == MembersFilterAdmins; if (_inner.chat() || _inner.creating() != CreatingGroupNone) { QString title(lang(addingAdmin ? lng_channel_add_admin : lng_profile_add_participant)); - paintTitle(p, title, true); + paintOldTitle(p, title, true); if (!addingAdmin) { p.setPen(st::newGroupLimitFg); - p.drawTextLeft(st::old_boxTitlePos.x() + st::old_boxTitleFont->width(title) + st::addContactDelta, st::old_boxTitlePos.y(), width(), QString("%1 / %2").arg(_inner.selectedCount()).arg(cMaxGroupCount())); + p.drawTextLeft(st::old_boxTitlePos.x() + st::old_boxTitleFont->width(title) + st::addContactSkip, st::old_boxTitlePos.y(), width(), QString("%1 / %2").arg(_inner.selectedCount()).arg(cMaxGroupCount())); // paint button sep p.fillRect(st::btnSelectCancel.width, size().height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); } } else if (_inner.bot()) { - paintTitle(p, lang(lng_bot_choose_group), true); + paintOldTitle(p, lang(lng_bot_choose_group), true); } else { - paintTitle(p, lang(lng_contacts_header), true); + paintOldTitle(p, lang(lng_contacts_header), true); } } void ContactsBox::resizeEvent(QResizeEvent *e) { ItemListBox::resizeEvent(e); _addContact.move(width() - _addContact.width(), 0); - _filter.move(st::newGroupNamePadding.left(), _addContact.height() + st::newGroupNamePadding.top()); + _filter.move(st::old_newGroupNamePadding.left(), _addContact.height() + st::old_newGroupNamePadding.top()); _inner.resize(width(), _inner.height()); _next.move(width() - _next.width(), height() - _next.height()); _cancel.move(0, height() - _cancel.height()); @@ -1915,7 +1915,7 @@ void MembersBox::paintEvent(QPaintEvent *e) { if (paint(p)) return; QString title(lang(_inner.filter() == MembersFilterRecent ? lng_channel_members : lng_channel_admins)); - paintTitle(p, title, false); + paintOldTitle(p, title, false); } void MembersBox::resizeEvent(QResizeEvent *e) { @@ -1981,13 +1981,13 @@ void MembersBox::showDone() { NewGroupBox::NewGroupBox() : AbstractBox(), _group(this, qsl("group_type"), 0, lang(lng_create_group_title), true), _channel(this, qsl("group_type"), 1, lang(lng_create_channel_title)), -_aboutGroupWidth(width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft), +_aboutGroupWidth(width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x()), _aboutGroup(st::normalFont, lng_create_group_about(lt_count, cMaxGroupCount()), _defaultOptions, _aboutGroupWidth), _aboutChannel(st::normalFont, lang(lng_create_channel_about), _defaultOptions, _aboutGroupWidth), -_next(this, lang(lng_create_group_next), st::btnSelectDone), -_cancel(this, lang(lng_cancel), st::btnSelectCancel) { +_next(this, lang(lng_create_group_next), st::defaultBoxButton), +_cancel(this, lang(lng_box_cancel), st::cancelBoxButton) { _aboutGroupHeight = _aboutGroup.countHeight(_aboutGroupWidth); - setMaxHeight(st::newGroupPadding.top() + _group.height() + _aboutGroupHeight + st::newGroupSkip + _channel.height() + _aboutChannel.countHeight(_aboutGroupWidth) + st::newGroupPadding.bottom() + _next.height()); + setMaxHeight(st::boxPadding.top() + st::newGroupPadding.top() + _group.height() + _aboutGroupHeight + st::newGroupSkip + _channel.height() + _aboutChannel.countHeight(_aboutGroupWidth) + st::newGroupPadding.bottom() + st::boxPadding.bottom() + st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom()); connect(&_next, SIGNAL(clicked()), this, SLOT(onNext())); connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); @@ -2027,28 +2027,19 @@ void NewGroupBox::paintEvent(QPaintEvent *e) { p.setPen(st::newGroupAboutFg->p); - QRect aboutGroup(st::newGroupPadding.left() + st::rbDefFlat.textLeft, _group.y() + _group.height(), width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft, _aboutGroupHeight); - if (rtl()) aboutGroup.setX(width() - aboutGroup.x() - aboutGroup.width()); + QRect aboutGroup = myrtlrect(st::boxPadding.left() + st::newGroupPadding.left() + st::defaultRadiobutton.textPosition.x(), _group.y() + _group.height() + st::lineWidth, width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x(), _aboutGroupHeight); _aboutGroup.draw(p, aboutGroup.x(), aboutGroup.y(), aboutGroup.width()); - QRect aboutChannel(st::newGroupPadding.left() + st::rbDefFlat.textLeft, _channel.y() + _channel.height(), width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft, _aboutGroupHeight); - if (rtl()) aboutChannel.setX(width() - aboutChannel.x() - aboutChannel.width()); + QRect aboutChannel = myrtlrect(st::boxPadding.left() + st::newGroupPadding.left() + st::defaultRadiobutton.textPosition.x(), _channel.y() + _channel.height() + st::lineWidth, width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x(), _aboutGroupHeight); _aboutChannel.draw(p, aboutChannel.x(), aboutChannel.y(), aboutChannel.width()); - - // paint shadow - p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::btnSelectCancel.width, height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); } void NewGroupBox::resizeEvent(QResizeEvent *e) { - _group.moveToLeft(st::newGroupPadding.left(), st::newGroupPadding.top(), width()); - _channel.moveToLeft(st::newGroupPadding.left(), _group.y() + _group.height() + _aboutGroupHeight + st::newGroupSkip, width()); + _group.moveToLeft(st::boxPadding.left() + st::newGroupPadding.left(), st::boxPadding.top() + st::newGroupPadding.top()); + _channel.moveToLeft(st::boxPadding.left() + st::newGroupPadding.left(), _group.y() + _group.height() + _aboutGroupHeight + st::newGroupSkip); - int32 buttonTop = height() - st::btnSelectCancel.height; - _cancel.moveToLeft(0, buttonTop, width()); - _next.moveToRight(0, buttonTop, width()); + _next.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _next.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _next.width() + st::boxButtonPadding.left(), _next.y()); } void NewGroupBox::onNext() { @@ -2058,33 +2049,25 @@ void NewGroupBox::onNext() { GroupInfoBox::GroupInfoBox(CreatingGroupType creating, bool fromTypeChoose) : AbstractBox(), _creating(creating), a_photoOver(0, 0), -a_photo(animFunc(this, &GroupInfoBox::photoAnimStep)), +_a_photoOver(animFunc(this, &GroupInfoBox::animStep_photoOver)), _photoOver(false), -_descriptionOver(false), -a_descriptionBg(st::newGroupName.bgColor->c, st::newGroupName.bgColor->c), -a_descriptionBorder(st::newGroupName.borderColor->c, st::newGroupName.borderColor->c), -a_description(animFunc(this, &GroupInfoBox::descriptionAnimStep)), -_name(this, st::newGroupName, lang(_creating == CreatingGroupChannel ? lng_dlg_new_channel_name : lng_dlg_new_group_name)), -_photo(this, lang(lng_create_group_photo), st::newGroupPhoto), +_title(this, st::newGroupName, lang(_creating == CreatingGroupChannel ? lng_dlg_new_channel_name : lng_dlg_new_group_name)), _description(this, st::newGroupDescription, lang(lng_create_group_description)), -_next(this, lang(_creating == CreatingGroupChannel ? lng_create_group_create : lng_create_group_next), st::btnSelectDone), -_cancel(this, lang(fromTypeChoose ? lng_create_group_back : lng_cancel), st::btnSelectCancel), +_next(this, lang(_creating == CreatingGroupChannel ? lng_create_group_create : lng_create_group_next), st::defaultBoxButton), +_cancel(this, lang(fromTypeChoose ? lng_create_group_back : lng_box_cancel), st::cancelBoxButton), _creationRequestId(0), _createdChannel(0) { setMouseTracking(true); - _description.resize(width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::newGroupDescriptionPadding.left() - st::newGroupDescriptionPadding.right(), _name.height() - st::newGroupDescriptionPadding.top() - st::newGroupDescriptionPadding.bottom()); - _description.setMinHeight(_description.height()); - _description.setMaxHeight(3 * _description.height() + 2 * st::newGroupDescriptionPadding.top() + 2 * st::newGroupDescriptionPadding.bottom()); + _description.setMaxLength(MaxChannelDescription); + _description.resize(width() - st::boxPadding.left() - st::newGroupInfoPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)), _description.height()); updateMaxHeight(); - _description.setMaxLength(MaxChannelDescription); connect(&_description, SIGNAL(resized()), this, SLOT(onDescriptionResized())); connect(&_description, SIGNAL(submitted(bool)), this, SLOT(onNext())); connect(&_description, SIGNAL(cancelled()), this, SLOT(onClose())); - _description.installEventFilter(this); - connect(&_photo, SIGNAL(clicked()), this, SLOT(onPhoto())); + connect(&_title, SIGNAL(submitted(bool)), this, SLOT(onNameSubmit())); connect(&_next, SIGNAL(clicked()), this, SLOT(onNext())); connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); @@ -2093,16 +2076,14 @@ _creationRequestId(0), _createdChannel(0) { } void GroupInfoBox::hideAll() { - _name.hide(); - _photo.hide(); + _title.hide(); _description.hide(); _cancel.hide(); _next.hide(); } void GroupInfoBox::showAll() { - _name.show(); - _photo.show(); + _title.show(); if (_creating == CreatingGroupChannel) { _description.show(); } else { @@ -2113,24 +2094,7 @@ void GroupInfoBox::showAll() { } void GroupInfoBox::showDone() { - _name.setFocus(); -} - -void GroupInfoBox::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { - if (_name.hasFocus()) { - if (_name.text().trimmed().isEmpty()) { - _name.setFocus(); - _name.notaBene(); - } else if (_description.isHidden()) { - onNext(); - } else { - _description.setFocus(); - } - } - } else { - AbstractBox::keyPressEvent(e); - } + _title.setFocus(); } void GroupInfoBox::paintEvent(QPaintEvent *e) { @@ -2140,57 +2104,39 @@ void GroupInfoBox::paintEvent(QPaintEvent *e) { QRect phRect(photoRect()); if (phRect.intersects(e->rect())) { if (_photoSmall.isNull()) { - int32 s = st::newGroupPhotoSize * cIntRetinaFactor(); - QRect ph(st::setPhotoImg), overph(st::setOverPhotoImg); - if (a_photoOver.current() < 1) { - p.drawPixmapLeft(phRect.topLeft(), width(), App::sprite(), QRect(ph.x() + (ph.width() - s) / 2, ph.y() + (ph.height() - s) / 2, s, s)); - } - if (a_photoOver.current() > 0) { - p.setOpacity(a_photoOver.current()); - p.drawPixmapLeft(phRect.topLeft(), width(), App::sprite(), QRect(overph.x() + (overph.width() - s) / 2, overph.y() + (overph.height() - s) / 2, s, s)); - p.setOpacity(1); + float64 o = a_photoOver.current(); + if (o > 0) { + if (o < 1) { + QColor c; + c.setRedF(st::newGroupPhotoBg->c.redF() * (1. - o) + st::newGroupPhotoBgOver->c.redF() * o); + c.setGreenF(st::newGroupPhotoBg->c.greenF() * (1. - o) + st::newGroupPhotoBgOver->c.greenF() * o); + c.setBlueF(st::newGroupPhotoBg->c.blueF() * (1. - o) + st::newGroupPhotoBgOver->c.blueF() * o); + p.fillRect(phRect, c); + } else { + p.fillRect(phRect, st::newGroupPhotoBgOver->b); + } + } else { + p.fillRect(phRect, st::newGroupPhotoBg->b); } + p.drawSprite(phRect.topLeft() + st::newGroupPhotoIconPosition, st::newGroupPhotoIcon); } else { - p.drawPixmap(st::newGroupPadding.left(), st::newGroupPadding.left(), _photoSmall); + p.drawPixmap(phRect.topLeft(), _photoSmall); } if (phRect.contains(e->rect())) { return; } } - QRect descRect(descriptionRect()); - if (_creating == CreatingGroupChannel && descRect.intersects(e->rect())) { - p.fillRect(descRect, a_descriptionBg.current()); - if (st::newGroupName.borderWidth) { - QBrush b(a_descriptionBorder.current()); - p.fillRect(descRect.x(), descRect.y(), descRect.width() - st::newGroupName.borderWidth, st::newGroupName.borderWidth, b); - p.fillRect(descRect.x() + descRect.width() - st::newGroupName.borderWidth, descRect.y(), st::newGroupName.borderWidth, descRect.height() - st::newGroupName.borderWidth, b); - p.fillRect(descRect.x() + st::newGroupName.borderWidth, descRect.y() + descRect.height() - st::newGroupName.borderWidth, descRect.width() - st::newGroupName.borderWidth, st::newGroupName.borderWidth, b); - p.fillRect(descRect.x(), descRect.y() + st::newGroupName.borderWidth, st::newGroupName.borderWidth, descRect.height() - st::newGroupName.borderWidth, b); - } - if (descRect.contains(e->rect())) { - return; - } - } - - // paint shadow - p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::btnSelectCancel.width, height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); } void GroupInfoBox::resizeEvent(QResizeEvent *e) { - int32 nameLeft = st::newGroupPhotoSize + st::newGroupPhotoSkip; - _name.resize(width() - st::newGroupPadding.left() - st::newGroupPadding.right() - nameLeft, _name.height()); - _name.moveToLeft(st::newGroupPadding.left() + nameLeft, st::newGroupPadding.top(), width()); - _photo.moveToLeft(_name.x(), _name.y() + st::newGroupPhotoSize - _photo.height(), width()); + int32 nameLeft = st::newGroupPhotoSize + st::newGroupNamePosition.x(); + _title.resize(width() - st::boxPadding.left() - st::newGroupInfoPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)) - nameLeft, _title.height()); + _title.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left() + nameLeft, st::boxPadding.top() + st::newGroupInfoPadding.top() + st::newGroupNamePosition.y()); - _description.moveToLeft(st::newGroupPadding.left() + st::newGroupDescriptionPadding.left(), _photo.y() + _photo.height() + st::newGroupDescriptionSkip + st::newGroupDescriptionPadding.top(), width()); + _description.moveToLeft(st::boxPadding.left() + st::newGroupInfoPadding.left(), st::boxPadding.top() + st::newGroupInfoPadding.top() + st::newGroupPhotoSize + st::newGroupDescriptionPadding.top()); - int32 buttonTop = (_creating == CreatingGroupChannel) ? (_description.y() + _description.height() + st::newGroupDescriptionPadding.bottom()) : (_photo.y() + _photo.height()); - buttonTop += st::newGroupPadding.bottom(); - _cancel.move(0, buttonTop); - _next.move(width() - _next.width(), buttonTop); + _next.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _next.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _next.width() + st::boxButtonPadding.left(), _next.y()); } void GroupInfoBox::mouseMoveEvent(QMouseEvent *e) { @@ -2205,24 +2151,17 @@ void GroupInfoBox::updateSelected(const QPoint &cursorGlobalPosition) { _photoOver = photoOver; if (_photoSmall.isNull()) { a_photoOver.start(_photoOver ? 1 : 0); - a_photo.start(); + _a_photoOver.start(); } } - bool descriptionOver = _photoOver ? false : descriptionRect().contains(p); - if (descriptionOver != _descriptionOver) { - _descriptionOver = descriptionOver; - } - - setCursor(_photoOver ? style::cur_pointer : (_descriptionOver ? style::cur_text : style::cur_default)); + setCursor(_photoOver ? style::cur_pointer : style::cur_default); } void GroupInfoBox::mousePressEvent(QMouseEvent *e) { mouseMoveEvent(e); if (_photoOver) { onPhoto(); - } else if (_descriptionOver) { - _description.setFocus(); } } @@ -2230,22 +2169,7 @@ void GroupInfoBox::leaveEvent(QEvent *e) { updateSelected(QCursor::pos()); } -bool GroupInfoBox::descriptionAnimStep(float64 ms) { - float dt = ms / st::newGroupName.phDuration; - bool res = true; - if (dt >= 1) { - res = false; - a_descriptionBg.finish(); - a_descriptionBorder.finish(); - } else { - a_descriptionBg.update(dt, st::newGroupName.phColorFunc); - a_descriptionBorder.update(dt, st::newGroupName.phColorFunc); - } - update(descriptionRect()); - return res; -} - -bool GroupInfoBox::photoAnimStep(float64 ms) { +bool GroupInfoBox::animStep_photoOver(float64 ms) { float64 dt = ms / st::setPhotoDuration; bool res = true; if (dt >= 1) { @@ -2258,34 +2182,30 @@ bool GroupInfoBox::photoAnimStep(float64 ms) { return res; } -bool GroupInfoBox::eventFilter(QObject *obj, QEvent *e) { - if (obj == &_description) { - if (e->type() == QEvent::FocusIn) { - a_descriptionBorder.start(st::newGroupName.borderActive->c); - a_descriptionBg.start(st::newGroupName.bgActive->c); - a_description.start(); - } else if (e->type() == QEvent::FocusOut) { - a_descriptionBorder.start(st::newGroupName.borderColor->c); - a_descriptionBg.start(st::newGroupName.bgColor->c); - a_description.start(); - } +void GroupInfoBox::onNameSubmit() { + if (_title.getLastText().trimmed().isEmpty()) { + _title.setFocus(); + _title.showError(); + } else if (_description.isHidden()) { + onNext(); + } else { + _description.setFocus(); } - return AbstractBox::eventFilter(obj, e); } void GroupInfoBox::onNext() { if (_creationRequestId) return; - QString name = _name.text().trimmed(); - if (name.isEmpty()) { - _name.setFocus(); - _name.notaBene(); + QString title = _title.getLastText().trimmed(); + if (title.isEmpty()) { + _title.setFocus(); + _title.showError(); return; } if (_creating == CreatingGroupGroup) { - App::wnd()->replaceLayer(new ContactsBox(name, _photoBig)); + App::wnd()->replaceLayer(new ContactsBox(title, _photoBig)); } else { - _creationRequestId = MTP::send(MTPchannels_CreateChannel(MTP_int(MTPmessages_CreateChannel_flag_broadcast), MTP_string(name), MTP_string(_description.getLastText().trimmed()), MTP_vector(0)), rpcDone(&GroupInfoBox::creationDone), rpcFail(&GroupInfoBox::creationFail)); + _creationRequestId = MTP::send(MTPchannels_CreateChannel(MTP_int(MTPmessages_CreateChannel_flag_broadcast), MTP_string(title), MTP_string(_description.getLastText().trimmed()), MTP_vector(0)), rpcDone(&GroupInfoBox::creationDone), rpcFail(&GroupInfoBox::creationFail)); } } @@ -2304,8 +2224,8 @@ bool GroupInfoBox::creationFail(const RPCError &error) { _creationRequestId = 0; if (error.type() == "NO_CHAT_TITLE") { - _name.setFocus(); - _name.notaBene(); + _title.setFocus(); + _title.showError(); return true; } else if (error.type() == "PEER_FLOOD") { App::wnd()->replaceLayer(new InformBox(lng_cant_invite_not_contact_channel(lt_more_info, textcmdLink(qsl("https://telegram.org/faq?_hash=can-39t-send-messages-to-non-contacts"), lang(lng_cant_more_info))))); @@ -2327,18 +2247,14 @@ void GroupInfoBox::onDescriptionResized() { update(); } -QRect GroupInfoBox::descriptionRect() const { - return rtlrect(_description.x() - st::newGroupDescriptionPadding.left(), _description.y() - st::newGroupDescriptionPadding.top(), _description.width() + st::newGroupDescriptionPadding.left() + st::newGroupDescriptionPadding.right(), _description.height() + st::newGroupDescriptionPadding.top() + st::newGroupDescriptionPadding.bottom(), width()); -} - QRect GroupInfoBox::photoRect() const { - return rtlrect(st::newGroupPadding.left(), st::newGroupPadding.top(), st::newGroupPhotoSize, st::newGroupPhotoSize, width()); + return myrtlrect(st::boxPadding.left() + st::newGroupInfoPadding.left(), st::boxPadding.top() + st::newGroupInfoPadding.top(), st::newGroupPhotoSize, st::newGroupPhotoSize); } void GroupInfoBox::updateMaxHeight() { - int32 h = st::newGroupPadding.top() + st::newGroupPhotoSize + st::newGroupPadding.bottom() + _next.height(); + int32 h = st::boxPadding.top() + st::newGroupInfoPadding.top() + st::newGroupPhotoSize + st::boxPadding.bottom() + st::newGroupInfoPadding.bottom() + st::boxButtonPadding.top() + _next.height() + st::boxButtonPadding.bottom(); if (_creating == CreatingGroupChannel) { - h += st::newGroupDescriptionSkip + st::newGroupDescriptionPadding.top() + _description.height() + st::newGroupDescriptionPadding.bottom(); + h += st::newGroupDescriptionPadding.top() + _description.height() + st::newGroupDescriptionPadding.bottom(); } setMaxHeight(h); } @@ -2382,26 +2298,23 @@ _existing(existing), _public(this, qsl("channel_privacy"), 0, lang(lng_create_public_channel_title), true), _private(this, qsl("channel_privacy"), 1, lang(lng_create_private_channel_title)), _comments(this, lang(lng_create_channel_comments), false), -_aboutPublicWidth(width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft), +_aboutPublicWidth(width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x()), _aboutPublic(st::normalFont, lang(lng_create_public_channel_about), _defaultOptions, _aboutPublicWidth), _aboutPrivate(st::normalFont, lang(lng_create_private_channel_about), _defaultOptions, _aboutPublicWidth), _aboutComments(st::normalFont, lang(lng_create_channel_comments_about), _defaultOptions, _aboutPublicWidth), -_linkPlaceholder(qsl("telegram.me/")), -_link(this, st::newGroupLink, QString(), channel->username), +_link(this, st::newGroupLink, QString(), channel->username, true), _linkOver(false), -_save(this, lang(lng_create_group_save), st::btnSelectDone), -_skip(this, lang(existing ? lng_cancel : lng_create_group_skip), st::btnSelectCancel), +_save(this, lang(lng_settings_save), st::defaultBoxButton), +_skip(this, lang(existing ? lng_box_cancel : lng_create_group_skip), st::cancelBoxButton), _tooMuchUsernames(false), _saveRequestId(0), _checkRequestId(0), -a_goodOpacity(0, 0), a_good(animFunc(this, &SetupChannelBox::goodAnimStep)) { +a_goodOpacity(0, 0), _a_goodFade(animFunc(this, &SetupChannelBox::animStep_goodFade)) { setMouseTracking(true); _checkRequestId = MTP::send(MTPchannels_CheckUsername(_channel->inputChannel, MTP_string("preston")), RPCDoneHandlerPtr(), rpcFail(&SetupChannelBox::onFirstCheckFail)); - _link.setTextMargin(style::margins(st::newGroupLink.textMrg.left() + st::newGroupLink.font->width(_linkPlaceholder), st::newGroupLink.textMrg.top(), st::newGroupLink.textMrg.right(), st::newGroupLink.textMrg.bottom())); - _aboutPublicHeight = _aboutPublic.countHeight(_aboutPublicWidth); - setMaxHeight(st::newGroupPadding.top() + _public.height() + _aboutPublicHeight + st::newGroupSkip + _private.height() + _aboutPrivate.countHeight(_aboutPublicWidth)/* + st::newGroupSkip + _comments.height() + _aboutComments.countHeight(_aboutPublicWidth)*/ + st::newGroupPadding.bottom() + st::newGroupLinkPadding.top() + _link.height() + st::newGroupLinkPadding.bottom() + _save.height()); + setMaxHeight(st::boxPadding.top() + st::newGroupPadding.top() + _public.height() + _aboutPublicHeight + st::newGroupSkip + _private.height() + _aboutPrivate.countHeight(_aboutPublicWidth)/* + st::newGroupSkip + _comments.height() + _aboutComments.countHeight(_aboutPublicWidth)*/ + st::newGroupSkip + st::newGroupPadding.bottom() + st::newGroupLinkPadding.top() + _link.height() + st::newGroupLinkPadding.bottom() + _save.height()); connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); connect(&_skip, SIGNAL(clicked()), this, SLOT(onClose())); @@ -2430,7 +2343,7 @@ void SetupChannelBox::hideAll() { void SetupChannelBox::showAll() { _public.show(); _private.show(); -// _comments.show(); + //_comments.show(); if (_public.checked()) { _link.show(); } else { @@ -2449,7 +2362,7 @@ void SetupChannelBox::keyPressEvent(QKeyEvent *e) { if (_link.hasFocus()) { if (_link.text().trimmed().isEmpty()) { _link.setFocus(); - _link.notaBene(); + _link.showError(); } else { onSave(); } @@ -2465,67 +2378,57 @@ void SetupChannelBox::paintEvent(QPaintEvent *e) { p.setPen(st::newGroupAboutFg); - QRect aboutPublic = rtlrect(st::newGroupPadding.left() + st::rbDefFlat.textLeft, _public.y() + _public.height(), width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft, _aboutPublicHeight, width()); + QRect aboutPublic = myrtlrect(st::boxPadding.left() + st::newGroupPadding.left() + st::defaultRadiobutton.textPosition.x(), _public.y() + _public.height(), width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x(), _aboutPublicHeight); _aboutPublic.draw(p, aboutPublic.x(), aboutPublic.y(), aboutPublic.width()); - QRect aboutPrivate = rtlrect(st::newGroupPadding.left() + st::rbDefFlat.textLeft, _private.y() + _private.height(), width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft, _aboutPublicHeight, width()); + QRect aboutPrivate = myrtlrect(st::boxPadding.left() + st::newGroupPadding.left() + st::defaultRadiobutton.textPosition.x(), _private.y() + _private.height(), width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x(), _aboutPublicHeight); _aboutPrivate.draw(p, aboutPrivate.x(), aboutPrivate.y(), aboutPrivate.width()); -// QRect aboutComments = rtlrect(st::newGroupPadding.left() + st::rbDefFlat.textLeft, _comments.y() + _comments.height(), width() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::rbDefFlat.textLeft, _aboutPublicHeight, width()); -// _aboutComments.draw(p, aboutComments.x(), aboutComments.y(), aboutComments.width()); + //QRect aboutComments = myrtlrect(st::boxPadding.left() + st::newGroupPadding.left() + st::defaultRadiobutton.textPosition.x(), _comments.y() + _comments.height(), width() - st::boxPadding.left() - st::boxPadding.right() - st::newGroupPadding.left() - st::newGroupPadding.right() - st::defaultRadiobutton.textPosition.x(), _aboutPublicHeight); + //_aboutComments.draw(p, aboutComments.x(), aboutComments.y(), aboutComments.width()); p.setPen(st::black); p.setFont(st::newGroupLinkFont); - p.drawTextLeft(st::newGroupPadding.left(), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop, width(), lang(_link.isHidden() ? lng_create_group_invite_link : lng_create_group_link)); + p.drawTextLeft(st::boxPadding.left() + st::newGroupPadding.left() + st::newGroupLink.textMargins.left(), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop, width(), lang(_link.isHidden() ? lng_create_group_invite_link : lng_create_group_link)); if (_link.isHidden()) { QTextOption option(style::al_left); option.setWrapMode(QTextOption::WrapAnywhere); - p.setFont(_linkOver ? st::newGroupLink.font->underline() : st::newGroupLink.font); + p.setFont(_linkOver ? st::boxTextFont->underline() : st::boxTextFont); p.setPen(st::btnDefLink.color); p.drawText(_invitationLink, _channel->invitationUrl, option); if (!_goodTextLink.isEmpty() && a_goodOpacity.current() > 0) { p.setOpacity(a_goodOpacity.current()); - p.setPen(st::setGoodColor->p); - p.setFont(st::setErrFont->f); - p.drawTextRight(st::newGroupPadding.right(), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop + st::newGroupLinkFont->ascent - st::setErrFont->ascent, width(), _goodTextLink); + p.setPen(st::setGoodColor); + p.setFont(st::boxTextFont); + p.drawTextRight(st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop + st::newGroupLinkFont->ascent - st::boxTextFont->ascent, width(), _goodTextLink); p.setOpacity(1); } } else { - p.setFont(st::newGroupLink.font); - p.setPen(st::newGroupLink.phColor); - p.drawText(QRect(_link.x() + st::newGroupLink.textMrg.left(), _link.y() + st::newGroupLink.textMrg.top(), _link.width(), _link.height() - st::newGroupLink.textMrg.top() - st::newGroupLink.textMrg.bottom()), _linkPlaceholder, style::al_left); - if (!_errorText.isEmpty()) { - p.setPen(st::setErrColor->p); - p.setFont(st::setErrFont->f); - p.drawTextRight(st::newGroupPadding.right(), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop + st::newGroupLinkFont->ascent - st::setErrFont->ascent, width(), _errorText); + p.setPen(st::setErrColor); + p.setFont(st::boxTextFont); + p.drawTextRight(st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop + st::newGroupLinkFont->ascent - st::boxTextFont->ascent, width(), _errorText); } else if (!_goodText.isEmpty()) { - p.setPen(st::setGoodColor->p); - p.setFont(st::setErrFont->f); - p.drawTextRight(st::newGroupPadding.right(), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop + st::newGroupLinkFont->ascent - st::setErrFont->ascent, width(), _goodText); + p.setPen(st::setGoodColor); + p.setFont(st::boxTextFont); + p.drawTextRight(st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2), _link.y() - st::newGroupLinkPadding.top() + st::newGroupLinkTop + st::newGroupLinkFont->ascent - st::boxTextFont->ascent, width(), _goodText); } } - - // paint shadow - p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::btnSelectCancel.width, height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); } void SetupChannelBox::resizeEvent(QResizeEvent *e) { - _public.moveToLeft(st::newGroupPadding.left(), st::newGroupPadding.top(), width()); - _private.moveToLeft(st::newGroupPadding.left(), _public.y() + _public.height() + _aboutPublicHeight + st::newGroupSkip, width()); -// _comments.moveToLeft(st::newGroupPadding.left(), _private.y() + _private.height() + _aboutPrivate.countHeight(_aboutPublicWidth) + st::newGroupSkip, width()); + _public.moveToLeft(st::boxPadding.left() + st::newGroupPadding.left(), st::boxPadding.top() + st::newGroupPadding.top()); + _private.moveToLeft(st::boxPadding.left() + st::newGroupPadding.left(), _public.y() + _public.height() + _aboutPublicHeight + st::newGroupSkip); + //_comments.moveToLeft(st::boxPadding.left() + st::newGroupPadding.left(), _private.y() + _private.height() + _aboutPrivate.countHeight(_aboutPublicWidth) + st::newGroupSkip); -// _link.setGeometry(st::newGroupLinkPadding.left(), _comments.y() + _comments.height() + _aboutComments.countHeight(_aboutPublicWidth) + st::newGroupPadding.bottom() + st::newGroupLinkPadding.top(), width() - st::newGroupPadding.left() - st::newGroupPadding.right(), _link.height()); - _link.setGeometry(st::newGroupLinkPadding.left(), _private.y() + _private.height() + _aboutPrivate.countHeight(_aboutPublicWidth) + st::newGroupPadding.bottom() + st::newGroupLinkPadding.top(), width() - st::newGroupPadding.left() - st::newGroupPadding.right(), _link.height()); - _invitationLink = QRect(_link.x(), _link.y() + (_link.height() / 2) - st::newGroupLinkFont->height, _link.width(), 2 * st::newGroupLinkFont->height); + _link.resize(width() - st::boxPadding.left() - st::newGroupLinkPadding.left() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)), _link.height()); + //_link.moveToLeft(st::boxPadding.left() + st::newGroupLinkPadding.left(), _comments.y() + _comments.height() + _aboutComments.countHeight(_aboutPublicWidth) + st::newGroupSkip + st::newGroupPadding.bottom() + st::newGroupLinkPadding.top()); + _link.moveToLeft(st::boxPadding.left() + st::newGroupLinkPadding.left(), _private.y() + _private.height() + _aboutPrivate.countHeight(_aboutPublicWidth) + st::newGroupSkip + st::newGroupPadding.bottom() + st::newGroupLinkPadding.top()); + _invitationLink = QRect(_link.x(), _link.y() + (_link.height() / 2) - st::boxTextFont->height, _link.width(), 2 * st::boxTextFont->height); - int32 buttonTop = _link.y() + _link.height() + st::newGroupLinkPadding.bottom(); - _skip.moveToLeft(0, buttonTop, width()); - _save.moveToRight(0, buttonTop, width()); + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _skip.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); } void SetupChannelBox::mouseMoveEvent(QMouseEvent *e) { @@ -2538,7 +2441,7 @@ void SetupChannelBox::mousePressEvent(QMouseEvent *e) { App::app()->clipboard()->setText(_channel->invitationUrl); _goodTextLink = lang(lng_create_channel_link_copied); a_goodOpacity = anim::fvalue(1, 0); - a_good.start(); + _a_goodFade.start(); } } @@ -2557,7 +2460,7 @@ void SetupChannelBox::updateSelected(const QPoint &cursorGlobalPosition) { } } -bool SetupChannelBox::goodAnimStep(float64 ms) { +bool SetupChannelBox::animStep_goodFade(float64 ms) { float dt = ms / st::newGroupLinkFadeDuration; bool res = true; if (dt >= 1) { @@ -2594,7 +2497,7 @@ void SetupChannelBox::onSave() { QString link = _link.text().trimmed(); if (link.isEmpty()) { _link.setFocus(); - _link.notaBene(); + _link.showError(); return; } @@ -2617,7 +2520,7 @@ void SetupChannelBox::onChange() { int32 i, len = name.size(); for (int32 i = 0; i < len; ++i) { QChar ch = name.at(i); - if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z') && (ch < '0' || ch > '9') && ch != '_' && (ch != '@' || i > 0)) { + if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z') && (ch < '0' || ch > '9') && ch != '_') { if (_errorText != lang(lng_create_channel_link_bad_symbols)) { _errorText = lang(lng_create_channel_link_bad_symbols); update(); @@ -2675,7 +2578,7 @@ void SetupChannelBox::onUpdateDone(const MTPBool &result) { } bool SetupChannelBox::onUpdateFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _saveRequestId = 0; QString err(error.type()); @@ -2685,13 +2588,13 @@ bool SetupChannelBox::onUpdateFail(const RPCError &error) { return true; } else if (err == "USERNAME_INVALID") { _link.setFocus(); - _link.notaBene(); + _link.showError(); _errorText = lang(lng_create_channel_link_invalid); update(); return true; } else if (err == "USERNAME_OCCUPIED" || err == "USERNAMES_UNAVAILABLE") { _link.setFocus(); - _link.notaBene(); + _link.showError(); _errorText = lang(lng_create_channel_link_occupied); update(); return true; @@ -2712,7 +2615,7 @@ void SetupChannelBox::onCheckDone(const MTPBool &result) { } bool SetupChannelBox::onCheckFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _checkRequestId = 0; QString err(error.type()); @@ -2740,7 +2643,7 @@ bool SetupChannelBox::onCheckFail(const RPCError &error) { } bool SetupChannelBox::onFirstCheckFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _checkRequestId = 0; QString err(error.type()); diff --git a/Telegram/SourceFiles/boxes/contactsbox.h b/Telegram/SourceFiles/boxes/contactsbox.h index 67a7ce5d9..b198e956f 100644 --- a/Telegram/SourceFiles/boxes/contactsbox.h +++ b/Telegram/SourceFiles/boxes/contactsbox.h @@ -418,10 +418,10 @@ protected: private: - FlatRadiobutton _group, _channel; + Radiobutton _group, _channel; int32 _aboutGroupWidth, _aboutGroupHeight; Text _aboutGroup, _aboutChannel; - FlatButton _next, _cancel; + BoxButton _next, _cancel; }; @@ -431,20 +431,16 @@ class GroupInfoBox : public AbstractBox, public RPCSender { public: GroupInfoBox(CreatingGroupType creating, bool fromTypeChoose); - void keyPressEvent(QKeyEvent *e); void paintEvent(QPaintEvent *e); void resizeEvent(QResizeEvent *e); void mouseMoveEvent(QMouseEvent *e); void mousePressEvent(QMouseEvent *e); void leaveEvent(QEvent *e); - bool eventFilter(QObject *obj, QEvent *e); - - bool descriptionAnimStep(float64 ms); - bool photoAnimStep(float64 ms); + bool animStep_photoOver(float64 ms); void setInnerFocus() { - _name.setFocus(); + _title.setFocus(); } public slots: @@ -453,6 +449,7 @@ public slots: void onPhotoReady(const QImage &img); void onNext(); + void onNameSubmit(); void onDescriptionResized(); protected: @@ -463,7 +460,6 @@ protected: private: - QRect descriptionRect() const; QRect photoRect() const; void updateMaxHeight(); @@ -471,18 +467,15 @@ private: CreatingGroupType _creating; anim::fvalue a_photoOver; - Animation a_photo; - bool _photoOver, _descriptionOver; + Animation _a_photoOver; + bool _photoOver; - anim::cvalue a_descriptionBg, a_descriptionBorder; - Animation a_description; + InputField _title; + InputArea _description; - FlatInput _name; - FlatButton _photo; - FlatTextarea _description; QImage _photoBig; QPixmap _photoSmall; - FlatButton _next, _cancel; + BoxButton _next, _cancel; // channel creation int32 _creationRequestId; @@ -533,20 +526,7 @@ protected: private: void updateSelected(const QPoint &cursorGlobalPosition); - bool goodAnimStep(float64 ms); - - ChannelData *_channel; - bool _existing; - - FlatRadiobutton _public, _private; - FlatCheckbox _comments; - int32 _aboutPublicWidth, _aboutPublicHeight; - Text _aboutPublic, _aboutPrivate, _aboutComments; - QString _linkPlaceholder; - UsernameInput _link; - QRect _invitationLink; - bool _linkOver; - FlatButton _save, _skip; + bool animStep_goodFade(float64 ms); void onUpdateDone(const MTPBool &result); bool onUpdateFail(const RPCError &error); @@ -555,6 +535,18 @@ private: bool onCheckFail(const RPCError &error); bool onFirstCheckFail(const RPCError &error); + ChannelData *_channel; + bool _existing; + + Radiobutton _public, _private; + Checkbox _comments; + int32 _aboutPublicWidth, _aboutPublicHeight; + Text _aboutPublic, _aboutPrivate, _aboutComments; + UsernameInput _link; + QRect _invitationLink; + bool _linkOver; + BoxButton _save, _skip; + bool _tooMuchUsernames; mtpRequestId _saveRequestId, _checkRequestId; @@ -562,7 +554,7 @@ private: QString _goodTextLink; anim::fvalue a_goodOpacity; - Animation a_good; + Animation _a_goodFade; QTimer _checkTimer; }; diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.cpp b/Telegram/SourceFiles/boxes/downloadpathbox.cpp index bbbf26de1..3dc30241e 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.cpp +++ b/Telegram/SourceFiles/boxes/downloadpathbox.cpp @@ -28,54 +28,55 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org DownloadPathBox::DownloadPathBox() : _path(cDownloadPath()), - _defaultRadio(this, qsl("dir_type"), 0, lang(lng_download_path_default_radio), _path.isEmpty()), - _tempRadio(this, qsl("dir_type"), 1, lang(lng_download_path_temp_radio), _path == qsl("tmp")), - _dirRadio(this, qsl("dir_type"), 2, lang(lng_download_path_dir_radio), !_path.isEmpty() && _path != qsl("tmp")), - _dirInput(this, st::inpDownloadDir, QString(), (_path.isEmpty() || _path == qsl("tmp")) ? QString() : QDir::toNativeSeparators(_path)), - _saveButton(this, lang(lng_connection_save), st::btnSelectDone), - _cancelButton(this, lang(lng_cancel), st::btnSelectCancel) { + _default(this, qsl("dir_type"), 0, lang(lng_download_path_default_radio), _path.isEmpty()), + _temp(this, qsl("dir_type"), 1, lang(lng_download_path_temp_radio), _path == qsl("tmp")), + _dir(this, qsl("dir_type"), 2, lang(lng_download_path_dir_radio), !_path.isEmpty() && _path != qsl("tmp")), + _pathLink(this, QString(), st::defaultBoxLinkButton), + _save(this, lang(lng_connection_save), st::defaultBoxButton), + _cancel(this, lang(lng_box_cancel), st::cancelBoxButton) { - connect(&_saveButton, SIGNAL(clicked()), this, SLOT(onSave())); - connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); - connect(&_defaultRadio, SIGNAL(changed()), this, SLOT(onChange())); - connect(&_tempRadio, SIGNAL(changed()), this, SLOT(onChange())); - connect(&_dirRadio, SIGNAL(changed()), this, SLOT(onChange())); - - connect(&_dirInput, SIGNAL(focused()), this, SLOT(onEditPath())); - _dirInput.setCursorPosition(0); + connect(&_default, SIGNAL(changed()), this, SLOT(onChange())); + connect(&_temp, SIGNAL(changed()), this, SLOT(onChange())); + connect(&_dir, SIGNAL(changed()), this, SLOT(onChange())); + connect(&_pathLink, SIGNAL(clicked()), this, SLOT(onEditPath())); + if (!_path.isEmpty() && _path != qsl("tmp")) { + setPathText(QDir::toNativeSeparators(_path)); + } prepare(); } void DownloadPathBox::hideAll() { - _defaultRadio.hide(); - _tempRadio.hide(); - _dirRadio.hide(); + _default.hide(); + _temp.hide(); + _dir.hide(); - _dirInput.hide(); + _pathLink.hide(); - _saveButton.hide(); - _cancelButton.hide(); + _save.hide(); + _cancel.hide(); } void DownloadPathBox::showAll() { - _defaultRadio.show(); - _tempRadio.show(); - _dirRadio.show(); + _default.show(); + _temp.show(); + _dir.show(); - if (_dirRadio.checked()) { - _dirInput.show(); + if (_dir.checked()) { + _pathLink.show(); } else { - _dirInput.hide(); + _pathLink.hide(); } - _saveButton.show(); - _cancelButton.show(); + _save.show(); + _cancel.show(); - int32 h = st::old_boxTitleHeight + st::downloadSkip + _defaultRadio.height() + st::downloadSkip + _tempRadio.height() + st::downloadSkip + _dirRadio.height(); - if (_dirRadio.checked()) h += st::boxPadding.top() + _dirInput.height(); - h += st::downloadSkip + _saveButton.height(); + int32 h = st::boxTitleHeight + st::boxOptionListPadding.top() + _default.height() + st::boxOptionListPadding.top() + _temp.height() + st::boxOptionListPadding.top() + _dir.height(); + if (_dir.checked()) h += st::downloadPathSkip + _pathLink.height(); + h += st::boxOptionListPadding.bottom() + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom(); setMaxHeight(h); } @@ -84,42 +85,34 @@ void DownloadPathBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_download_path_header), true); - - // paint shadows - p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::btnSelectCancel.width, height() - st::btnSelectCancel.height, st::lineWidth, st::btnSelectCancel.height, st::btnSelectSep->b); + paintTitle(p, lang(lng_download_path_header)); } void DownloadPathBox::resizeEvent(QResizeEvent *e) { - _defaultRadio.move(st::boxPadding.left(), st::old_boxTitleHeight + st::downloadSkip); - _tempRadio.move(st::boxPadding.left(), _defaultRadio.y() + _defaultRadio.height() + st::downloadSkip); - _dirRadio.move(st::boxPadding.left(), _tempRadio.y() + _tempRadio.height() + st::downloadSkip); - int32 inputy = _dirRadio.y() + _dirRadio.height() + st::boxPadding.top(); + _default.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), st::boxTitleHeight + st::boxOptionListPadding.top()); + _temp.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), _default.y() + _default.height() + st::boxOptionListPadding.top()); + _dir.moveToLeft(st::boxPadding.left() + st::boxOptionListPadding.left(), _temp.y() + _temp.height() + st::boxOptionListPadding.top()); + int32 inputx = st::boxPadding.left() + st::boxOptionListPadding.left() + st::defaultRadiobutton.textPosition.x(); + int32 inputy = _dir.y() + _dir.height() + st::downloadPathSkip; - _dirInput.move(st::boxPadding.left() + st::rbDefFlat.textLeft, inputy); + _pathLink.moveToLeft(inputx, inputy); - int32 buttony = (_dirRadio.checked() ? (_dirInput.y() + _dirInput.height()) : (_dirRadio.y() + _dirRadio.height())) + st::downloadSkip; - - _saveButton.move(width() - _saveButton.width(), buttony); - _cancelButton.move(0, buttony); + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); } void DownloadPathBox::onChange() { - if (_dirRadio.checked()) { + if (_dir.checked()) { if (_path.isEmpty() || _path == qsl("tmp")) { - (_path.isEmpty() ? _defaultRadio : _tempRadio).setChecked(true); + (_path.isEmpty() ? _default : _temp).setChecked(true); onEditPath(); if (!_path.isEmpty() && _path != qsl("tmp")) { - _dirRadio.setChecked(true); + _dir.setChecked(true); } } else { - _dirInput.setText(QDir::toNativeSeparators(_path)); - _dirInput.setCursorPosition(0); + setPathText(QDir::toNativeSeparators(_path)); } - } else if (_tempRadio.checked()) { + } else if (_temp.checked()) { _path = qsl("tmp"); } else { _path = QString(); @@ -129,8 +122,6 @@ void DownloadPathBox::onChange() { } void DownloadPathBox::onEditPath() { - _dirInput.clearFocus(); - filedialogInit(); QString path, lastPath = cDialogLastPath(); if (!cDownloadPath().isEmpty()) { @@ -139,15 +130,19 @@ void DownloadPathBox::onEditPath() { if (filedialogGetDir(path, lang(lng_download_path_choose))) { if (!path.isEmpty()) { _path = path + '/'; - _dirInput.setText(QDir::toNativeSeparators(_path)); - _dirInput.setCursorPosition(0); + setPathText(QDir::toNativeSeparators(_path)); } } cSetDialogLastPath(lastPath); } void DownloadPathBox::onSave() { - cSetDownloadPath(_defaultRadio.checked() ? QString() : (_tempRadio.checked() ? qsl("tmp") : _path)); + cSetDownloadPath(_default.checked() ? QString() : (_temp.checked() ? qsl("tmp") : _path)); Local::writeUserSettings(); emit closed(); } + +void DownloadPathBox::setPathText(const QString &text) { + int32 availw = st::boxWideWidth - st::boxPadding.left() - st::defaultRadiobutton.textPosition.x() - (st::boxButtonPadding.right() - (st::defaultBoxButton.width / 2)); + _pathLink.setText(st::boxTextFont->elided(text, availw)); +} diff --git a/Telegram/SourceFiles/boxes/downloadpathbox.h b/Telegram/SourceFiles/boxes/downloadpathbox.h index cb09f7016..2b0432f24 100644 --- a/Telegram/SourceFiles/boxes/downloadpathbox.h +++ b/Telegram/SourceFiles/boxes/downloadpathbox.h @@ -44,9 +44,11 @@ protected: private: + void setPathText(const QString &text); + QString _path; - FlatRadiobutton _defaultRadio, _tempRadio, _dirRadio; - FlatInput _dirInput; - FlatButton _saveButton, _cancelButton; + Radiobutton _default, _temp, _dir; + LinkButton _pathLink; + BoxButton _save, _cancel; }; diff --git a/Telegram/SourceFiles/boxes/emojibox.cpp b/Telegram/SourceFiles/boxes/emojibox.cpp index 50cfa112a..106d38944 100644 --- a/Telegram/SourceFiles/boxes/emojibox.cpp +++ b/Telegram/SourceFiles/boxes/emojibox.cpp @@ -142,7 +142,7 @@ void EmojiBox::paintEvent(QPaintEvent *e) { int32 rowSize = i->size(), left = (width() - rowSize * st::emojiReplaceWidth) / 2; for (BlockRow::const_iterator j = i->cbegin(), en = i->cend(); j != en; ++j) { if (j->emoji) { - p.drawPixmap(QPoint(left + (st::emojiReplaceWidth - _esize) / 2, top + (st::emojiReplaceHeight - _blockHeight) / 2), App::emojisLarge(), QRect(j->emoji->x * _esize, j->emoji->y * _esize, _esize, _esize)); + p.drawPixmap(QPoint(left + (st::emojiReplaceWidth - _esize) / 2, top + (st::emojiReplaceHeight - _blockHeight) / 2), App::emojiLarge(), QRect(j->emoji->x * _esize, j->emoji->y * _esize, _esize, _esize)); } QRect trect(left, top + (st::emojiReplaceHeight + _blockHeight) / 2 - st::emojiTextFont->height, st::emojiReplaceWidth, st::emojiTextFont->height); p.drawText(trect, j->text, QTextOption(Qt::AlignHCenter | Qt::AlignTop)); diff --git a/Telegram/SourceFiles/boxes/languagebox.cpp b/Telegram/SourceFiles/boxes/languagebox.cpp index 238a40aa5..a9918515f 100644 --- a/Telegram/SourceFiles/boxes/languagebox.cpp +++ b/Telegram/SourceFiles/boxes/languagebox.cpp @@ -31,16 +31,16 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "langloaderplain.h" LanguageBox::LanguageBox() : -_done(this, lang(lng_about_done), st::langsCloseButton) { +_close(this, lang(lng_box_ok), st::defaultBoxButton) { bool haveTestLang = (cLang() == languageTest); - int32 y = st::old_boxTitleHeight + st::langsPadding.top(); + int32 y = st::boxTitleHeight + st::boxOptionListPadding.top(); _langs.reserve(languageCount + (haveTestLang ? 1 : 0)); if (haveTestLang) { - _langs.push_back(new FlatRadiobutton(this, qsl("lang"), languageTest, qsl("Custom Lang"), (cLang() == languageTest), st::langButton)); - _langs.back()->move(st::langsPadding.left() + st::langPadding.left(), y + st::langPadding.top()); - y += st::langPadding.top() + _langs.back()->height() + st::langPadding.bottom(); + _langs.push_back(new Radiobutton(this, qsl("lang"), languageTest, qsl("Custom Lang"), (cLang() == languageTest), st::langsButton)); + _langs.back()->move(st::boxPadding.left() + st::boxOptionListPadding.left(), y); + y += _langs.back()->height() + st::boxOptionListPadding.top(); connect(_langs.back(), SIGNAL(changed()), this, SLOT(onChange())); } for (int32 i = 0; i < languageCount; ++i) { @@ -51,28 +51,29 @@ _done(this, lang(lng_about_done), st::langsCloseButton) { } else { result.insert(lng_language_name, langOriginal(lng_language_name)); } - _langs.push_back(new FlatRadiobutton(this, qsl("lang"), i, result.value(lng_language_name, LanguageCodes[i] + qsl(" language")), (cLang() == i), st::langButton)); - _langs.back()->move(st::langsPadding.left() + st::langPadding.left(), y + st::langPadding.top()); - y += st::langPadding.top() + _langs.back()->height() + st::langPadding.bottom(); + _langs.push_back(new Radiobutton(this, qsl("lang"), i, result.value(lng_language_name, LanguageCodes[i] + qsl(" language")), (cLang() == i), st::langsButton)); + _langs.back()->move(st::boxPadding.left() + st::boxOptionListPadding.left(), y); + y += _langs.back()->height() + st::boxOptionListPadding.top(); connect(_langs.back(), SIGNAL(changed()), this, SLOT(onChange())); } - resizeMaxHeight(st::langsWidth, st::old_boxTitleHeight + st::langsPadding.top() + st::langsPadding.bottom() + (languageCount + (haveTestLang ? 1 : 0)) * (st::langPadding.top() + st::rbDefFlat.height + st::langPadding.bottom()) + _done.height()); + resizeMaxHeight(st::langsWidth, st::boxTitleHeight + (languageCount + (haveTestLang ? 1 : 0)) * (st::boxOptionListPadding.top() + st::langsButton.height) + st::boxOptionListPadding.bottom() + st::boxPadding.bottom() + st::boxButtonPadding.top() + _close.height() + st::boxButtonPadding.bottom()); - connect(&_done, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_close, SIGNAL(clicked()), this, SLOT(onClose())); + _close.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _close.height()); prepare(); } void LanguageBox::hideAll() { - _done.hide(); + _close.hide(); for (int32 i = 0, l = _langs.size(); i < l; ++i) { _langs[i]->hide(); } } void LanguageBox::showAll() { - _done.show(); + _close.show(); for (int32 i = 0, l = _langs.size(); i < l; ++i) { _langs[i]->show(); } @@ -100,11 +101,7 @@ void LanguageBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_languages), true); -} - -void LanguageBox::resizeEvent(QResizeEvent *e) { - _done.move(0, height() - _done.height()); + paintTitle(p, lang(lng_languages)); } void LanguageBox::onChange() { diff --git a/Telegram/SourceFiles/boxes/languagebox.h b/Telegram/SourceFiles/boxes/languagebox.h index aeb08bb45..ce37f417c 100644 --- a/Telegram/SourceFiles/boxes/languagebox.h +++ b/Telegram/SourceFiles/boxes/languagebox.h @@ -30,7 +30,6 @@ public: LanguageBox(); void mousePressEvent(QMouseEvent *e); void paintEvent(QPaintEvent *e); - void resizeEvent(QResizeEvent *e); ~LanguageBox(); public slots: @@ -46,6 +45,6 @@ protected: private: - QVector _langs; - BottomButton _done; + QVector _langs; + BoxButton _close; }; diff --git a/Telegram/SourceFiles/boxes/passcodebox.cpp b/Telegram/SourceFiles/boxes/passcodebox.cpp index b4d02dcde..6bba1adb8 100644 --- a/Telegram/SourceFiles/boxes/passcodebox.cpp +++ b/Telegram/SourceFiles/boxes/passcodebox.cpp @@ -58,8 +58,8 @@ _recover(this, lang(lng_signin_recover)) { } void PasscodeBox::init() { - _about.setRichText(st::usernameFont, lang(_cloudPwd ? lng_cloud_password_about : lng_passcode_about)); - if (!_hint.isEmpty()) _hintText.setText(st::usernameFont, lng_signin_hint(lt_password_hint, _hint)); + _about.setRichText(st::normalFont, lang(_cloudPwd ? lng_cloud_password_about : lng_passcode_about)); + if (!_hint.isEmpty()) _hintText.setText(st::normalFont, lng_signin_hint(lt_password_hint, _hint)); _aboutHeight = _about.countHeight(st::boxWideWidth - st::addContactPadding.left() - st::addContactPadding.right()); _oldPasscode.setEchoMode(QLineEdit::Password); _newPasscode.setEchoMode(QLineEdit::Password); @@ -73,11 +73,11 @@ void PasscodeBox::init() { if (has) { _oldPasscode.show(); _boxTitle = lang(_cloudPwd ? lng_cloud_password_change : lng_passcode_change); - setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 3 * _oldPasscode.height() + st::usernameSkip * 2 + 1 * st::addContactDelta + (_cloudPwd ? _passwordHint.height() + st::addContactDelta : 0) + _aboutHeight + (_hasRecovery ? ((st::usernameSkip + _recover.height()) / 2) : 0) + st::addContactPadding.bottom() + _saveButton.height()); + setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 3 * _oldPasscode.height() + st::usernameSkip * 2 + 1 * st::addContactSkip + (_cloudPwd ? _passwordHint.height() + st::addContactSkip : 0) + _aboutHeight + (_hasRecovery ? ((st::usernameSkip + _recover.height()) / 2) : 0) + st::addContactPadding.bottom() + _saveButton.height()); } else { _oldPasscode.hide(); _boxTitle = lang(_cloudPwd ? lng_cloud_password_create : lng_passcode_create); - setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 2 * _oldPasscode.height() + st::usernameSkip + 1 * st::addContactDelta + (_cloudPwd ? _passwordHint.height() + st::addContactDelta : 0) + _aboutHeight + (_cloudPwd ? st::addContactDelta + _recoverEmail.height() + st::usernameSkip : st::addContactPadding.bottom()) + _saveButton.height()); + setMaxHeight(st::old_boxTitleHeight + st::addContactPadding.top() + 2 * _oldPasscode.height() + st::usernameSkip + 1 * st::addContactSkip + (_cloudPwd ? _passwordHint.height() + st::addContactSkip : 0) + _aboutHeight + (_cloudPwd ? st::addContactSkip + _recoverEmail.height() + st::usernameSkip : st::addContactPadding.bottom()) + _saveButton.height()); } } @@ -187,19 +187,19 @@ void PasscodeBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, _boxTitle, true); + paintOldTitle(p, _boxTitle, true); // paint shadow p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); int32 w = width() - st::addContactPadding.left() - st::addContactPadding.right(); - int32 abouty = (_passwordHint.isHidden() ? (_reenterPasscode.isHidden() ? _oldPasscode : _reenterPasscode).y() + st::usernameSkip : _passwordHint.y() + st::addContactDelta) + _oldPasscode.height(); - p.setPen(st::usernameColor->p); + int32 abouty = (_passwordHint.isHidden() ? (_reenterPasscode.isHidden() ? _oldPasscode : _reenterPasscode).y() + st::usernameSkip : _passwordHint.y() + st::addContactSkip) + _oldPasscode.height(); + p.setPen(st::black); _about.draw(p, st::addContactPadding.left(), abouty, w); if (!_hint.isEmpty() && _oldError.isEmpty()) { p.setPen(st::black->p); - _hintText.drawElided(p, st::addContactPadding.left(), _oldPasscode.y() + _oldPasscode.height() + ((st::usernameSkip - st::usernameFont->height) / 2), w, 1, style::al_top); + _hintText.drawElided(p, st::addContactPadding.left(), _oldPasscode.y() + _oldPasscode.height() + ((st::usernameSkip - st::normalFont->height) / 2), w, 1, style::al_top); } if (!_oldError.isEmpty()) { @@ -225,16 +225,16 @@ void PasscodeBox::resizeEvent(QResizeEvent *e) { bool has = _cloudPwd ? (!_curSalt.isEmpty()) : cHasPasscode(); _oldPasscode.setGeometry(st::addContactPadding.left(), st::old_boxTitleHeight + st::addContactPadding.top(), width() - st::addContactPadding.left() - st::addContactPadding.right(), _oldPasscode.height()); _newPasscode.setGeometry(st::addContactPadding.left(), _oldPasscode.y() + ((_turningOff || has) ? (_oldPasscode.height() + st::usernameSkip) : 0), _oldPasscode.width(), _oldPasscode.height()); - _reenterPasscode.setGeometry(st::addContactPadding.left(), _newPasscode.y() + _newPasscode.height() + st::addContactDelta, _newPasscode.width(), _newPasscode.height()); + _reenterPasscode.setGeometry(st::addContactPadding.left(), _newPasscode.y() + _newPasscode.height() + st::addContactSkip, _newPasscode.width(), _newPasscode.height()); _passwordHint.setGeometry(st::addContactPadding.left(), _reenterPasscode.y() + _reenterPasscode.height() + st::usernameSkip, _reenterPasscode.width(), _reenterPasscode.height()); - _recoverEmail.setGeometry(st::addContactPadding.left(), _passwordHint.y() + _passwordHint.height() + st::addContactDelta + _aboutHeight + st::addContactDelta, _passwordHint.width(), _passwordHint.height()); + _recoverEmail.setGeometry(st::addContactPadding.left(), _passwordHint.y() + _passwordHint.height() + st::addContactSkip + _aboutHeight + st::addContactSkip, _passwordHint.width(), _passwordHint.height()); if (!_recover.isHidden()) { if (_turningOff) { _recover.move((width() - _recover.width()) / 2, _oldPasscode.y() + _oldPasscode.height() + st::usernameSkip + _aboutHeight + ((st::usernameSkip - _recover.height()) / 2)); } else { - _recover.move((width() - _recover.width()) / 2, _passwordHint.y() + _passwordHint.height() + st::addContactDelta + _aboutHeight + ((st::usernameSkip - _recover.height()) / 2)); + _recover.move((width() - _recover.width()) / 2, _passwordHint.y() + _passwordHint.height() + st::addContactSkip + _aboutHeight + ((st::usernameSkip - _recover.height()) / 2)); } } @@ -288,7 +288,7 @@ bool PasscodeBox::setPasswordFail(const RPCError &error) { } else if (err == "EMAIL_UNCONFIRMED") { App::wnd()->showLayer(new InformBox(lang(lng_cloud_password_almost))); emit reloadPassword(); - } else if (error.type().startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { if (_oldPasscode.isHidden()) return false; _oldPasscode.selectAll(); @@ -457,7 +457,7 @@ void PasscodeBox::recoverStarted(const MTPauth_PasswordRecovery &result) { } bool PasscodeBox::recoverStartFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _pattern = QString(); onClose(); @@ -465,7 +465,7 @@ bool PasscodeBox::recoverStartFail(const RPCError &error) { } RecoverBox::RecoverBox(const QString &pattern) : -_submitRequest(0), _pattern(st::usernameFont->elided(lng_signin_recover_hint(lt_recover_email, pattern), st::boxWideWidth - st::addContactPadding.left() - st::addContactPadding.right())), +_submitRequest(0), _pattern(st::normalFont->elided(lng_signin_recover_hint(lt_recover_email, pattern), st::boxWideWidth - st::addContactPadding.left() - st::addContactPadding.right())), _saveButton(this, lang(lng_passcode_submit), st::btnSelectDone), _cancelButton(this, lang(lng_cancel), st::btnSelectCancel), _recoverCode(this, st::inpAddContact, lang(lng_signin_code)) { @@ -508,12 +508,12 @@ void RecoverBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_signin_recover), true); + paintOldTitle(p, lang(lng_signin_recover), true); // paint shadow p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - p.setFont(st::usernameFont->f); + p.setFont(st::normalFont->f); int32 w = width() - st::addContactPadding.left() - st::addContactPadding.right(); p.drawText(QRect(st::addContactPadding.left(), _recoverCode.y() - st::usernameSkip - st::addContactPadding.top(), w, st::addContactPadding.top() + st::usernameSkip), _pattern, style::al_center); @@ -582,7 +582,7 @@ bool RecoverBox::codeSubmitFail(const RPCError &error) { update(); _recoverCode.notaBene(); return true; - } else if (error.type().startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { _error = lang(lng_flood_error); update(); _recoverCode.notaBene(); diff --git a/Telegram/SourceFiles/boxes/sessionsbox.cpp b/Telegram/SourceFiles/boxes/sessionsbox.cpp index 896857501..ed7a9c3c8 100644 --- a/Telegram/SourceFiles/boxes/sessionsbox.cpp +++ b/Telegram/SourceFiles/boxes/sessionsbox.cpp @@ -109,7 +109,7 @@ void SessionsInner::terminateDone(uint64 hash, const MTPBool &result) { } bool SessionsInner::terminateFail(uint64 hash, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; TerminateButtons::iterator i = _terminateButtons.find(hash); if (i != _terminateButtons.end()) { @@ -176,7 +176,7 @@ _terminateAll(this, lang(lng_sessions_terminate_all)), _terminateBox(0), _shortP void SessionsBox::resizeEvent(QResizeEvent *e) { ScrollableBox::resizeEvent(e); _done.move(0, height() - _done.height()); - _terminateAll.moveToRight(st::sessionPadding.left(), st::old_boxTitleHeight + st::sessionHeight + st::old_boxTitlePos.y() + st::old_boxTitleFont->ascent - st::linkFont->ascent, width()); + _terminateAll.moveToRight(st::sessionPadding.left(), st::old_boxTitleHeight + st::sessionHeight + st::old_boxTitlePos.y() + st::old_boxTitleFont->ascent - st::linkFont->ascent); } void SessionsBox::hideAll() { @@ -204,7 +204,7 @@ void SessionsBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_sessions_header), true); + paintOldTitle(p, lang(lng_sessions_header), true); p.translate(0, st::old_boxTitleHeight); if (_loading) { @@ -230,7 +230,7 @@ void SessionsBox::paintEvent(QPaintEvent *e) { p.drawTextLeft(x, st::sessionPadding.top() + st::sessionNameFont->height + st::sessionInfoFont->height, w, _current.ip, _current.ipWidth); p.translate(0, st::sessionHeight); if (_list.isEmpty()) { - paintTitle(p, lang(lng_sessions_no_other), true); + paintOldTitle(p, lang(lng_sessions_no_other), true); p.setFont(st::sessionInfoFont->f); p.setPen(st::sessionInfoColor->p); @@ -239,7 +239,7 @@ void SessionsBox::paintEvent(QPaintEvent *e) { // paint shadow p.fillRect(0, height() - st::sessionsCloseButton.height - st::scrollDef.bottomsh - st::sessionHeight - st::old_boxTitleHeight, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); } else { - paintTitle(p, lang(lng_sessions_other_header), false); + paintOldTitle(p, lang(lng_sessions_other_header), false); } } } @@ -418,7 +418,7 @@ void SessionsBox::terminateAllDone(const MTPBool &result) { } bool SessionsBox::terminateAllFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; MTP::send(MTPaccount_GetAuthorizations(), rpcDone(&SessionsBox::gotAuthorizations)); if (_shortPollRequest) { diff --git a/Telegram/SourceFiles/boxes/stickersetbox.cpp b/Telegram/SourceFiles/boxes/stickersetbox.cpp index f893d801f..4fecc0143 100644 --- a/Telegram/SourceFiles/boxes/stickersetbox.cpp +++ b/Telegram/SourceFiles/boxes/stickersetbox.cpp @@ -86,7 +86,7 @@ void StickerSetInner::gotSet(const MTPmessages_StickerSet &set) { } bool StickerSetInner::failedSet(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; _loaded = true; @@ -135,7 +135,7 @@ void StickerSetInner::installDone(const MTPBool &result) { } bool StickerSetInner::installFailed(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; App::wnd()->showLayer(new InformBox(lang(lng_stickers_not_found))); @@ -234,7 +234,7 @@ _closeStickers(this, lang(lng_close), st::btnStickersAdd) { setMaxHeight(st::stickersMaxHeight); connect(App::main(), SIGNAL(stickersUpdated()), this, SLOT(onStickersUpdated())); - init(&_inner, 0, st::boxFont->height + st::newGroupNamePadding.top() + st::newGroupNamePadding.bottom()); + init(&_inner, 0, st::boxFont->height + st::old_newGroupNamePadding.top() + st::old_newGroupNamePadding.bottom()); connect(&_close, SIGNAL(clicked()), this, SLOT(onClose())); connect(&_addStickers, SIGNAL(clicked()), this, SLOT(onAddStickers())); @@ -315,13 +315,13 @@ void StickerSetBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, _inner.title(), false); + paintOldTitle(p, _inner.title(), false); } void StickerSetBox::resizeEvent(QResizeEvent *e) { ScrollableBox::resizeEvent(e); _inner.resize(width(), _inner.height()); - _close.moveToRight(0, 0, width()); + _close.moveToRight(0, 0); _addStickers.move((width() - _addStickers.width()) / 2, height() - (st::stickersAddOrShare + _addStickers.height()) / 2); _shareStickers.move((width() - _shareStickers.width()) / 2, height() - (st::stickersAddOrShare + _shareStickers.height()) / 2); _closeStickers.move((width() - _closeStickers.width()) / 2, height() - (st::stickersAddOrShare + _closeStickers.height()) / 2); diff --git a/Telegram/SourceFiles/boxes/usernamebox.cpp b/Telegram/SourceFiles/boxes/usernamebox.cpp index 17f8e76f4..cc9eb064f 100644 --- a/Telegram/SourceFiles/boxes/usernamebox.cpp +++ b/Telegram/SourceFiles/boxes/usernamebox.cpp @@ -26,22 +26,26 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "mainwidget.h" #include "window.h" -UsernameBox::UsernameBox() : -_saveButton(this, lang(lng_settings_save), st::usernameDone), -_cancelButton(this, lang(lng_cancel), st::usernameCancel), -_usernameInput(this, st::inpAddContact, qsl("@username"), App::self()->username), -_saveRequest(0), _checkRequest(0), _about(st::usernameWidth - 2 * st::old_boxTitlePos.x()) { - _about.setRichText(st::usernameFont, lang(lng_username_about)); +UsernameBox::UsernameBox() : AbstractBox(st::boxWidth), +_save(this, lang(lng_settings_save), st::defaultBoxButton), +_cancel(this, lang(lng_box_cancel), st::cancelBoxButton), +_username(this, st::usernameField, qsl("@username"), App::self()->username, false), +_link(this, QString(), st::defaultBoxLinkButton), +_saveRequestId(0), _checkRequestId(0), +_about(st::boxWidth - st::usernamePadding.left()) { _goodText = App::self()->username.isEmpty() ? QString() : lang(lng_username_available); - initBox(); -} -void UsernameBox::initBox() { - resizeMaxHeight(st::usernameWidth, st::old_boxTitleHeight + st::addContactPadding.top() + _usernameInput.height() + st::addContactPadding.bottom() + _about.countHeight(st::usernameWidth - 2 * st::old_boxTitlePos.x()) + st::usernameSkip + _saveButton.height()); + textstyleSet(&st::usernameTextStyle); + _about.setRichText(st::boxTextFont, lang(lng_username_about)); + resizeMaxHeight(st::boxWidth, st::boxBlueTitleHeight + st::usernamePadding.top() + _username.height() + st::usernameSkip + _about.countHeight(st::boxWidth - st::usernamePadding.left() - st::usernamePadding.right()) + 3 * st::usernameTextStyle.lineHeight + st::usernamePadding.bottom() + st::boxButtonPadding.top() + _save.height() + st::boxButtonPadding.bottom()); + textstyleRestore(); - connect(&_saveButton, SIGNAL(clicked()), this, SLOT(onSave())); - connect(&_cancelButton, SIGNAL(clicked()), this, SLOT(onClose())); - connect(&_usernameInput, SIGNAL(changed()), this, SLOT(onChanged())); + connect(&_save, SIGNAL(clicked()), this, SLOT(onSave())); + connect(&_cancel, SIGNAL(clicked()), this, SLOT(onClose())); + connect(&_username, SIGNAL(changed()), this, SLOT(onChanged())); + connect(&_username, SIGNAL(submitted(bool)), this, SLOT(onSave())); + + connect(&_link, SIGNAL(clicked()), this, SLOT(onLinkClick())); _checkTimer.setSingleShot(true); connect(&_checkTimer, SIGNAL(timeout()), this, SLOT(onCheck())); @@ -50,87 +54,100 @@ void UsernameBox::initBox() { } void UsernameBox::hideAll() { - _usernameInput.hide(); - _saveButton.hide(); - _cancelButton.hide(); + _username.hide(); + _save.hide(); + _cancel.hide(); + _link.hide(); } void UsernameBox::showAll() { - _usernameInput.show(); - _saveButton.show(); - _cancelButton.show(); + _username.show(); + _save.show(); + _cancel.show(); + updateLinkText(); } void UsernameBox::showDone() { - _usernameInput.setFocus(); -} - -void UsernameBox::keyPressEvent(QKeyEvent *e) { - if (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return) { - onSave(); - } else { - AbstractBox::keyPressEvent(e); - } + _username.setFocus(); } void UsernameBox::paintEvent(QPaintEvent *e) { Painter p(this); if (paint(p)) return; - paintTitle(p, lang(lng_username_title), true); + paintBlueTitle(p, lang(lng_username_title)); - // paint shadow - p.fillRect(0, height() - st::btnSelectCancel.height - st::scrollDef.bottomsh, width(), st::scrollDef.bottomsh, st::scrollDef.shColor->b); - - // paint button sep - p.fillRect(st::usernameCancel.width, size().height() - st::usernameCancel.height, st::lineWidth, st::usernameCancel.height, st::btnSelectSep->b); - - if (!_errorText.isEmpty()) { - p.setPen(st::setErrColor->p); - p.setFont(st::setErrFont->f); - int32 w = st::setErrFont->width(_errorText); - p.drawText((width() - w) / 2, _usernameInput.y() + _usernameInput.height() + ((st::usernameSkip - st::setErrFont->height) / 2) + st::setErrFont->ascent, _errorText); + if (!_copiedTextLink.isEmpty()) { + p.setPen(st::usernameDefaultFg); + p.setFont(st::boxTextFont); + p.drawTextLeft(st::usernamePadding.left(), _username.y() + _username.height() + ((st::usernameSkip - st::boxTextFont->height) / 2), width(), _copiedTextLink); + } else if (!_errorText.isEmpty()) { + p.setPen(st::setErrColor); + p.setFont(st::boxTextFont); + p.drawTextLeft(st::usernamePadding.left(), _username.y() + _username.height() + ((st::usernameSkip - st::boxTextFont->height) / 2), width(), _errorText); } else if (!_goodText.isEmpty()) { - p.setPen(st::setGoodColor->p); - p.setFont(st::setErrFont->f); - int32 w = st::setErrFont->width(_goodText); - p.drawText((width() - w) / 2, _usernameInput.y() + _usernameInput.height() + ((st::usernameSkip - st::setErrFont->height) / 2) + st::setErrFont->ascent, _goodText); + p.setPen(st::setGoodColor); + p.setFont(st::boxTextFont); + p.drawTextLeft(st::usernamePadding.left(), _username.y() + _username.height() + ((st::usernameSkip - st::boxTextFont->height) / 2), width(), _goodText); + } else { + p.setPen(st::usernameDefaultFg); + p.setFont(st::boxTextFont); + p.drawTextLeft(st::usernamePadding.left(), _username.y() + _username.height() + ((st::usernameSkip - st::boxTextFont->height) / 2), width(), lang(lng_username_choose)); + } + p.setPen(st::black); + textstyleSet(&st::usernameTextStyle); + int32 availw = st::boxWidth - st::usernamePadding.left(), h = _about.countHeight(availw); + _about.draw(p, st::usernamePadding.left(), _username.y() + _username.height() + st::usernameSkip, availw); + textstyleRestore(); + + int32 linky = _username.y() + _username.height() + st::usernameSkip + h + st::usernameTextStyle.lineHeight + ((st::usernameTextStyle.lineHeight - st::boxTextFont->height) / 2); + if (_link.isHidden()) { + p.drawTextLeft(st::usernamePadding.left(), linky, width(), lang(lng_username_link_willbe)); + p.setPen(st::usernameDefaultFg); + p.drawTextLeft(st::usernamePadding.left(), linky + st::usernameTextStyle.lineHeight + ((st::usernameTextStyle.lineHeight - st::boxTextFont->height) / 2), width(), qsl("https://telegram.me/username")); + } else { + p.drawTextLeft(st::usernamePadding.left(), linky, width(), lang(lng_username_link)); } - p.setPen(st::usernameColor->p); - _about.draw(p, st::old_boxTitlePos.x(), _usernameInput.y() + _usernameInput.height() + st::usernameSkip, width() - 2 * st::old_boxTitlePos.x()); } void UsernameBox::resizeEvent(QResizeEvent *e) { - _usernameInput.setGeometry(st::addContactPadding.left(), st::old_boxTitleHeight + st::addContactPadding.top(), width() - st::addContactPadding.left() - st::addContactPadding.right(), _usernameInput.height()); + _username.resize(width() - st::usernamePadding.left() - st::usernamePadding.right(), _username.height()); + _username.moveToLeft(st::usernamePadding.left(), st::boxBlueTitleHeight + st::usernamePadding.top()); - int32 buttonTop = height() - _cancelButton.height(); - _cancelButton.move(0, buttonTop); - _saveButton.move(width() - _saveButton.width(), buttonTop); + textstyleSet(&st::usernameTextStyle); + int32 availw = st::boxWidth - st::usernamePadding.left(), h = _about.countHeight(availw); + textstyleRestore(); + int32 linky = _username.y() + _username.height() + st::usernameSkip + h + st::usernameTextStyle.lineHeight + ((st::usernameTextStyle.lineHeight - st::boxTextFont->height) / 2); + _link.moveToLeft(st::usernamePadding.left(), linky + st::usernameTextStyle.lineHeight + ((st::usernameTextStyle.lineHeight - st::boxTextFont->height) / 2)); + + _save.moveToRight(st::boxButtonPadding.right(), height() - st::boxButtonPadding.bottom() - _save.height()); + _cancel.moveToRight(st::boxButtonPadding.right() + _save.width() + st::boxButtonPadding.left(), _save.y()); } void UsernameBox::onSave() { - if (_saveRequest) return; + if (_saveRequestId) return; _sentUsername = getName(); - _saveRequest = MTP::send(MTPaccount_UpdateUsername(MTP_string(_sentUsername)), rpcDone(&UsernameBox::onUpdateDone), rpcFail(&UsernameBox::onUpdateFail)); + _saveRequestId = MTP::send(MTPaccount_UpdateUsername(MTP_string(_sentUsername)), rpcDone(&UsernameBox::onUpdateDone), rpcFail(&UsernameBox::onUpdateFail)); } void UsernameBox::onCheck() { - if (_checkRequest) { - MTP::cancel(_checkRequest); + if (_checkRequestId) { + MTP::cancel(_checkRequestId); } QString name = getName(); if (name.size() >= MinUsernameLength) { _checkUsername = name; - _checkRequest = MTP::send(MTPaccount_CheckUsername(MTP_string(name)), rpcDone(&UsernameBox::onCheckDone), rpcFail(&UsernameBox::onCheckFail)); + _checkRequestId = MTP::send(MTPaccount_CheckUsername(MTP_string(name)), rpcDone(&UsernameBox::onCheckDone), rpcFail(&UsernameBox::onCheckFail)); } } void UsernameBox::onChanged() { + updateLinkText(); QString name = getName(); if (name.isEmpty()) { if (!_errorText.isEmpty() || !_goodText.isEmpty()) { - _errorText = _goodText = QString(); + _copiedTextLink = _errorText = _goodText = QString(); update(); } _checkTimer.stop(); @@ -139,7 +156,8 @@ void UsernameBox::onChanged() { for (int32 i = 0; i < len; ++i) { QChar ch = name.at(i); if ((ch < 'A' || ch > 'Z') && (ch < 'a' || ch > 'z') && (ch < '0' || ch > '9') && ch != '_' && (ch != '@' || i > 0)) { - if (_errorText != lang(lng_username_bad_symbols)) { + if (_errorText != lang(lng_username_bad_symbols) || !_copiedTextLink.isEmpty()) { + _copiedTextLink = QString(); _errorText = lang(lng_username_bad_symbols); update(); } @@ -148,14 +166,15 @@ void UsernameBox::onChanged() { } } if (name.size() < MinUsernameLength) { - if (_errorText != lang(lng_username_too_short)) { + if (_errorText != lang(lng_username_too_short) || !_copiedTextLink.isEmpty()) { + _copiedTextLink = QString(); _errorText = lang(lng_username_too_short); update(); } _checkTimer.stop(); } else { - if (!_errorText.isEmpty() || !_goodText.isEmpty()) { - _errorText = _goodText = QString(); + if (!_errorText.isEmpty() || !_goodText.isEmpty() || !_copiedTextLink.isEmpty()) { + _copiedTextLink = _errorText = _goodText = QString(); update(); } _checkTimer.start(UsernameCheckTimeout); @@ -163,50 +182,61 @@ void UsernameBox::onChanged() { } } +void UsernameBox::onLinkClick() { + App::app()->clipboard()->setText(qsl("https://telegram.me/") + getName()); + _copiedTextLink = lang(lng_username_copied); + update(); +} + void UsernameBox::onUpdateDone(const MTPUser &user) { App::feedUsers(MTP_vector(1, user)); emit closed(); } bool UsernameBox::onUpdateFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; - _saveRequest = 0; + _saveRequestId = 0; QString err(error.type()); if (err == "USERNAME_NOT_MODIFIED" || _sentUsername == App::self()->username) { App::self()->setName(textOneLine(App::self()->firstName), textOneLine(App::self()->lastName), textOneLine(App::self()->nameOrPhone), textOneLine(_sentUsername)); emit closed(); return true; } else if (err == "USERNAME_INVALID") { - _usernameInput.setFocus(); - _usernameInput.notaBene(); + _username.setFocus(); + _username.showError(); + _copiedTextLink = QString(); _errorText = lang(lng_username_invalid); + update(); return true; } else if (err == "USERNAME_OCCUPIED" || err == "USERNAMES_UNAVAILABLE") { - _usernameInput.setFocus(); - _usernameInput.notaBene(); + _username.setFocus(); + _username.showError(); + _copiedTextLink = QString(); _errorText = lang(lng_username_occupied); + update(); return true; } - _usernameInput.setFocus(); + _username.setFocus(); return true; } void UsernameBox::onCheckDone(const MTPBool &result) { - _checkRequest = 0; + _checkRequestId = 0; QString newError = (result.v || _checkUsername == App::self()->username) ? QString() : lang(lng_username_occupied); QString newGood = newError.isEmpty() ? lang(lng_username_available) : QString(); - if (_errorText != newError || _goodText != newGood) { + if (_errorText != newError || _goodText != newGood || !_copiedTextLink.isEmpty()) { _errorText = newError; _goodText = newGood; + _copiedTextLink = QString(); update(); } } bool UsernameBox::onCheckFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; - _checkRequest = 0; + _checkRequestId = 0; QString err(error.type()); if (err == "USERNAME_INVALID") { _errorText = lang(lng_username_invalid); @@ -218,10 +248,27 @@ bool UsernameBox::onCheckFail(const RPCError &error) { return true; } _goodText = QString(); - _usernameInput.setFocus(); + _copiedTextLink = QString(); + _username.setFocus(); return true; } QString UsernameBox::getName() const { - return _usernameInput.text().replace('@', QString()).trimmed(); + return _username.text().replace('@', QString()).trimmed(); } + +void UsernameBox::updateLinkText() { + QString uname = getName(); + _link.setText(st::boxTextFont->elided(qsl("https://telegram.me/") + uname, st::boxWidth - st::usernamePadding.left() - st::usernamePadding.right())); + if (uname.isEmpty()) { + if (!_link.isHidden()) { + _link.hide(); + update(); + } + } else { + if (_link.isHidden()) { + _link.show(); + update(); + } + } +} \ No newline at end of file diff --git a/Telegram/SourceFiles/boxes/usernamebox.h b/Telegram/SourceFiles/boxes/usernamebox.h index 1f7f7e28d..c48af468f 100644 --- a/Telegram/SourceFiles/boxes/usernamebox.h +++ b/Telegram/SourceFiles/boxes/usernamebox.h @@ -28,7 +28,6 @@ class UsernameBox : public AbstractBox, public RPCSender { public: UsernameBox(); - void keyPressEvent(QKeyEvent *e); void paintEvent(QPaintEvent *e); void resizeEvent(QResizeEvent *e); @@ -39,6 +38,8 @@ public slots: void onCheck(); void onChanged(); + void onLinkClick(); + protected: void hideAll(); @@ -54,13 +55,14 @@ private: bool onCheckFail(const RPCError &error); QString getName() const; - void initBox(); + void updateLinkText(); - FlatButton _saveButton, _cancelButton; - UsernameInput _usernameInput; + BoxButton _save, _cancel; + UsernameInput _username; + LinkButton _link; - mtpRequestId _saveRequest, _checkRequest; - QString _sentUsername, _checkUsername, _errorText, _goodText; + mtpRequestId _saveRequestId, _checkRequestId; + QString _sentUsername, _checkUsername, _errorText, _goodText, _copiedTextLink; Text _about; QTimer _checkTimer; diff --git a/Telegram/SourceFiles/dialogswidget.cpp b/Telegram/SourceFiles/dialogswidget.cpp index 05c48d2ad..2903caa0b 100644 --- a/Telegram/SourceFiles/dialogswidget.cpp +++ b/Telegram/SourceFiles/dialogswidget.cpp @@ -1726,7 +1726,7 @@ void DialogsWidget::dialogsReceived(const MTPmessages_Dialogs &dialogs, mtpReque } bool DialogsWidget::dialogsFailed(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; LOG(("RPC Error: %1 %2: %3").arg(error.code()).arg(error.type()).arg(error.description())); if (_dialogsRequest == req) { @@ -1853,7 +1853,7 @@ void DialogsWidget::contactsReceived(const MTPcontacts_Contacts &contacts) { } bool DialogsWidget::contactsFailed(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; return true; } @@ -1943,7 +1943,7 @@ void DialogsWidget::peopleReceived(const MTPcontacts_Found &result, mtpRequestId } bool DialogsWidget::searchFailed(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (_searchRequest == req) { _searchRequest = 0; @@ -1953,7 +1953,7 @@ bool DialogsWidget::searchFailed(const RPCError &error, mtpRequestId req) { } bool DialogsWidget::peopleFailed(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (_peopleRequest == req) { _peopleRequest = 0; diff --git a/Telegram/SourceFiles/dropdown.cpp b/Telegram/SourceFiles/dropdown.cpp index f023a8d5c..a374a23f2 100644 --- a/Telegram/SourceFiles/dropdown.cpp +++ b/Telegram/SourceFiles/dropdown.cpp @@ -690,7 +690,7 @@ void EmojiColorPicker::drawVariant(Painter &p, int variant) { p.setOpacity(1); } int esize = EmojiSizes[EIndex + 1]; - p.drawPixmapLeft(w.x() + (st::emojiPanSize.width() - (esize / cIntRetinaFactor())) / 2, w.y() + (st::emojiPanSize.height() - (esize / cIntRetinaFactor())) / 2, width(), App::emojisLarge(), QRect(_variants[variant]->x * esize, _variants[variant]->y * esize, esize, esize)); + p.drawPixmapLeft(w.x() + (st::emojiPanSize.width() - (esize / cIntRetinaFactor())) / 2, w.y() + (st::emojiPanSize.height() - (esize / cIntRetinaFactor())) / 2, width(), App::emojiLarge(), QRect(_variants[variant]->x * esize, _variants[variant]->y * esize, esize, esize)); } EmojiPanInner::EmojiPanInner() : _maxHeight(int(st::emojiPanMaxHeight)), @@ -802,7 +802,7 @@ void EmojiPanInner::paintEvent(QPaintEvent *e) { App::roundRect(p, QRect(tl, st::emojiPanSize), st::emojiPanHover, StickerHoverCorners); p.setOpacity(1); } - p.drawPixmapLeft(w.x() + (st::emojiPanSize.width() - (_esize / cIntRetinaFactor())) / 2, w.y() + (st::emojiPanSize.height() - (_esize / cIntRetinaFactor())) / 2, width(), App::emojisLarge(), QRect(_emojis[c][index]->x * _esize, _emojis[c][index]->y * _esize, _esize, _esize)); + p.drawPixmapLeft(w.x() + (st::emojiPanSize.width() - (_esize / cIntRetinaFactor())) / 2, w.y() + (st::emojiPanSize.height() - (_esize / cIntRetinaFactor())) / 2, width(), App::emojiLarge(), QRect(_emojis[c][index]->x * _esize, _emojis[c][index]->y * _esize, _esize, _esize)); } } } @@ -964,7 +964,7 @@ QRect EmojiPanInner::emojiRect(int tab, int sel) { x = st::emojiPanPadding + ((sel % EmojiPanPerRow) * st::emojiPanSize.width()); break; } else { - int cnt = emojiPackCount(emojiTabAtIndex(i)); + int cnt = _counts[i]; int rows = (cnt / EmojiPanPerRow) + ((cnt % EmojiPanPerRow) ? 1 : 0); y += st::emojiPanHeader + rows * st::emojiPanSize.height(); } @@ -1083,10 +1083,11 @@ void EmojiPanInner::fillPanels(QVector &panels) { for (int c = 0; c < emojiTabCount; ++c) { panels.push_back(new EmojiPanel(parentWidget(), lang(LangKey(lng_emoji_category0 + c)), NoneStickerSetId, true, y)); connect(panels.back(), SIGNAL(mousePressed()), this, SLOT(checkPickerHide())); - int cnt = emojiPackCount(emojiTabAtIndex(c)), rows = (cnt / EmojiPanPerRow) + ((cnt % EmojiPanPerRow) ? 1 : 0); + int cnt = _counts[c], rows = (cnt / EmojiPanPerRow) + ((cnt % EmojiPanPerRow) ? 1 : 0); panels.back()->show(); y += st::emojiPanHeader + rows * st::emojiPanSize.height(); } + _picker.raise(); } void EmojiPanInner::refreshPanels(QVector &panels) { @@ -1095,7 +1096,7 @@ void EmojiPanInner::refreshPanels(QVector &panels) { int32 y = 0; for (int c = 0; c < emojiTabCount; ++c) { panels.at(c)->setWantedY(y); - int cnt = emojiPackCount(emojiTabAtIndex(c)), rows = (cnt / EmojiPanPerRow) + ((cnt % EmojiPanPerRow) ? 1 : 0); + int cnt = _counts[c], rows = (cnt / EmojiPanPerRow) + ((cnt % EmojiPanPerRow) ? 1 : 0); y += st::emojiPanHeader + rows * st::emojiPanSize.height(); } } @@ -1972,7 +1973,7 @@ void EmojiPan::paintEvent(QPaintEvent *e) { if (_toCache.isNull()) { if (_cache.isNull()) { - p.fillRect(rtlrect(r.x() + r.width() - st::emojiScroll.width, r.y(), st::emojiScroll.width, e_scroll.height(), width()), st::white->b); + p.fillRect(myrtlrect(r.x() + r.width() - st::emojiScroll.width, r.y(), st::emojiScroll.width, e_scroll.height()), st::white->b); if (_stickersShown) { p.fillRect(r.left(), _iconsTop, r.width(), st::rbEmoji.height, st::emojiPanCategories->b); if (!_icons.isEmpty()) { diff --git a/Telegram/SourceFiles/fileuploader.cpp b/Telegram/SourceFiles/fileuploader.cpp index 7894ff887..4f4f46971 100644 --- a/Telegram/SourceFiles/fileuploader.cpp +++ b/Telegram/SourceFiles/fileuploader.cpp @@ -285,7 +285,7 @@ void FileUploader::partLoaded(const MTPBool &result, mtpRequestId requestId) { } bool FileUploader::partFailed(const RPCError &error, mtpRequestId requestId) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (requestsSent.constFind(requestId) != requestsSent.cend() || docRequestsSent.constFind(requestId) != docRequestsSent.cend()) { // failed to upload current file currentFailed(); diff --git a/Telegram/SourceFiles/gui/countryinput.cpp b/Telegram/SourceFiles/gui/countryinput.cpp index fcb06074e..d3ea80ee0 100644 --- a/Telegram/SourceFiles/gui/countryinput.cpp +++ b/Telegram/SourceFiles/gui/countryinput.cpp @@ -536,7 +536,7 @@ void CountrySelect::onFilterUpdate() { void CountrySelect::resizeEvent(QResizeEvent *e) { if (width() != e->oldSize().width()) { - _innerWidth = st::newGroupNamePadding.left() + _filter.width() + st::newGroupNamePadding.right(); + _innerWidth = st::old_newGroupNamePadding.left() + _filter.width() + st::old_newGroupNamePadding.right(); _innerLeft = (width() - _innerWidth) / 2; _list.resize(_innerWidth, _list.height()); @@ -550,9 +550,9 @@ void CountrySelect::resizeEvent(QResizeEvent *e) { } } - _filter.move(_innerLeft + st::newGroupNamePadding.left(), _innerTop + st::contactsAdd.height + st::newGroupNamePadding.top()); - int32 scrollTop = _filter.y() + _filter.height() + st::newGroupNamePadding.bottom(); - int32 scrollHeight = _innerHeight - st::contactsAdd.height - st::newGroupNamePadding.top() - _filter.height() - st::newGroupNamePadding.bottom() - _cancelButton.height(); + _filter.move(_innerLeft + st::old_newGroupNamePadding.left(), _innerTop + st::contactsAdd.height + st::old_newGroupNamePadding.top()); + int32 scrollTop = _filter.y() + _filter.height() + st::old_newGroupNamePadding.bottom(); + int32 scrollHeight = _innerHeight - st::contactsAdd.height - st::old_newGroupNamePadding.top() - _filter.height() - st::old_newGroupNamePadding.bottom() - _cancelButton.height(); _scroll.setGeometry(_innerLeft, scrollTop, _innerWidth, scrollHeight); int btnTop = scrollTop + scrollHeight; diff --git a/Telegram/SourceFiles/gui/flatbutton.cpp b/Telegram/SourceFiles/gui/flatbutton.cpp index 3c495805d..a5e039da7 100644 --- a/Telegram/SourceFiles/gui/flatbutton.cpp +++ b/Telegram/SourceFiles/gui/flatbutton.cpp @@ -301,9 +301,12 @@ _st(st), a_textBgOverOpacity(0), a_textFg(st.textFg->c), _a_over(animFunc(this, &BoxButton::animStep_over)) { if (_st.width <= 0) { resize(_textWidth - _st.width, _st.height); - } else if (_st.width < _textWidth + (_st.height - _st.font->height)) { - _text = _st.font->elided(_fullText, qMax(_st.width - (_st.height - _st.font->height), 1.)); - _textWidth = _st.font->width(_text); + } else { + if (_st.width < _textWidth + (_st.height - _st.font->height)) { + _text = _st.font->elided(_fullText, qMax(_st.width - (_st.height - _st.font->height), 1.)); + _textWidth = _st.font->width(_text); + } + resize(_st.width, _st.height); } connect(this, SIGNAL(stateChanged(int, ButtonStateChangeSource)), this, SLOT(onStateChange(int, ButtonStateChangeSource))); diff --git a/Telegram/SourceFiles/gui/flatcheckbox.cpp b/Telegram/SourceFiles/gui/flatcheckbox.cpp index 48df0deae..70d64cce4 100644 --- a/Telegram/SourceFiles/gui/flatcheckbox.cpp +++ b/Telegram/SourceFiles/gui/flatcheckbox.cpp @@ -127,14 +127,15 @@ bool FlatCheckbox::animStep(float64 ms) { return res; } -class RadiobuttonsGroup : public QSet { - typedef QSet Parent; +template +class TemplateRadiobuttonsGroup : public QMap { + typedef QMap Parent; public: - RadiobuttonsGroup(const QString &name) : _name(name), _val(0) { + TemplateRadiobuttonsGroup(const QString &name) : _name(name), _val(0) { } - void remove(FlatRadiobutton * const &radio); + void remove(Type * const &radio); int32 val() const { return _val; } @@ -148,15 +149,19 @@ private: }; -class Radiobuttons : public QMap { - typedef QMap Parent; +typedef TemplateRadiobuttonsGroup FlatRadiobuttonGroup; +typedef TemplateRadiobuttonsGroup RadiobuttonGroup; + +template +class Radiobuttons : public QMap *> { + typedef QMap *> Parent; public: - RadiobuttonsGroup *reg(const QString &group) { + TemplateRadiobuttonsGroup *reg(const QString &group) { Parent::const_iterator i = constFind(group); if (i == cend()) { - i = insert(group, new RadiobuttonsGroup(group)); + i = insert(group, new TemplateRadiobuttonsGroup(group)); } return i.value(); } @@ -179,39 +184,366 @@ public: }; namespace { - Radiobuttons radioButtons; + Radiobuttons flatRadiobuttons; + Radiobuttons radiobuttons; } -void RadiobuttonsGroup::remove(FlatRadiobutton * const &radio) { +template <> +void TemplateRadiobuttonsGroup::remove(FlatRadiobutton * const &radio) { Parent::remove(radio); if (isEmpty()) { - radioButtons.remove(_name); + flatRadiobuttons.remove(_name); + } +} + +template <> +void TemplateRadiobuttonsGroup::remove(Radiobutton * const &radio) { + Parent::remove(radio); + if (isEmpty()) { + radiobuttons.remove(_name); } } FlatRadiobutton::FlatRadiobutton(QWidget *parent, const QString &group, int32 value, const QString &text, bool checked, const style::flatCheckbox &st) : - FlatCheckbox(parent, text, checked, st), _group(radioButtons.reg(group)), _value(value) { - _group->insert(this); + FlatCheckbox(parent, text, checked, st), _group(flatRadiobuttons.reg(group)), _value(value) { + reinterpret_cast(_group)->insert(this, true); connect(this, SIGNAL(changed()), this, SLOT(onChanged())); if (this->checked()) onChanged(); } void FlatRadiobutton::onChanged() { + FlatRadiobuttonGroup *group = reinterpret_cast(_group); if (checked()) { - int32 uncheck = _group->val(); + int32 uncheck = group->val(); if (uncheck != _value) { - _group->setVal(_value); - for (RadiobuttonsGroup::const_iterator i = _group->cbegin(), e = _group->cend(); i != e; ++i) { - if ((*i)->val() == uncheck) { - (*i)->setChecked(false); + group->setVal(_value); + for (FlatRadiobuttonGroup::const_iterator i = group->cbegin(), e = group->cend(); i != e; ++i) { + if (i.key()->val() == uncheck) { + i.key()->setChecked(false); } } } - } else if (_group->val() == _value) { + } else if (group->val() == _value) { setChecked(true); } } FlatRadiobutton::~FlatRadiobutton() { - _group->remove(this); + reinterpret_cast(_group)->remove(this); +} + +Checkbox::Checkbox(QWidget *parent, const QString &text, bool checked, const style::Checkbox &st) : Button(parent), +_st(st), +a_over(0), a_checked(checked ? 1 : 0), +_a_over(animFunc(this, &Checkbox::animStep_over)), _a_checked(animFunc(this, &Checkbox::animStep_checked)), +_text(text), _fullText(text), _textWidth(st.font->width(text)), +_checked(checked) { + if (_st.width <= 0) { + resize(_textWidth - _st.width, _st.height); + } else { + if (_st.width < _st.textPosition.x() + _textWidth + (_st.textPosition.x() - _st.diameter)) { + _text = _st.font->elided(_fullText, qMax(_st.width - (_st.textPosition.x() + (_st.textPosition.x() - _st.diameter)), 1.)); + _textWidth = _st.font->width(_text); + } + resize(_st.width, _st.height); + } + _checkRect = myrtlrect(0, 0, _st.diameter, _st.diameter); + + connect(this, SIGNAL(clicked()), this, SLOT(onClicked())); + connect(this, SIGNAL(stateChanged(int, ButtonStateChangeSource)), this, SLOT(onStateChange(int, ButtonStateChangeSource))); + + setCursor(style::cur_pointer); + + setAttribute(Qt::WA_OpaquePaintEvent); +} + +bool Checkbox::checked() const { + return _checked; +} + +void Checkbox::setChecked(bool checked) { + if (_checked != checked) { + _checked = checked; + if (_checked) { + a_checked.start(1); + } else { + a_checked.start(0); + } + _a_checked.start(); + + emit changed(); + } +} + +bool Checkbox::animStep_over(float64 ms) { + float64 dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + a_over.finish(); + res = false; + } else { + a_over.update(dt, anim::linear); + } + update(_checkRect); + return res; +} + +bool Checkbox::animStep_checked(float64 ms) { + float64 dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + a_checked.finish(); + res = false; + } else { + a_checked.update(dt, anim::linear); + } + update(_checkRect); + return res; +} + +void Checkbox::paintEvent(QPaintEvent *e) { + Painter p(this); + + float64 over = a_over.current(), checked = a_checked.current(); + bool cnone = (over == 0. && checked == 0.), cover = (over == 1. && checked == 0.), cchecked = (checked == 1.); + bool cbad = !cnone && !cover && !cchecked; + QColor color; + if (cbad) { + float64 onone = (1. - over) * (1. - checked), oover = over * (1. - checked), ochecked = checked; + color.setRedF(_st.checkFg->c.redF() * onone + _st.checkFgOver->c.redF() * oover + _st.checkFgActive->c.redF() * ochecked); + color.setGreenF(_st.checkFg->c.greenF() * onone + _st.checkFgOver->c.greenF() * oover + _st.checkFgActive->c.greenF() * ochecked); + color.setBlueF(_st.checkFg->c.blueF() * onone + _st.checkFgOver->c.blueF() * oover + _st.checkFgActive->c.blueF() * ochecked); + } + + QRect r(e->rect()); + p.setClipRect(r); + p.fillRect(r, _st.textBg->b); + if (_checkRect.intersects(r)) { + p.setRenderHint(QPainter::HighQualityAntialiasing); + + QPen pen; + if (cbad) { + pen = QPen(color); + } else { + pen = (cnone ? _st.checkFg : (cover ? _st.checkFgOver : _st.checkFgActive))->p; + color = (cnone ? _st.checkFg : (cover ? _st.checkFgOver : _st.checkFgActive))->c; + } + pen.setWidth(_st.thickness); + p.setPen(pen); + if (checked > 0) { + color.setAlphaF(checked); + p.setBrush(color); + } else { + p.setBrush(Qt::NoBrush); + } + p.drawRoundedRect(QRectF(_checkRect).marginsRemoved(QMarginsF(_st.thickness / 2, _st.thickness / 2, _st.thickness / 2, _st.thickness / 2)), st::msgRadius, st::msgRadius); + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + + if (checked > 0) { + p.drawSpriteCenter(_checkRect, _st.checkIcon); + } + } + if (_checkRect.contains(r)) return; + + p.setPen(_st.textFg); + p.setFont(_st.font); + p.drawTextLeft(_st.textPosition.x(), _st.textPosition.y(), width(), _text, _textWidth); +} + +void Checkbox::onClicked() { + if (_state & StateDisabled) return; + setChecked(!checked()); +} + +void Checkbox::onStateChange(int oldState, ButtonStateChangeSource source) { + if ((_state & StateOver) && !(oldState & StateOver)) { + a_over.start(1); + _a_over.start(); + } else if (!(_state & StateOver) && (oldState & StateOver)) { + a_over.start(0); + _a_over.start(); + } + if ((_state & StateDisabled) && !(oldState & StateDisabled)) { + setCursor(style::cur_default); + } else if (!(_state & StateDisabled) && (oldState & StateDisabled)) { + setCursor(style::cur_pointer); + } +} + +Radiobutton::Radiobutton(QWidget *parent, const QString &group, int32 value, const QString &text, bool checked, const style::Radiobutton &st) : Button(parent), +_st(st), +a_over(0), a_checked(checked ? 1 : 0), +_a_over(animFunc(this, &Radiobutton::animStep_over)), _a_checked(animFunc(this, &Radiobutton::animStep_checked)), +_text(text), _fullText(text), _textWidth(st.font->width(text)), +_checked(checked), _group(radiobuttons.reg(group)), _value(value) { + if (_st.width <= 0) { + resize(_textWidth - _st.width, _st.height); + } else { + if (_st.width < _st.textPosition.x() + _textWidth + (_st.textPosition.x() - _st.diameter)) { + _text = _st.font->elided(_fullText, qMax(_st.width - (_st.textPosition.x() + (_st.textPosition.x() - _st.diameter)), 1.)); + _textWidth = _st.font->width(_text); + } + resize(_st.width, _st.height); + } + _checkRect = myrtlrect(0, 0, _st.diameter, _st.diameter); + + connect(this, SIGNAL(clicked()), this, SLOT(onClicked())); + connect(this, SIGNAL(stateChanged(int, ButtonStateChangeSource)), this, SLOT(onStateChange(int, ButtonStateChangeSource))); + + setCursor(style::cur_pointer); + + setAttribute(Qt::WA_OpaquePaintEvent); + + reinterpret_cast(_group)->insert(this, true); + if (_checked) onChanged(); +} + +bool Radiobutton::checked() const { + return _checked; +} + +void Radiobutton::setChecked(bool checked) { + if (_checked != checked) { + _checked = checked; + if (_checked) { + a_checked.start(1); + } else { + a_checked.start(0); + } + _a_checked.start(); + + onChanged(); + emit changed(); + } +} + +bool Radiobutton::animStep_over(float64 ms) { + float64 dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + a_over.finish(); + res = false; + } else { + a_over.update(dt, anim::linear); + } + update(_checkRect); + return res; +} + +bool Radiobutton::animStep_checked(float64 ms) { + float64 dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + a_checked.finish(); + res = false; + } else { + a_checked.update(dt, anim::linear); + } + update(_checkRect); + return res; +} + +void Radiobutton::paintEvent(QPaintEvent *e) { + Painter p(this); + + float64 over = a_over.current(), checked = a_checked.current(); + bool cnone = (over == 0. && checked == 0.), cover = (over == 1. && checked == 0.), cchecked = (checked == 1.); + bool cbad = !cnone && !cover && !cchecked; + QColor color; + if (cbad) { + float64 onone = (1. - over) * (1. - checked), oover = over * (1. - checked), ochecked = checked; + color.setRedF(_st.checkFg->c.redF() * onone + _st.checkFgOver->c.redF() * oover + _st.checkFgActive->c.redF() * ochecked); + color.setGreenF(_st.checkFg->c.greenF() * onone + _st.checkFgOver->c.greenF() * oover + _st.checkFgActive->c.greenF() * ochecked); + color.setBlueF(_st.checkFg->c.blueF() * onone + _st.checkFgOver->c.blueF() * oover + _st.checkFgActive->c.blueF() * ochecked); + } + + QRect r(e->rect()); + p.setClipRect(r); + p.fillRect(r, _st.textBg->b); + if (_checkRect.intersects(r)) { + p.setRenderHint(QPainter::HighQualityAntialiasing); + + QPen pen; + if (cbad) { + pen = QPen(color); + } else { + pen = (cnone ? _st.checkFg : (cover ? _st.checkFgOver : _st.checkFgActive))->p; + } + pen.setWidth(_st.thickness); + p.setPen(pen); + p.setBrush(Qt::NoBrush); + //int32 skip = qCeil(_st.thickness / 2); + //p.drawEllipse(_checkRect.marginsRemoved(QMargins(skip, skip, skip, skip))); + p.drawEllipse(QRectF(_checkRect).marginsRemoved(QMarginsF(_st.thickness / 2, _st.thickness / 2, _st.thickness / 2, _st.thickness / 2))); + + if (checked > 0) { + p.setPen(Qt::NoPen); + if (cbad) { + p.setBrush(color); + } else { + p.setBrush(cnone ? _st.checkFg : (cover ? _st.checkFgOver : _st.checkFgActive)); + } + float64 skip0 = _checkRect.width() / 2., skip1 = _st.checkSkip / 10., checkSkip = skip0 * (1. - checked) + skip1 * checked; + p.drawEllipse(QRectF(_checkRect).marginsRemoved(QMarginsF(checkSkip, checkSkip, checkSkip, checkSkip))); + //int32 fskip = qFloor(checkSkip), cskip = qCeil(checkSkip); + //if (2 * fskip < _checkRect.width()) { + // if (fskip != cskip) { + // p.setOpacity(float64(cskip) - checkSkip); + // p.drawEllipse(_checkRect.marginsRemoved(QMargins(fskip, fskip, fskip, fskip))); + // p.setOpacity(1.); + // } + // if (2 * cskip < _checkRect.width()) { + // p.drawEllipse(_checkRect.marginsRemoved(QMargins(cskip, cskip, cskip, cskip))); + // } + //} + } + + p.setRenderHint(QPainter::HighQualityAntialiasing, false); + } + if (_checkRect.contains(r)) return; + + p.setPen(_st.textFg); + p.setFont(_st.font); + p.drawTextLeft(_st.textPosition.x(), _st.textPosition.y(), width(), _text, _textWidth); +} + +void Radiobutton::onClicked() { + if (_state & StateDisabled) return; + setChecked(!checked()); +} + +void Radiobutton::onStateChange(int oldState, ButtonStateChangeSource source) { + if ((_state & StateOver) && !(oldState & StateOver)) { + a_over.start(1); + _a_over.start(); + } else if (!(_state & StateOver) && (oldState & StateOver)) { + a_over.start(0); + _a_over.start(); + } + if ((_state & StateDisabled) && !(oldState & StateDisabled)) { + setCursor(style::cur_default); + } else if (!(_state & StateDisabled) && (oldState & StateDisabled)) { + setCursor(style::cur_pointer); + } +} + +void Radiobutton::onChanged() { + RadiobuttonGroup *group = reinterpret_cast(_group); + if (checked()) { + int32 uncheck = group->val(); + if (uncheck != _value) { + group->setVal(_value); + for (RadiobuttonGroup::const_iterator i = group->cbegin(), e = group->cend(); i != e; ++i) { + if (i.key()->val() == uncheck) { + i.key()->setChecked(false); + } + } + } + } else if (group->val() == _value) { + setChecked(true); + } +} + +Radiobutton::~Radiobutton() { + reinterpret_cast(_group)->remove(this); } diff --git a/Telegram/SourceFiles/gui/flatcheckbox.h b/Telegram/SourceFiles/gui/flatcheckbox.h index 840c5d818..c0296e405 100644 --- a/Telegram/SourceFiles/gui/flatcheckbox.h +++ b/Telegram/SourceFiles/gui/flatcheckbox.h @@ -59,7 +59,6 @@ private: }; -class RadiobuttonsGroup; class FlatRadiobutton : public FlatCheckbox { Q_OBJECT @@ -77,7 +76,94 @@ public slots: private: - RadiobuttonsGroup *_group; + void *_group; + int32 _value; + +}; + +class Checkbox : public Button { + Q_OBJECT + +public: + + Checkbox(QWidget *parent, const QString &text, bool checked = false, const style::Checkbox &st = st::defaultCheckbox); + + bool checked() const; + void setChecked(bool checked); + + bool animStep_over(float64 ms); + bool animStep_checked(float64 ms); + + void paintEvent(QPaintEvent *e); + +public slots: + + void onClicked(); + void onStateChange(int oldState, ButtonStateChangeSource source); + +signals: + + void changed(); + +private: + + const style::Checkbox &_st; + anim::fvalue a_over, a_checked; + Animation _a_over, _a_checked; + + QString _text, _fullText; + int32 _textWidth; + QRect _checkRect; + + bool _checked; + +}; + +class Radiobutton : public Button { + Q_OBJECT + +public: + + Radiobutton(QWidget *parent, const QString &group, int32 value, const QString &text, bool checked = false, const style::Radiobutton &st = st::defaultRadiobutton); + + bool checked() const; + void setChecked(bool checked); + + int32 val() const { + return _value; + } + + bool animStep_over(float64 ms); + bool animStep_checked(float64 ms); + + void paintEvent(QPaintEvent *e); + + ~Radiobutton(); + +public slots: + + void onClicked(); + void onStateChange(int oldState, ButtonStateChangeSource source); + +signals: + + void changed(); + +private: + + void onChanged(); + + const style::Radiobutton &_st; + anim::fvalue a_over, a_checked; + Animation _a_over, _a_checked; + + QString _text, _fullText; + int32 _textWidth; + QRect _checkRect; + + bool _checked; + + void *_group; int32 _value; }; diff --git a/Telegram/SourceFiles/gui/flatinput.cpp b/Telegram/SourceFiles/gui/flatinput.cpp index aaa1889fc..1e5cfb7e4 100644 --- a/Telegram/SourceFiles/gui/flatinput.cpp +++ b/Telegram/SourceFiles/gui/flatinput.cpp @@ -25,6 +25,9 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "window.h" #include "countryinput.h" +#include "lang.h" +#include "numbers.h" + namespace { template class InputStyle : public QCommonStyle { @@ -45,12 +48,13 @@ namespace { } }; InputStyle _flatInputStyle; + InputStyle _inputFieldStyle; } FlatInput::FlatInput(QWidget *parent, const style::flatInput &st, const QString &pholder, const QString &v) : QLineEdit(v, parent), -_fullph(pholder), _oldtext(v), _fastph(false), _kev(0), _customUpDown(false), _phVisible(!v.length()), - a_phLeft(_phVisible ? 0 : st.phShift), a_phAlpha(_phVisible ? 1 : 0), a_phColor(st.phColor->c), - a_borderColor(st.borderColor->c), a_bgColor(st.bgColor->c), _notingBene(0), _st(st) { +_oldtext(v), _fullph(pholder), _fastph(false), _customUpDown(false), _phVisible(!v.length()), +a_phLeft(_phVisible ? 0 : st.phShift), a_phAlpha(_phVisible ? 1 : 0), a_phColor(st.phColor->c), +a_borderColor(st.borderColor->c), a_bgColor(st.bgColor->c), _notingBene(0), _st(st) { resize(_st.width, _st.height); setFont(_st.font->f); @@ -65,7 +69,7 @@ _fullph(pholder), _oldtext(v), _fastph(false), _kev(0), _customUpDown(false), _p if (App::wnd()) connect(this, SIGNAL(selectionChanged()), App::wnd(), SLOT(updateGlobalMenu())); setStyle(&_flatInputStyle); - setTextMargins(0, 0, 0, 0); + QLineEdit::setTextMargins(0, 0, 0, 0); setContentsMargins(0, 0, 0, 0); setAttribute(Qt::WA_AcceptTouchEvents); @@ -77,7 +81,7 @@ void FlatInput::customUpDown(bool custom) { _customUpDown = custom; } -void FlatInput::setTextMargin(const QMargins &mrg) { +void FlatInput::setTextMargins(const QMargins &mrg) { _st.textMrg = mrg; } @@ -277,7 +281,7 @@ QRect FlatInput::placeholderRect() const { return QRect(_st.textMrg.left() + _st.phPos.x(), _st.textMrg.top() + _st.phPos.y(), width() - _st.textMrg.left() - _st.textMrg.right(), height() - _st.textMrg.top() - _st.textMrg.bottom()); } -void FlatInput::correctValue(QKeyEvent *e, const QString &was) { +void FlatInput::correctValue(const QString &was, QString &now) { } void FlatInput::phPrepare(Painter &p) { @@ -286,34 +290,38 @@ void FlatInput::phPrepare(Painter &p) { } void FlatInput::keyPressEvent(QKeyEvent *e) { - QString was(text()); - _kev = e; + QString wasText(_oldtext); + + bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); + bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = true; if (_customUpDown && (e->key() == Qt::Key_Up || e->key() == Qt::Key_Down)) { e->ignore(); } else { QLineEdit::keyPressEvent(e); } - if (was == text()) { // call correct manually - correctValue(_kev, was); - _oldtext = text(); - if (was != _oldtext) emit changed(); + QString newText(text()); + if (wasText == newText) { // call correct manually + correctValue(wasText, newText); + _oldtext = newText; + if (wasText != _oldtext) emit changed(); updatePlaceholder(); } if (e->key() == Qt::Key_Escape) { emit cancelled(); } else if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { - emit accepted(); + emit submitted(ctrl && shift); } - _kev = 0; } void FlatInput::onTextEdited() { - QString was(_oldtext); - correctValue(_kev, was); - _oldtext = text(); - if (was != _oldtext) emit changed(); + QString wasText(_oldtext), newText(text()); + + correctValue(wasText, newText); + _oldtext = newText; + if (wasText != _oldtext) emit changed(); updatePlaceholder(); + if (App::wnd()) App::wnd()->updateGlobalMenu(); } @@ -339,24 +347,24 @@ void CountryCodeInput::startErasing(QKeyEvent *e) { } void CountryCodeInput::codeSelected(const QString &code) { - QString old(text()); - setText('+' + code); + QString wasText(getLastText()), newText = '+' + code; + setText(newText); _nosignal = true; - correctValue(0, old); + correctValue(wasText, newText); _nosignal = false; emit changed(); } -void CountryCodeInput::correctValue(QKeyEvent *e, const QString &was) { - QString oldText(text()), newText, addToNumber; - int oldPos(cursorPosition()), newPos(-1), oldLen(oldText.length()), start = 0, digits = 5; +void CountryCodeInput::correctValue(const QString &was, QString &now) { + QString newText, addToNumber; + int oldPos(cursorPosition()), newPos(-1), oldLen(now.length()), start = 0, digits = 5; newText.reserve(oldLen + 1); newText += '+'; - if (oldLen && oldText[0] == '+') { + if (oldLen && now[0] == '+') { ++start; } for (int i = start; i < oldLen; ++i) { - QChar ch(oldText[i]); + QChar ch(now[i]); if (ch.isDigit()) { if (!digits || !--digits) { addToNumber += ch; @@ -376,8 +384,10 @@ void CountryCodeInput::correctValue(QKeyEvent *e, const QString &was) { if (newPos < 0 || newPos > newText.length()) { newPos = newText.length(); } - if (newText != oldText) { + if (newText != now) { + now = newText; setText(newText); + updatePlaceholder(); if (newPos != oldPos) { setCursorPosition(newPos); } @@ -390,43 +400,146 @@ void CountryCodeInput::correctValue(QKeyEvent *e, const QString &was) { } } -UsernameInput::UsernameInput(QWidget *parent, const style::flatInput &st, const QString &ph, const QString &val) : FlatInput(parent, st, ph, val) { +PhoneInput::PhoneInput(QWidget *parent, const style::flatInput &st) : FlatInput(parent, st, lang(lng_phone_ph)) { } -void UsernameInput::correctValue(QKeyEvent *e, const QString &was) { - QString oldText(text()), newText; - int32 newPos = cursorPosition(), from, len = oldText.size(); - for (from = 0; from < len; ++from) { - if (!oldText.at(from).isSpace()) { - break; +void PhoneInput::paintEvent(QPaintEvent *e) { + FlatInput::paintEvent(e); + + Painter p(this); + QString t(text()); + if (!pattern.isEmpty() && !t.isEmpty()) { + QString ph = placeholder().mid(t.size()); + if (!ph.isEmpty()) { + p.setClipRect(rect()); + QRect phRect(placeholderRect()); + int tw = phFont()->width(t); + if (tw < phRect.width()) { + phRect.setLeft(phRect.left() + tw); + phPrepare(p); + p.drawText(phRect, ph, style::al_left); + } } - if (newPos > 0) --newPos; } - len -= from; - if (len > MaxUsernameLength) len = MaxUsernameLength + (oldText.at(from) == '@' ? 1 : 0); - for (int32 to = from + len; to > from;) { - --to; - if (!oldText.at(to).isSpace()) { - break; +} + +void PhoneInput::keyPressEvent(QKeyEvent *e) { + if (e->key() == Qt::Key_Backspace && text().isEmpty()) { + emit voidBackspace(e); + } else { + FlatInput::keyPressEvent(e); + } +} + +void PhoneInput::correctValue(const QString &was, QString &now) { + QString newText; + int oldPos(cursorPosition()), newPos(-1), oldLen(now.length()), digitCount = 0; + for (int i = 0; i < oldLen; ++i) { + if (now[i].isDigit()) { + ++digitCount; } - --len; } - newText = oldText.mid(from, len); - if (newText != oldText) { - setText(newText); + if (digitCount > MaxPhoneTailLength) digitCount = MaxPhoneTailLength; + + bool inPart = !pattern.isEmpty(); + int curPart = -1, leftInPart = 0; + newText.reserve(oldLen); + for (int i = 0; i < oldLen; ++i) { + if (i == oldPos && newPos < 0) { + newPos = newText.length(); + } + + QChar ch(now[i]); + if (ch.isDigit()) { + if (!digitCount--) { + break; + } + if (inPart) { + if (leftInPart) { + --leftInPart; + } else { + newText += ' '; + ++curPart; + inPart = curPart < pattern.size(); + leftInPart = inPart ? (pattern.at(curPart) - 1) : 0; + + ++oldPos; + } + } + newText += ch; + } else if (ch == ' ' || ch == '-' || ch == '(' || ch == ')') { + if (inPart) { + if (leftInPart) { + } else { + newText += ch; + ++curPart; + inPart = curPart < pattern.size(); + leftInPart = inPart ? pattern.at(curPart) : 0; + } + } else { + newText += ch; + } + } + } + int32 newlen = newText.size(); + while (newlen > 0 && newText.at(newlen - 1).isSpace()) { + --newlen; + } + if (newlen < newText.size()) newText = newText.mid(0, newlen); + if (newPos < 0) { + newPos = newText.length(); + } + if (newText != now) { + now = newText; + setText(now); + updatePlaceholder(); setCursorPosition(newPos); } } -InputField::InputField(QWidget *parent, const style::InputField &st, const QString &ph, const QString &val) : TWidget(parent), +void PhoneInput::addedToNumber(const QString &added) { + setFocus(); + QString wasText(getLastText()), newText = added + wasText; + setText(newText); + setCursorPosition(added.length()); + correctValue(wasText, newText); + updatePlaceholder(); +} + +void PhoneInput::onChooseCode(const QString &code) { + pattern = phoneNumberParse(code); + if (!pattern.isEmpty() && pattern.at(0) == code.size()) { + pattern.pop_front(); + } else { + pattern.clear(); + } + if (pattern.isEmpty()) { + setPlaceholder(lang(lng_phone_ph)); + } else { + QString ph; + ph.reserve(20); + for (int i = 0, l = pattern.size(); i < l; ++i) { + ph.append(' '); + ph.append(QString(pattern.at(i), QChar(0x2212))); + } + setPlaceholder(ph); + } + QString newText(getLastText()); + correctValue(newText, newText); + setPlaceholderFast(!pattern.isEmpty()); + updatePlaceholder(); +} + +InputArea::InputArea(QWidget *parent, const style::InputArea &st, const QString &ph, const QString &val) : TWidget(parent), +_maxLength(-1), _inner(this, val), _oldtext(val), -_keyEvent(0), _undoAvailable(false), _redoAvailable(false), +_inHeightCheck(false), +_ctrlEnterSubmit(true), -_fakeMargin(0), _customUpDown(false), _placeholderFull(ph), @@ -434,34 +547,32 @@ _placeholderVisible(val.isEmpty()), a_placeholderLeft(_placeholderVisible ? 0 : st.placeholderShift), a_placeholderOpacity(_placeholderVisible ? 1 : 0), a_placeholderFg(st.placeholderFg->c), -_placeholderFgAnim(animFunc(this, &InputField::placeholderFgStep)), -_placeholderShiftAnim(animFunc(this, &InputField::placeholderShiftStep)), +_a_placeholderFg(animFunc(this, &InputArea::animStep_placeholderFg)), +_a_placeholderShift(animFunc(this, &InputArea::animStep_placeholderShift)), a_borderOpacityActive(0), a_borderFg(st.borderFg->c), -_borderAnim(animFunc(this, &InputField::borderStep)), +_a_border(animFunc(this, &InputArea::animStep_border)), _focused(false), _error(false), -_st(&st), +_st(st), _touchPress(false), _touchRightButton(false), _touchMove(false), -_replacingEmojis(false) { +_correcting(false) { _inner.setAcceptRichText(false); - resize(_st->width, _st->height); + resize(_st.width, _st.heightMin); - _inner.setWordWrapMode(QTextOption::NoWrap); - _inner.setLineWrapMode(QTextEdit::NoWrap); + setAttribute(Qt::WA_OpaquePaintEvent); - _inner.setFont(_st->font->f); - _inner.setAlignment(cRtl() ? Qt::AlignRight : Qt::AlignLeft); + _inner.setFont(_st.font->f); - _placeholder = _st->font->elided(_placeholderFull, width() - _st->textMargins.left() - _st->textMargins.right() - _st->placeholderMargins.left() - _st->placeholderMargins.right() - 1); + _placeholder = _st.font->elided(_placeholderFull, width() - _st.textMargins.left() - _st.textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1); QPalette p(palette()); - p.setColor(QPalette::Text, _st->textFg->c); + p.setColor(QPalette::Text, _st.textFg->c); setPalette(p); _inner.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -483,13 +594,683 @@ _replacingEmojis(false) { connect(&_inner, SIGNAL(undoAvailable(bool)), this, SLOT(onUndoAvailable(bool))); connect(&_inner, SIGNAL(redoAvailable(bool)), this, SLOT(onRedoAvailable(bool))); if (App::wnd()) connect(&_inner, SIGNAL(selectionChanged()), App::wnd(), SLOT(updateGlobalMenu())); + + setCursor(style::cur_text); + heightAutoupdated(); +} + +void InputArea::onTouchTimer() { + _touchRightButton = true; +} + +bool InputArea::heightAutoupdated() { + if (_st.heightMin < 0 || _st.heightMax < 0 || _inHeightCheck) return false; + _inHeightCheck = true; + + myEnsureResized(this); + + int newh = qCeil(_inner.document()->size().height()) + _st.textMargins.top() + _st.textMargins.bottom(); + if (newh > _st.heightMax) { + newh = _st.heightMax; + } else if (newh < _st.heightMin) { + newh = _st.heightMin; + } + if (height() != newh) { + resize(width(), newh); + _inHeightCheck = false; + return true; + } + _inHeightCheck = false; + return false; +} + +void InputArea::checkContentHeight() { + if (heightAutoupdated()) { + emit resized(); + } +} + +InputArea::InputAreaInner::InputAreaInner(InputArea *parent, const QString &val) : QTextEdit(parent) { + if (!val.isEmpty()) { + setPlainText(val); + } +} + +bool InputArea::InputAreaInner::viewportEvent(QEvent *e) { + if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { + QTouchEvent *ev = static_cast(e); + if (ev->device()->type() == QTouchDevice::TouchScreen) { + qobject_cast(parentWidget())->touchEvent(ev); + return QTextEdit::viewportEvent(e); + } + } + return QTextEdit::viewportEvent(e); +} + +void InputArea::touchEvent(QTouchEvent *e) { + switch (e->type()) { + case QEvent::TouchBegin: + if (_touchPress || e->touchPoints().isEmpty()) return; + _touchTimer.start(QApplication::startDragTime()); + _touchPress = true; + _touchMove = _touchRightButton = false; + _touchStart = e->touchPoints().cbegin()->screenPos().toPoint(); + break; + + case QEvent::TouchUpdate: + if (!_touchPress || e->touchPoints().isEmpty()) return; + if (!_touchMove && (e->touchPoints().cbegin()->screenPos().toPoint() - _touchStart).manhattanLength() >= QApplication::startDragDistance()) { + _touchMove = true; + } + break; + + case QEvent::TouchEnd: + if (!_touchPress) return; + if (!_touchMove && window()) { + Qt::MouseButton btn(_touchRightButton ? Qt::RightButton : Qt::LeftButton); + QPoint mapped(mapFromGlobal(_touchStart)), winMapped(window()->mapFromGlobal(_touchStart)); + + if (_touchRightButton) { + QContextMenuEvent contextEvent(QContextMenuEvent::Mouse, mapped, _touchStart); + contextMenuEvent(&contextEvent); + } + } + _touchTimer.stop(); + _touchPress = _touchMove = _touchRightButton = false; + break; + + case QEvent::TouchCancel: + _touchPress = false; + _touchTimer.stop(); + break; + } +} + +void InputArea::paintEvent(QPaintEvent *e) { + Painter p(this); + + QRect r(rect().intersected(e->rect())); + p.fillRect(r, st::white->b); + if (_st.border) { + p.fillRect(0, height() - _st.border, width(), _st.border, _st.borderFg->b); + } + if (_st.borderActive && a_borderOpacityActive.current() > 0) { + p.setOpacity(a_borderOpacityActive.current()); + p.fillRect(0, height() - _st.borderActive, width(), _st.borderActive, a_borderFg.current()); + p.setOpacity(1); + } + + bool drawPlaceholder = _placeholderVisible; + if (_a_placeholderShift.animating()) { + p.setOpacity(a_placeholderOpacity.current()); + drawPlaceholder = true; + } + if (drawPlaceholder) { + p.save(); + p.setClipRect(r); + + QRect r(rect().marginsRemoved(_st.textMargins + _st.placeholderMargins)); + r.moveLeft(r.left() + a_placeholderLeft.current()); + if (rtl()) r.moveLeft(width() - r.left() - r.width()); + + p.setFont(_st.font); + p.setPen(a_placeholderFg.current()); + p.drawText(r, _placeholder, _st.placeholderAlign); + + p.restore(); + } + TWidget::paintEvent(e); +} + +void InputArea::startBorderAnimation() { + a_borderFg.start((_error ? _st.borderFgError : (_focused ? _st.borderFgActive : _st.borderFg))->c); + a_borderOpacityActive.start((_error || _focused) ? 1 : 0); + _a_border.start(); +} + +void InputArea::focusInEvent(QFocusEvent *e) { + _inner.setFocus(); +} + +void InputArea::mousePressEvent(QMouseEvent *e) { + _inner.setFocus(); +} + +void InputArea::contextMenuEvent(QContextMenuEvent *e) { + _inner.contextMenuEvent(e); +} + +void InputArea::InputAreaInner::focusInEvent(QFocusEvent *e) { + f()->focusInInner(); + QTextEdit::focusInEvent(e); + emit f()->focused(); +} + +void InputArea::focusInInner() { + if (!_focused) { + _focused = true; + + a_placeholderFg.start(_st.placeholderFgActive->c); + _a_placeholderFg.start(); + + startBorderAnimation(); + } +} + +void InputArea::InputAreaInner::focusOutEvent(QFocusEvent *e) { + f()->focusOutInner(); + QTextEdit::focusOutEvent(e); + emit f()->blurred(); +} + +void InputArea::focusOutInner() { + if (_focused) { + _focused = false; + + a_placeholderFg.start(_st.placeholderFg->c); + _a_placeholderFg.start(); + + startBorderAnimation(); + } +} + +QSize InputArea::sizeHint() const { + return geometry().size(); +} + +QSize InputArea::minimumSizeHint() const { + return geometry().size(); +} + +QString InputArea::getText(int32 start, int32 end) const { + if (end >= 0 && end <= start) return QString(); + + if (start < 0) start = 0; + bool full = (start == 0) && (end < 0); + + QTextDocument *doc(_inner.document()); + QTextBlock from = full ? doc->begin() : doc->findBlock(start), till = (end < 0) ? doc->end() : doc->findBlock(end); + if (till.isValid()) till = till.next(); + + int32 possibleLen = 0; + for (QTextBlock b = from; b != till; b = b.next()) { + possibleLen += b.length(); + } + QString result; + result.reserve(possibleLen + 1); + if (!full && end < 0) { + end = possibleLen; + } + + for (QTextBlock b = from; b != till; b = b.next()) { + for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) { + QTextFragment fragment(iter.fragment()); + if (!fragment.isValid()) continue; + + int32 p = full ? 0 : fragment.position(), e = full ? 0 : (p + fragment.length()); + if (!full) { + if (p >= end || e <= start) { + continue; + } + } + + QTextCharFormat f = fragment.charFormat(); + QString emojiText; + QString t(fragment.text()); + if (!full) { + if (p < start) { + t = t.mid(start - p, end - start); + } else if (e > end) { + t = t.mid(0, end - p); + } + } + QChar *ub = t.data(), *uc = ub, *ue = uc + t.size(); + for (; uc != ue; ++uc) { + switch (uc->unicode()) { + case 0xfdd0: // QTextBeginningOfFrame + case 0xfdd1: // QTextEndOfFrame + case QChar::ParagraphSeparator: + case QChar::LineSeparator: + *uc = QLatin1Char('\n'); + break; + case QChar::Nbsp: + *uc = QLatin1Char(' '); + break; + case QChar::ObjectReplacementCharacter: + if (emojiText.isEmpty() && f.isImageFormat()) { + QString imageName = static_cast(&f)->name(); + if (imageName.startsWith(qstr("emoji://e."))) { + if (EmojiPtr emoji = emojiFromUrl(imageName)) { + emojiText = emojiString(emoji); + } + } + } + if (uc > ub) result.append(ub, uc - ub); + if (!emojiText.isEmpty()) result.append(emojiText); + ub = uc + 1; + break; + } + } + if (uc > ub) result.append(ub, uc - ub); + } + result.append('\n'); + } + result.chop(1); + return result; +} + +bool InputArea::hasText() const { + QTextDocument *doc(_inner.document()); + QTextBlock from = doc->begin(), till = doc->end(); + + if (from == till) return false; + + for (QTextBlock::Iterator iter = from.begin(); !iter.atEnd(); ++iter) { + QTextFragment fragment(iter.fragment()); + if (!fragment.isValid()) continue; + if (!fragment.text().isEmpty()) return true; + } + return (from.next() != till); +} + +bool InputArea::isUndoAvailable() const { + return _undoAvailable; +} + +bool InputArea::isRedoAvailable() const { + return _redoAvailable; +} + +void InputArea::insertEmoji(EmojiPtr emoji, QTextCursor c) { + QTextImageFormat imageFormat; + int32 ew = ESize + st::emojiPadding * cIntRetinaFactor() * 2, eh = _st.font->height * cIntRetinaFactor(); + imageFormat.setWidth(ew / cIntRetinaFactor()); + imageFormat.setHeight(eh / cIntRetinaFactor()); + imageFormat.setName(qsl("emoji://e.") + QString::number(emojiKey(emoji), 16)); + imageFormat.setVerticalAlignment(QTextCharFormat::AlignBaseline); + + static QString objectReplacement(QChar::ObjectReplacementCharacter); + c.insertText(objectReplacement, imageFormat); +} + +QVariant InputArea::InputAreaInner::loadResource(int type, const QUrl &name) { + QString imageName = name.toDisplayString(); + if (imageName.startsWith(qstr("emoji://e."))) { + if (EmojiPtr emoji = emojiFromUrl(imageName)) { + return QVariant(App::emojiSingle(emoji, f()->_st.font->height)); + } + } + return QVariant(); +} + +void InputArea::processDocumentContentsChange(int position, int charsAdded) { + int32 emojiPosition = 0, emojiLen = 0; + const EmojiData *emoji = 0; + + QTextDocument *doc(_inner.document()); + QTextCursor c(_inner.textCursor()); + c.joinPreviousEditBlock(); + while (true) { + int32 start = position, end = position + charsAdded; + QTextBlock from = doc->findBlock(start), till = doc->findBlock(end); + if (till.isValid()) till = till.next(); + + for (QTextBlock b = from; b != till; b = b.next()) { + for (QTextBlock::Iterator iter = b.begin(); !iter.atEnd(); ++iter) { + QTextFragment fragment(iter.fragment()); + if (!fragment.isValid()) continue; + + int32 fp = fragment.position(), fe = fp + fragment.length(); + if (fp >= end || fe <= start) { + continue; + } + + QString t(fragment.text()); + const QChar *ch = t.constData(), *e = ch + t.size(); + for (; ch != e; ++ch) { + emoji = emojiFromText(ch, e, emojiLen); + if (emoji) { + emojiPosition = fp + (ch - t.constData()); + break; + } + if (ch + 1 < e && ch->isHighSurrogate() && (ch + 1)->isLowSurrogate()) ++ch; + } + if (emoji) break; + } + if (emoji) break; + } + if (emoji) { + if (!_inner.document()->pageSize().isNull()) { + _inner.document()->setPageSize(QSizeF(0, 0)); + } + + QTextCursor c(doc->docHandle(), emojiPosition); + c.setPosition(emojiPosition + emojiLen, QTextCursor::KeepAnchor); + int32 removedUpto = c.position(); + + insertEmoji(emoji, c); + + charsAdded -= removedUpto - position; + position = emojiPosition + 1; + + emoji = 0; + emojiPosition = 0; + } else { + break; + } + } + c.endEditBlock(); +} + +void InputArea::onDocumentContentsChange(int position, int charsRemoved, int charsAdded) { + if (_correcting) return; + + QString oldtext(_oldtext); + QTextCursor(_inner.document()->docHandle(), 0).joinPreviousEditBlock(); + + QTextCursor c(_inner.document()->docHandle(), 0); + c.movePosition(QTextCursor::End); + int pos = c.position(); + + _correcting = true; + if (_maxLength >= 0) { + QTextCursor c(_inner.document()->docHandle(), 0); + c.movePosition(QTextCursor::End); + int32 fullSize = c.position(), toRemove = fullSize - _maxLength; + if (toRemove > 0) { + if (toRemove > charsAdded) { + if (charsAdded) { + c.setPosition(position); + c.setPosition((position + charsAdded), QTextCursor::KeepAnchor); + c.removeSelectedText(); + } + c.setPosition(fullSize - (toRemove - charsAdded)); + c.setPosition(fullSize, QTextCursor::KeepAnchor); + c.removeSelectedText(); + position = _maxLength; + charsAdded = 0; + charsRemoved += toRemove; + } else { + c.setPosition(position + (charsAdded - toRemove)); + c.setPosition(position + charsAdded, QTextCursor::KeepAnchor); + c.removeSelectedText(); + charsAdded -= toRemove; + } + } + } + _correcting = false; + + QTextCursor(_inner.document()->docHandle(), 0).endEditBlock(); + + if (_inner.document()->availableRedoSteps() > 0) return; + + const int takeBack = 3; + + position -= takeBack; + charsAdded += takeBack; + if (position < 0) { + charsAdded += position; + position = 0; + } + if (charsAdded <= 0) return; + + _correcting = true; + QSizeF s = _inner.document()->pageSize(); + processDocumentContentsChange(position, charsAdded); + if (_inner.document()->pageSize() != s) { + _inner.document()->setPageSize(s); + } + _correcting = false; +} + +void InputArea::onDocumentContentsChanged() { + if (_correcting) return; + + if (_error) { + _error = false; + startBorderAnimation(); + } + + QString curText(getText()); + if (_oldtext != curText) { + _oldtext = curText; + emit changed(); + checkContentHeight(); + } + updatePlaceholder(); + if (App::wnd()) App::wnd()->updateGlobalMenu(); +} + +void InputArea::onUndoAvailable(bool avail) { + _undoAvailable = avail; + if (App::wnd()) App::wnd()->updateGlobalMenu(); +} + +void InputArea::onRedoAvailable(bool avail) { + _redoAvailable = avail; + if (App::wnd()) App::wnd()->updateGlobalMenu(); +} + +bool InputArea::animStep_placeholderFg(float64 ms) { + float dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + res = false; + a_placeholderFg.finish(); + } else { + a_placeholderFg.update(dt, anim::linear); + } + update(); + return res; +} + +bool InputArea::animStep_placeholderShift(float64 ms) { + float dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + res = false; + a_placeholderLeft.finish(); + a_placeholderOpacity.finish(); + } else { + a_placeholderLeft.update(dt, anim::linear); + a_placeholderOpacity.update(dt, anim::linear); + } + update(); + return res; +} + +bool InputArea::animStep_border(float64 ms) { + float dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + res = false; + a_borderFg.finish(); + a_borderOpacityActive.finish(); + } else { + a_borderFg.update(dt, anim::linear); + a_borderOpacityActive.update(dt, anim::linear); + } + update(); + return res; +} + +void InputArea::updatePlaceholder() { + bool placeholderVisible = _oldtext.isEmpty(); + if (placeholderVisible != _placeholderVisible) { + _placeholderVisible = placeholderVisible; + + a_placeholderLeft.start(_placeholderVisible ? 0 : _st.placeholderShift); + a_placeholderOpacity.start(_placeholderVisible ? 1 : 0); + _a_placeholderShift.start(); + } +} + +QMimeData *InputArea::InputAreaInner::createMimeDataFromSelection() const { + QMimeData *result = new QMimeData(); + QTextCursor c(textCursor()); + int32 start = c.selectionStart(), end = c.selectionEnd(); + if (end > start) { + result->setText(f()->getText(start, end)); + } + return result; +} + +void InputArea::customUpDown(bool custom) { + _customUpDown = custom; +} + +void InputArea::InputAreaInner::keyPressEvent(QKeyEvent *e) { + bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); + bool macmeta = (cPlatform() == dbipMac) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); + bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = (ctrl && f()->_ctrlEnterSubmit) || (!ctrl && !shift && !f()->_ctrlEnterSubmit) || (ctrl && shift); + bool enter = (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return); + + if (macmeta && e->key() == Qt::Key_Backspace) { + QTextCursor tc(textCursor()), start(tc); + start.movePosition(QTextCursor::StartOfLine); + tc.setPosition(start.position(), QTextCursor::KeepAnchor); + tc.removeSelectedText(); + } else if (enter && ctrlGood) { + emit f()->submitted(ctrl && shift); + } else if (e->key() == Qt::Key_Escape) { + e->ignore(); + emit f()->cancelled(); + } else if (e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) { + if (alt || ctrl) { + e->ignore(); + } else { + if (!focusNextPrevChild(e->key() == Qt::Key_Tab && !shift)) { + e->ignore(); + } + } + } else if (e->key() == Qt::Key_Search || e == QKeySequence::Find) { + e->ignore(); + } else if (f()->_customUpDown && (e->key() == Qt::Key_Up || e->key() == Qt::Key_Down)) { + e->ignore(); + } else { + QTextCursor tc(textCursor()); + if (enter && ctrl) { + e->setModifiers(e->modifiers() & ~Qt::ControlModifier); + } + QTextEdit::keyPressEvent(e); + if (tc == textCursor()) { + bool check = false; + if (e->key() == Qt::Key_PageUp || e->key() == Qt::Key_Up) { + tc.movePosition(QTextCursor::Start, e->modifiers().testFlag(Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor); + check = true; + } else if (e->key() == Qt::Key_PageDown || e->key() == Qt::Key_Down) { + tc.movePosition(QTextCursor::End, e->modifiers().testFlag(Qt::ShiftModifier) ? QTextCursor::KeepAnchor : QTextCursor::MoveAnchor); + check = true; + } + if (check) { + if (tc == textCursor()) { + e->ignore(); + } else { + setTextCursor(tc); + } + } + } + } +} + +void InputArea::InputAreaInner::paintEvent(QPaintEvent *e) { + return QTextEdit::paintEvent(e); +} + +void InputArea::resizeEvent(QResizeEvent *e) { + _placeholder = _st.font->elided(_placeholderFull, width() - _st.textMargins.left() - _st.textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1); + _inner.setGeometry(rect().marginsRemoved(_st.textMargins)); + TWidget::resizeEvent(e); + checkContentHeight(); +} + +void InputArea::showError() { + _error = true; + if (hasFocus()) { + startBorderAnimation(); + } else { + _inner.setFocus(); + } +} + +InputField::InputField(QWidget *parent, const style::InputField &st, const QString &ph, const QString &val) : TWidget(parent), +_maxLength(-1), +_inner(this, val), +_oldtext(val), + +_undoAvailable(false), +_redoAvailable(false), + +_customUpDown(false), + +_placeholderFull(ph), +_placeholderVisible(val.isEmpty()), +a_placeholderLeft(_placeholderVisible ? 0 : st.placeholderShift), +a_placeholderOpacity(_placeholderVisible ? 1 : 0), +a_placeholderFg(st.placeholderFg->c), +_a_placeholderFg(animFunc(this, &InputField::animStep_placeholderFg)), +_a_placeholderShift(animFunc(this, &InputField::animStep_placeholderShift)), + +a_borderOpacityActive(0), +a_borderFg(st.borderFg->c), +_a_border(animFunc(this, &InputField::animStep_border)), + +_focused(false), _error(false), + +_st(st), + +_touchPress(false), +_touchRightButton(false), +_touchMove(false), +_correcting(false) { + _inner.setAcceptRichText(false); + resize(_st.width, _st.height); + + _inner.setWordWrapMode(QTextOption::NoWrap); + _inner.setLineWrapMode(QTextEdit::NoWrap); + + setAttribute(Qt::WA_OpaquePaintEvent); + + _inner.setFont(_st.font->f); + _inner.setAlignment(_st.textAlign); + + _placeholder = _st.font->elided(_placeholderFull, width() - _st.textMargins.left() - _st.textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1); + + QPalette p(palette()); + p.setColor(QPalette::Text, _st.textFg->c); + setPalette(p); + + _inner.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + _inner.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + _inner.setFrameStyle(QFrame::NoFrame | QFrame::Plain); + _inner.viewport()->setAutoFillBackground(false); + + _inner.setContentsMargins(0, 0, 0, 0); + _inner.document()->setDocumentMargin(0); + + setAttribute(Qt::WA_AcceptTouchEvents); + _inner.viewport()->setAttribute(Qt::WA_AcceptTouchEvents); + _touchTimer.setSingleShot(true); + connect(&_touchTimer, SIGNAL(timeout()), this, SLOT(onTouchTimer())); + + connect(_inner.document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(onDocumentContentsChange(int, int, int))); + connect(_inner.document(), SIGNAL(contentsChanged()), this, SLOT(onDocumentContentsChanged())); + connect(&_inner, SIGNAL(undoAvailable(bool)), this, SLOT(onUndoAvailable(bool))); + connect(&_inner, SIGNAL(redoAvailable(bool)), this, SLOT(onRedoAvailable(bool))); + if (App::wnd()) connect(&_inner, SIGNAL(selectionChanged()), App::wnd(), SLOT(updateGlobalMenu())); + + setCursor(style::cur_text); } void InputField::onTouchTimer() { _touchRightButton = true; } -InputField::InputFieldInner::InputFieldInner(InputField *parent, const QString &val) : QTextEdit(val, parent) { +InputField::InputFieldInner::InputFieldInner(InputField *parent, const QString &val) : QTextEdit(parent) { + if (!val.isEmpty()) { + setPlainText(val); + } } bool InputField::InputFieldInner::viewportEvent(QEvent *e) { @@ -542,29 +1323,25 @@ void InputField::touchEvent(QTouchEvent *e) { } } -int32 InputField::fakeMargin() const { - return _fakeMargin; -} - void InputField::paintEvent(QPaintEvent *e) { Painter p(this); QRect r(rect().intersected(e->rect())); p.fillRect(r, st::white->b); - if (_st->border) { - p.fillRect(0, height() - _st->border, width(), _st->border, _st->borderFg->b); + if (_st.border) { + p.fillRect(0, height() - _st.border, width(), _st.border, _st.borderFg->b); } - if (_st->borderActive && a_borderOpacityActive.current() > 0) { + if (_st.borderActive && a_borderOpacityActive.current() > 0) { p.setOpacity(a_borderOpacityActive.current()); - p.fillRect(0, height() - _st->borderActive, width(), _st->borderActive, a_borderFg.current()); + p.fillRect(0, height() - _st.borderActive, width(), _st.borderActive, a_borderFg.current()); p.setOpacity(1); } - if (_st->iconSprite.pxWidth()) { - p.drawSpriteLeft(_st->iconPosition, width(), _st->iconSprite); + if (_st.iconSprite.pxWidth()) { + p.drawSpriteLeft(_st.iconPosition, width(), _st.iconSprite); } bool drawPlaceholder = _placeholderVisible; - if (_placeholderShiftAnim.animating()) { + if (_a_placeholderShift.animating()) { p.setOpacity(a_placeholderOpacity.current()); drawPlaceholder = true; } @@ -572,19 +1349,25 @@ void InputField::paintEvent(QPaintEvent *e) { p.save(); p.setClipRect(r); - QRect r(rect().marginsRemoved(_st->textMargins + _st->placeholderMargins)); + QRect r(rect().marginsRemoved(_st.textMargins + _st.placeholderMargins)); r.moveLeft(r.left() + a_placeholderLeft.current()); if (rtl()) r.moveLeft(width() - r.left() - r.width()); - p.setFont(_st->font->f); + p.setFont(_st.font); p.setPen(a_placeholderFg.current()); - p.drawText(r, _placeholder, _st->placeholderAlign); + p.drawText(r, _placeholder, _st.placeholderAlign); p.restore(); } TWidget::paintEvent(e); } +void InputField::startBorderAnimation() { + a_borderFg.start((_error ? _st.borderFgError : (_focused ? _st.borderFgActive : _st.borderFg))->c); + a_borderOpacityActive.start((_error || _focused) ? 1 : 0); + _a_border.start(); +} + void InputField::focusInEvent(QFocusEvent *e) { _inner.setFocus(); } @@ -607,12 +1390,10 @@ void InputField::focusInInner() { if (!_focused) { _focused = true; - a_placeholderFg.start(_st->placeholderFgActive->c); - _placeholderFgAnim.start(); + a_placeholderFg.start(_st.placeholderFgActive->c); + _a_placeholderFg.start(); - a_borderFg.start((_error ? _st->borderFgError : _st->borderFgActive)->c); - a_borderOpacityActive.start(1); - _borderAnim.start(); + startBorderAnimation(); } } @@ -626,12 +1407,10 @@ void InputField::focusOutInner() { if (_focused) { _focused = false; - a_placeholderFg.start(_st->placeholderFg->c); - _placeholderFgAnim.start(); + a_placeholderFg.start(_st.placeholderFg->c); + _a_placeholderFg.start(); - a_borderFg.start((_error ? _st->borderFgError : _st->borderFg)->c); - a_borderOpacityActive.start(_error ? 1 : 0); - _borderAnim.start(); + startBorderAnimation(); } } @@ -744,7 +1523,7 @@ bool InputField::isRedoAvailable() const { void InputField::insertEmoji(EmojiPtr emoji, QTextCursor c) { QTextImageFormat imageFormat; - int32 ew = ESize + st::emojiPadding * cIntRetinaFactor() * 2, eh = _st->font->height * cIntRetinaFactor(); + int32 ew = ESize + st::emojiPadding * cIntRetinaFactor() * 2, eh = _st.font->height * cIntRetinaFactor(); imageFormat.setWidth(ew / cIntRetinaFactor()); imageFormat.setHeight(eh / cIntRetinaFactor()); imageFormat.setName(qsl("emoji://e.") + QString::number(emojiKey(emoji), 16)); @@ -758,7 +1537,7 @@ QVariant InputField::InputFieldInner::loadResource(int type, const QUrl &name) { QString imageName = name.toDisplayString(); if (imageName.startsWith(qstr("emoji://e."))) { if (EmojiPtr emoji = emojiFromUrl(imageName)) { - return QVariant(App::emojiSingle(emoji, f()->_st->font->height)); + return QVariant(App::emojiSingle(emoji, f()->_st.font->height)); } } return QVariant(); @@ -838,17 +1617,6 @@ void InputField::processDocumentContentsChange(int position, int charsAdded) { insertEmoji(emoji, c); - for (Insertions::iterator i = _insertions.begin(), e = _insertions.end(); i != e; ++i) { - if (i->first >= removedUpto) { - i->first -= removedUpto - emojiPosition - 1; - } else if (i->first >= emojiPosition) { - i->second -= removedUpto - emojiPosition; - i->first = emojiPosition + 1; - } else if (i->first + i->second > emojiPosition + 1) { - i->second -= qMin(removedUpto, i->first + i->second) - emojiPosition; - } - } - charsAdded -= removedUpto - position; position = emojiPosition + 1; @@ -862,7 +1630,44 @@ void InputField::processDocumentContentsChange(int position, int charsAdded) { } void InputField::onDocumentContentsChange(int position, int charsRemoved, int charsAdded) { - if (_replacingEmojis) return; + if (_correcting) return; + + QString oldtext(_oldtext); + QTextCursor(_inner.document()->docHandle(), 0).joinPreviousEditBlock(); + + QTextCursor c(_inner.document()->docHandle(), 0); + c.movePosition(QTextCursor::End); + int pos = c.position(); + + _correcting = true; + if (_maxLength >= 0) { + QTextCursor c(_inner.document()->docHandle(), 0); + c.movePosition(QTextCursor::End); + int32 fullSize = c.position(), toRemove = fullSize - _maxLength; + if (toRemove > 0) { + if (toRemove > charsAdded) { + if (charsAdded) { + c.setPosition(position); + c.setPosition((position + charsAdded), QTextCursor::KeepAnchor); + c.removeSelectedText(); + } + c.setPosition(fullSize - (toRemove - charsAdded)); + c.setPosition(fullSize, QTextCursor::KeepAnchor); + c.removeSelectedText(); + position = _maxLength; + charsAdded = 0; + charsRemoved += toRemove; + } else { + c.setPosition(position + (charsAdded - toRemove)); + c.setPosition(position + charsAdded, QTextCursor::KeepAnchor); + c.removeSelectedText(); + charsAdded -= toRemove; + } + } + } + _correcting = false; + + QTextCursor(_inner.document()->docHandle(), 0).endEditBlock(); if (_inner.document()->availableRedoSteps() > 0) return; @@ -876,39 +1681,21 @@ void InputField::onDocumentContentsChange(int position, int charsRemoved, int ch } if (charsAdded <= 0) return; - // _insertions.push_back(Insertion(position, charsAdded)); - _replacingEmojis = true; + _correcting = true; QSizeF s = _inner.document()->pageSize(); processDocumentContentsChange(position, charsAdded); if (_inner.document()->pageSize() != s) { _inner.document()->setPageSize(s); } - _replacingEmojis = false; + _correcting = false; } void InputField::onDocumentContentsChanged() { - if (_replacingEmojis) return; + if (_correcting) return; - if (!_insertions.isEmpty()) { - if (_inner.document()->availableRedoSteps() > 0) { - _insertions.clear(); - } else { - _replacingEmojis = true; - QSizeF s = _inner.document()->pageSize(); - - do { - Insertion i = _insertions.front(); - _insertions.pop_front(); - if (i.second > 0) { - processDocumentContentsChange(i.first, i.second); - } - } while (!_insertions.isEmpty()); - - if (_inner.document()->pageSize() != s) { - _inner.document()->setPageSize(s); - } - _replacingEmojis = false; - } + if (_error) { + _error = false; + startBorderAnimation(); } QString curText(getText()); @@ -930,8 +1717,8 @@ void InputField::onRedoAvailable(bool avail) { if (App::wnd()) App::wnd()->updateGlobalMenu(); } -bool InputField::placeholderFgStep(float64 ms) { - float dt = ms / _st->duration; +bool InputField::animStep_placeholderFg(float64 ms) { + float dt = ms / _st.duration; bool res = true; if (dt >= 1) { res = false; @@ -943,8 +1730,8 @@ bool InputField::placeholderFgStep(float64 ms) { return res; } -bool InputField::placeholderShiftStep(float64 ms) { - float dt = ms / _st->duration; +bool InputField::animStep_placeholderShift(float64 ms) { + float dt = ms / _st.duration; bool res = true; if (dt >= 1) { res = false; @@ -958,8 +1745,8 @@ bool InputField::placeholderShiftStep(float64 ms) { return res; } -bool InputField::borderStep(float64 ms) { - float dt = ms / _st->duration; +bool InputField::animStep_border(float64 ms) { + float dt = ms / _st.duration; bool res = true; if (dt >= 1) { res = false; @@ -972,24 +1759,18 @@ bool InputField::borderStep(float64 ms) { update(); return res; } -const QString &InputField::getLastText() const { - return _oldtext; -} void InputField::updatePlaceholder() { bool placeholderVisible = _oldtext.isEmpty(); if (placeholderVisible != _placeholderVisible) { _placeholderVisible = placeholderVisible; - a_placeholderLeft.start(_placeholderVisible ? 0 : _st->placeholderShift); + a_placeholderLeft.start(_placeholderVisible ? 0 : _st.placeholderShift); a_placeholderOpacity.start(_placeholderVisible ? 1 : 0); - _placeholderShiftAnim.start(); + _a_placeholderShift.start(); } } -void InputField::correctValue(QKeyEvent *e, const QString &was) { -} - QMimeData *InputField::InputFieldInner::createMimeDataFromSelection() const { QMimeData *result = new QMimeData(); QTextCursor c(textCursor()); @@ -1005,7 +1786,7 @@ void InputField::customUpDown(bool custom) { } void InputField::InputFieldInner::keyPressEvent(QKeyEvent *e) { - bool shift = e->modifiers().testFlag(Qt::ShiftModifier); + bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); bool macmeta = (cPlatform() == dbipMac) && e->modifiers().testFlag(Qt::ControlModifier) && !e->modifiers().testFlag(Qt::MetaModifier) && !e->modifiers().testFlag(Qt::AltModifier); bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = true; bool enter = (e->key() == Qt::Key_Enter || e->key() == Qt::Key_Return); @@ -1018,12 +1799,15 @@ void InputField::InputFieldInner::keyPressEvent(QKeyEvent *e) { } else if (enter && ctrlGood) { emit f()->submitted(ctrl && shift); } else if (e->key() == Qt::Key_Escape) { + e->ignore(); emit f()->cancelled(); - } else if (e->key() == Qt::Key_Tab || (ctrl && e->key() == Qt::Key_Backtab)) { - if (ctrl) { + } else if (e->key() == Qt::Key_Tab || e->key() == Qt::Key_Backtab) { + if (alt || ctrl) { e->ignore(); } else { - emit f()->tabbed(); + if (!focusNextPrevChild(e->key() == Qt::Key_Tab && !shift)) { + e->ignore(); + } } } else if (e->key() == Qt::Key_Search || e == QKeySequence::Find) { e->ignore(); @@ -1060,7 +1844,466 @@ void InputField::InputFieldInner::paintEvent(QPaintEvent *e) { } void InputField::resizeEvent(QResizeEvent *e) { - _placeholder = _st->font->elided(_placeholderFull, width() - _st->textMargins.left() - _st->textMargins.right() - _st->placeholderMargins.left() - _st->placeholderMargins.right() - 1); - _inner.setGeometry(rect().marginsRemoved(_st->textMargins)); + _placeholder = _st.font->elided(_placeholderFull, width() - _st.textMargins.left() - _st.textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1); + _inner.setGeometry(rect().marginsRemoved(_st.textMargins)); TWidget::resizeEvent(e); } + +void InputField::showError() { + _error = true; + if (hasFocus()) { + startBorderAnimation(); + } else { + _inner.setFocus(); + } +} + +MaskedInputField::MaskedInputField(QWidget *parent, const style::InputField &st, const QString &placeholder, const QString &val) : QLineEdit(val, parent), +_st(st), +_maxLength(-1), +_oldtext(val), + +_undoAvailable(false), +_redoAvailable(false), + +_customUpDown(false), + +_placeholderFull(placeholder), +_placeholderVisible(val.isEmpty()), +_placeholderFast(false), +a_placeholderLeft(_placeholderVisible ? 0 : st.placeholderShift), +a_placeholderOpacity(_placeholderVisible ? 1 : 0), +a_placeholderFg(st.placeholderFg->c), +_a_placeholderFg(animFunc(this, &MaskedInputField::animStep_placeholderFg)), +_a_placeholderShift(animFunc(this, &MaskedInputField::animStep_placeholderShift)), + +a_borderOpacityActive(0), +a_borderFg(st.borderFg->c), +_a_border(animFunc(this, &MaskedInputField::animStep_border)), + +_focused(false), _error(false), + +_touchPress(false), +_touchRightButton(false), +_touchMove(false) { + resize(_st.width, _st.height); + + setFont(_st.font->f); + setAlignment(_st.textAlign); + + QPalette p(palette()); + p.setColor(QPalette::Text, _st.textFg->c); + setPalette(p); + + setAttribute(Qt::WA_OpaquePaintEvent); + + connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(onTextChange(const QString&))); + connect(this, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(onCursorPositionChanged(int,int))); + + connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(onTextEdited())); + if (App::wnd()) connect(this, SIGNAL(selectionChanged()), App::wnd(), SLOT(updateGlobalMenu())); + + setStyle(&_inputFieldStyle); + QLineEdit::setTextMargins(0, 0, 0, 0); + setContentsMargins(0, 0, 0, 0); + + setAttribute(Qt::WA_AcceptTouchEvents); + _touchTimer.setSingleShot(true); + connect(&_touchTimer, SIGNAL(timeout()), this, SLOT(onTouchTimer())); + + setTextMargins(_st.textMargins); + updatePlaceholder(); +} + +void MaskedInputField::customUpDown(bool custom) { + _customUpDown = custom; +} + +void MaskedInputField::setTextMargins(const QMargins &mrg) { + _textMargins = mrg; + _placeholder = _st.font->elided(_placeholderFull, width() - _textMargins.left() - _textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1); +} + +void MaskedInputField::onTouchTimer() { + _touchRightButton = true; +} + +bool MaskedInputField::event(QEvent *e) { + if (e->type() == QEvent::TouchBegin || e->type() == QEvent::TouchUpdate || e->type() == QEvent::TouchEnd || e->type() == QEvent::TouchCancel) { + QTouchEvent *ev = static_cast(e); + if (ev->device()->type() == QTouchDevice::TouchScreen) { + touchEvent(ev); + return QLineEdit::event(e); + } + } + return QLineEdit::event(e); +} + +void MaskedInputField::touchEvent(QTouchEvent *e) { + switch (e->type()) { + case QEvent::TouchBegin: + if (_touchPress || e->touchPoints().isEmpty()) return; + _touchTimer.start(QApplication::startDragTime()); + _touchPress = true; + _touchMove = _touchRightButton = false; + _touchStart = e->touchPoints().cbegin()->screenPos().toPoint(); + break; + + case QEvent::TouchUpdate: + if (!_touchPress || e->touchPoints().isEmpty()) return; + if (!_touchMove && (e->touchPoints().cbegin()->screenPos().toPoint() - _touchStart).manhattanLength() >= QApplication::startDragDistance()) { + _touchMove = true; + } + break; + + case QEvent::TouchEnd: + if (!_touchPress) return; + if (!_touchMove && window()) { + Qt::MouseButton btn(_touchRightButton ? Qt::RightButton : Qt::LeftButton); + QPoint mapped(mapFromGlobal(_touchStart)), winMapped(window()->mapFromGlobal(_touchStart)); + + if (_touchRightButton) { + QContextMenuEvent contextEvent(QContextMenuEvent::Mouse, mapped, _touchStart); + contextMenuEvent(&contextEvent); + } + } + _touchTimer.stop(); + _touchPress = _touchMove = _touchRightButton = false; + break; + + case QEvent::TouchCancel: + _touchPress = false; + _touchTimer.stop(); + break; + } +} + +QRect MaskedInputField::getTextRect() const { + return rect().marginsRemoved(_textMargins + QMargins(-2, -1, -2, -1)); +} + +void MaskedInputField::paintEvent(QPaintEvent *e) { + Painter p(this); + + QRect r(rect().intersected(e->rect())); + p.fillRect(r, st::white->b); + if (_st.border) { + p.fillRect(0, height() - _st.border, width(), _st.border, _st.borderFg->b); + } + if (_st.borderActive && a_borderOpacityActive.current() > 0) { + p.setOpacity(a_borderOpacityActive.current()); + p.fillRect(0, height() - _st.borderActive, width(), _st.borderActive, a_borderFg.current()); + p.setOpacity(1); + } + if (_st.iconSprite.pxWidth()) { + p.drawSpriteLeft(_st.iconPosition, width(), _st.iconSprite); + } + + p.setClipRect(r); + paintPlaceholder(p); + + QLineEdit::paintEvent(e); +} + +void MaskedInputField::startBorderAnimation() { + a_borderFg.start((_error ? _st.borderFgError : (_focused ? _st.borderFgActive : _st.borderFg))->c); + a_borderOpacityActive.start((_error || _focused) ? 1 : 0); + _a_border.start(); +} + +void MaskedInputField::focusInEvent(QFocusEvent *e) { + if (!_focused) { + _focused = true; + + a_placeholderFg.start(_st.placeholderFgActive->c); + _a_placeholderFg.start(); + + startBorderAnimation(); + } + QLineEdit::focusInEvent(e); + emit focused(); +} + +void MaskedInputField::focusOutEvent(QFocusEvent *e) { + if (_focused) { + _focused = false; + + a_placeholderFg.start(_st.placeholderFg->c); + _a_placeholderFg.start(); + + startBorderAnimation(); + } + QLineEdit::focusOutEvent(e); + emit blurred(); +} + +void MaskedInputField::resizeEvent(QResizeEvent *e) { + _placeholder = _st.font->elided(_placeholderFull, width() - _textMargins.left() - _textMargins.right() - _st.placeholderMargins.left() - _st.placeholderMargins.right() - 1); + QLineEdit::resizeEvent(e); +} + +void MaskedInputField::showError() { + _error = true; + if (hasFocus()) { + startBorderAnimation(); + } else { + setFocus(); + } +} + +QSize MaskedInputField::sizeHint() const { + return geometry().size(); +} + +QSize MaskedInputField::minimumSizeHint() const { + return geometry().size(); +} + +bool MaskedInputField::animStep_placeholderFg(float64 ms) { + float dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + res = false; + a_placeholderFg.finish(); + } else { + a_placeholderFg.update(dt, anim::linear); + } + update(); + return res; +} + +bool MaskedInputField::animStep_placeholderShift(float64 ms) { + float dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + res = false; + a_placeholderLeft.finish(); + a_placeholderOpacity.finish(); + } else { + a_placeholderLeft.update(dt, anim::linear); + a_placeholderOpacity.update(dt, anim::linear); + } + update(); + return res; +} + +bool MaskedInputField::animStep_border(float64 ms) { + float dt = ms / _st.duration; + bool res = true; + if (dt >= 1) { + res = false; + a_borderFg.finish(); + a_borderOpacityActive.finish(); + } else { + a_borderFg.update(dt, anim::linear); + a_borderOpacityActive.update(dt, anim::linear); + } + update(); + return res; +} + +void MaskedInputField::setPlaceholder(const QString &placeholder) { + _placeholderFull = placeholder; + resizeEvent(0); + update(); +} + +void MaskedInputField::setPlaceholderFast(bool fast) { + _placeholderFast = fast; + if (_placeholderFast) { + a_placeholderLeft = anim::ivalue(_placeholderVisible ? 0 : _st.placeholderShift, _placeholderVisible ? 0 : _st.placeholderShift); + a_placeholderOpacity = anim::fvalue(_placeholderVisible ? 1 : 0, _placeholderVisible ? 1 : 0); + update(); + } +} + +void MaskedInputField::updatePlaceholder() { + bool placeholderVisible = _oldtext.isEmpty(); + if (placeholderVisible != _placeholderVisible) { + _placeholderVisible = placeholderVisible; + + if (_placeholderFast) { + a_placeholderLeft = anim::ivalue(_placeholderVisible ? 0 : _st.placeholderShift, _placeholderVisible ? 0 : _st.placeholderShift); + a_placeholderOpacity = anim::fvalue(_placeholderVisible ? 1 : 0, _placeholderVisible ? 1 : 0); + update(); + } else { + a_placeholderLeft.start(_placeholderVisible ? 0 : _st.placeholderShift); + a_placeholderOpacity.start(_placeholderVisible ? 1 : 0); + _a_placeholderShift.start(); + } + } +} + +const QString &MaskedInputField::placeholder() const { + return _placeholderFull; +} + +QRect MaskedInputField::placeholderRect() const { + return rect().marginsRemoved(_st.textMargins + _st.placeholderMargins); +} + +void MaskedInputField::correctValue(const QString &was, int32 wasCursor, QString &now, int32 &nowCursor) { +} + +void MaskedInputField::paintPlaceholder(Painter &p) { + bool drawPlaceholder = _placeholderVisible; + if (_a_placeholderShift.animating()) { + p.setOpacity(a_placeholderOpacity.current()); + drawPlaceholder = true; + } + if (drawPlaceholder) { + p.save(); + + QRect phRect(placeholderRect()); + phRect.moveLeft(phRect.left() + a_placeholderLeft.current()); + if (rtl()) phRect.moveLeft(width() - phRect.left() - phRect.width()); + + placeholderPreparePaint(p); + p.drawText(phRect, _placeholder, _st.placeholderAlign); + + p.restore(); + } +} + +void MaskedInputField::placeholderPreparePaint(Painter &p) { + p.setFont(_st.font); + p.setPen(a_placeholderFg.current()); +} + +void MaskedInputField::keyPressEvent(QKeyEvent *e) { + QString wasText(_oldtext); + int32 wasCursor(_oldcursor); + + bool shift = e->modifiers().testFlag(Qt::ShiftModifier), alt = e->modifiers().testFlag(Qt::AltModifier); + bool ctrl = e->modifiers().testFlag(Qt::ControlModifier) || e->modifiers().testFlag(Qt::MetaModifier), ctrlGood = true; + if (_customUpDown && (e->key() == Qt::Key_Up || e->key() == Qt::Key_Down)) { + e->ignore(); + } else { + QLineEdit::keyPressEvent(e); + } + + QString newText(text()); + int32 newCursor(cursorPosition()); + if (wasText == newText && wasCursor == newCursor) { // call correct manually + correctValue(wasText, wasCursor, newText, newCursor); + _oldtext = newText; + _oldcursor = newCursor; + if (wasText != _oldtext) emit changed(); + updatePlaceholder(); + } + if (e->key() == Qt::Key_Escape) { + e->ignore(); + emit cancelled(); + } else if (e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter) { + emit submitted(ctrl && shift); + } +} + +void MaskedInputField::onTextEdited() { + QString wasText(_oldtext), newText(text()); + int32 wasCursor(_oldcursor), newCursor(cursorPosition()); + + correctValue(wasText, wasCursor, newText, newCursor); + _oldtext = newText; + _oldcursor = newCursor; + if (wasText != _oldtext) emit changed(); + updatePlaceholder(); + + if (App::wnd()) App::wnd()->updateGlobalMenu(); +} + +void MaskedInputField::onTextChange(const QString &text) { + _oldtext = text; + if (_error) { + _error = false; + startBorderAnimation(); + } + if (App::wnd()) App::wnd()->updateGlobalMenu(); +} + +void MaskedInputField::onCursorPositionChanged(int oldPosition, int position) { + _oldcursor = position; +} + +PortInput::PortInput(QWidget *parent, const style::InputField &st, const QString &ph, const QString &val) : MaskedInputField(parent, st, ph, val) { + if (!val.toInt() || val.toInt() > 65535) { + setText(QString()); + } +} + +void PortInput::correctValue(const QString &was, int32 wasCursor, QString &now, int32 &nowCursor) { + QString newText; + newText.reserve(now.size()); + int32 newCursor = nowCursor; + for (int32 i = 0, l = now.size(); i < l; ++i) { + if (now.at(i).isDigit()) { + newText.append(now.at(i)); + } else if (i < nowCursor) { + --newCursor; + } + } + if (!newText.toInt()) { + newText = QString(); + newCursor = 0; + } else if (newText.toInt() > 65535) { + newText = was; + newCursor = wasCursor; + } + if (newText != now) { + now = newText; + setText(newText); + } + if (newCursor != nowCursor) { + nowCursor = newCursor; + setCursorPosition(newCursor); + } +} + +UsernameInput::UsernameInput(QWidget *parent, const style::InputField &st, const QString &ph, const QString &val, bool isLink) : MaskedInputField(parent, st, ph, val), +_linkPlaceholder(isLink ? qsl("telegram.me/") : QString()) { + if (!_linkPlaceholder.isEmpty()) { + setTextMargins(style::margins(_st.textMargins.left() + _st.font->width(_linkPlaceholder), _st.textMargins.top(), _st.textMargins.right(), _st.textMargins.bottom())); + } +} + +void UsernameInput::paintPlaceholder(Painter &p) { + if (_linkPlaceholder.isEmpty()) { + MaskedInputField::paintPlaceholder(p); + } else { + p.setFont(_st.font); + p.setPen(_st.placeholderFg); + p.drawText(QRect(_st.textMargins.left(), _st.textMargins.top(), width(), height() - _st.textMargins.top() - _st.textMargins.bottom()), _linkPlaceholder, style::al_topleft); + } +} + +void UsernameInput::correctValue(const QString &was, int32 wasCursor, QString &now, int32 &nowCursor) { + QString newText; + int32 newCursor = nowCursor, from, len = now.size(); + for (from = 0; from < len; ++from) { + if (!now.at(from).isSpace()) { + break; + } + if (newCursor > 0) --newCursor; + } + len -= from; + if (len > MaxUsernameLength) len = MaxUsernameLength + (now.at(from) == '@' ? 1 : 0); + for (int32 to = from + len; to > from;) { + --to; + if (!now.at(to).isSpace()) { + break; + } + --len; + } + newText = now.mid(from, len); + if (newCursor > len) { + newCursor = len; + } + if (newText != now) { + now = newText; + setText(newText); + } + if (newCursor != nowCursor) { + nowCursor = newCursor; + setCursorPosition(newCursor); + } +} diff --git a/Telegram/SourceFiles/gui/flatinput.h b/Telegram/SourceFiles/gui/flatinput.h index f9ddf0fe1..3f506c52a 100644 --- a/Telegram/SourceFiles/gui/flatinput.h +++ b/Telegram/SourceFiles/gui/flatinput.h @@ -20,7 +20,6 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org */ #pragma once -#include #include "style.h" #include "animation.h" @@ -56,11 +55,11 @@ public: QSize minimumSizeHint() const; void customUpDown(bool isCustom); - QString getLastText() const { - return text(); + const QString &getLastText() const { + return _oldtext; } - void setTextMargin(const QMargins &mrg); + void setTextMargins(const QMargins &mrg); public slots: @@ -73,13 +72,13 @@ signals: void changed(); void cancelled(); - void accepted(); + void submitted(bool ctrlShiftEnter); void focused(); void blurred(); protected: - virtual void correctValue(QKeyEvent *e, const QString &was); + virtual void correctValue(const QString &was, QString &now); style::font phFont() { return _st.font; @@ -89,9 +88,8 @@ protected: private: - QString _ph, _fullph, _oldtext; + QString _oldtext, _ph, _fullph; bool _fastph; - QKeyEvent *_kev; bool _customUpDown; @@ -117,7 +115,7 @@ public: CountryCodeInput(QWidget *parent, const style::flatInput &st); - public slots: +public slots: void startErasing(QKeyEvent *e); void codeSelected(const QString &code); @@ -129,7 +127,7 @@ signals: protected: - void correctValue(QKeyEvent *e, const QString &was); + void correctValue(const QString &was, QString &now); private: @@ -137,24 +135,41 @@ private: }; - -class UsernameInput : public FlatInput { -public: - - UsernameInput(QWidget *parent, const style::flatInput &st, const QString &ph = QString(), const QString &val = QString()); - -protected: - - void correctValue(QKeyEvent *e, const QString &was); - -}; - -class InputField : public TWidget { +class PhoneInput : public FlatInput { Q_OBJECT public: - InputField(QWidget *parent, const style::InputField &st, const QString &ph = QString(), const QString &val = QString()); + PhoneInput(QWidget *parent, const style::flatInput &st); + + void paintEvent(QPaintEvent *e); + void keyPressEvent(QKeyEvent *e); + +public slots: + + void addedToNumber(const QString &added); + void onChooseCode(const QString &code); + +signals: + + void voidBackspace(QKeyEvent *e); + +protected: + + void correctValue(const QString &was, QString &now); + +private: + + QVector pattern; + +}; + +class InputArea : public TWidget { + Q_OBJECT + +public: + + InputArea(QWidget *parent, const style::InputArea &st, const QString &ph = QString(), const QString &val = QString()); void touchEvent(QTouchEvent *e); void paintEvent(QPaintEvent *e); @@ -163,14 +178,20 @@ public: void contextMenuEvent(QContextMenuEvent *e); void resizeEvent(QResizeEvent *e); - const QString &getLastText() const; + void showError(); + + void setMaxLength(int32 maxLength) { + _maxLength = maxLength; + } + + const QString &getLastText() const { + return _oldtext; + } void updatePlaceholder(); - int32 fakeMargin() const; - - bool placeholderFgStep(float64 ms); - bool placeholderShiftStep(float64 ms); - bool borderStep(float64 ms); + bool animStep_placeholderFg(float64 ms); + bool animStep_placeholderShift(float64 ms); + bool animStep_border(float64 ms); QSize sizeHint() const; QSize minimumSizeHint() const; @@ -190,12 +211,181 @@ public: return _inner.textCursor(); } void setText(const QString &text) { - return _inner.setText(text); + _inner.setText(text); + updatePlaceholder(); } void clear() { - return _inner.clear(); + _inner.clear(); + updatePlaceholder(); + } + bool hasFocus() const { + return _inner.hasFocus(); } +public slots: + + void onTouchTimer(); + + void onDocumentContentsChange(int position, int charsRemoved, int charsAdded); + void onDocumentContentsChanged(); + + void onUndoAvailable(bool avail); + void onRedoAvailable(bool avail); + +signals: + + void changed(); + void submitted(bool ctrlShiftEnter); + void cancelled(); + void tabbed(); + + void focused(); + void blurred(); + void resized(); + +protected: + + void insertEmoji(EmojiPtr emoji, QTextCursor c); + TWidget *tparent() { + return qobject_cast(parentWidget()); + } + const TWidget *tparent() const { + return qobject_cast(parentWidget()); + } + +private: + + int32 _maxLength; + bool heightAutoupdated(); + void checkContentHeight(); + + friend class InputAreaInner; + class InputAreaInner : public QTextEdit { + public: + InputAreaInner(InputArea *parent, const QString &val = QString()); + + bool viewportEvent(QEvent *e); + void focusInEvent(QFocusEvent *e); + void focusOutEvent(QFocusEvent *e); + void keyPressEvent(QKeyEvent *e); + void paintEvent(QPaintEvent *e); + + QMimeData *createMimeDataFromSelection() const; + + QVariant loadResource(int type, const QUrl &name); + + private: + + InputArea *f() const { + return static_cast(parentWidget()); + } + friend class InputArea; + }; + + void focusInInner(); + void focusOutInner(); + + void processDocumentContentsChange(int position, int charsAdded); + + void startBorderAnimation(); + + InputAreaInner _inner; + + QString _oldtext; + + bool _undoAvailable, _redoAvailable, _inHeightCheck, _ctrlEnterSubmit; + + bool _customUpDown; + + QString _placeholder, _placeholderFull; + bool _placeholderVisible; + anim::ivalue a_placeholderLeft; + anim::fvalue a_placeholderOpacity; + anim::cvalue a_placeholderFg; + Animation _a_placeholderFg, _a_placeholderShift; + + anim::fvalue a_borderOpacityActive; + anim::cvalue a_borderFg; + Animation _a_border; + + bool _focused, _error; + + const style::InputArea &_st; + + QTimer _touchTimer; + bool _touchPress, _touchRightButton, _touchMove; + QPoint _touchStart; + + bool _correcting; +}; + +class InputField : public TWidget { + Q_OBJECT + +public: + + InputField(QWidget *parent, const style::InputField &st, const QString &ph = QString(), const QString &val = QString()); + + void touchEvent(QTouchEvent *e); + void paintEvent(QPaintEvent *e); + void focusInEvent(QFocusEvent *e); + void mousePressEvent(QMouseEvent *e); + void contextMenuEvent(QContextMenuEvent *e); + void resizeEvent(QResizeEvent *e); + + void showError(); + + const QString &getLastText() const { + return _oldtext; + } + void updatePlaceholder(); + + bool animStep_placeholderFg(float64 ms); + bool animStep_placeholderShift(float64 ms); + bool animStep_border(float64 ms); + + QSize sizeHint() const; + QSize minimumSizeHint() const; + + QString getText(int32 start = 0, int32 end = -1) const; + bool hasText() const; + + bool isUndoAvailable() const; + bool isRedoAvailable() const; + + void customUpDown(bool isCustom); + + void setTextCursor(const QTextCursor &cursor) { + return _inner.setTextCursor(cursor); + } + QTextCursor textCursor() const { + return _inner.textCursor(); + } + void setText(const QString &text) { + _inner.setText(text); + updatePlaceholder(); + } + void clear() { + _inner.clear(); + updatePlaceholder(); + } + bool hasFocus() const { + return _inner.hasFocus(); + } + void setFocus() { + _inner.setFocus(); + QTextCursor c(_inner.textCursor()); + c.movePosition(QTextCursor::End); + _inner.setTextCursor(c); + } + void clearFocus() { + _inner.clearFocus(); + } + void setCursorPosition(int pos) { + QTextCursor c(_inner.textCursor()); + c.setPosition(pos); + _inner.setTextCursor(c); + } public slots: @@ -219,8 +409,6 @@ signals: protected: - virtual void correctValue(QKeyEvent *e, const QString &was); - void insertEmoji(EmojiPtr emoji, QTextCursor c); TWidget *tparent() { return qobject_cast(parentWidget()); @@ -231,6 +419,8 @@ protected: private: + int32 _maxLength; + friend class InputFieldInner; class InputFieldInner : public QTextEdit { public: @@ -253,20 +443,20 @@ private: } friend class InputField; }; - InputFieldInner _inner; + void focusInInner(); void focusOutInner(); void processDocumentContentsChange(int position, int charsAdded); - QString _oldtext; + void startBorderAnimation(); - QKeyEvent *_keyEvent; + InputFieldInner _inner; + + QString _oldtext; bool _undoAvailable, _redoAvailable; - int32 _fakeMargin; - bool _customUpDown; QString _placeholder, _placeholderFull; @@ -274,22 +464,158 @@ private: anim::ivalue a_placeholderLeft; anim::fvalue a_placeholderOpacity; anim::cvalue a_placeholderFg; - Animation _placeholderFgAnim, _placeholderShiftAnim; + Animation _a_placeholderFg, _a_placeholderShift; anim::fvalue a_borderOpacityActive; anim::cvalue a_borderFg; - Animation _borderAnim; + Animation _a_border; bool _focused, _error; - const style::InputField *_st; + const style::InputField &_st; QTimer _touchTimer; bool _touchPress, _touchRightButton, _touchMove; QPoint _touchStart; - bool _replacingEmojis; - typedef QPair Insertion; - typedef QList Insertions; - Insertions _insertions; + bool _correcting; +}; + +class MaskedInputField : public QLineEdit { + Q_OBJECT + T_WIDGET + +public: + + MaskedInputField(QWidget *parent, const style::InputField &st, const QString &placeholder = QString(), const QString &val = QString()); + + bool event(QEvent *e); + void touchEvent(QTouchEvent *e); + void paintEvent(QPaintEvent *e); + void focusInEvent(QFocusEvent *e); + void focusOutEvent(QFocusEvent *e); + void keyPressEvent(QKeyEvent *e); + void resizeEvent(QResizeEvent *e); + + void showError(); + + void setPlaceholder(const QString &ph); + void setPlaceholderFast(bool fast); + void updatePlaceholder(); + + QRect getTextRect() const; + + bool animStep_placeholderFg(float64 ms); + bool animStep_placeholderShift(float64 ms); + bool animStep_border(float64 ms); + + QSize sizeHint() const; + QSize minimumSizeHint() const; + + void customUpDown(bool isCustom); + const QString &getLastText() const { + return _oldtext; + } + void setText(const QString &text) { + QLineEdit::setText(text); + updatePlaceholder(); + } + void clear() { + QLineEdit::clear(); + updatePlaceholder(); + } + +public slots: + + void onTextChange(const QString &text); + void onCursorPositionChanged(int oldPosition, int position); + + void onTextEdited(); + + void onTouchTimer(); + +signals: + + void changed(); + void cancelled(); + void submitted(bool ctrlShiftEnter); + void focused(); + void blurred(); + +protected: + + virtual void correctValue(const QString &was, int32 wasCursor, QString &now, int32 &nowCursor); + virtual void paintPlaceholder(Painter &p); + + style::font phFont() { + return _st.font; + } + + void placeholderPreparePaint(Painter &p); + const QString &placeholder() const; + QRect placeholderRect() const; + + void setTextMargins(const QMargins &mrg); + const style::InputField &_st; + +private: + + void startBorderAnimation(); + + int32 _maxLength; + + QString _oldtext; + int32 _oldcursor; + + bool _undoAvailable, _redoAvailable; + + bool _customUpDown; + + QString _placeholder, _placeholderFull; + bool _placeholderVisible, _placeholderFast; + anim::ivalue a_placeholderLeft; + anim::fvalue a_placeholderOpacity; + anim::cvalue a_placeholderFg; + Animation _a_placeholderFg, _a_placeholderShift; + + anim::fvalue a_borderOpacityActive; + anim::cvalue a_borderFg; + Animation _a_border; + + bool _focused, _error; + + style::margins _textMargins; + + QTimer _touchTimer; + bool _touchPress, _touchRightButton, _touchMove; + QPoint _touchStart; +}; + +class PortInput : public MaskedInputField { + Q_OBJECT + +public: + + PortInput(QWidget *parent, const style::InputField &st, const QString &ph, const QString &val); + +protected: + + void correctValue(const QString &was, int32 wasCursor, QString &now, int32 &nowCursor); + +}; + +class UsernameInput : public MaskedInputField { +public: + + UsernameInput(QWidget *parent, const style::InputField &st, const QString &ph, const QString &val, bool isLink); + void paintPlaceholder(Painter &p); + +protected: + + void correctValue(const QString &was, int32 wasCursor, QString &now, int32 &nowCursor); + +private: + + QString _linkPlaceholder; + }; diff --git a/Telegram/SourceFiles/gui/flattextarea.cpp b/Telegram/SourceFiles/gui/flattextarea.cpp index e6a88a72a..a5abeba89 100644 --- a/Telegram/SourceFiles/gui/flattextarea.cpp +++ b/Telegram/SourceFiles/gui/flattextarea.cpp @@ -24,12 +24,12 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "flattextarea.h" #include "window.h" -FlatTextarea::FlatTextarea(QWidget *parent, const style::flatTextarea &st, const QString &pholder, const QString &v) : QTextEdit(QString(), parent), +FlatTextarea::FlatTextarea(QWidget *parent, const style::flatTextarea &st, const QString &pholder, const QString &v) : QTextEdit(parent), _minHeight(-1), _maxHeight(-1), _maxLength(-1), _ctrlEnterSubmit(true), _oldtext(v), _phVisible(!v.length()), a_phLeft(_phVisible ? 0 : st.phShift), a_phAlpha(_phVisible ? 1 : 0), a_phColor(st.phColor->c), _st(st), _undoAvailable(false), _redoAvailable(false), _inDrop(false), _inHeightCheck(false), _fakeMargin(0), -_touchPress(false), _touchRightButton(false), _touchMove(false), _replacingEmojis(false) { +_touchPress(false), _touchRightButton(false), _touchMove(false), _correcting(false) { setAcceptRichText(false); resize(_st.width, _st.font->height); @@ -576,6 +576,9 @@ void FlatTextarea::insertFromMimeData(const QMimeData *source) { if (!_inDrop) emit spacedReturnedPasted(); } +void FlatTextarea::correctValue(const QString &was, QString &now) { +} + void FlatTextarea::insertEmoji(EmojiPtr emoji, QTextCursor c) { QTextImageFormat imageFormat; int32 ew = ESize + st::emojiPadding * cIntRetinaFactor() * 2, eh = _st.font->height * cIntRetinaFactor(); @@ -650,17 +653,6 @@ void FlatTextarea::processDocumentContentsChange(int position, int charsAdded) { insertEmoji(emoji, c); - for (Insertions::iterator i = _insertions.begin(), e = _insertions.end(); i != e; ++i) { - if (i->first >= removedUpto) { - i->first -= removedUpto - emojiPosition - 1; - } else if (i->first >= emojiPosition) { - i->second -= removedUpto - emojiPosition; - i->first = emojiPosition + 1; - } else if (i->first + i->second > emojiPosition + 1) { - i->second -= qMin(removedUpto, i->first + i->second) - emojiPosition; - } - } - charsAdded -= removedUpto - position; position = emojiPosition + 1; @@ -673,9 +665,11 @@ void FlatTextarea::processDocumentContentsChange(int position, int charsAdded) { } void FlatTextarea::onDocumentContentsChange(int position, int charsRemoved, int charsAdded) { - if (_replacingEmojis) return; + if (_correcting) return; - _replacingEmojis = true; + QTextCursor(document()->docHandle(), 0).joinPreviousEditBlock(); + + _correcting = true; if (_maxLength >= 0) { QTextCursor c(document()->docHandle(), 0); c.movePosition(QTextCursor::End); @@ -697,7 +691,7 @@ void FlatTextarea::onDocumentContentsChange(int position, int charsRemoved, int } } } - _replacingEmojis = false; + _correcting = false; if (!_links.isEmpty()) { bool changed = false; @@ -715,7 +709,10 @@ void FlatTextarea::onDocumentContentsChange(int position, int charsRemoved, int if (changed) emit linksChanged(); } - if (document()->availableRedoSteps() > 0) return; + if (document()->availableRedoSteps() > 0) { + QTextCursor(document()->docHandle(), 0).endEditBlock(); + return; + } const int takeBack = 3; @@ -725,45 +722,29 @@ void FlatTextarea::onDocumentContentsChange(int position, int charsRemoved, int charsAdded += position; position = 0; } - if (charsAdded <= 0) return; - - // _insertions.push_back(Insertion(position, charsAdded)); - _replacingEmojis = true; + if (charsAdded <= 0) { + QTextCursor(document()->docHandle(), 0).endEditBlock(); + return; + } + _correcting = true; QSizeF s = document()->pageSize(); processDocumentContentsChange(position, charsAdded); if (document()->pageSize() != s) { document()->setPageSize(s); } - _replacingEmojis = false; + _correcting = false; + + QTextCursor(document()->docHandle(), 0).endEditBlock(); } void FlatTextarea::onDocumentContentsChanged() { - if (_replacingEmojis) return; - - if (!_insertions.isEmpty()) { - if (document()->availableRedoSteps() > 0) { - _insertions.clear(); - } else { - _replacingEmojis = true; - QSizeF s = document()->pageSize(); - - do { - Insertion i = _insertions.front(); - _insertions.pop_front(); - if (i.second > 0) { - processDocumentContentsChange(i.first, i.second); - } - } while (!_insertions.isEmpty()); - - if (document()->pageSize() != s) { - document()->setPageSize(s); - } - _replacingEmojis = false; - } - } + if (_correcting) return; QString curText(getText()); + _correcting = true; + correctValue(_oldtext, curText); + _correcting = false; if (_oldtext != curText) { _oldtext = curText; emit changed(); @@ -803,10 +784,6 @@ bool FlatTextarea::animStep(float64 ms) { return res; } -const QString &FlatTextarea::getLastText() const { - return _oldtext; -} - void FlatTextarea::setPlaceholder(const QString &ph) { _ph = ph; _phelided = _st.font->elided(_ph, width() - _st.textMrg.left() - _st.textMrg.right() - _st.phPos.x() - 1); diff --git a/Telegram/SourceFiles/gui/flattextarea.h b/Telegram/SourceFiles/gui/flattextarea.h index 02d3cb139..2a17b95af 100644 --- a/Telegram/SourceFiles/gui/flattextarea.h +++ b/Telegram/SourceFiles/gui/flattextarea.h @@ -46,7 +46,9 @@ public: void setMinHeight(int32 minHeight); void setMaxHeight(int32 maxHeight); - const QString &getLastText() const; + const QString &getLastText() const { + return _oldtext; + } void setPlaceholder(const QString &ph); void updatePlaceholder(); @@ -61,7 +63,6 @@ public: EmojiPtr getSingleEmoji() const; void getMentionHashtagBotCommandStart(QString &start) const; void removeSingleEmoji(); - QString getText(int32 start = 0, int32 end = -1) const; bool hasText() const; bool isUndoAvailable() const; @@ -99,6 +100,9 @@ signals: protected: + QString getText(int32 start = 0, int32 end = -1) const; + virtual void correctValue(const QString &was, QString &now); + void insertEmoji(EmojiPtr emoji, QTextCursor c); QVariant loadResource(int type, const QUrl &name); @@ -130,10 +134,7 @@ private: bool _touchPress, _touchRightButton, _touchMove; QPoint _touchStart; - bool _replacingEmojis; - typedef QPair Insertion; - typedef QList Insertions; - Insertions _insertions; + bool _correcting; typedef QPair LinkRange; typedef QList LinkRanges; diff --git a/Telegram/SourceFiles/gui/phoneinput.cpp b/Telegram/SourceFiles/gui/phoneinput.cpp deleted file mode 100644 index facb89460..000000000 --- a/Telegram/SourceFiles/gui/phoneinput.cpp +++ /dev/null @@ -1,168 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop 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. - -It 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. - -In addition, as a special exception, the copyright holders give permission -to link the code of portions of this program with the OpenSSL library. - -Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org -*/ -#include "stdafx.h" -#include "style.h" - -#include "gui/phoneinput.h" -#include "numbers.h" -#include "lang.h" - -PhoneInput::PhoneInput(QWidget *parent, const style::flatInput &st) : FlatInput(parent, st, lang(lng_phone_ph)) { -} - -void PhoneInput::paintEvent(QPaintEvent *e) { - FlatInput::paintEvent(e); - - Painter p(this); - QString t(text()); - if (!pattern.isEmpty() && !t.isEmpty()) { - QString ph = placeholder().mid(t.size()); - if (!ph.isEmpty()) { - p.setClipRect(rect()); - QRect phRect(placeholderRect()); - int tw = phFont()->width(t); - if (tw < phRect.width()) { - phRect.setLeft(phRect.left() + tw); - phPrepare(p); - p.drawText(phRect, ph, style::al_left); - } - } - } -} - -void PhoneInput::correctValue(QKeyEvent *e, const QString &was) { - if (e && e->key() == Qt::Key_Backspace && !was.length()) { - emit voidBackspace(e); - return; - } - QString oldText(text()), newText; - int oldPos(cursorPosition()), newPos(-1), oldLen(oldText.length()), digitCount = 0; - for (int i = 0; i < oldLen; ++i) { - if (oldText[i].isDigit()) { - ++digitCount; - } - } - if (digitCount > MaxPhoneTailLength) digitCount = MaxPhoneTailLength; - - bool inPart = !pattern.isEmpty(); - int curPart = -1, leftInPart = 0; - newText.reserve(oldLen); - for (int i = 0; i < oldLen; ++i) { - if (i == oldPos && newPos < 0) { - newPos = newText.length(); - } - - QChar ch(oldText[i]); - if (ch.isDigit()) { - if (!digitCount--) { - break; - } - if (inPart) { - if (leftInPart) { - --leftInPart; - } else { - newText += ' '; - ++curPart; - inPart = curPart < pattern.size(); - leftInPart = inPart ? (pattern.at(curPart) - 1) : 0; - - ++oldPos; - } - } - newText += ch; - } else if (ch == ' ' || ch == '-' || ch == '(' || ch == ')') { - if (inPart) { - if (leftInPart) { - } else { - newText += ch; - ++curPart; - inPart = curPart < pattern.size(); - leftInPart = inPart ? pattern.at(curPart) : 0; - } - } else { - newText += ch; - } - } - } - int32 newlen = newText.size(); - while (newlen > 0 && newText.at(newlen - 1).isSpace()) { - --newlen; - } - if (newlen < newText.size()) newText = newText.mid(0, newlen); - if (newPos < 0) { - newPos = newText.length(); - } - if (newText != oldText) { - setText(newText); - setCursorPosition(newPos); - } -} - -void PhoneInput::addedToNumber(const QString &added) { - setFocus(); - QString was(text()); - setText(added + text()); - setCursorPosition(added.length()); - correctValue(0, was); - updatePlaceholder(); -} - -void PhoneInput::onChooseCode(const QString &code) { - pattern = phoneNumberParse(code); - if (!pattern.isEmpty() && pattern.at(0) == code.size()) { - pattern.pop_front(); - } else { - pattern.clear(); - } - if (pattern.isEmpty()) { - setPlaceholder(lang(lng_phone_ph)); - } else { - QString ph; - ph.reserve(20); - for (int i = 0, l = pattern.size(); i < l; ++i) { - ph.append(' '); - ph.append(QString(QChar(0x2212)).repeated(pattern.at(i))); - } - setPlaceholder(ph); - } - correctValue(0, text()); - setPlaceholderFast(!pattern.isEmpty()); - updatePlaceholder(); -} - -PortInput::PortInput(QWidget *parent, const style::flatInput &st, const QString &ph, const QString &val) : FlatInput(parent, st, ph, val) { - correctValue(0, QString()); -} - -void PortInput::correctValue(QKeyEvent *e, const QString &was) { - QString oldText(text()), newText(oldText); - - newText.replace(QRegularExpression(qsl("[^\\d]")), QString()); - if (!newText.toInt()) { - newText = QString(); - } else if (newText.toInt() > 65535) { - newText = was; - } - if (newText != oldText) { - setText(newText); - updatePlaceholder(); - } -} diff --git a/Telegram/SourceFiles/gui/phoneinput.h b/Telegram/SourceFiles/gui/phoneinput.h deleted file mode 100644 index f89bd91c3..000000000 --- a/Telegram/SourceFiles/gui/phoneinput.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -This file is part of Telegram Desktop, -the official desktop version of Telegram messaging app, see https://telegram.org - -Telegram Desktop 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. - -It 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. - -In addition, as a special exception, the copyright holders give permission -to link the code of portions of this program with the OpenSSL library. - -Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE -Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org -*/ -#pragma once - -#include "gui/flatinput.h" - -class PhoneInput : public FlatInput { - Q_OBJECT - -public: - - PhoneInput(QWidget *parent, const style::flatInput &st); - - void paintEvent(QPaintEvent *e); - -public slots: - - void addedToNumber(const QString &added); - void onChooseCode(const QString &code); - -signals: - - void voidBackspace(QKeyEvent *e); - -protected: - - void correctValue(QKeyEvent *e, const QString &was); - -private: - - QVector pattern; - -}; - -class PortInput : public FlatInput { - Q_OBJECT - -public: - - PortInput(QWidget *parent, const style::flatInput &st, const QString &ph, const QString &val); - -protected: - - void correctValue(QKeyEvent *e, const QString &was); - -}; diff --git a/Telegram/SourceFiles/gui/text.cpp b/Telegram/SourceFiles/gui/text.cpp index 7ef4cf037..1b2bfb2b9 100644 --- a/Telegram/SourceFiles/gui/text.cpp +++ b/Telegram/SourceFiles/gui/text.cpp @@ -4466,5 +4466,5 @@ LinksInText textParseLinks(const QString &text, int32 flags, bool rich) { // som } void emojiDraw(QPainter &p, EmojiPtr e, int x, int y) { - p.drawPixmap(QPoint(x, y), App::emojis(), QRect(e->x * ESize, e->y * ESize, ESize, ESize)); + p.drawPixmap(QPoint(x, y), App::emoji(), QRect(e->x * ESize, e->y * ESize, ESize, ESize)); } diff --git a/Telegram/SourceFiles/gui/twidget.h b/Telegram/SourceFiles/gui/twidget.h index 11ff79b6c..a51bee937 100644 --- a/Telegram/SourceFiles/gui/twidget.h +++ b/Telegram/SourceFiles/gui/twidget.h @@ -158,11 +158,11 @@ virtual void leaveToChildEvent(QEvent *e) { /* e -- from enterEvent() of child T } \ virtual void enterFromChildEvent(QEvent *e) { /* e -- from leaveEvent() of child TWidget */ \ } \ -void moveToLeft(int x, int y, int outerw) { \ - move(rtl() ? (outerw - x - width()) : x, y); \ +void moveToLeft(int x, int y, int outerw = 0) { \ + move(rtl() ? ((outerw > 0 ? outerw : parentWidget()->width()) - x - width()) : x, y); \ } \ -void moveToRight(int x, int y, int outerw) { \ - move(rtl() ? x : (outerw - x - width()), y); \ +void moveToRight(int x, int y, int outerw = 0) { \ + move(rtl() ? x : ((outerw > 0 ? outerw : parentWidget()->width()) - x - width()), y); \ } \ QPoint myrtlpoint(int x, int y) const { \ return rtlpoint(x, y, width()); \ diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index 3d07462cf..34a2a2956 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -1695,8 +1695,8 @@ _clear(this, lang(lng_profile_delete_conversation)) { void ReportSpamPanel::resizeEvent(QResizeEvent *e) { _report.resize(width() - (_hide.width() + st::reportSpamSeparator) * 2, _report.height()); - _report.moveToLeft(_hide.width() + st::reportSpamSeparator, 0, width()); - _hide.moveToRight(0, 0, width()); + _report.moveToLeft(_hide.width() + st::reportSpamSeparator, 0); + _hide.moveToRight(0, 0); _clear.move((width() - _clear.width()) / 2, height() - _clear.height() - ((height() - st::msgFont->height - _clear.height()) / 2)); } @@ -2217,8 +2217,8 @@ void HistoryHider::resizeEvent(QResizeEvent *e) { _cancel.hide(); } box = QRect((width() - w) / 2, (height() - h) / 2, w, h); - _send.moveToRight(width() - (box.x() + box.width()) + st::boxButtonPadding.right(), box.y() + h - st::boxButtonPadding.bottom() - _send.height(), width()); - _cancel.moveToRight(width() - (box.x() + box.width()) + st::boxButtonPadding.right() + _send.width() + st::boxButtonPadding.left(), _send.y(), width()); + _send.moveToRight(width() - (box.x() + box.width()) + st::boxButtonPadding.right(), box.y() + h - st::boxButtonPadding.bottom() - _send.height()); + _cancel.moveToRight(width() - (box.x() + box.width()) + st::boxButtonPadding.right() + _send.width() + st::boxButtonPadding.left(), _send.y()); } bool HistoryHider::offerPeer(PeerId peer) { @@ -2762,7 +2762,7 @@ void HistoryWidget::stickersGot(const MTPmessages_AllStickers &stickers) { } bool HistoryWidget::stickersFailed(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; LOG(("App Fail: Failed to get stickers!")); @@ -3418,7 +3418,7 @@ void HistoryWidget::historyCleared(History *history) { } bool HistoryWidget::messagesFailed(const RPCError &error, mtpRequestId requestId) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (error.type() == qstr("CHANNEL_PRIVATE")) { App::main()->showDialogs(); @@ -3820,7 +3820,7 @@ void HistoryWidget::unblockDone(PeerData *peer, const MTPBool &result, mtpReques } bool HistoryWidget::unblockFail(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (_unblockRequest == req) _unblockRequest = 0; return false; @@ -3874,7 +3874,7 @@ void HistoryWidget::joinDone(const MTPUpdates &result, mtpRequestId req) { } bool HistoryWidget::joinFail(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (_unblockRequest == req) _unblockRequest = 0; if (error.type() == qstr("CHANNEL_PRIVATE")) { @@ -5119,7 +5119,7 @@ void HistoryWidget::reportSpamDone(PeerData *peer, const MTPBool &result, mtpReq } bool HistoryWidget::reportSpamFail(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (req == _reportSpamRequest) { _reportSpamRequest = 0; diff --git a/Telegram/SourceFiles/intro/introcode.cpp b/Telegram/SourceFiles/intro/introcode.cpp index caabe3768..ffdc561a6 100644 --- a/Telegram/SourceFiles/intro/introcode.cpp +++ b/Telegram/SourceFiles/intro/introcode.cpp @@ -30,11 +30,11 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org CodeInput::CodeInput(QWidget *parent, const style::flatInput &st, const QString &ph) : FlatInput(parent, st, ph) { } -void CodeInput::correctValue(QKeyEvent *e, const QString &was) { - QString oldText(text()), newText; - int oldPos(cursorPosition()), newPos(-1), oldLen(oldText.length()), digitCount = 0; +void CodeInput::correctValue(const QString &was, QString &now) { + QString newText; + int oldPos(cursorPosition()), newPos(-1), oldLen(now.length()), digitCount = 0; for (int i = 0; i < oldLen; ++i) { - if (oldText[i].isDigit()) { + if (now[i].isDigit()) { ++digitCount; } } @@ -43,7 +43,7 @@ void CodeInput::correctValue(QKeyEvent *e, const QString &was) { newText.reserve(oldLen); for (int i = 0; i < oldLen; ++i) { - QChar ch(oldText[i]); + QChar ch(now[i]); if (ch.isDigit()) { if (!digitCount--) { break; @@ -60,8 +60,10 @@ void CodeInput::correctValue(QKeyEvent *e, const QString &was) { if (newPos < 0) { newPos = newText.length(); } - if (newText != oldText) { - setText(newText); + if (newText != now) { + now = newText; + setText(now); + updatePlaceholder(); if (newPos != oldPos) { setCursorPosition(newPos); } @@ -262,7 +264,7 @@ bool IntroCode::codeSubmitFail(const RPCError &error) { checkRequest.start(1000); sentRequest = MTP::send(MTPaccount_GetPassword(), rpcDone(&IntroCode::gotPassword), rpcFail(&IntroCode::codeSubmitFail)); return true; - } else if (error.type().startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { showError(lang(lng_flood_error)); code.setFocus(); return true; @@ -342,7 +344,7 @@ void IntroCode::noTelegramCodeDone(const MTPBool &result) { } bool IntroCode::noTelegramCodeFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) { + if (mtpIsFlood(error)) { showError(lang(lng_flood_error)); code.setFocus(); return true; diff --git a/Telegram/SourceFiles/intro/introcode.h b/Telegram/SourceFiles/intro/introcode.h index d9cf7b18f..68d8e557d 100644 --- a/Telegram/SourceFiles/intro/introcode.h +++ b/Telegram/SourceFiles/intro/introcode.h @@ -38,7 +38,7 @@ signals: protected: - void correctValue(QKeyEvent *e, const QString &was); + void correctValue(const QString &was, QString &now); }; diff --git a/Telegram/SourceFiles/intro/introphone.cpp b/Telegram/SourceFiles/intro/introphone.cpp index 803a06a9f..46e016689 100644 --- a/Telegram/SourceFiles/intro/introphone.cpp +++ b/Telegram/SourceFiles/intro/introphone.cpp @@ -274,7 +274,7 @@ bool IntroPhone::phoneSubmitFail(const RPCError &error) { showError(lang(lng_bad_phone)); enableAll(true); return true; - } else if (error.type().startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { showError(lang(lng_flood_error)); enableAll(true); return true; diff --git a/Telegram/SourceFiles/intro/introphone.h b/Telegram/SourceFiles/intro/introphone.h index e100c3547..7e559e207 100644 --- a/Telegram/SourceFiles/intro/introphone.h +++ b/Telegram/SourceFiles/intro/introphone.h @@ -22,7 +22,6 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include #include "gui/flatbutton.h" -#include "gui/phoneinput.h" #include "gui/countryinput.h" #include "intro.h" diff --git a/Telegram/SourceFiles/intro/intropwdcheck.cpp b/Telegram/SourceFiles/intro/intropwdcheck.cpp index ee75a96d1..8481fbdc0 100644 --- a/Telegram/SourceFiles/intro/intropwdcheck.cpp +++ b/Telegram/SourceFiles/intro/intropwdcheck.cpp @@ -203,7 +203,7 @@ bool IntroPwdCheck::pwdSubmitFail(const RPCError &error) { return true; } else if (err == "PASSWORD_EMPTY") { intro()->onIntroBack(); - } else if (err.startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { showError(lang(lng_flood_error)); _pwdField.notaBene(); return true; @@ -237,7 +237,7 @@ bool IntroPwdCheck::codeSubmitFail(const RPCError &error) { showError(lang(lng_signin_wrong_code)); _codeField.notaBene(); return true; - } else if (err.startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { showError(lang(lng_flood_error)); _codeField.notaBene(); return true; diff --git a/Telegram/SourceFiles/intro/introsignup.cpp b/Telegram/SourceFiles/intro/introsignup.cpp index 538b70107..81b5a0bae 100644 --- a/Telegram/SourceFiles/intro/introsignup.cpp +++ b/Telegram/SourceFiles/intro/introsignup.cpp @@ -265,7 +265,7 @@ bool IntroSignup::nameSubmitFail(const RPCError &error) { showError(lang(lng_bad_name)); last.setFocus(); return true; - } else if (error.type().startsWith(qsl("FLOOD_WAIT_"))) { + } else if (mtpIsFlood(error)) { showError(lang(lng_flood_error)); if (_invertOrder) { first.setFocus(); diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index ee8d9b1d8..18f5b4e34 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -89,6 +89,8 @@ void TopBarWidget::onEdit() { if (p) { if (p->isChannel()) { App::wnd()->showLayer(new EditChannelBox(p->asChannel())); + } else if (p->isChat()) { + App::wnd()->showLayer(new EditNameTitleBox(p)); } else { App::wnd()->showLayer(new AddContactBox(p)); } @@ -771,7 +773,7 @@ DragState MainWidget::getDragState(const QMimeData *mime) { } bool MainWidget::leaveChatFailed(PeerData *peer, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (error.type() == qstr("USER_NOT_PARTICIPANT") || error.type() == qstr("CHAT_ID_INVALID")) { // left this chat already deleteConversation(peer); @@ -907,7 +909,7 @@ void MainWidget::kickParticipant(ChatData *chat, UserData *user) { } bool MainWidget::kickParticipantFail(ChatData *chat, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; error.type(); return false; @@ -1479,7 +1481,7 @@ void MainWidget::itemResized(HistoryItem *row, bool scrollToIt) { } bool MainWidget::overviewFailed(PeerData *peer, const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; MediaOverviewType type = OverviewCount; for (int32 i = 0; i < OverviewCount; ++i) { @@ -1641,7 +1643,7 @@ void MainWidget::partWasRead(PeerData *peer, const MTPmessages_AffectedHistory & } bool MainWidget::readRequestFail(PeerData *peer, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; readRequestDone(peer); return false; @@ -2086,7 +2088,7 @@ void MainWidget::serviceHistoryDone(const MTPmessages_Messages &msgs) { } bool MainWidget::serviceHistoryFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; App::wnd()->showDelayedServiceMsgs(); return false; @@ -3612,7 +3614,7 @@ void MainWidget::usernameResolveDone(QPair toProfileStartToken, c } bool MainWidget::usernameResolveFail(QString name, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (error.code() == 400) { App::wnd()->showLayer(new InformBox(lng_username_not_found(lt_user, name))); @@ -3649,7 +3651,7 @@ void MainWidget::inviteCheckDone(QString hash, const MTPChatInvite &invite) { } bool MainWidget::inviteCheckFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (error.code() == 400) { App::wnd()->showLayer(new InformBox(lang(lng_group_invite_bad_link))); @@ -3687,7 +3689,7 @@ void MainWidget::inviteImportDone(const MTPUpdates &updates) { } bool MainWidget::inviteImportFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (error.code() == 400) { App::wnd()->showLayer(new InformBox(lang(error.type() == qsl("USERS_TOO_MUCH") ? lng_group_invite_no_room : lng_group_invite_bad_link))); @@ -3792,7 +3794,7 @@ void MainWidget::gotNotifySetting(MTPInputNotifyPeer peer, const MTPPeerNotifySe } bool MainWidget::failNotifySetting(MTPInputNotifyPeer peer, const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; gotNotifySetting(peer, MTP_peerNotifySettingsEmpty()); return true; diff --git a/Telegram/SourceFiles/mediaview.cpp b/Telegram/SourceFiles/mediaview.cpp index 3441b1eb8..7f50a466e 100644 --- a/Telegram/SourceFiles/mediaview.cpp +++ b/Telegram/SourceFiles/mediaview.cpp @@ -245,21 +245,21 @@ void MediaView::updateControls() { if (_doc->loader) { _docDownload.hide(); _docSaveAs.hide(); - _docCancel.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocBlue.pxWidth(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop, width()); + _docCancel.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocBlue.pxWidth(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop); _docCancel.show(); if (!_docRadialFirst) _docRadialFirst = _docRadialLast = _docRadialStart = getms(); if (!animating()) anim::start(this); anim::step(this); } else { if (_doc->already(true).isEmpty()) { - _docDownload.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocBlue.pxWidth(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop, width()); + _docDownload.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocBlue.pxWidth(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop); _docDownload.show(); - _docSaveAs.moveToLeft(_docRect.x() + 2.5 * st::mvDocPadding + st::mvDocBlue.pxWidth() + _docDownload.width(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop, width()); + _docSaveAs.moveToLeft(_docRect.x() + 2.5 * st::mvDocPadding + st::mvDocBlue.pxWidth() + _docDownload.width(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop); _docSaveAs.show(); _docCancel.hide(); } else { _docDownload.hide(); - _docSaveAs.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocBlue.pxWidth(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop, width()); + _docSaveAs.moveToLeft(_docRect.x() + 2 * st::mvDocPadding + st::mvDocBlue.pxWidth(), _docRect.y() + st::mvDocPadding + st::mvDocLinksTop); _docSaveAs.show(); _docCancel.hide(); } @@ -329,13 +329,13 @@ void MediaView::updateDropdown() { _btnToMessage->setVisible(_msgid > 0); _btnShowInFolder->setVisible(_doc && !_doc->already(true).isEmpty()); _btnSaveAs->setVisible(true); - _btnCopy->setVisible((_doc && !_current.isNull()) || (_photo && _photo->full->loaded())); + _btnCopy->setVisible((_doc && (!_current.isNull() || !_currentGif.isNull())) || (_photo && _photo->full->loaded())); _btnForward->setVisible(_canForward); _btnDelete->setVisible(_canDelete || (_photo && App::self() && App::self()->photoId == _photo->id) || (_photo && _photo->peer && _photo->peer->photoId == _photo->id && (_photo->peer->isChat() || (_photo->peer->isChannel() && _photo->peer->asChannel()->amCreator())))); _btnViewAll->setVisible((_overview != OverviewCount) && _history); _btnViewAll->setText(lang(_doc ? lng_mediaview_files_all : lng_mediaview_photos_all)); _dropdown.updateButtons(); - _dropdown.moveToRight(0, height() - _dropdown.height(), width()); + _dropdown.moveToRight(0, height() - _dropdown.height()); } bool MediaView::animStep(float64 msp) { @@ -644,9 +644,11 @@ void MediaView::onCopy() { _dropdown.hideStart(); } if (_doc) { - if (_current.isNull()) return; - - QApplication::clipboard()->setPixmap(_current); + if (!_current.isNull()) { + QApplication::clipboard()->setPixmap(_current); + } else if (!_currentGif.isNull()) { + QApplication::clipboard()->setPixmap(_currentGif.current(_currentGif.w, _currentGif.h, false)); + } } else { if (!_photo || !_photo->full->loaded()) return; @@ -992,8 +994,6 @@ void MediaView::displayDocument(DocumentData *doc, HistoryItem *item) { // empty } void MediaView::paintEvent(QPaintEvent *e) { -// uint64 ms = getms(); - QRect r(e->rect()); QRegion region(e->region()); QVector rs(region.rects()); diff --git a/Telegram/SourceFiles/mtproto/mtp.cpp b/Telegram/SourceFiles/mtproto/mtp.cpp index b13f61f0e..22246480b 100644 --- a/Telegram/SourceFiles/mtproto/mtp.cpp +++ b/Telegram/SourceFiles/mtproto/mtp.cpp @@ -120,7 +120,7 @@ namespace { } bool importFail(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (globalHandler.onFail && MTP::authedId()) (*globalHandler.onFail)(req, error); // auth import failed return true; @@ -141,7 +141,7 @@ namespace { } bool exportFail(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; AuthExportRequests::const_iterator i = authExportRequests.constFind(req); if (i != authExportRequests.cend()) { @@ -556,7 +556,7 @@ namespace _mtp_internal { } bool rpcErrorOccured(mtpRequestId requestId, const RPCFailHandlerPtr &onFail, const RPCError &err) { // return true if need to clean request data - if (err.type().startsWith(qsl("FLOOD_WAIT_"))) { + if (mtpIsFlood(err)) { if (onFail && (*onFail)(requestId, err)) return true; } diff --git a/Telegram/SourceFiles/mtproto/mtpDC.cpp b/Telegram/SourceFiles/mtproto/mtpDC.cpp index 326cc20fc..4b9cc8c9c 100644 --- a/Telegram/SourceFiles/mtproto/mtpDC.cpp +++ b/Telegram/SourceFiles/mtproto/mtpDC.cpp @@ -160,7 +160,7 @@ namespace { mtpConfigLoader()->done(); } bool configFailed(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; loadingConfig = false; LOG(("MTP Error: failed to get config!")); diff --git a/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp b/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp index 4d2a5aafd..536d54bde 100644 --- a/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp +++ b/Telegram/SourceFiles/mtproto/mtpFileLoader.cpp @@ -292,7 +292,7 @@ void mtpFileLoader::partLoaded(int32 offset, const MTPupload_File &result, mtpRe } bool mtpFileLoader::partFailed(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; finishFail(); return true; diff --git a/Telegram/SourceFiles/overviewwidget.cpp b/Telegram/SourceFiles/overviewwidget.cpp index 8838d6a83..e32e26581 100644 --- a/Telegram/SourceFiles/overviewwidget.cpp +++ b/Telegram/SourceFiles/overviewwidget.cpp @@ -366,7 +366,7 @@ void OverviewInner::searchReceived(bool fromStart, const MTPmessages_Messages &r } bool OverviewInner::searchFailed(const RPCError &error, mtpRequestId req) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; if (_searchRequest == req) { _searchRequest = 0; diff --git a/Telegram/SourceFiles/passcodewidget.cpp b/Telegram/SourceFiles/passcodewidget.cpp index 00c1509cd..4b77af01e 100644 --- a/Telegram/SourceFiles/passcodewidget.cpp +++ b/Telegram/SourceFiles/passcodewidget.cpp @@ -34,13 +34,13 @@ _passcode(this, st::passcodeInput), _submit(this, lang(lng_passcode_submit), st::passcodeSubmit), _logout(this, lang(lng_passcode_logout)) { setGeometry(QRect(0, st::titleHeight, App::wnd()->width(), App::wnd()->height() - st::titleHeight)); - connect(App::wnd(), SIGNAL(resized(const QSize &)), this, SLOT(onParentResize(const QSize &))); + connect(App::wnd(), SIGNAL(resized(const QSize&)), this, SLOT(onParentResize(const QSize&))); _passcode.setEchoMode(QLineEdit::Password); connect(&_submit, SIGNAL(clicked()), this, SLOT(onSubmit())); connect(&_passcode, SIGNAL(changed()), this, SLOT(onChanged())); - connect(&_passcode, SIGNAL(accepted()), this, SLOT(onSubmit())); + connect(&_passcode, SIGNAL(submitted(bool)), this, SLOT(onSubmit())); connect(&_logout, SIGNAL(clicked()), App::wnd(), SLOT(onLogout())); diff --git a/Telegram/SourceFiles/profilewidget.cpp b/Telegram/SourceFiles/profilewidget.cpp index 9b3797f13..ef4b4bdd1 100644 --- a/Telegram/SourceFiles/profilewidget.cpp +++ b/Telegram/SourceFiles/profilewidget.cpp @@ -340,8 +340,8 @@ void ProfileInner::blockDone(bool blocked, const MTPBool &result) { } bool ProfileInner::blockFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; - + if (mtpIsFlood(error)) return false; + _blockRequest = 0; return false; } diff --git a/Telegram/SourceFiles/settings.cpp b/Telegram/SourceFiles/settings.cpp index 2bbab026e..5b612a5ce 100644 --- a/Telegram/SourceFiles/settings.cpp +++ b/Telegram/SourceFiles/settings.cpp @@ -24,7 +24,7 @@ Copyright (c) 2014-2015 John Preston, https://desktop.telegram.org #include "lang.h" bool gRtl = false; -Qt::LayoutDirection gLangDir = Qt::LeftToRight; +Qt::LayoutDirection gLangDir = gRtl ? Qt::RightToLeft : Qt::LeftToRight; mtpDcOptions gDcOptions; @@ -211,7 +211,7 @@ void settingsParseArgs(int argc, char *argv[]) { RecentEmojiPack &cGetRecentEmojis() { if (cRecentEmojis().isEmpty()) { RecentEmojiPack r; - if (!cRecentEmojisPreload().isEmpty() && false) { + if (!cRecentEmojisPreload().isEmpty()) { RecentEmojisPreload p(cRecentEmojisPreload()); cSetRecentEmojisPreload(RecentEmojisPreload()); r.reserve(p.size()); diff --git a/Telegram/SourceFiles/settingswidget.cpp b/Telegram/SourceFiles/settingswidget.cpp index e3a926992..85a0e5df1 100644 --- a/Telegram/SourceFiles/settingswidget.cpp +++ b/Telegram/SourceFiles/settingswidget.cpp @@ -822,7 +822,7 @@ void SettingsInner::mousePressEvent(QMouseEvent *e) { return; } if (QRect(_uploadPhoto.x() + st::setNameLeft, st::setTop + st::setNameTop, qMin(_uploadPhoto.width() - int(st::setNameLeft), _nameText.maxWidth()), st::setNameFont->height).contains(e->pos())) { - App::wnd()->showLayer(new AddContactBox(self())); + App::wnd()->showLayer(new EditNameTitleBox(self())); } else if (QRect(_left, st::setTop, st::setPhotoSize, st::setPhotoSize).contains(e->pos())) { if (_photoLink) { App::photo(self()->photoId)->full->load(); @@ -938,7 +938,7 @@ void SettingsInner::offPasswordDone(const MTPBool &result) { } bool SettingsInner::offPasswordFail(const RPCError &error) { - if (error.type().startsWith(qsl("FLOOD_WAIT_"))) return false; + if (mtpIsFlood(error)) return false; onReloadPassword(); return true; @@ -1459,6 +1459,7 @@ void SettingsInner::onIncludeMuted() { } void SettingsInner::onWindowsNotifications() { + if (cPlatform() != dbipWindows) return; cSetWindowsNotifications(!cWindowsNotifications()); App::wnd()->notifyClearFast(); cSetCustomNotifies(!cWindowsNotifications()); diff --git a/Telegram/Telegram.vcxproj b/Telegram/Telegram.vcxproj index 971426476..9a2473c0c 100644 --- a/Telegram/Telegram.vcxproj +++ b/Telegram/Telegram.vcxproj @@ -340,10 +340,6 @@ true true - - true - true - true true @@ -606,10 +602,6 @@ true true - - true - true - true true @@ -898,10 +890,6 @@ true true - - true - true - true true @@ -1014,7 +1002,6 @@ - @@ -1477,20 +1464,6 @@ $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) - - Moc%27ing phoneinput.h... - .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\ffmpeg-2.6.3" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.0\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.0\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/phoneinput.h" - Moc%27ing phoneinput.h... - Moc%27ing phoneinput.h... - .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\libogg-1.3.2\include" "-I.\..\..\Libraries\opus\include" "-I.\..\..\Libraries\opusfile\include" "-I.\..\..\Libraries\mpg123-1.22.1\ports\MSVC++" "-I.\..\..\Libraries\mpg123-1.22.1\src\libmpg123" "-I.\..\..\Libraries\faad2-2.7\include" "-I.\..\..\Libraries\faad2-2.7\common\mp4ff" "-I.\..\..\Libraries\ffmpeg-2.6.3" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.0\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.0\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/phoneinput.h" - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DAL_LIBTYPE_STATIC -DCUSTOM_API_ID -DUNICODE -D_WITH_DEBUG -DWIN32 -DWIN64 -DHAVE_STDINT_H -DZLIB_WINAPI -DQT_NO_DEBUG -DNDEBUG -D_SCL_SECURE_NO_WARNINGS "-I.\..\..\Libraries\lzma\C" "-I.\..\..\Libraries\libexif-0.6.20" "-I.\..\..\Libraries\zlib-1.2.8" "-I.\..\..\Libraries\OpenSSL-Win32\include" "-I.\..\..\Libraries\ffmpeg-2.6.3" "-I.\..\..\Libraries\openal-soft\include" "-I.\SourceFiles" "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I.\..\..\Libraries\QtStatic\qtbase\include\QtCore\5.5.0\QtCore" "-I.\..\..\Libraries\QtStatic\qtbase\include\QtGui\5.5.0\QtGui" "-fstdafx.h" "-f../../SourceFiles/gui/phoneinput.h" - $(QTDIR)\bin\moc.exe;%(FullPath) - $(QTDIR)\bin\moc.exe;%(FullPath) - $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing countryinput.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp @@ -2151,4 +2124,4 @@ - + \ No newline at end of file diff --git a/Telegram/Telegram.vcxproj.filters b/Telegram/Telegram.vcxproj.filters index 547bf8990..47eb59868 100644 --- a/Telegram/Telegram.vcxproj.filters +++ b/Telegram/Telegram.vcxproj.filters @@ -84,9 +84,6 @@ gui - - gui - gui @@ -318,15 +315,6 @@ Generated Files\Release - - Generated Files\Deploy - - - Generated Files\Debug - - - Generated Files\Release - Generated Files\Deploy @@ -1023,9 +1011,6 @@ gui - - gui - gui