/** * Constructs a TabDlg * * \param tabManager The tabManager that will manage this TabDlg * \param delegate If non-zero, this is a pointer to a TabDlgDelegate that * will manage some aspects of the TabDlg behavior. Ownership is not * passed. */ TabDlg::TabDlg(TabManager* tabManager, const QString& geometryOption, TabDlgDelegate *delegate) : AdvancedWidget<QWidget>(0, delegate ? delegate->initWindowFlags() : (Qt::WindowFlags)0) , delegate_(delegate) , tabWidget_(0) , detachButton_(0) , closeButton_(0) , closeCross_(0) , tabMenu_(new QMenu(this)) , act_close_(0) , act_next_(0) , act_prev_(0) , tabManager_(tabManager) , userManagement_(true) , tabBarSingles_(true) , simplifiedCaption_(false) , activateTabMapper_(0) { if (delegate_) { delegate_->create(this); } // FIXME qRegisterMetaType<TabDlg*>("TabDlg*"); qRegisterMetaType<TabbableWidget*>("TabbableWidget*"); tabWidget_ = new PsiTabWidget(this); tabWidget_->setCloseIcon(IconsetFactory::icon("psi/closetab").icon()); connect(tabWidget_, SIGNAL(mouseDoubleClickTab(QWidget*)), SLOT(mouseDoubleClickTab(QWidget*))); connect(tabWidget_, SIGNAL(mouseMiddleClickTab(QWidget*)), SLOT(mouseMiddleClickTab(QWidget*))); connect(tabWidget_, SIGNAL(aboutToShowMenu(QMenu*)), SLOT(tab_aboutToShowMenu(QMenu*))); connect(tabWidget_, SIGNAL(tabContextMenu(int, QPoint, QContextMenuEvent*)), SLOT(showTabMenu(int, QPoint, QContextMenuEvent*))); connect(tabWidget_, SIGNAL(closeButtonClicked()), SLOT(closeCurrentTab())); connect(tabWidget_, SIGNAL(currentChanged(QWidget*)), SLOT(tabSelected(QWidget*))); if(delegate_) delegate_->tabWidgetCreated(this, tabWidget_); QVBoxLayout *vert1 = new QVBoxLayout(this); vert1->setMargin(1); vert1->addWidget(tabWidget_); setAcceptDrops(true); X11WM_CLASS("tabs"); setLooks(); act_close_ = new QAction(this); addAction(act_close_); connect(act_close_,SIGNAL(triggered()), SLOT(closeCurrentTab())); act_prev_ = new QAction(this); addAction(act_prev_); connect(act_prev_,SIGNAL(triggered()), SLOT(previousTab())); act_next_ = new QAction(this); addAction(act_next_); connect(act_next_,SIGNAL(triggered()), SLOT(nextTab())); setShortcuts(); setGeometryOptionPath(geometryOption); }
/** * Add the Widget to the tab stack. */ void PsiTabWidget::addTab(QWidget *widget, QString name, const QIcon &icon) { Q_ASSERT(widget); if (widgets_.contains(widget)) { return; } widgets_.append(widget); stacked_->addWidget(widget); if (PsiOptions::instance()->getOption("options.ui.tabs.show-tab-icons").toBool()) tabBar_->addTab(icon, name); else tabBar_->addTab(name); setLooks(); showPage(currentPage()); tabBar_->layoutTabs(); }
void ChatDlg::init() { initUi(); initActions(); setShortcuts(); // TODO: this have to be moved to chatEditCreated() chatView()->setDialog(this); chatEdit()->setDialog(this); chatEdit()->installEventFilter(this); connect(chatView(), SIGNAL(selectionChanged()), SLOT(logSelectionChanged())); // SyntaxHighlighters modify the QTextEdit in a QTimer::singleShot(0, ...) call // so we need to install our hooks after it fired for the first time QTimer::singleShot(10, this, SLOT(initComposing())); connect(this, SIGNAL(composing(bool)), SLOT(updateIsComposing(bool))); setAcceptDrops(TRUE); updateContact(jid(), true); X11WM_CLASS("chat"); setLooks(); updatePGP(); connect(account(), SIGNAL(pgpKeyChanged()), SLOT(updatePGP())); connect(account(), SIGNAL(encryptedMessageSent(int, bool, int, const QString &)), SLOT(encryptedMessageSent(int, bool, int, const QString &))); account()->dialogRegister(this, jid()); chatView()->setFocusPolicy(Qt::NoFocus); chatEdit()->setFocus(); // TODO: port to restoreSavedSize() (and adapt it from restoreSavedGeometry()) QSize size = PsiOptions::instance()->getOption("options.ui.chat.size").toSize(); if (!size.isEmpty()) { resize(size); } else { resize(defaultSize()); } }
//---------------------------------------------------------------------------- // ChatView //---------------------------------------------------------------------------- ChatView::ChatView(QWidget *parent) : PsiTextView(parent) , isMuc_(false) , oldTrackBarPosition(0) , dialog_(0) { setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); setReadOnly(true); setUndoRedoEnabled(false); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setLooks(this); #ifndef HAVE_X11 // linux has this feature built-in connect(this, SIGNAL(selectionChanged()), SLOT(autoCopy())); connect(this, SIGNAL(cursorPositionChanged()), SLOT(autoCopy())); #endif useMessageIcons_ = PsiOptions::instance()->getOption("options.ui.chat.use-message-icons").toBool(); if (useMessageIcons_) { int logIconsSize = fontInfo().pixelSize()*0.93; if (PsiOptions::instance()->getOption("options.ui.chat.scaled-message-icons").toBool()) { logIconReceive = IconsetFactory::iconPixmap("psi/notification_chat_receive").scaledToHeight(logIconsSize, Qt::SmoothTransformation); logIconSend = IconsetFactory::iconPixmap("psi/notification_chat_send").scaledToHeight(logIconsSize, Qt::SmoothTransformation); logIconDelivered = IconsetFactory::iconPixmap("psi/notification_chat_delivery_ok").scaledToHeight(logIconsSize, Qt::SmoothTransformation); logIconTime = IconsetFactory::iconPixmap("psi/notification_chat_time").scaledToHeight(logIconsSize, Qt::SmoothTransformation); logIconInfo = IconsetFactory::iconPixmap("psi/notification_chat_info").scaledToHeight(logIconsSize, Qt::SmoothTransformation); } else { logIconReceive = IconsetFactory::iconPixmap("psi/notification_chat_receive"); logIconSend = IconsetFactory::iconPixmap("psi/notification_chat_send"); logIconDelivered = IconsetFactory::iconPixmap("psi/notification_chat_delivery_ok"); logIconTime = IconsetFactory::iconPixmap("psi/notification_chat_time"); logIconInfo = IconsetFactory::iconPixmap("psi/notification_chat_info"); } addLogIconsResources(); } }
void ChatDlg::optionsUpdate() { setLooks(); setShortcuts(); if (isHidden()) { if (PsiOptions::instance()->getOption("options.ui.chat.delete-contents-after").toString() == "instant") { deleteLater(); return; } else { if (PsiOptions::instance()->getOption("options.ui.chat.delete-contents-after").toString() == "hour") { setSelfDestruct(60); } else if (PsiOptions::instance()->getOption("options.ui.chat.delete-contents-after").toString() == "day") { setSelfDestruct(60 * 24); } else { setSelfDestruct(0); } } } }
/** * Constructs a TabDlg * * \param tabManager The tabManager that will manage this TabDlg * \param delegate If non-zero, this is a pointer to a TabDlgDelegate that * will manage some aspects of the TabDlg behavior. Ownership is not * passed. */ TabDlg::TabDlg(TabManager* tabManager, QSize size, TabDlgDelegate *delegate) : AdvancedWidget<QWidget>(0, delegate ? delegate->initWindowFlags() : (Qt::WindowFlags)0) , delegate_(delegate) , tabWidget_(0) , detachButton_(0) , closeButton_(0) , closeCross_(0) , tabMenu_(new QMenu(this)) , act_close_(0) , act_next_(0) , act_prev_(0) , tabManager_(tabManager) , userManagement_(true) , tabBarSingles_(true) , simplifiedCaption_(false) { if (delegate_) { delegate_->create(this); } // FIXME qRegisterMetaType<TabDlg*>("TabDlg*"); qRegisterMetaType<TabbableWidget*>("TabbableWidget*"); tabWidget_ = new PsiTabWidget(this); tabWidget_->setCloseIcon(IconsetFactory::icon("psi/closetab").icon()); connect(tabWidget_, SIGNAL(mouseDoubleClickTab(QWidget*)), SLOT(mouseDoubleClickTab(QWidget*))); connect(tabWidget_, SIGNAL(mouseMiddleClickTab(QWidget*)), SLOT(mouseMiddleClickTab(QWidget*))); connect(tabWidget_, SIGNAL(aboutToShowMenu(QMenu*)), SLOT(tab_aboutToShowMenu(QMenu*))); connect(tabWidget_, SIGNAL(tabContextMenu(int, QPoint, QContextMenuEvent*)), SLOT(showTabMenu(int, QPoint, QContextMenuEvent*))); connect(tabWidget_, SIGNAL(closeButtonClicked()), SLOT(closeCurrentTab())); connect(tabWidget_, SIGNAL(currentChanged(QWidget*)), SLOT(tabSelected(QWidget*))); if(delegate_) delegate_->tabWidgetCreated(this, tabWidget_); QVBoxLayout *vert1 = new QVBoxLayout(this); vert1->setMargin(1); vert1->addWidget(tabWidget_); setAcceptDrops(true); X11WM_CLASS("tabs"); setLooks(); act_close_ = new QAction(this); addAction(act_close_); connect(act_close_,SIGNAL(triggered()), SLOT(closeCurrentTab())); act_prev_ = new QAction(this); addAction(act_prev_); connect(act_prev_,SIGNAL(triggered()), SLOT(previousTab())); act_next_ = new QAction(this); addAction(act_next_); connect(act_next_,SIGNAL(triggered()), SLOT(nextTab())); setShortcuts(); QSignalMapper* activateTabMapper_ = new QSignalMapper(this); connect(activateTabMapper_, SIGNAL(mapped(int)), tabWidget_, SLOT(setCurrentPage(int))); for (int i = 0; i < 10; ++i) { QAction* action = new QAction(this); connect(action, SIGNAL(triggered()), activateTabMapper_, SLOT(map())); action->setShortcuts(QList<QKeySequence>() << QKeySequence(QString("Ctrl+%1").arg(i)) << QKeySequence(QString("Alt+%1").arg(i))); activateTabMapper_->setMapping(action, (i > 0 ? i : 10) - 1); addAction(action); } if (size.isValid()) { resize(size); } else { resize(ChatDlg::defaultSize()); //TODO: no! } }
/** * Constructs a TabDlg * * \param tabManager The tabManager that will manage this TabDlg * \param delegate If non-zero, this is a pointer to a TabDlgDelegate that * will manage some aspects of the TabDlg behavior. Ownership is not * passed. */ TabDlg::TabDlg(TabManager* tabManager, QSize size, TabDlgDelegate *delegate) : AdvancedWidget<QWidget>(0, delegate ? delegate->initWindowFlags() : (Qt::WindowFlags)0) , delegate_(delegate) , tabWidget_(0) , detachButton_(0) , closeButton_(0) , closeCross_(0) , tabMenu_(new QMenu(this)) , act_close_(0) , act_next_(0) , act_prev_(0) , tabManager_(tabManager) , userManagement_(true) , tabBarSingles_(true) , simplifiedCaption_(false) { if (delegate_) { delegate_->create(this); } if (PsiOptions::instance()->getOption("options.ui.mac.use-brushed-metal-windows").toBool()) { setAttribute(Qt::WA_MacMetalStyle); } // FIXME qRegisterMetaType<TabDlg*>("TabDlg*"); qRegisterMetaType<TabbableWidget*>("TabbableWidget*"); tabWidget_ = new PsiTabWidget(this); tabWidget_->setCloseIcon(IconsetFactory::icon("psi/closetab").icon()); connect(tabWidget_, SIGNAL(mouseDoubleClickTab(QWidget*)), SLOT(mouseDoubleClickTab(QWidget*))); connect(tabWidget_, SIGNAL(aboutToShowMenu(QMenu*)), SLOT(tab_aboutToShowMenu(QMenu*))); connect(tabWidget_, SIGNAL(tabContextMenu(int, QPoint, QContextMenuEvent*)), SLOT(showTabMenu(int, QPoint, QContextMenuEvent*))); connect(tabWidget_, SIGNAL(closeButtonClicked()), SLOT(closeCurrentTab())); connect(tabWidget_, SIGNAL(currentChanged(QWidget*)), SLOT(tabSelected(QWidget*))); if(delegate_) delegate_->tabWidgetCreated(this, tabWidget_); QVBoxLayout *vert1 = new QVBoxLayout( this, 1); vert1->addWidget(tabWidget_); setAcceptDrops(TRUE); X11WM_CLASS("tabs"); setLooks(); act_close_ = new QAction(this); addAction(act_close_); connect(act_close_,SIGNAL(activated()), SLOT(closeCurrentTab())); act_prev_ = new QAction(this); addAction(act_prev_); connect(act_prev_,SIGNAL(activated()), SLOT(previousTab())); act_next_ = new QAction(this); addAction(act_next_); connect(act_next_,SIGNAL(activated()), SLOT(nextTab())); setShortcuts(); if (size.isValid()) { resize(size); } else { resize(ChatDlg::defaultSize()); //TODO: no! } }
/** * Constructor */ PsiTabWidget::PsiTabWidget(QWidget *parent) : QWidget(parent) { tabsPosition_ = QTabWidget::East; // impossible => uninitialised state tabBar_ = new PsiTabBar(this); bool multiRow = PsiOptions::instance()->getOption("options.ui.tabs.multi-rows", true).toBool(); tabBar_->setMultiRow(multiRow); tabBar_->setUsesScrollButtons(!multiRow); layout_ = new QVBoxLayout(this); layout_->setMargin(0); layout_->setSpacing(0); barLayout_ = new QHBoxLayout; layout_->addLayout(barLayout_); barLayout_->setMargin(0); barLayout_->setSpacing(0); barLayout_->addWidget(tabBar_, 2); barLayout_->setAlignment(Qt::AlignLeft); int buttonwidth = qMax(tabBar_->style()->pixelMetric(QStyle::PM_TabBarScrollButtonWidth, 0, tabBar_), QApplication::globalStrut().width()); downButton_ = new QToolButton(this); downButton_->setMinimumSize(3,3); downButton_->setFixedWidth(buttonwidth); downButton_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); menu_ = new QMenu(this); downButton_->setMenu(menu_); downButton_->setStyleSheet(" QToolButton::menu-indicator { image:none } "); connect(menu_, SIGNAL(aboutToShow()), SLOT(menu_aboutToShow())); connect(menu_, SIGNAL(triggered(QAction*)), SLOT(menu_triggered(QAction*))); barLayout_->addWidget(downButton_); barLayout_->setAlignment(downButton_, Qt::AlignBottom); closeButton_ = new QToolButton(this); closeButton_->setMinimumSize(3,3); closeButton_->setFixedWidth(buttonwidth); closeButton_->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); barLayout_->addWidget(closeButton_); barLayout_->setAlignment(closeButton_, Qt::AlignBottom); closeButton_->setText("x"); downButton_->setArrowType(Qt::DownArrow); downButton_->setPopupMode(QToolButton::InstantPopup); stacked_ = new QStackedLayout(layout_); setTabPosition(QTabWidget::North); setLooks(); if (!PsiOptions::instance()->getOption("options.ui.tabs.show-tab-buttons").toBool()) { closeButton_->hide(); downButton_->hide(); } #if QT_VERSION >= 0x040500 if (!PsiOptions::instance()->getOption("options.ui.tabs.show-tab-close-buttons").toBool()) { tabBar_->setTabsClosable(false); } #endif connect( tabBar_, SIGNAL(mouseDoubleClickTab(int)), SLOT(mouseDoubleClickTab(int))); connect( tabBar_, SIGNAL(mouseMiddleClickTab(int)), SLOT(mouseMiddleClickTab(int))); connect( tabBar_, SIGNAL( currentChanged(int)), SLOT(tab_currentChanged(int))); connect( tabBar_, SIGNAL( contextMenu(QContextMenuEvent*,int)), SLOT( tab_contextMenu(QContextMenuEvent*,int))); connect( closeButton_, SIGNAL(clicked()), SIGNAL(closeButtonClicked())); connect(tabBar_, SIGNAL(tabMoved(int,int)),SLOT(widgetMoved(int,int))); connect(tabBar_, SIGNAL(tabCloseRequested(int)),SIGNAL(tabCloseRequested(int))); }