Skip to content

Commit

Permalink
feat: [titlebar] connect qml with dpf events
Browse files Browse the repository at this point in the history
Create crumbbar component, connent qml with dpf
event, click item will send event and change titile.

Log: Connect qml with dpf events
  • Loading branch information
rb-union authored and Johnson-zs committed Jun 20, 2024
1 parent 1b68206 commit f515ff9
Show file tree
Hide file tree
Showing 12 changed files with 367 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,3 +98,16 @@ ViewMode TitleBarEventCaller::sendGetDefualtViewMode(const QString &scheme)
int defaultViewMode = dpfSlotChannel->push("dfmplugin_workspace", "slot_View_GetDefaultViewMode", scheme).toInt();
return static_cast<ViewMode>(defaultViewMode);
}

void TitleBarEventCaller::sendCd(dfmgui::Applet *applet, const QUrl &url)
{
DFMBASE_USE_NAMESPACE
quint64 id = TitleBarHelper::windowId(applet);
Q_ASSERT(id > 0);
if (!url.isValid()) {
fmWarning() << "Invalid url: " << url;
return;
}

dpfSignalDispatcher->publish(DFMBASE_NAMESPACE::GlobalEventType::kChangeCurrentUrl, id, url);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@

#include <dfm-base/dfm_global_defines.h>

#include <dfm-gui/applet.h>

#include <QObject>

namespace dfmplugin_titlebar {
Expand All @@ -30,6 +32,8 @@ class TitleBarEventCaller
static void sendCheckAddressInputStr(QWidget *sender, QString *str);
static bool sendCheckTabAddable(quint64 windowId);
static DFMGLOBAL_NAMESPACE::ViewMode sendGetDefualtViewMode(const QString &scheme);

static void sendCd(dfmgui::Applet *applet, const QUrl &url);
};

}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include "quickcrumbmodel.h"

namespace dfmplugin_titlebar {

QuickCrumbModel::QuickCrumbModel(QObject *parent)
: QAbstractListModel { parent }
{
}

void QuickCrumbModel::setCurrentUrl(const QUrl &url, const QList<CrumbData> &crumbDataList)
{
beginResetModel();
fileUrl = url;
crumbData = crumbDataList;
endResetModel();
}

int QuickCrumbModel::rowCount(const QModelIndex &) const
{
return crumbData.size();
}

QVariant QuickCrumbModel::data(const QModelIndex &index, int role) const
{
if (index.row() < 0 || index.row() >= crumbData.size()) {
return {};
}

const CrumbData &data = crumbData.at(index.row());
switch (role) {
case FileUrlRole:
return data.url;
case FullUrlRole:
return fileUrl;
case TextRole:
return data.displayText;
case IconRole:
return data.iconName;
case UseIconRole:
return !data.iconName.isEmpty();
}

return {};
}

QHash<int, QByteArray> QuickCrumbModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[FileUrlRole] = "fileUrl";
roles[FullUrlRole] = "fullUrl";
roles[TextRole] = "text";
roles[IconRole] = "icon";
roles[UseIconRole] = "useIcon";
return roles;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef QUICKCRUMBMODEL_H
#define QUICKCRUMBMODEL_H

#include "dfmplugin_titlebar_global.h"

#include <QAbstractListModel>
#include <QUrl>

namespace dfmplugin_titlebar {

class QuickCrumbModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles {
FileUrlRole = Qt::UserRole + 1,
FullUrlRole,
TextRole,
IconRole,
UseIconRole,
};
Q_ENUM(Roles)

explicit QuickCrumbModel(QObject *parent = nullptr);

void setCurrentUrl(const QUrl &url, const QList<CrumbData> &crumbDataList);

int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;

private:
QUrl fileUrl;
QList<CrumbData> crumbData;
};

}

#endif // QUICKCRUMBMODEL_H
86 changes: 86 additions & 0 deletions src/plugins/filemanager/core/dfmplugin-titlebar/qml/CrumbBar.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

import QtQuick
import QtQuick.Controls
import org.dfm.base
import org.deepin.dtk
import org.deepin.dtk.private 1.0 as P

///! 面包屑导航栏
Item {
id: breadcrumbs

// 请求弹出同级文件夹列表
signal requsetQuickJumpMenu(var url, real x, real y)

ListView {
id: addressline

anchors.fill: parent
model: Containment.crumbModel
orientation: ListView.Horizontal

delegate: Button {
id: addressBtn

enabled: index !== (ListView.view.count - 1)
icon.name: model.useIcon ? model.icon : undefined
leftInset: 0
padding: 0
rightInset: 0
spacing: 0
text: model.useIcon ? undefined : model.text

background: P.ButtonPanel {
id: bkgPanel

button: addressBtn
implicitWidth: addressBtn.contentItem.implicitWidth
visible: addressBtn.enabled && addressBtn.hovered
}
indicator: Item {
implicitHeight: 20
implicitWidth: 10

Text {
anchors.centerIn: parent
font.bold: false
font.family: "Noto Sans CJK TC"
text: "/"
visible: !bkgPanel.visible
}

Loader {
enabled: bkgPanel.visible

sourceComponent: Button {
id: popupBtn

height: 16
icon.height: 10
icon.name: "combobox_arrow"
icon.width: 10
visible: bkgPanel.visible
width: 16

onClicked: {
breadcrumbs.requsetQuickJumpMenu(model.fileUrl, popupBtn.x, popupBtn.y + 20);
}

anchors {
right: parent.right
rightMargin: 10
verticalCenter: parent.verticalCenter
}
}
}
}

onClicked: {
Containment.currentUrl = model.fileUrl;
}
}
}
}
14 changes: 8 additions & 6 deletions src/plugins/filemanager/core/dfmplugin-titlebar/qml/Titlebar.qml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import org.dfm.base
import org.deepin.dtk
import org.deepin.dtk.style 1.0 as DS

AppletItem {
ContainmentItem {
id: titlebar

property int breadcrumbsHeight: 30
Expand All @@ -30,7 +30,6 @@ AppletItem {

RowLayout {
Layout.fillHeight: true
Layout.fillWidth: true
layoutDirection: Qt.LeftToRight

CheckBox {
Expand Down Expand Up @@ -67,16 +66,20 @@ AppletItem {

IconButton {
icon.name: "button_add"

onClicked: {
console.warn("--- test", Containment.applets);
Applet.currentUrl = "file:///home/uos/Downloads/GammaRay/build/bin";
}
}
}

Loader {
Layout.preferredWidth: item ? item.implicitWidth : 0
Layout.fillWidth: true
active: Window.window
height: DS.Style.titleBar.height

sourceComponent: TitleBar {
// replace Window.window.width
width: parent.width
}
}
Expand All @@ -89,12 +92,11 @@ AppletItem {
implicitHeight: breadcrumbsHeight
spacing: 0

Rectangle {
CrumbBar {
id: breadcrumbs

Layout.fillHeight: true
Layout.fillWidth: true
color: "blue"
}

Rectangle {
Expand Down
27 changes: 27 additions & 0 deletions src/plugins/filemanager/core/dfmplugin-titlebar/titlebar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// SPDX-License-Identifier: GPL-3.0-or-later

#include "titlebar.h"
#include "titlebarcontainment.h"
#include "utils/titlebarhelper.h"
#include "utils/crumbinterface.h"
#include "utils/crumbmanager.h"
Expand All @@ -16,11 +17,29 @@
#include <dfm-base/base/urlroute.h>
#include <dfm-base/dfm_event_defines.h>

#include <dfm-gui/containment.h>
#include <dfm-gui/appletfactory.h>

#include <dfm-framework/dpf.h>

namespace dfmplugin_titlebar {
DFM_LOG_REISGER_CATEGORY(DPTITLEBAR_NAMESPACE)

static constexpr char kAppletUrl[] { "org.dfm.titlebar" };

static dfmgui::Applet *createTitlebarApplet(const QString &url, dfmgui::Containment *parent, QString *errorString)
{
if (kAppletUrl == url) {
Q_ASSERT_X(parent && parent->flags().testFlag(dfmgui::Applet::kPanel),
"Create titlebar applet", "Parent must based on panel");

auto titlebar = new TitlebarContainment(parent);
QObject::connect(parent, &dfmgui::Applet::currentUrlChanged, titlebar, &TitlebarContainment::setCurrentUrl);
return titlebar;
}
return nullptr;
}

void TitleBar::initialize()
{
DFMBASE_USE_NAMESPACE
Expand All @@ -31,6 +50,14 @@ void TitleBar::initialize()

// event has been sended before the Window showed
bindEvents();

// register qml component
QString errorString;
bool regSuccess = dfmgui::AppletFactory::instance()->regCreator(
kAppletUrl, &createTitlebarApplet, &errorString);
if (!regSuccess) {
fmWarning() << QString("Register applet %1 failed.").arg(kAppletUrl) << errorString;
}
}

bool TitleBar::start()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
{
"Url" : "qml/Titlebar.qml",
"Id" : "titlebar",
"Parent" : "dfmplugin-core.filewindow"
"Parent" : "dfmplugin-core.filewindow",
"Applet" : "org.dfm.titlebar"
}
]
}
Loading

0 comments on commit f515ff9

Please sign in to comment.