From ba934ceb1bfe30d01d5fb5c072c3197f8080be04 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Sat, 20 Sep 2008 04:12:37 +0200 Subject: [PATCH] Test our newly acquired shortcut capabilities by finally allowing Ctrl+F to trigger the search bar :) We have now a global ActionCollection (accessible through QtUi::actionCollection()) that allows the use of global shortcuts. ChatViewSearchBar is the first widget to make use of this. Also some cleanups. ChatViewSearchBar now uses --- src/qtui/chatitem.cpp | 1 + src/qtui/chatline.cpp | 1 + src/qtui/chatlinemodelitem.cpp | 6 ++--- src/qtui/chatscene.cpp | 3 ++- src/qtui/chatviewsearchbar.cpp | 27 +++++++++++++------- src/qtui/chatviewsearchbar.h | 5 +--- src/qtui/mainwin.cpp | 15 +++++++++-- src/qtui/mainwin.h | 11 +++++--- src/qtui/qtui.cpp | 9 ++++--- src/qtui/qtui.h | 16 ++++++++++-- src/qtui/settingspages/colorsettingspage.cpp | 3 ++- src/qtui/settingspages/fontssettingspage.cpp | 7 ++--- src/qtui/topiclabel.cpp | 1 + src/uisupport/actioncollection.cpp | 7 ++++- src/uisupport/actioncollection.h | 1 + 15 files changed, 81 insertions(+), 32 deletions(-) diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index a087d6cd..28b496ea 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -30,6 +30,7 @@ #include "chatitem.h" #include "chatlinemodel.h" #include "qtui.h" +#include "qtuistyle.h" ChatItem::ChatItem(ChatLineModel::ColumnType col, QAbstractItemModel *model, QGraphicsItem *parent) : QGraphicsItem(parent), diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index 24e4a5d1..1a8501c7 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -32,6 +32,7 @@ #include "networkmodel.h" #include "qtui.h" #include "qtuisettings.h" +#include "qtuistyle.h" ChatLine::ChatLine(int row, QAbstractItemModel *model, QGraphicsItem *parent) : QGraphicsItem(parent), diff --git a/src/qtui/chatlinemodelitem.cpp b/src/qtui/chatlinemodelitem.cpp index 90691f8f..24e2273d 100644 --- a/src/qtui/chatlinemodelitem.cpp +++ b/src/qtui/chatlinemodelitem.cpp @@ -24,7 +24,7 @@ #include "chatlinemodelitem.h" #include "chatlinemodel.h" #include "qtui.h" -#include "uistyle.h" +#include "qtuistyle.h" // This Struct is taken from Harfbuzz. We use it only to calc it's size. // we use a shared memory region so we do not have to malloc a buffer area for every line @@ -92,7 +92,7 @@ public: computeWrapList(); return _wrapList; } - + private: inline void style() { QtUiStyle::StyledMessage m = QtUi::style()->styleMessage(*_msgBuffer); @@ -168,7 +168,7 @@ private: // the part " || (finder.position() == contents->plainText.length())" shouldn't be necessary // but in rare and indeterministic cases Qt states that the end of the text is not a boundary o_O } while(finder.isAtBoundary() || (finder.position() == contents->plainText.length())); - + // A QVector needs less space than a QList _wrapList.resize(wplist.count()); for(int i = 0; i < wplist.count(); i++) { diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 6c54f7c7..c3a07b15 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -32,6 +32,7 @@ #include "columnhandleitem.h" #include "messagefilter.h" #include "qtui.h" +#include "qtuistyle.h" #include "chatviewsettings.h" const qreal minContentsWidth = 200; @@ -152,7 +153,7 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) { line->setPos(0, line->pos().y() + offset); } } - + // update sceneRect if(atTop || moveTop) { updateSceneRect(_sceneRect.adjusted(0, h, 0, 0)); diff --git a/src/qtui/chatviewsearchbar.cpp b/src/qtui/chatviewsearchbar.cpp index 121070d3..c4c6f095 100644 --- a/src/qtui/chatviewsearchbar.cpp +++ b/src/qtui/chatviewsearchbar.cpp @@ -20,7 +20,9 @@ #include "chatviewsearchbar.h" -#include +#include "action.h" +#include "actioncollection.h" +#include "qtui.h" ChatViewSearchBar::ChatViewSearchBar(QWidget *parent) : QWidget(parent) @@ -31,18 +33,25 @@ ChatViewSearchBar::ChatViewSearchBar(QWidget *parent) ui.searchUpButton->setEnabled(false); ui.searchDownButton->setEnabled(false); - _toggleViewAction = new QAction(tr("Show search bar"), this); - _toggleViewAction->setCheckable(true); - _toggleViewAction->setChecked(false); - connect(_toggleViewAction, SIGNAL(toggled(bool)), - this, SLOT(setVisible(bool))); - setVisible(false); + hide(); - connect(ui.hideButton, SIGNAL(clicked()), - _toggleViewAction, SLOT(toggle())); + ActionCollection *coll = QtUi::actionCollection(); + + Action *toggleSearchBar = coll->add("toggleSearchBar"); + connect(toggleSearchBar, SIGNAL(toggled(bool)), SLOT(setVisible(bool))); + toggleSearchBar->setText(tr("Show Search Bar")); + toggleSearchBar->setShortcut(Qt::CTRL + Qt::Key_F); + toggleSearchBar->setCheckable(true); + + Action *hideSearchBar = coll->add("hideSearchBar", toggleSearchBar, SLOT(setChecked(bool))); // always false + hideSearchBar->setShortcut(Qt::Key_Escape); + + connect(ui.hideButton, SIGNAL(clicked()), toggleSearchBar, SLOT(toggle())); } void ChatViewSearchBar::setVisible(bool visible) { QWidget::setVisible(visible); ui.searchEditLine->clear(); + if(visible) ui.searchEditLine->setFocus(); } + diff --git a/src/qtui/chatviewsearchbar.h b/src/qtui/chatviewsearchbar.h index 043e4bac..8caf3f80 100644 --- a/src/qtui/chatviewsearchbar.h +++ b/src/qtui/chatviewsearchbar.h @@ -39,14 +39,11 @@ public: inline QCheckBox *searchMsgsBox() const { return ui.searchMsgsBox; } inline QCheckBox *searchOnlyRegularMsgsBox() const { return ui.searchOnlyRegularMsgsBox; } - inline QAction *toggleViewAction() const { return _toggleViewAction; } - public slots: - void setVisible(bool visible); + void setVisible(bool); private: Ui::ChatViewSearchBar ui; - QAction *_toggleViewAction; }; #endif //CHATVIEWSEARCHBAR_H diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 46756e5a..88968936 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -20,6 +20,8 @@ #include "mainwin.h" #include "aboutdlg.h" +#include "action.h" +#include "actioncollection.h" #include "bufferview.h" #include "bufferviewconfig.h" #include "bufferviewfilter.h" @@ -82,7 +84,8 @@ MainWin::MainWin(QWidget *parent) offlineTrayIcon(":/icons/quassel-icon-offline.png"), trayIconActive(false), - timer(new QTimer(this)) + timer(new QTimer(this)), + _actionCollection(new ActionCollection(this)) { UiSettings uiSettings; QString style = uiSettings.value("Style", QString("")).toString(); @@ -97,6 +100,8 @@ MainWin::MainWin(QWidget *parent) systray->setIcon(offlineTrayIcon); setWindowIconText("Quassel IRC"); + QtUi::actionCollection()->addAssociatedWidget(this); + statusBar()->showMessage(tr("Waiting for core...")); installEventFilter(new JumpKeyHandler(this)); @@ -140,6 +145,7 @@ void MainWin::init() { setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); // setup stuff... + setupActions(); setupMenus(); setupViews(); setupNickWidget(); @@ -161,7 +167,7 @@ void MainWin::init() { // attach the BufferWidget to the BufferModel and the default selection ui.bufferWidget->setModel(Client::bufferModel()); ui.bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - ui.menuViews->addAction(ui.bufferWidget->searchBar()->toggleViewAction()); + ui.menuViews->addAction(QtUi::actionCollection()->action("toggleSearchBar")); _titleSetter.setModel(Client::bufferModel()); _titleSetter.setSelectionModel(Client::bufferModel()->standardSelectionModel()); @@ -174,6 +180,11 @@ MainWin::~MainWin() { s.setValue("MainWinState", saveState()); } +void MainWin::setupActions() { + + +} + void MainWin::setupMenus() { connect(ui.actionConnectCore, SIGNAL(triggered()), this, SLOT(showCoreConnectionDlg())); connect(ui.actionDisconnectCore, SIGNAL(triggered()), Client::instance(), SLOT(disconnectFromCore())); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index a055115a..ffa2ade1 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -18,18 +18,19 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef _MAINWIN_H_ -#define _MAINWIN_H_ +#ifndef MAINWIN_H_ +#define MAINWIN_H_ #include "ui_mainwin.h" #include "qtui.h" #include "titlesetter.h" -#include "sessionsettings.h" +#include "sessionsettings.h" #include #include +class ActionCollection; class Buffer; class BufferViewConfig; class MsgProcessorStatusWidget; @@ -49,6 +50,7 @@ class MainWin : public QMainWindow { virtual ~MainWin(); void init(); + void addBufferView(BufferViewConfig *config = 0); void displayTrayIconMessage(const QString &title, const QString &message); @@ -121,6 +123,7 @@ class MainWin : public QMainWindow { TitleSetter _titleSetter; + void setupActions(); void setupMenus(); void setupViews(); void setupNickWidget(); @@ -146,6 +149,8 @@ class MainWin : public QMainWindow { QList _netViews; NickListWidget *nickListWidget; + ActionCollection *_actionCollection; + #ifdef HAVE_DBUS org::freedesktop::Notifications *desktopNotifications; quint32 notificationId; diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index ff676ad1..85e6b1a6 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -22,22 +22,25 @@ #include +#include "actioncollection.h" #include "chatlinemodel.h" #include "mainwin.h" #include "qtuimessageprocessor.h" +#include "qtuistyle.h" #include "uisettings.h" #include "util.h" +ActionCollection *QtUi::_actionCollection = 0; QtUiStyle *QtUi::_style = 0; -QtUi::QtUi() - : AbstractUi() +QtUi::QtUi() : AbstractUi() { if(_style != 0) { qWarning() << "QtUi has been instantiated again!"; return; } - + _actionCollection = new ActionCollection(this); + UiSettings uiSettings; loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); diff --git a/src/qtui/qtui.h b/src/qtui/qtui.h index 2c1156f7..9ac3b97b 100644 --- a/src/qtui/qtui.h +++ b/src/qtui/qtui.h @@ -21,12 +21,13 @@ #ifndef QTUI_H #define QTUI_H -#include "qtuistyle.h" #include "quasselui.h" +class ActionCollection; class MainWin; class MessageModel; class QtUiMessageProcessor; +class QtUiStyle; //! This class encapsulates Quassel's Qt-based GUI. /** This is basically a wrapper around MainWin, which is necessary because we cannot derive MainWin @@ -42,7 +43,14 @@ public: MessageModel *createMessageModel(QObject *parent); AbstractMessageProcessor *createMessageProcessor(QObject *parent); - inline static QtUiStyle *style() { return _style; } + inline static QtUiStyle *style(); + + //! Access the global ActionCollection. + /** This ActionCollection is associated with the main window, i.e. it contains global + * actions (and thus, shortcuts). Widgets providing application-wide shortcuts should + * create appropriate Action objects using QtUi::actionCollection()->add\(). + */ + inline static ActionCollection *actionCollection(); public slots: void init(); @@ -53,7 +61,11 @@ protected slots: private: MainWin *mainWin; + static ActionCollection *_actionCollection; static QtUiStyle *_style; }; +ActionCollection *QtUi::actionCollection() { return _actionCollection; } +QtUiStyle *QtUi::style() { return _style; } + #endif diff --git a/src/qtui/settingspages/colorsettingspage.cpp b/src/qtui/settingspages/colorsettingspage.cpp index 8e76c709..2a8ee4c3 100644 --- a/src/qtui/settingspages/colorsettingspage.cpp +++ b/src/qtui/settingspages/colorsettingspage.cpp @@ -22,6 +22,7 @@ #include "qtui.h" #include "qtuisettings.h" +#include "qtuistyle.h" #include "colorbutton.h" #include @@ -590,7 +591,7 @@ bool ColorSettingsPage::testHasChanged() { if(QtUi::style()->format(UiStyle::Sender).background().color() != ui.senderBG->color()) return true; if(settings["SenderUseBG"].toBool() != ui.senderUseBG->isChecked()) return true; if(settings["NewMsgMarkerFG"].value() != ui.newMsgMarkerFG->color()) return true; - + /* if(QtUi::style()->format(UiStyle::Nick).foreground().color() != ui.nickFG->color()) return true; if(QtUi::style()->format(UiStyle::Nick).background().color() != ui.nickBG->color()) return true; diff --git a/src/qtui/settingspages/fontssettingspage.cpp b/src/qtui/settingspages/fontssettingspage.cpp index f8ba23bd..7d81e7f5 100644 --- a/src/qtui/settingspages/fontssettingspage.cpp +++ b/src/qtui/settingspages/fontssettingspage.cpp @@ -22,6 +22,7 @@ #include "qtui.h" #include "qtuisettings.h" +#include "qtuistyle.h" #include @@ -49,7 +50,7 @@ FontsSettingsPage::FontsSettingsPage(QWidget *parent) mapper->setMapping(ui.chooseTimestamp, ui.demoTimestamp); connect(mapper, SIGNAL(mapped(QWidget *)), this, SLOT(chooseFont(QWidget *))); - + //connect(ui.customAppFonts, SIGNAL(clicked()), this, SLOT(widgetHasChanged())); connect(ui.checkTopic, SIGNAL(clicked()), this, SLOT(widgetHasChanged())); connect(ui.checkBufferView, SIGNAL(clicked()), this, SLOT(widgetHasChanged())); @@ -87,7 +88,7 @@ void FontsSettingsPage::load(Settings::Mode mode) { inputLineFont = qApp->font(); } initLabel(ui.demoInputLine, inputLineFont); - + QTextCharFormat chatFormat = QtUi::style()->format(UiStyle::None, mode); initLabel(ui.demoChatMessages, chatFormat.font()); QTextCharFormat nicksFormat = QtUi::style()->format(UiStyle::Sender, mode); @@ -114,7 +115,7 @@ void FontsSettingsPage::save() { QtUiSettings s; s.setValue("UseInputLineFont", (ui.checkInputLine->checkState() == Qt::Checked)); s.setValue("InputLineFont", ui.demoInputLine->font()); - + QTextCharFormat chatFormat = QtUi::style()->format(UiStyle::None); chatFormat.setFont(ui.demoChatMessages->font()); QtUi::style()->setFormat(UiStyle::None, chatFormat, Settings::Custom); diff --git a/src/qtui/topiclabel.cpp b/src/qtui/topiclabel.cpp index b41f7365..87031424 100644 --- a/src/qtui/topiclabel.cpp +++ b/src/qtui/topiclabel.cpp @@ -31,6 +31,7 @@ #include #include "qtui.h" +#include "qtuistyle.h" #include "message.h" TopicLabel::TopicLabel(QWidget *parent) diff --git a/src/uisupport/actioncollection.cpp b/src/uisupport/actioncollection.cpp index a20d9183..8a5d6067 100644 --- a/src/uisupport/actioncollection.cpp +++ b/src/uisupport/actioncollection.cpp @@ -21,6 +21,7 @@ ***************************************************************************/ #include +#include #include "actioncollection.h" @@ -49,7 +50,7 @@ QList ActionCollection::actions() const { } Action *ActionCollection::addAction(const QString &name, Action *action) { - QAction *act = addAction(name, action); + QAction *act = addAction(name, static_cast(action)); Q_ASSERT(act == action); return action; } @@ -206,6 +207,10 @@ void ActionCollection::clearAssociatedWidgets() { _associatedWidgets.clear(); } +void ActionCollection::associatedWidgetDestroyed(QObject *obj) { + _associatedWidgets.removeAll(static_cast(obj)); +} + bool ActionCollection::unlistAction(QAction *action) { // This might be called with a partly destroyed QAction! diff --git a/src/uisupport/actioncollection.h b/src/uisupport/actioncollection.h index 41bc044a..c03daef8 100644 --- a/src/uisupport/actioncollection.h +++ b/src/uisupport/actioncollection.h @@ -23,6 +23,7 @@ #ifndef ACTIONCOLLECTION_H_ #define ACTIONCOLLECTION_H_ +#include #include #include #include -- 2.20.1