diff --git a/src/mainwindow.ui b/src/mainwindow.ui index b2bb7c793..df3c93517 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1030,13 +1030,25 @@ QSplitter:handle{ - + 0 0 + + ... + + + QToolButton::InstantPopup + + + Qt::ToolButtonTextBesideIcon + + + Qt::DownArrow + diff --git a/src/widget/form/profileform.cpp b/src/widget/form/profileform.cpp index 89331fbdd..73c4e5f43 100644 --- a/src/widget/form/profileform.cpp +++ b/src/widget/form/profileform.cpp @@ -43,6 +43,7 @@ #include #include #include +#include ProfileForm::ProfileForm(QWidget *parent) : QWidget{parent}, qr{nullptr} diff --git a/src/widget/friendlistwidget.cpp b/src/widget/friendlistwidget.cpp index 7154c8b7c..5f0da4ed5 100644 --- a/src/widget/friendlistwidget.cpp +++ b/src/widget/friendlistwidget.cpp @@ -506,6 +506,7 @@ void FriendListWidget::moveWidget(FriendWidget* w, Status s, bool add) Time time = getTime(activityDate); CategoryWidget* categoryWidget = dynamic_cast(activityLayout->itemAt(time)->widget()); categoryWidget->addFriendWidget(contact->getFriendWidget(), contact->getStatus()); + categoryWidget->show(); } } diff --git a/src/widget/widget.cpp b/src/widget/widget.cpp index 96aced67e..137091d75 100644 --- a/src/widget/widget.cpp +++ b/src/widget/widget.cpp @@ -134,6 +134,45 @@ void Widget::init() ui->myProfile->insertWidget(0, profilePicture); ui->myProfile->insertSpacing(1, 7); + filterMenu = new QMenu(this); + filterGroup = new QActionGroup(this); + filterDisplayGroup = new QActionGroup(this); + + filterDisplayName = new QAction(this); + filterDisplayName->setCheckable(true); + filterDisplayName->setChecked(true); + filterDisplayGroup->addAction(filterDisplayName); + filterMenu->addAction(filterDisplayName); + filterDisplayActivity = new QAction(this); + filterDisplayActivity->setCheckable(true); + filterDisplayGroup->addAction(filterDisplayActivity); + filterMenu->addAction(filterDisplayActivity); + filterMenu->addSeparator(); + + filterAllAction = new QAction(this); + filterAllAction->setCheckable(true); + filterAllAction->setChecked(true); + filterGroup->addAction(filterAllAction); + filterMenu->addAction(filterAllAction); + filterOnlineAction = new QAction(this); + filterOnlineAction->setCheckable(true); + filterGroup->addAction(filterOnlineAction); + filterMenu->addAction(filterOnlineAction); + filterOfflineAction = new QAction(this); + filterOfflineAction->setCheckable(true); + filterGroup->addAction(filterOfflineAction); + filterMenu->addAction(filterOfflineAction); + filterFriendsAction = new QAction(this); + filterFriendsAction->setCheckable(true); + filterGroup->addAction(filterFriendsAction); + filterMenu->addAction(filterFriendsAction); + filterGroupsAction = new QAction(this); + filterGroupsAction->setCheckable(true); + filterGroup->addAction(filterGroupsAction); + filterMenu->addAction(filterGroupsAction); + + ui->searchContactFilterBox->setMenu(filterMenu); + ui->mainContent->setLayout(new QVBoxLayout()); ui->mainHead->setLayout(new QVBoxLayout()); ui->mainHead->layout()->setMargin(0); @@ -205,7 +244,8 @@ void Widget::init() connect(timer, &QTimer::timeout, this, &Widget::onTryCreateTrayIcon); connect(offlineMsgTimer, &QTimer::timeout, this, &Widget::processOfflineMsgs); connect(ui->searchContactText, &QLineEdit::textChanged, this, &Widget::searchContacts); - connect(ui->searchContactFilterCBox, &QComboBox::currentTextChanged, this, &Widget::searchContacts); + connect(filterGroup, &QActionGroup::triggered, this, &Widget::searchContacts); + connect(filterDisplayGroup, &QActionGroup::triggered, this, &Widget::changeDisplayMode); connect(ui->friendList, &QWidget::customContextMenuRequested, this, &Widget::friendListContextMenu); // keyboard shortcuts @@ -624,7 +664,7 @@ void Widget::addFriend(int friendId, const QString &userId) newfriend->getFriendWidget()->onAvatarChange(friendId, avatar); } - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); newfriend->getFriendWidget()->search(ui->searchContactText->text(), filterOffline(filter)); } @@ -718,7 +758,7 @@ void Widget::onFriendUsernameChanged(int friendId, const QString& username) void Widget::onFriendDisplayChanged(FriendWidget *friendWidget, Status s) { contactListWidget->moveWidget(friendWidget, s); - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); switch (s) { case Status::Offline: @@ -1016,7 +1056,7 @@ void Widget::onGroupTitleChanged(int groupnumber, const QString& author, const Q g->getChatForm()->addSystemInfoMessage(tr("%1 has set the title to %2").arg(author, title), ChatMessage::INFO, QDateTime::currentDateTime()); contactListWidget->renameGroupWidget(g->getGroupWidget(), title); - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); g->getGroupWidget()->searchName(ui->searchContactText->text(), filterGroups(filter)); } @@ -1076,7 +1116,7 @@ Group *Widget::createGroup(int groupId) connect(newgroup->getChatForm(), &GroupChatForm::sendAction, core, &Core::sendGroupAction); connect(newgroup->getChatForm(), &GroupChatForm::groupTitleChanged, core, &Core::changeGroupTitle); - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); newgroup->getGroupWidget()->searchName(ui->searchContactText->text(), filterGroups(filter)); return newgroup; @@ -1436,23 +1476,56 @@ Status Widget::getStatusFromString(QString status) void Widget::searchContacts() { QString searchString = ui->searchContactText->text(); - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); contactListWidget->searchChatrooms(searchString, filterOnline(filter), filterOffline(filter), filterGroups(filter)); + updateFilterText(); + contactListWidget->reDraw(); } +void Widget::changeDisplayMode() +{ + if (filterDisplayGroup->checkedAction() == filterDisplayActivity) + contactListWidget->setMode(FriendListWidget::Activity); + else if (filterDisplayGroup->checkedAction() == filterDisplayName) + contactListWidget->setMode(FriendListWidget::Name); + + updateFilterText(); +} + +void Widget::updateFilterText() +{ + ui->searchContactFilterBox->setText(filterDisplayGroup->checkedAction()->text() + QStringLiteral(" | ") + filterGroup->checkedAction()->text()); +} + +int Widget::getFilterCriteria() const +{ + QAction* checked = filterGroup->checkedAction(); + + if (checked == filterOnlineAction) + return Online; + else if (checked == filterOfflineAction) + return Offline; + else if (checked == filterFriendsAction) + return Friends; + else if (checked == filterGroupsAction) + return Groups; + + return All; +} + void Widget::searchCircle(CircleWidget *circleWidget) { - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); circleWidget->search(ui->searchContactText->text(), true, filterOnline(filter), filterOffline(filter)); } void Widget::searchItem(GenericChatItemWidget *chatItem, GenericChatItemWidget::ItemType type) { bool hide; - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); switch (type) { case GenericChatItemWidget::GroupItem: @@ -1467,7 +1540,7 @@ void Widget::searchItem(GenericChatItemWidget *chatItem, GenericChatItemWidget:: bool Widget::groupsVisible() const { - int filter = ui->searchContactFilterCBox->currentIndex(); + int filter = getFilterCriteria(); return !filterGroups(filter); } @@ -1475,20 +1548,10 @@ void Widget::friendListContextMenu(const QPoint &pos) { QMenu menu(this); QAction *addCircleAction = menu.addAction(tr("Add new circle...")); - QAction *switchMode = menu.addAction("Switch between Recent and Name (BETA)"); QAction *chosenAction = menu.exec(ui->friendList->mapToGlobal(pos)); if (chosenAction == addCircleAction) - { contactListWidget->addCircleWidget(); - } - else if (chosenAction == switchMode) - { - if (contactListWidget->getMode() == FriendListWidget::Name) - contactListWidget->setMode(FriendListWidget::Activity); - else - contactListWidget->setMode(FriendListWidget::Name); - } } void Widget::setActiveToolMenuButton(ActiveToolMenuButton newActiveButton) @@ -1509,12 +1572,17 @@ void Widget::retranslateUi() ui->retranslateUi(this); ui->nameLabel->setText(name); ui->statusLabel->setText(status); - ui->searchContactFilterCBox->clear(); - ui->searchContactFilterCBox->addItem(tr("All")); - ui->searchContactFilterCBox->addItem(tr("Online")); - ui->searchContactFilterCBox->addItem(tr("Offline")); - ui->searchContactFilterCBox->addItem(tr("Friends")); - ui->searchContactFilterCBox->addItem(tr("Groups")); + + filterDisplayName->setText(tr("By Name")); + filterDisplayActivity->setText(tr("By Activity")); + filterAllAction->setText(tr("All")); + filterOnlineAction->setText(tr("Online")); + filterOfflineAction->setText(tr("Offline")); + filterFriendsAction->setText(tr("Friends")); + filterGroupsAction->setText(tr("Groups")); + ui->searchContactText->setPlaceholderText(tr("Search Contacts")); + updateFilterText(); + ui->searchContactText->setPlaceholderText(tr("Search Contacts")); statusOnline->setText(tr("Online", "Button to set your status to 'Online'")); statusAway->setText(tr("Away", "Button to set your status to 'Away'")); diff --git a/src/widget/widget.h b/src/widget/widget.h index 4ecaec62c..cadc9faa6 100644 --- a/src/widget/widget.h +++ b/src/widget/widget.h @@ -50,6 +50,7 @@ class ProfileForm; class SettingsWidget; class AddFriendForm; class CircleWidget; +class QActionGroup; class Widget final : public QMainWindow { @@ -186,6 +187,9 @@ private: void saveSplitterGeometry(); void cycleContacts(bool forward); void searchContacts(); + void changeDisplayMode(); + void updateFilterText(); + int getFilterCriteria() const; static bool filterGroups(int index); static bool filterOnline(int index); static bool filterOffline(int index); @@ -194,10 +198,23 @@ private: private: SystemTrayIcon *icon; QMenu *trayMenu; - QAction *statusOnline, - *statusAway, - *statusBusy, - *actionQuit; + QAction *statusOnline; + QAction *statusAway; + QAction *statusBusy; + QAction *actionQuit; + + QMenu* filterMenu; + + QActionGroup* filterGroup; + QAction* filterAllAction; + QAction* filterOnlineAction; + QAction* filterOfflineAction; + QAction* filterFriendsAction; + QAction* filterGroupsAction; + + QActionGroup* filterDisplayGroup; + QAction* filterDisplayName; + QAction* filterDisplayActivity; Ui::MainWindow *ui; QSplitter *centralLayout; diff --git a/ui/window/statusPanel.css b/ui/window/statusPanel.css index e1eede1b3..9619e6d5b 100644 --- a/ui/window/statusPanel.css +++ b/ui/window/statusPanel.css @@ -7,7 +7,7 @@ QLineEdit border-radius: 4px; } -QComboBox { +QToolButton { background: none; background-color: @themeMedium; color: white; @@ -15,14 +15,13 @@ QComboBox { border-radius: 4px; } -QComboBox:on { +QToolButton:pressed { background-color: @themeMediumDark; border-radius: 4px; } -QComboBox:drop-down { - border-style: none; - border-radius: 4px; +QToolButton::menu-indicator { + image: none } /**