context menu:provide Add view through templates

work/spdx
Michail Vourlakos 4 years ago
parent 5f6c0df50c
commit fe5d2d7a63

@ -18,6 +18,10 @@
<method name="exportViewTemplate"> <method name="exportViewTemplate">
<arg name="containmentId" type="u" direction="in"/> <arg name="containmentId" type="u" direction="in"/>
</method> </method>
<method name="addView">
<arg name="containmentId" type="u" direction="in"/>
<arg name="templateId" type="s" direction="in"/>
</method>
<method name="duplicateView"> <method name="duplicateView">
<arg name="containmentId" type="u" direction="in"/> <arg name="containmentId" type="u" direction="in"/>
</method> </method>
@ -35,6 +39,9 @@
<arg name="data" type="as" direction="out"/> <arg name="data" type="as" direction="out"/>
<arg name="containmentId" type="u" direction="in"/> <arg name="containmentId" type="u" direction="in"/>
</method> </method>
<method name="viewTemplatesData">
<arg name="data" type="as" direction="out"/>
</method>
<method name="setBackgroundFromBroadcast"> <method name="setBackgroundFromBroadcast">
<arg name="activity" type="s" direction="in"/> <arg name="activity" type="s" direction="in"/>
<arg name="screenName" type="s" direction="in"/> <arg name="screenName" type="s" direction="in"/>

@ -26,6 +26,7 @@
#include "apptypes.h" #include "apptypes.h"
#include "lattedockadaptor.h" #include "lattedockadaptor.h"
#include "screenpool.h" #include "screenpool.h"
#include "data/generictable.h"
#include "declarativeimports/interfaces.h" #include "declarativeimports/interfaces.h"
#include "indicator/factory.h" #include "indicator/factory.h"
#include "layout/abstractlayout.h" #include "layout/abstractlayout.h"
@ -1163,6 +1164,28 @@ QStringList Corona::contextMenuData(const uint &containmentId)
return data; return data;
} }
QStringList Corona::viewTemplatesData()
{
QStringList data;
Latte::Data::GenericTable<Data::Generic> viewtemplates = m_templatesManager->viewTemplates();
for(int i=0; i<viewtemplates.rowCount(); ++i) {
data << viewtemplates[i].name;
data << viewtemplates[i].id;
}
return data;
}
void Corona::addView(const uint &containmentId, const QString &templateId)
{
auto view = m_layoutsManager->synchronizer()->viewForContainment((int)containmentId);
if (view && view->layout() && !templateId.isEmpty()) {
view->layout()->newView(templateId);
}
}
void Corona::duplicateView(const uint &containmentId) void Corona::duplicateView(const uint &containmentId)
{ {
auto view = m_layoutsManager->synchronizer()->viewForContainment((int)containmentId); auto view = m_layoutsManager->synchronizer()->viewForContainment((int)containmentId);

@ -160,12 +160,14 @@ public:
void showSettingsWindow(int page); void showSettingsWindow(int page);
QStringList contextMenuData(const uint &containmentId); QStringList contextMenuData(const uint &containmentId);
QStringList viewTemplatesData();
public slots: public slots:
void aboutApplication(); void aboutApplication();
void activateLauncherMenu(); void activateLauncherMenu();
void loadDefaultLayout() override; void loadDefaultLayout() override;
void addView(const uint &containmentId, const QString &templateId);
void duplicateView(const uint &containmentId); void duplicateView(const uint &containmentId);
void exportViewTemplate(const uint &containmentId); void exportViewTemplate(const uint &containmentId);
void moveViewToLayout(const uint &containmentId, const QString &layoutName); void moveViewToLayout(const uint &containmentId, const QString &layoutName);

@ -43,6 +43,7 @@ const int LAYOUTMENUINDEX = 3;
const int VIEWTYPEINDEX = 4; const int VIEWTYPEINDEX = 4;
const int VIEWLAYOUTINDEX = 5; const int VIEWLAYOUTINDEX = 5;
const char ADDVIEWNAME[] = "add view";
const char LAYOUTSNAME[] = "layouts"; const char LAYOUTSNAME[] = "layouts";
const char PREFERENCESNAME[] = "preferences"; const char PREFERENCESNAME[] = "preferences";
const char QUITLATTENAME[] = "quit latte"; const char QUITLATTENAME[] = "quit latte";
@ -83,6 +84,7 @@ Menu::~Menu()
m_separator->deleteLater(); m_separator->deleteLater();
//! sub-menus //! sub-menus
m_addViewMenu->deleteLater();
m_switchLayoutsMenu->deleteLater(); m_switchLayoutsMenu->deleteLater();
m_moveToLayoutMenu->deleteLater(); m_moveToLayoutMenu->deleteLater();
@ -148,6 +150,17 @@ void Menu::makeActions()
connect(m_switchLayoutsMenu, &QMenu::aboutToShow, this, &Menu::populateLayouts); connect(m_switchLayoutsMenu, &QMenu::aboutToShow, this, &Menu::populateLayouts);
connect(m_switchLayoutsMenu, &QMenu::triggered, this, &Menu::switchToLayout); connect(m_switchLayoutsMenu, &QMenu::triggered, this, &Menu::switchToLayout);
//! Add View submenu
m_addViewMenu = new QMenu;
m_addViewAction = m_addViewMenu->menuAction();
m_addViewAction->setText(i18n("&Add Dock/Panel"));
m_addViewAction->setIcon(QIcon::fromTheme("list-add"));
m_addViewAction->setStatusTip(i18n("Add dock or panel based on specific template"));
this->containment()->actions()->addAction(ADDVIEWNAME, m_addViewAction);
connect(m_addViewMenu, &QMenu::aboutToShow, this, &Menu::populateViewTemplates);
connect(m_addViewMenu, &QMenu::triggered, this, &Menu::addView);
//! Move submenu //! Move submenu
m_moveToLayoutMenu = new QMenu; m_moveToLayoutMenu = new QMenu;
m_moveAction = m_moveToLayoutMenu->menuAction(); m_moveAction = m_moveToLayoutMenu->menuAction();
@ -237,6 +250,7 @@ QList<QAction *> Menu::contextualActions()
actions << m_separator; actions << m_separator;
actions << m_addWidgetsAction; actions << m_addWidgetsAction;
actions << m_addViewAction;
actions << m_duplicateAction; actions << m_duplicateAction;
actions << m_moveAction; actions << m_moveAction;
actions << m_exportViewAction; actions << m_exportViewAction;
@ -244,12 +258,15 @@ QList<QAction *> Menu::contextualActions()
actions << m_removeAction; actions << m_removeAction;
m_data.clear(); m_data.clear();
m_viewTemplates.clear();
QDBusInterface iface("org.kde.lattedock", "/Latte", "", QDBusConnection::sessionBus()); QDBusInterface iface("org.kde.lattedock", "/Latte", "", QDBusConnection::sessionBus());
if (iface.isValid()) { if (iface.isValid()) {
QDBusReply<QStringList> replyData = iface.call("contextMenuData", containment()->id()); QDBusReply<QStringList> contextData = iface.call("contextMenuData", containment()->id());
m_data = contextData.value();
m_data = replyData.value(); QDBusReply<QStringList> templatesData = iface.call("viewTemplatesData");
m_viewTemplates = templatesData.value();
} }
ViewType viewType{static_cast<ViewType>((m_data[VIEWTYPEINDEX]).toInt())}; ViewType viewType{static_cast<ViewType>((m_data[VIEWTYPEINDEX]).toInt())};
@ -280,7 +297,9 @@ QList<QAction *> Menu::contextualActions()
QAction *Menu::action(const QString &name) QAction *Menu::action(const QString &name)
{ {
if (name == ADDWIDGETSNAME) { if (name == ADDVIEWNAME) {
return m_addViewAction;
} else if (name == ADDWIDGETSNAME) {
return m_addWidgetsAction; return m_addWidgetsAction;
} else if (name == DUPLICATEVIEWNAME) { } else if (name == DUPLICATEVIEWNAME) {
return m_duplicateAction; return m_duplicateAction;
@ -430,6 +449,34 @@ void Menu::populateMoveToLayouts()
} }
} }
void Menu::populateViewTemplates()
{
m_addViewMenu->clear();
for(int i=0; i<m_viewTemplates.count(); ++i) {
if (i % 2 == 1) {
//! even records are the templates ids and they have already been registered
continue;
}
QAction *templateAction = m_addViewMenu->addAction(m_viewTemplates[i]);
templateAction->setData(m_viewTemplates[i+1]);
}
}
void Menu::addView(QAction *action)
{
const QString templateId = action->data().toString();
QTimer::singleShot(400, [this, templateId]() {
QDBusInterface iface("org.kde.lattedock", "/Latte", "", QDBusConnection::sessionBus());
if (iface.isValid()) {
iface.call("addView", containment()->id(), templateId);
}
});
}
void Menu::moveToLayout(QAction *action) void Menu::moveToLayout(QAction *action)
{ {
const QString layoutName = action->data().toString(); const QString layoutName = action->data().toString();

@ -45,15 +45,18 @@ private Q_SLOTS:
void onUserConfiguringChanged(const bool &configuring); void onUserConfiguringChanged(const bool &configuring);
void populateLayouts(); void populateLayouts();
void populateMoveToLayouts(); void populateMoveToLayouts();
void populateViewTemplates();
void quitApplication(); void quitApplication();
void requestConfiguration(); void requestConfiguration();
void requestWidgetExplorer(); void requestWidgetExplorer();
void addView(QAction *action);
void moveToLayout(QAction *action); void moveToLayout(QAction *action);
void switchToLayout(QAction *action); void switchToLayout(QAction *action);
private: private:
QStringList m_data; QStringList m_data;
QStringList m_viewTemplates;
QList<QAction *>m_actions; QList<QAction *>m_actions;
@ -69,6 +72,9 @@ private:
QAction *m_removeAction{nullptr}; QAction *m_removeAction{nullptr};
QAction *m_quitApplication{nullptr}; QAction *m_quitApplication{nullptr};
QAction *m_addViewAction{nullptr};
QMenu *m_addViewMenu{nullptr};
QAction *m_layoutsAction{nullptr}; QAction *m_layoutsAction{nullptr};
QMenu *m_switchLayoutsMenu{nullptr}; QMenu *m_switchLayoutsMenu{nullptr};

@ -519,7 +519,7 @@ Loader {
buttonEnabled: true buttonEnabled: true
buttonIsTriggeringMenu: true buttonIsTriggeringMenu: true
buttonText: i18n("New...") buttonText: i18n("Add...")
buttonIconSource: "list-add" buttonIconSource: "list-add"
buttonToolTip: i18n("Add new docks and panels from various templates") buttonToolTip: i18n("Add new docks and panels from various templates")
@ -549,7 +549,7 @@ Loader {
onActivated: { onActivated: {
var item = actionsModel.get(index); var item = actionsModel.get(index);
if (item && item.actionId === "new:") { if (item && item.actionId === "add:") {
latteView.layout.newView(item.templateId); latteView.layout.newView(item.templateId);
} }
@ -587,10 +587,10 @@ Loader {
for(var i=viewTemplateIds.length-1; i>=0; --i) { for(var i=viewTemplateIds.length-1; i>=0; --i) {
//! add view templates on reverse //! add view templates on reverse
var viewtemplate = { var viewtemplate = {
actionId: 'new:', actionId: 'add:',
enabled: true, enabled: true,
templateId: viewTemplateIds[i], templateId: viewTemplateIds[i],
name: i18n("New %0").arg(viewTemplateNames[i]), name: i18n("Add %0").arg(viewTemplateNames[i]),
icon: 'list-add' icon: 'list-add'
}; };
actionsModel.append(viewtemplate); actionsModel.append(viewtemplate);

Loading…
Cancel
Save