#pragma once #include class QTextEdit; class QPushButton; class QLabel; class QProgressBar; class EmojiPanel; class AudioRecorder; class InputBar : public QWidget { Q_OBJECT public: explicit InputBar(EmojiPanel *emojiPanel, AudioRecorder *recorder, QWidget *parent = nullptr); void setRecordingContext(const QString& mediaDirBase, const QString& channelId); signals: void sendMessage(const QString &text); void sendVoiceMessage(const QString& mediaSrc, const QString& mediaDest, int durationMs, const QString& waveformStr); void sendFileAttachment(const QString& mediaSrc, const QString& mediaDest, const QString& displayName); protected: bool eventFilter(QObject *obj, QEvent *event) override; void resizeEvent(QResizeEvent* event) override; private slots: void onSendClicked(); void adjustInputHeight(); void onPttPressed(); void onPttReleased(); void onAttachClicked(); void clearPendingAttachment(); void updateRecordingUI(int ms); void showRecordOverlay(); void hideRecordOverlay(); private: static QString formatFileSize(qint64 bytes); QTextEdit *m_input; QPushButton *m_emojiBtn; QPushButton *m_pttBtn; QPushButton *m_attachBtn = nullptr; EmojiPanel *m_emojiPanel; AudioRecorder *m_recorder; QWidget *m_recordOverlay = nullptr; QLabel *m_recordLabel = nullptr; QPushButton *m_cancelRecBtn = nullptr; QProgressBar *m_levelBar = nullptr; QWidget *m_attachPreview = nullptr; QLabel *m_attachPreviewLabel = nullptr; QPushButton *m_attachClearBtn = nullptr; bool m_pttActive = false; QString m_voiceFilePath; QString m_mediaDirBase; QString m_channelIdForRecord; QString m_pendingAttachSrc; QString m_pendingAttachDest; QString m_pendingAttachName; qint64 m_pendingAttachSize = 0; };