feat(ukui-menu): Change the style of the classification function button

This commit is contained in:
youdiansaodongxi 2023-12-04 10:03:41 +08:00 committed by hewenfei
parent 75c530f9cc
commit 1c86a7a981
10 changed files with 150 additions and 279 deletions

View File

@ -30,12 +30,6 @@ Item {
property Component content: null
clip: true
function changeToSearch(keyEvent) {
if (appPageHeaderRoot.content === null) {
loader.item.changeToSearchState(keyEvent);
}
}
Loader {
id: loader
anchors.fill: parent
@ -50,65 +44,6 @@ Item {
Item {
id: root
Item {
id: searchBar
width: parent.width; height: 30
Component.onCompleted: {
visible = false;
mainWindow.visibleChanged.connect(searchBarHide);
}
Component.onDestruction: mainWindow.visibleChanged.disconnect(searchBarHide);
function searchBarHide() {
if (!mainWindow.visible) {
root.state = "normal"
}
}
RowLayout {
anchors.fill: parent
anchors.leftMargin: 15
anchors.rightMargin: 15
spacing: 10
SearchInputBar {
id: searchInputBar
property string providerId: ""
Layout.fillWidth: true
Layout.fillHeight: true
radius: 16
changeFocusTarget: focusToPageContent
onTextChanged: {
if (text === "") {
pluginSelectMenu.model.reactivateProvider();
} else {
appPageHeaderUtils.activateProvider(providerId);
appPageHeaderUtils.startSearch(text);
}
}
}
AppControls2.RoundButton {
Layout.preferredWidth: parent.height; Layout.preferredHeight: parent.height
buttonIcon: "image://appicon/edit-clear-symbolic"
activeFocusOnTab: true
onClicked: {
normalUI.focusToFalse();
searchInputBar.clear();
root.state = "normal";
}
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
searchInputBar.clear();
root.state = "normal";
}
}
}
}
}
Item {
id: pluginSelectionBar
width: parent.width
@ -125,12 +60,12 @@ Item {
font.bold: true
}
PluginSelectMenu {
id: pluginSelectMenu
Layout.preferredWidth: childrenRect.width
PluginSelectButton {
id: pluginSelectButton
Layout.preferredWidth: 64
Layout.preferredHeight: 32
Layout.maximumHeight: 32
Layout.minimumWidth: 32
Layout.minimumWidth: 64
Layout.rightMargin: 8
Layout.alignment: Qt.AlignVCenter
}

View File

@ -9,6 +9,15 @@ Item {
clip: true
property alias searchOpacity: searchInputBar.opacity
property alias searchText: searchInputBar.text
PluginSelectButton {
id: pluginSelectButton
anchors.left: parent.left
anchors.leftMargin: 72
anchors.verticalCenter: parent.verticalCenter
height: 32; width: 64
}
SearchInputBar {
id: searchInputBar
width: 372; height: 36
@ -18,7 +27,7 @@ Item {
onTextChanged: {
if (text === "") {
pluginSelectMenu.model.reactivateProvider();
pluginSelectButton.model.reactivateProvider();
} else {
appPageHeaderUtils.model(PluginGroup.Button).reactivateProvider();
appPageHeaderUtils.startSearch(text);
@ -29,15 +38,6 @@ Item {
}
}
PluginSelectMenu {
id: pluginSelectMenu
anchors.right: parent.right
anchors.rightMargin: 72 // 48+24
anchors.verticalCenter: parent.verticalCenter
height: 48; width: 72 // 48+16+8
spacing: 8
}
AppControls2.StyleBackground {
width: 48; height: width
radius: 4

View File

@ -0,0 +1,121 @@
/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
import QtQuick 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import AppControls2 1.0 as AppControls2
import org.ukui.menu.core 1.0
import org.ukui.menu.utils 1.0
import org.ukui.quick.items 1.0 as UkuiItems
UkuiItems.StyleBackground {
useStyleTransparency: false
paletteRole: UkuiItems.Theme.Text
radius: childrenRect.width / 2
alpha: 0.06
function resetFocus() {
if(!mainWindow.isFullScreen) {
normalUI.focusToFalse();
}
}
RowLayout {
id: pluginSortButtonRoot
property int currentId: 0
anchors.fill: parent
anchors.topMargin: 2
anchors.bottomMargin: 2
anchors.leftMargin: 2
anchors.rightMargin: 2
property var model: appPageHeaderUtils.model(PluginGroup.SortMenuItem)
spacing: 4
UkuiItems.Button {
id: pluginLetterSortButton
Layout.fillHeight: true
Layout.fillWidth: true
Layout.maximumWidth: height
activeFocusOnTab: true
ToolTip.delay: 500
ToolTip.text: qsTr("Letter Sort")
ToolTip.visible: containsMouse
background.radius: width / 2
icon.mode: parent.currentId === 0 ? mainWindow.isFullScreen ? UkuiItems.Icon.AutoHighlight : UkuiItems.Icon.Normal : UkuiItems.Icon.Disabled
icon.source: pluginSortButtonRoot.model.getProviderIcon(0);
background.paletteRole: UkuiItems.Theme.Light
background.alpha: parent.currentId === 0 ? 0.7 : 0
onClicked: {
resetFocus();
pluginSortButtonRoot.model.changeProvider(0);
}
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
pluginSortButtonRoot.model.changeProvider(0);
}
}
}
UkuiItems.Button {
id: pluginCateGoryButton
Layout.fillHeight: true
Layout.fillWidth: true
Layout.maximumWidth: height
activeFocusOnTab: true
ToolTip.delay: 500
ToolTip.text: qsTr("Category")
ToolTip.visible: containsMouse
background.radius: width / 2
icon.mode: parent.currentId === 1 ? mainWindow.isFullScreen ? UkuiItems.Icon.AutoHighlight : UkuiItems.Icon.Normal : UkuiItems.Icon.Disabled
icon.source: pluginSortButtonRoot.model.getProviderIcon(1);
background.paletteRole: UkuiItems.Theme.Light
background.alpha: parent.currentId === 1 ? 0.7 : 0
onClicked: {
resetFocus();
pluginSortButtonRoot.model.changeProvider(1);
}
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
pluginSortButtonRoot.model.changeProvider(1);
}
}
}
Component.onCompleted: {
updateProviderId();
pluginSortButtonRoot.model.currentIndexChanged.connect(updateProviderId);
}
Component.onDestruction: {
pluginSortButtonRoot.model.currentIndexChanged.disconnect(updateProviderId);
}
function updateProviderId() {
currentId = pluginSortButtonRoot.model.currentProviderId();
}
}
}

View File

@ -1,151 +0,0 @@
/*
* Copyright (C) 2023, KylinSoft Co., Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
import QtQuick 2.12
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import AppControls2 1.0 as AppControls2
import org.ukui.menu.core 1.0
import org.ukui.menu.utils 1.0
RowLayout {
id: pluginSelectMenuRoot
property var model: appPageHeaderUtils.model(PluginGroup.SortMenuItem)
spacing: 2
function resetFocus() {
if(!mainWindow.isFullScreen) {
normalUI.focusToFalse();
}
}
AppControls2.RoundButton {
id: pluginSelectButton
Layout.fillHeight: true
Layout.fillWidth: true
Layout.maximumWidth: height
activeFocusOnTab: true
ToolTip.delay: 500
ToolTip.text: qsTr("Switch Sort Type")
ToolTip.visible: containsMouse
highlight: mainWindow.isFullScreen
autoHighLight: !mainWindow.isFullScreen
buttonIcon: "image://appicon/ukui-selected"
onClicked: {
resetFocus();
pluginSelectMenuRoot.model.autoSwitchProvider();
}
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
pluginSelectMenuRoot.model.autoSwitchProvider();
}
}
}
MouseArea {
id: sortMenuMouseArea
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
Layout.fillHeight: true
Layout.maximumWidth: 16
Layout.maximumHeight: 16
ToolTip.delay: 500
ToolTip.text: qsTr("Sort Type Options")
ToolTip.visible: containsMouse
hoverEnabled: true
activeFocusOnTab: true
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
sortMenuClicked();
}
}
onClicked: {
resetFocus();
sortMenuClicked();
}
function sortMenuClicked() {
if(sortMenuSelector.state === "sortMenuClose") {
sortMenuSelector.state = "sortMenuOpen";
}
var pressY = sortMenuMouseArea.mapToGlobal(0, 0).y;
var pressX = sortMenuMouseArea.mapToGlobal(0, 0).x;
pluginSelectMenuRoot.model.openMenu(pluginSelectButton.height - y - mouseY + 8, pressX, pressY);
}
AppControls2.StyleBackground {
anchors.fill: parent
useStyleTransparent: false
paletteRole: Palette.Highlight
alpha: 0
borderColor: Palette.Highlight
border.width: sortMenuMouseArea.activeFocus ? 2 : 0
}
ThemeIcon {
id: sortMenuSelector
anchors.fill: parent
source: "image://appicon/ukui-up-symbolic"
opacity: 0.5
highLight: mainWindow.isFullScreen
autoHighLight: !mainWindow.isFullScreen
state: "sortMenuClose"
states: [
State {
name: "sortMenuOpen"
PropertyChanges { target: sortMenuSelector; rotation: 0 }
},
State {
name: "sortMenuClose"
PropertyChanges { target: sortMenuSelector; rotation: 180 }
}
]
transitions: [
Transition {
to: "sortMenuOpen"
RotationAnimation { duration: 100; direction: RotationAnimation.Counterclockwise}
},
Transition {
to: "sortMenuClose"
RotationAnimation { duration: 100; direction: RotationAnimation.Clockwise }
}
]
Component.onCompleted: {
updateProviderIcon();
pluginSelectMenuRoot.model.currentIndexChanged.connect(updateProviderIcon);
pluginSelectMenuRoot.model.menuClosed.connect(changeMenuStatus);
}
Component.onDestruction: {
pluginSelectMenuRoot.model.currentIndexChanged.disconnect(updateProviderIcon);
pluginSelectMenuRoot.model.menuClosed.disconnect(changeMenuStatus);
}
function updateProviderIcon() {
pluginSelectButton.buttonIcon = pluginSelectMenuRoot.model.currentProviderIcon();
}
function changeMenuStatus() {
sortMenuSelector.state = "sortMenuClose";
}
}
}
}

View File

@ -8,7 +8,7 @@ FullScreenUI 1.0 FullScreenUI.qml
AppPageHeader 1.0 AppPageHeader.qml
AppListView 1.0 AppListView.qml
SearchInputBar 1.0 SearchInputBar.qml
PluginSelectMenu 1.0 PluginSelectMenu.qml
PluginSelectButton 1.0 PluginSelectButton.qml
FullScreenHeader 1.0 FullScreenHeader.qml
FullScreenContent 1.0 FullScreenContent.qml
FullScreenFooter 1.0 FullScreenFooter.qml

View File

@ -29,7 +29,7 @@
<file>AppControls2/FolderIcon.qml</file>
<file>AppUI/SelectionPage.qml</file>
<file>AppUI/AppPageContent.qml</file>
<file>AppUI/PluginSelectMenu.qml</file>
<file>AppUI/PluginSelectButton.qml</file>
<file>AppUI/EditText.qml</file>
<file>AppUI/FullScreenFolder.qml</file>
<file>AppUI/AppPageSearch.qml</file>

View File

@ -44,10 +44,6 @@ DataProviderManager::DataProviderManager()
void DataProviderManager::initProviders()
{
auto *allProvider = new AllAppDataProvider;
connect(this, &DataProviderManager::toUpdate, allProvider, &AllAppDataProvider::update);
registerProvider(allProvider);
auto *search = new AppSearchPlugin;
connect(this, &DataProviderManager::toUpdate, search, &AppSearchPlugin::update);
registerProvider(search);
@ -60,8 +56,7 @@ void DataProviderManager::initProviders()
connect(this, &DataProviderManager::toUpdate, sort, &AppLetterSortPlugin::update);
registerProvider(sort);
activateProvider(allProvider->id(), false);
allProvider->moveToThread(&m_worker);
activateProvider(sort->id(), false);
search->moveToThread(&m_worker);
category->moveToThread(&m_worker);
sort->moveToThread(&m_worker);

View File

@ -41,7 +41,7 @@ AllAppDataProvider::AllAppDataProvider() : DataProviderPluginIFace()
int AllAppDataProvider::index()
{
return 0;
return 2;
}
QString AllAppDataProvider::id()

View File

@ -33,7 +33,7 @@ AppLetterSortPlugin::AppLetterSortPlugin()
int AppLetterSortPlugin::index()
{
return 2;
return 0;
}
QString AppLetterSortPlugin::id()

View File

@ -39,12 +39,11 @@ public:
QHash<int, QByteArray> roleNames() const override;
void updateCurrentPId(const QString &providerId);
//自动在各个插件之间切换
//在各个插件之间切换
Q_INVOKABLE void reactivateProvider();
Q_INVOKABLE void autoSwitchProvider();
Q_INVOKABLE QString currentProviderIcon();
Q_INVOKABLE void openMenu(int offset, int mouseX, int mouseY);
Q_INVOKABLE void changeProvider(int i);
Q_INVOKABLE QString getProviderIcon(int i);
Q_INVOKABLE int currentProviderId();
Q_SIGNALS:
void currentIndexChanged();
@ -137,47 +136,19 @@ int ProviderModel::indexOfProvider(const QString &providerId)
return -1;
}
void ProviderModel::autoSwitchProvider()
void ProviderModel::changeProvider(int i)
{
m_currentIndex = (m_currentIndex + 1) % m_providers.size();
DataProviderManager::instance()->activateProvider(m_providers.at(m_currentIndex).id);
DataProviderManager::instance()->activateProvider(m_providers.at(i).id);
}
QString ProviderModel::currentProviderIcon()
QString ProviderModel::getProviderIcon(int i)
{
return data(createIndex(m_currentIndex, 0), Icon).toString();
return data(createIndex(i, 0), Icon).toString();
}
void ProviderModel::openMenu(int offset, int mouseX, int mouseY)
int ProviderModel::currentProviderId()
{
if (m_menu) {
m_menu.data()->close();
return;
}
QMenu *menu = new QMenu;
menu->setAttribute(Qt::WA_DeleteOnClose);
if (m_providers.isEmpty()) {
return;
}
for (const ProviderInfo &info : m_providers) {
QAction *action = new QAction(info.name, menu);
action->setCheckable(true);
connect(action, &QAction::triggered, menu, [info]() {
DataProviderManager::instance()->activateProvider(info.id);
});
menu->addAction(action);
}
menu->actions().at(m_currentIndex)->setChecked(true);
int x = mouseX - menu->sizeHint().width();
int y = mouseY + offset;
m_menu = menu;
connect(menu, &QMenu::aboutToHide, this, &ProviderModel::menuClosed);
menu->popup(QPoint(x, y));
return m_currentIndex;
}
void ProviderModel::reactivateProvider()