/*! * Создание или повторная инициализация вкладки канала. * * \param id Идентификатор канала. * \param create \b true если необходимо создать канал. * \param show \b true если необходимо выбрать эту вкладку. * * \return Возвращает указатель на вкладку или 0 в случае ошибки. */ ChannelBaseTab *TabWidget::channelTab(const QByteArray &id, bool create, bool show) { SLOG_DEBUG("id =" << SimpleID::encode(id) << "create =" << create << "show =" << show); if (!Channel::isCompatibleId(id)) return 0; ChannelBaseTab *tab = 0; if (m_channels.contains(id)) { tab = m_channels.value(id); create = false; } ClientChannel channel = ChatClient::channels()->get(id); if (!channel) { if (!m_prefetch.contains(id)) m_prefetch.append(id); return 0; } if (create) { if (channel->type() == SimpleID::UserId) tab = new PrivateTab(channel, this); else if (channel->type() == SimpleID::ChannelId) tab = new ChannelTab(channel, this); if (tab) { m_channels[id] = tab; tab->setOnline(); addTab(tab, tab->icon(), channel->name()); connect(tab, SIGNAL(actionTriggered(bool)), SLOT(openTab())); if (channel->type() == SimpleID::ChannelId && isAutoPin(channel->id())) tab->pin(); if (m_autoPin.contains(id)) { m_autoPin.removeAll(id); tab->pin(); emit pinned(tab); } } closePage(PROGRESS_TAB); closePage(WELCOME_TAB); } if (show && tab) setCurrentIndex(indexOf(tab)); return tab; }
void ChatUrls::openChannelUrl(const QUrl &url) { QStringList actions = ChatUrls::actions(url); if (actions.isEmpty()) return; ClientChannel channel = ChatUrls::channel(url); if (!channel) return; QString action = actions.first(); if (action == LS("open")) { ChatNotify::start(Notify::OpenChannel, channel->id()); } else if (action == LS("info")) { ChatNotify::start(Notify::OpenInfo, channel->id()); } else if (action == LS("insert")) { ChatNotify::start(Notify::InsertText, QChar(QChar::Nbsp) + QString(LS("<a class=\"nick color-%1\" href=\"%2\">%3</a>")) .arg(Gender::colorToString(channel->gender().color())) .arg(url.toString()) .arg(Qt::escape(channel->name())) + QChar(QChar::Nbsp)); } else if (action == LS("edit")) { if (actions.size() == 1) return; if (actions.at(1) == LS("topic") && channel->type() == SimpleID::ChannelId) ChatNotify::start(Notify::EditTopic, channel->id()); } }
/*! * Иконка канала. */ QIcon ChatIcons::icon(ClientChannel channel, int options) { QString file = LS(":/images/channel.png"); if (channel->type() == ChatId::UserId || channel->id().isEmpty()) { file = LS(":/images/user"); int gender = channel->gender().value(); int color = channel->gender().color(); if (gender == Gender::Unknown) { file += LS("-unknown"); } else if (gender == Gender::Ghost) { file += LS("-ghost"); } else if (gender == Gender::Bot) { file += LS("-bot"); } else if (color != Gender::Default) { file += LS("-") + Gender::colorToString(color); } if (gender == Gender::Female) file += LS("-female"); file += LS(".png"); } else if (channel->type() == ChatId::ChannelId && channel->gender().color() == Gender::Green) { file = LS(":/images/secure.png"); } const Status& status = channel->status(); if (options & OfflineStatus && status.value() == Status::Offline && !(options & Statuses)) options |= Statuses; if (options & Statuses) { if (options & OfflineStatus && (status.value() == Status::Offline || !channel->isSynced())) return QIcon(QIcon(file).pixmap(16, 16, QIcon::Disabled)); return ChatIcons::icon(file, overlay(status.value())); } return QIcon(file); }
/*! * Формирование пакета для отправки клиенту заголовка канала. * * \param channel Канал. * \param dest Идентификатор получателя. * \param command Команда. */ ChannelPacket ChannelNotice::channel(ClientChannel channel, const QByteArray &dest, const QString &command) { ChannelPacket packet(new ChannelNotice(channel->id(), dest, command, DateTime::utc())); packet->setDirection(Server2Client); packet->setText(channel->name()); packet->gender = channel->gender().raw(); packet->channelStatus = channel->status().value(); // packet.setData(channel->feeds().headers(0)); if (channel->type() == SimpleID::ChannelId) packet->channels = channel->channels().all(); return packet; }