添加小屏开始菜单的拖拽功能

This commit is contained in:
youdiansaodongxi 2023-05-04 15:09:52 +08:00 committed by He Sir
parent 6d9742c5f7
commit 34f33a8dfc
9 changed files with 139 additions and 53 deletions

View File

@ -5,6 +5,7 @@ import org.ukui.menu.core 1.0
MouseArea {
id: control
property bool isSelect: false
hoverEnabled: true
states: State {
when: control.activeFocus
@ -18,7 +19,7 @@ MouseArea {
anchors.fill: parent
radius: 4
useStyleTransparent: false
alpha: control.containsPress ? 0.82 : control.containsMouse ? 0.55 : 0.00
alpha: isSelect ? 1.00 : control.containsPress ? 0.82 : control.containsMouse ? 0.55 : 0.00
ToolTip.visible: content.textTruncated && control.containsMouse
ToolTip.text: name

View File

@ -8,6 +8,7 @@ MouseArea {
id: control
property bool editStatus: false
property bool truncate: false
property bool isSelect: false
hoverEnabled: true
ToolTip.visible: editStatus && truncate && control.containsMouse
ToolTip.text: name
@ -23,7 +24,7 @@ MouseArea {
anchors.fill: parent
radius: 4
useStyleTransparent: false
alpha: control.containsPress ? 0.82 : control.containsMouse ? 0.55 : 0.00
alpha: isSelect ? 0.55 : control.containsPress ? 0.82 : control.containsMouse ? 0.55 : 0.00
RowLayout {
anchors.fill: parent

View File

@ -16,7 +16,7 @@
*
*/
import QtQuick 2.0
import QtQuick 2.15
import QtQml 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.12
@ -25,6 +25,7 @@ import org.ukui.menu.core 1.0
Item {
property string title: ""
property string idSelect: ""
signal labelItemClicked()
signal openFolderPageSignal(string folderId, string folderName);
@ -43,9 +44,10 @@ Item {
model: modelManager.getAppModel()
delegate: Component {
Loader {
width: ListView.view ? ListView.view.width : 0
height: 40
id: loaderView
focus: true
width: ListView.view ? ListView.view.width : 0
height: appListView.itemHeight
property int index: model.index
property int type: model.type
property string id: model.id
@ -55,13 +57,13 @@ Item {
property bool recentInstall: model.recentInstall
sourceComponent: {
if (type === DataType.Normal) {
return appItem;
return appItemComponent;
}
if (type === DataType.Folder) {
return folderItem;
return folderItemComponent;
}
if (type === DataType.Label) {
return labelItem;
return labelItemComponent;
}
}
}
@ -69,10 +71,18 @@ Item {
}
Component {
id: appItem
id: appItemComponent
Item {
id: appItemBase
AppControls2.AppItem {
id: appItem
focus: true
width: appListView.view ? appListView.view.width : 0
height: appListView.itemHeight
acceptedButtons: Qt.LeftButton | Qt.RightButton
Drag.active: drag.active
Drag.hotSpot.x: width / 2
Drag.hotSpot.y: height / 2
onClicked: {
if (mouse.button === Qt.RightButton) {
appListView.model.openMenu(index);
@ -86,6 +96,25 @@ Item {
return;
}
}
onPressAndHold: {
if (mouse.button === Qt.LeftButton) {
x = appItem.mapToItem(appListView,0,0).x;
y = appItem.mapToItem(appListView,0,0).y;
drag.target = appItem;
appItem.parent = appListView;
appItem.isSelect = true;
}
}
onReleased: {
idSelect = id;
Drag.drop();
drag.target = null;
appItem.parent = appItemBase;
x = 0;
y = 0;
appItem.isSelect = false;
}
}
Keys.onPressed: {
if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) {
appManager.launchApp(id);
@ -98,17 +127,32 @@ Item {
}
Component {
id: labelItem
id: labelItemComponent
AppControls2.LabelItem {
focus: true
focus: true;
onClicked: labelItemClicked();
}
}
Component {
id: folderItem
id: folderItemComponent
DropArea {
onEntered: {
folderItem.isSelect = true;
}
onExited: {
folderItem.isSelect = false;
}
onDropped: {
folderItem.isSelect = false;
if (id !== idSelect) {
appListView.model.addAppToFolder(idSelect, id);
}
}
AppControls2.FolderItem {
id: folderItem
focus: true
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: {
if (mouse.button === Qt.RightButton) {
@ -139,4 +183,5 @@ Item {
}
}
}
}
}

View File

@ -29,6 +29,7 @@ MouseArea {
property alias model: listView.model
property alias delegate: listView.delegate
property alias listFocus: listView.focus
property int itemHeight: 40
hoverEnabled: true
clip: true
onContainsMouseChanged: listView.focus = false
@ -49,6 +50,7 @@ MouseArea {
ListView {
id: listView
cacheBuffer: itemHeight * listView.count
spacing: 4
Layout.fillHeight: true
Layout.fillWidth: true

View File

@ -49,7 +49,6 @@ UkuiMenuExtension {
anchors.leftMargin: 16
anchors.topMargin: 12
anchors.bottomMargin: 6
clip: true
cellWidth: itemHeight + spacing; cellHeight: cellWidth
property int exchangedStartIndex: 0
property int spacing: 4

View File

@ -211,6 +211,30 @@ void AppFolderHelper::addAppToNewFolder(const QString &appId, const QString &fol
Q_EMIT folderAdded(folder.id);
}
void AppFolderHelper::addAppsToNewFolder(const QString &appIdA, const QString &appIdB, const QString &folderName)
{
if (appIdA.isEmpty() || appIdB.isEmpty()) {
return;
}
// TODO: max越界处理
int max = m_folders.isEmpty() ? -1 : m_folders.lastKey();
QString name = folderName;
if (name.isEmpty()) {
name = tr("New Folder %1").arg(m_folders.size() + 1);
}
Folder folder;
folder.id = ++max;
folder.name = name;
folder.apps.append(appIdA);
folder.apps.append(appIdB);
insertFolder(folder);
Q_EMIT folderAdded(folder.id);
forceSync();
}
void AppFolderHelper::removeAppFromFolder(const QString &appId, const int &folderId)
{
if (appId.isEmpty()) {

View File

@ -74,6 +74,7 @@ public:
void addAppToFolder(const QString& appId, const int& folderId);
void addAppToNewFolder(const QString& appId, const QString& folderName);
void addAppsToNewFolder(const QString& appIdA, const QString& appIdB, const QString& folderName);
void removeAppFromFolder(const QString& appId, const int& folderId);
bool deleteFolder(const int& folderId);
void renameFolder(const int& folderId, const QString& folderName);

View File

@ -189,10 +189,11 @@ void AppModel::insertData(QVector<DataEntity> &data, int index)
void AppModel::openMenu(const int &index)
{
QModelIndex modelIndex = createIndex(index, 0, nullptr);
if (modelIndex.isValid()) {
MenuManager::instance()->showMenu(modelIndex.data(DataEntity::Id).toString());
if (index < 0 || index >= m_apps.size()) {
return;
}
MenuManager::instance()->showMenu(m_apps.at(index));
}
void AppModel::renameFolder(const QString &index, const QString &folderName)
@ -200,6 +201,16 @@ void AppModel::renameFolder(const QString &index, const QString &folderName)
AppFolderHelper::instance()->renameFolder(index.toInt(), folderName);
}
void AppModel::addAppsToFolder(const QString &appIdA, const QString &appIdB, const QString &folderName)
{
AppFolderHelper::instance()->addAppsToNewFolder(appIdA, appIdB, folderName);
}
void AppModel::addAppToFolder(const QString &appId, const QString &folderId)
{
AppFolderHelper::instance()->addAppToFolder(appId, folderId.toInt());
}
QVariantList AppModel::getApps(int start, int end)
{
if (start < 0 || start >= m_apps.size() || end < 0 || end > m_apps.size()) {

View File

@ -43,6 +43,8 @@ public:
Q_INVOKABLE void appClicked(const int &index);
Q_INVOKABLE void openMenu(const int &index);
Q_INVOKABLE void renameFolder(const QString &index, const QString &folderName);
Q_INVOKABLE void addAppsToFolder(const QString &appIdA, const QString &appIdB, const QString &folderName);
Q_INVOKABLE void addAppToFolder(const QString &appId, const QString &folderId);
public Q_SLOTS:
void toRenameFolder(QString id);