Skip to content

Commit 41963f9

Browse files
committed
webpage preview and other things
1 parent 674d066 commit 41963f9

76 files changed

Lines changed: 2083 additions & 822 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎Telegram-Mac/AppAppearanceViewController.swift‎

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,26 @@ import TGUIKit
1616
import InAppSettings
1717

1818

19+
func generatePeerNameColorImage(_ peer: Peer?) -> CGImage {
20+
let attr = NSMutableAttributedString()
21+
let color = peer?.nameColor ?? .blue
22+
23+
_ = attr.append(string: (peer?.compactDisplayTitle ?? "").prefixWithDots(15), color: color.color, font: .avatar(.short))
24+
let textNode = TextNode.layoutText(attr, nil, 1, .end, NSMakeSize(.greatestFiniteMagnitude, 20), nil, false, .center)
25+
26+
var size = textNode.0.size
27+
size.width += 16
28+
size.height += 8
29+
return generateImage(size, rotatedContext: { size, ctx in
30+
let rect = NSMakeRect(0, 0, size.width, size.height)
31+
ctx.clear(rect)
32+
ctx.round(rect.size, size.height / 2)
33+
ctx.setFillColor(color.color.withAlphaComponent(0.1).cgColor)
34+
ctx.fill(rect)
35+
textNode.1.draw(rect.focus(textNode.0.size), in: ctx, backingScaleFactor: System.backingScale, backgroundColor: .clear)
36+
})!
37+
}
38+
1939
private extension TelegramBuiltinTheme {
2040
var baseTheme: TelegramBaseTheme {
2141
switch self {
@@ -148,7 +168,8 @@ private final class AppAppearanceViewArguments {
148168
let shareLocal:(ColorPalette)->Void
149169
let toggleDarkMode:(Bool)->Void
150170
let toggleRevealThemes:()->Void
151-
init(context: AccountContext, togglePalette: @escaping(InstallThemeSource)->Void, toggleBubbles: @escaping(Bool)->Void, toggleFontSize: @escaping(CGFloat)->Void, selectAccentColor: @escaping(AppearanceAccentColor?)->Void, selectChatBackground:@escaping()->Void, openAutoNightSettings:@escaping()->Void, removeTheme:@escaping(TelegramTheme)->Void, editTheme: @escaping(TelegramTheme)->Void, shareTheme:@escaping(TelegramTheme)->Void, shareLocal:@escaping(ColorPalette)->Void, toggleDarkMode: @escaping(Bool)->Void, toggleRevealThemes:@escaping()->Void) {
171+
let userNameColor:()->Void
172+
init(context: AccountContext, togglePalette: @escaping(InstallThemeSource)->Void, toggleBubbles: @escaping(Bool)->Void, toggleFontSize: @escaping(CGFloat)->Void, selectAccentColor: @escaping(AppearanceAccentColor?)->Void, selectChatBackground:@escaping()->Void, openAutoNightSettings:@escaping()->Void, removeTheme:@escaping(TelegramTheme)->Void, editTheme: @escaping(TelegramTheme)->Void, shareTheme:@escaping(TelegramTheme)->Void, shareLocal:@escaping(ColorPalette)->Void, toggleDarkMode: @escaping(Bool)->Void, toggleRevealThemes:@escaping()->Void, userNameColor:@escaping()->Void) {
152173
self.context = context
153174
self.togglePalette = togglePalette
154175
self.toggleBubbles = toggleBubbles
@@ -162,6 +183,7 @@ private final class AppAppearanceViewArguments {
162183
self.shareLocal = shareLocal
163184
self.toggleDarkMode = toggleDarkMode
164185
self.toggleRevealThemes = toggleRevealThemes
186+
self.userNameColor = userNameColor
165187
}
166188
}
167189

@@ -178,6 +200,7 @@ private let _id_theme_night_mode = InputDataIdentifier("_id_theme_night_mode")
178200

179201
private let _id_cloud_themes = InputDataIdentifier("_id_cloud_themes")
180202

203+
private let _id_name_color = InputDataIdentifier("_id_name_color")
181204

182205
private func appAppearanceEntries(appearance: Appearance, state: State, settings: ThemePaletteSettings, cloudThemes: [TelegramTheme], generated: CloudThemesCachedData, autoNightSettings: AutoNightThemePreferences, animatedEmojiStickers: [String: StickerPackItem], arguments: AppAppearanceViewArguments) -> [InputDataEntry] {
183206

@@ -203,21 +226,7 @@ private func appAppearanceEntries(appearance: Appearance, state: State, settings
203226
cloudThemes.append(cloud)
204227
}
205228
}
206-
207-
// var smartThemesList:[SmartThemeCachedData] = []
208-
// var values:[SmartThemeCachedData] = generated.list[.init(base: appearance.presentation.colors.parent.baseTheme, bubbled: appearance.presentation.bubbled)] ?? []
209-
// if let value = generated.default {
210-
// smartThemesList.append(value)
211-
// }
212-
// if values.isEmpty {
213-
// values = generated.list[.init(base: appearance.presentation.dark ? .night : .classic, bubbled: appearance.presentation.bubbled)] ?? []
214-
// }
215-
// for smartTheme in values {
216-
// smartThemesList.append(smartTheme)
217-
// }
218-
// if let custom = generated.custom {
219-
// smartThemesList.append(custom)
220-
// }
229+
221230

222231
if appearance.presentation.cloudTheme == nil || appearance.presentation.cloudTheme?.settings != nil {
223232
let copy = cloudThemes
@@ -347,18 +356,24 @@ private func appAppearanceEntries(appearance: Appearance, state: State, settings
347356
})))
348357
index += 1
349358

359+
350360

351-
entries.append(.general(sectionId: sectionId, index: index, value: .none, error: nil, identifier: _id_theme_chat_mode, data: InputDataGeneralData(name: strings().appearanceSettingsBubblesMode, color: appearance.presentation.colors.text, type: .switchable(appearance.presentation.bubbled), viewType: appearance.presentation.bubbled ? .innerItem : .lastItem, action: {
361+
362+
entries.append(.general(sectionId: sectionId, index: index, value: .none, error: nil, identifier: _id_theme_chat_mode, data: InputDataGeneralData(name: strings().appearanceSettingsBubblesMode, color: appearance.presentation.colors.text, type: .switchable(appearance.presentation.bubbled), viewType: .innerItem, action: {
352363
arguments.toggleBubbles(!appearance.presentation.bubbled)
353364
})))
354365
index += 1
355366

356367

357368
if appearance.presentation.bubbled {
358-
entries.append(.general(sectionId: sectionId, index: index, value: .none, error: nil, identifier: _id_theme_wallpaper1, data: InputDataGeneralData(name: strings().generalSettingsChatBackground, color: appearance.presentation.colors.text, type: .next, viewType: .lastItem, action: arguments.selectChatBackground)))
369+
entries.append(.general(sectionId: sectionId, index: index, value: .none, error: nil, identifier: _id_theme_wallpaper1, data: InputDataGeneralData(name: strings().generalSettingsChatBackground, color: appearance.presentation.colors.text, type: .next, viewType: .innerItem, action: arguments.selectChatBackground)))
359370
index += 1
360371
}
361372

373+
entries.append(.general(sectionId: sectionId, index: index, value: .none, error: nil, identifier: _id_name_color, data: InputDataGeneralData(name: strings().appearanceYourNameColor, color: appearance.presentation.colors.text, type: .imageContext(generatePeerNameColorImage(state.myPeer), ""), viewType: .lastItem, action: arguments.userNameColor)))
374+
index += 1
375+
376+
362377
entries.append(.sectionId(sectionId, type: .normal))
363378
sectionId += 1
364379

@@ -404,6 +419,7 @@ private func appAppearanceEntries(appearance: Appearance, state: State, settings
404419

405420
private struct State : Equatable {
406421
var revealed: Bool
422+
var myPeer: TelegramUser?
407423
}
408424

409425
func AppAppearanceViewController(context: AccountContext, focusOnItemTag: ThemeSettingsEntryTag? = nil) -> InputDataController {
@@ -412,6 +428,9 @@ func AppAppearanceViewController(context: AccountContext, focusOnItemTag: ThemeS
412428
let updateDisposable = MetaDisposable()
413429

414430

431+
let actionsDisposable = DisposableSet()
432+
433+
415434
let initialState = State(revealed: false)
416435

417436
let statePromise = ValuePromise(initialState, ignoreRepeated: true)
@@ -420,6 +439,13 @@ func AppAppearanceViewController(context: AccountContext, focusOnItemTag: ThemeS
420439
statePromise.set(stateValue.modify (f))
421440
}
422441

442+
actionsDisposable.add(getPeerView(peerId: context.peerId, postbox: context.account.postbox).start(next: { peer in
443+
updateState { current in
444+
var current = current
445+
current.myPeer = peer as? TelegramUser
446+
return current
447+
}
448+
}))
423449

424450
let applyTheme:(InstallThemeSource)->Void = { source in
425451
switch source {
@@ -569,6 +595,8 @@ func AppAppearanceViewController(context: AccountContext, focusOnItemTag: ThemeS
569595
current.revealed = !current.revealed
570596
return current
571597
}
598+
}, userNameColor: {
599+
context.bindings.rootNavigation().push(SelectColorController(context: context, source: .account(context.myPeer!)))
572600
})
573601

574602

@@ -665,6 +693,10 @@ func AppAppearanceViewController(context: AccountContext, focusOnItemTag: ThemeS
665693
controller.genericView.tableView.needUpdateVisibleAfterScroll = true
666694
}
667695

696+
controller.onDeinit = {
697+
actionsDisposable.dispose()
698+
}
699+
668700
return controller
669701
}
670702

‎Telegram-Mac/Appearance.swift‎

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,40 @@ func generalPrepaidGiveawayIcon(_ bgColor: NSColor, count: NSAttributedString) -
4444
})!
4545
}
4646

47+
func chatReplyLineDashTemplateImage(_ color: (NSColor, NSColor?), flipped: Bool) -> CGImage? {
48+
let radius: CGFloat = 3.0
49+
var offset: CGFloat = 5.0
50+
51+
var updated: (NSColor, NSColor?) = color
52+
53+
54+
let generator:(NSSize, CGContext) -> Void = { size, context in
55+
context.clear(size.bounds)
56+
57+
context.setFillColor(updated.0.cgColor)
58+
context.fill(size.bounds)
59+
60+
if let color = updated.1 {
61+
context.move(to: CGPoint(x: size.width, y: offset))
62+
context.addLine(to: CGPoint(x: size.width, y: offset + radius * 3.0))
63+
context.addLine(to: CGPoint(x: 0.0, y: offset + radius * 4.0))
64+
context.addLine(to: CGPoint(x: 0.0, y: offset + radius))
65+
context.closePath()
66+
67+
68+
context.setFillColor(color.cgColor)
69+
context.fillPath()
70+
}
71+
72+
}
73+
if flipped {
74+
return generateImage(CGSize(width: radius, height: radius * 6.0), contextGenerator: generator)
75+
} else {
76+
return generateImage(CGSize(width: radius, height: radius * 6.0), rotatedContext: generator)
77+
}
78+
}
79+
80+
4781

4882
func generateFilledCircleImage(diameter: CGFloat, color: NSColor?, strokeColor: NSColor? = nil, strokeWidth: CGFloat? = nil, backgroundColor: NSColor? = nil) -> CGImage {
4983
return generateImage(CGSize(width: diameter, height: diameter), contextGenerator: { size, context in
@@ -2558,7 +2592,8 @@ private func generateIcons(from palette: ColorPalette, bubbled: Bool) -> Telegra
25582592
profile_group_destruct: {NSImage(named: "Icon_Profile_Destruct")!.precomposed(flipVertical: true)},
25592593
profile_group_discussion: {NSImage(named: "Icon_Profile_Discussion")!.precomposed(flipVertical: true)},
25602594
profile_requests: {NSImage(named: "Icon_Profile_Requests")!.precomposed(palette.accent, flipVertical: true)},
2561-
profile_reactions: {NSImage(named: "Icon_PeerInfo_Reactions")!.precomposed(flipVertical: true)},
2595+
profile_reactions: { NSImage(named: "Icon_PeerInfo_Reactions")!.precomposed(flipVertical: true) },
2596+
profile_channel_color: { NSImage(named: "Icon_PeerInfo_ChannelColor")!.precomposed(flipVertical: true) },
25622597
profile_removed: {NSImage(named: "Icon_Profile_Removed")!.precomposed(flipVertical: true)},
25632598
profile_links: {NSImage(named: "Icon_Profile_Links")!.precomposed(flipVertical: true)},
25642599
destruct_clear_history: { NSImage(named: "Icon_ClearChat")!.precomposed(palette.redUI, flipVertical: true) },
@@ -2732,13 +2767,15 @@ private func generateIcons(from palette: ColorPalette, bubbled: Bool) -> Telegra
27322767
message_story_expired_bubble_incoming: { NSImage(named: "Icon_StoryExpired")!.precomposed(palette.chatReplyTitleBubble_incoming) },
27332768
message_story_expired_bubble_outgoing: { NSImage(named: "Icon_StoryExpired")!.precomposed(palette.chatReplyTitleBubble_outgoing) },
27342769
message_quote_accent: { NSImage(named: "Icon_Quote")!.precomposed(palette.accent) },
2735-
message_quote_red: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarRedTop) },
2736-
message_quote_orange: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarOrangeTop) },
2737-
message_quote_violet: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarVioletTop) },
2738-
message_quote_green: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarGreenTop) },
2739-
message_quote_cyan: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarCyanTop) },
2740-
message_quote_blue: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarBlueTop) },
2741-
message_quote_pink: { NSImage(named: "Icon_Quote")!.precomposed(palette.peerAvatarPinkTop) }
2770+
message_quote_red: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0xCC5049)) },
2771+
message_quote_orange: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0xD67722)) },
2772+
message_quote_violet: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0x955CDB)) },
2773+
message_quote_green: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0x40A920)) },
2774+
message_quote_cyan: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0x309EBA)) },
2775+
message_quote_blue: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0x368AD1)) },
2776+
message_quote_pink: { NSImage(named: "Icon_Quote")!.precomposed(NSColor(0xC7508B)) },
2777+
message_quote_bubble_incoming: { NSImage(named: "Icon_Quote")!.precomposed(palette.chatReplyTitleBubble_incoming) },
2778+
message_quote_bubble_outgoing: { NSImage(named: "Icon_Quote")!.precomposed(palette.chatReplyTitleBubble_outgoing) }
27422779

27432780
)
27442781
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "channel_color.png",
5+
"idiom" : "universal",
6+
"scale" : "1x"
7+
},
8+
{
9+
"filename" : "channel_color@2x.png",
10+
"idiom" : "universal",
11+
"scale" : "2x"
12+
},
13+
{
14+
"idiom" : "universal",
15+
"scale" : "3x"
16+
}
17+
],
18+
"info" : {
19+
"author" : "xcode",
20+
"version" : 1
21+
}
22+
}
581 Bytes
Loading
1.04 KB
Loading

‎Telegram-Mac/AvatarContentView.swift‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ final class AvatarContentView: View {
3838
let frameSize = self.frame.size
3939

4040

41-
let signal: Signal<(CGImage, CGImage)?, NoError> = peerAvatarImage(account: context.account, photo: .peer(peer, peer.smallProfileImage, peer.displayLetters, nil), displayDimensions: size, scale: System.backingScale, font: .avatar(size.height / 3 + 3), genCap: true, synchronousLoad: synchronousLoad) |> runOn(.concurrentDefaultQueue()) |> map { image in
41+
let signal: Signal<(CGImage, CGImage)?, NoError> = peerAvatarImage(account: context.account, photo: .peer(peer, peer.smallProfileImage, peer.nameColor, peer.displayLetters, nil), displayDimensions: size, scale: System.backingScale, font: .avatar(size.height / 3 + 3), genCap: true, synchronousLoad: synchronousLoad) |> runOn(.concurrentDefaultQueue()) |> map { image in
4242
if let image = image.0 {
4343
let clipImage = generateImage(frameSize, rotatedContext: { size, context in
4444
context.clear(CGRect(origin: CGPoint(), size: size))
@@ -184,7 +184,7 @@ final class AvatarContentLayer: SimpleLayer {
184184
let frameSize = self.frame.size
185185

186186

187-
let signal: Signal<(CGImage, CGImage)?, NoError> = peerAvatarImage(account: context.account, photo: .peer(peer, peer.smallProfileImage, peer.displayLetters, nil), displayDimensions: size, scale: System.backingScale, font: .avatar(size.height / 3 + 3), genCap: true, synchronousLoad: synchronousLoad) |> deliverOn(prepareQueue) |> map { image in
187+
let signal: Signal<(CGImage, CGImage)?, NoError> = peerAvatarImage(account: context.account, photo: .peer(peer, peer.smallProfileImage, peer.nameColor, peer.displayLetters, nil), displayDimensions: size, scale: System.backingScale, font: .avatar(size.height / 3 + 3), genCap: true, synchronousLoad: synchronousLoad) |> deliverOn(prepareQueue) |> map { image in
188188
if let image = image.0 {
189189
let clipImage = generateImage(frameSize, rotatedContext: { size, context in
190190
context.clear(CGRect(origin: CGPoint(), size: size))

‎Telegram-Mac/AvatarLayer.swift‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ private class AvatarNodeParameters: NSObject {
3232

3333
enum AvatarNodeState: Equatable {
3434
case Empty
35-
case PeerAvatar(Peer, [String], TelegramMediaImageRepresentation?, Message?, NSSize?, Bool)
35+
case PeerAvatar(Peer, [String], TelegramMediaImageRepresentation?, PeerNameColor?, Message?, NSSize?, Bool)
3636
case ArchivedChats
3737
}
3838

3939
func ==(lhs: AvatarNodeState, rhs: AvatarNodeState) -> Bool {
4040
switch (lhs, rhs) {
4141
case (.Empty, .Empty):
4242
return true
43-
case let (.PeerAvatar(lhsPeer, lhsLetters, lhsPhotoRepresentations, _, lhsSize, lhsForum), .PeerAvatar(rhsPeer, rhsLetters, rhsPhotoRepresentations, _, rhsSize, rhsForum)):
44-
return lhsPeer.isEqual(rhsPeer) && lhsLetters == rhsLetters && lhsPhotoRepresentations == rhsPhotoRepresentations && lhsSize == rhsSize && lhsForum == rhsForum
43+
case let (.PeerAvatar(lhsPeer, lhsLetters, lhsPhotoRepresentations, lhsPeerNameColor, _, lhsSize, lhsForum), .PeerAvatar(rhsPeer, rhsLetters, rhsPhotoRepresentations, rhsPeerNameColor, _, rhsSize, rhsForum)):
44+
return lhsPeer.isEqual(rhsPeer) && lhsLetters == rhsLetters && lhsPhotoRepresentations == rhsPhotoRepresentations && lhsSize == rhsSize && lhsForum == rhsForum && lhsPeerNameColor == rhsPeerNameColor
4545
case (.ArchivedChats, .ArchivedChats):
4646
return true
4747
default:
@@ -144,7 +144,7 @@ class AvatarControl: NSView {
144144
self.disableForum = disableForum
145145
let state: AvatarNodeState
146146
if let peer = peer {
147-
state = .PeerAvatar(peer, peer.displayLetters, peer.smallProfileImage, message, size, peer.isForum && !disableForum)
147+
state = .PeerAvatar(peer, peer.displayLetters, peer.smallProfileImage, peer.nameColor, message, size, peer.isForum && !disableForum)
148148
} else {
149149
state = .Empty
150150
}
@@ -223,15 +223,15 @@ class AvatarControl: NSView {
223223
let photo: PeerPhoto?
224224
var updatedSize: NSSize = self.frame.size
225225
switch state {
226-
case let .PeerAvatar(peer, letters, representation, message, size, _):
226+
case let .PeerAvatar(peer, letters, representation, nameColor, message, size, _):
227227
if let peer = peer as? TelegramUser, peer.firstName == nil && peer.lastName == nil {
228228
photo = nil
229229
self.setState(account: account, state: .Empty)
230230
let icon = theme.icons.deletedAccount
231231
self.setSignal(generateEmptyPhoto(updatedSize, type: .icon(colors: theme.colors.peerColors(Int(peer.id.id._internalGetInt64Value() % 7)), icon: icon, iconSize: icon.backingSize.aspectFitted(NSMakeSize(min(50, updatedSize.width - 20), min(updatedSize.height - 20, 50))), cornerRadius: nil)) |> map {($0, false)})
232232
return
233233
} else {
234-
photo = .peer(peer, representation, letters, message)
234+
photo = .peer(peer, representation, nameColor, letters, message)
235235
}
236236
updatedSize = size ?? frame.size
237237
case .Empty:

0 commit comments

Comments
 (0)