Skip to content

Commit

Permalink
Implement adding, editing and deleting actions, and action disableOn
Browse files Browse the repository at this point in the history
  • Loading branch information
direc85 committed Apr 14, 2022
1 parent af90669 commit 5ecefa9
Show file tree
Hide file tree
Showing 8 changed files with 195 additions and 15 deletions.
79 changes: 79 additions & 0 deletions qml/ActionPage.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import QtQuick 2.0
import Sailfish.Silica 1.0

Dialog {
property string title
property string command
property string disableOn
property int index: -1
property Item actionWorker

signal updateActions

Component.onCompleted: {
console.log(title, command, index)
}

canAccept: titleField.acceptableInput && commandField.acceptableInput

onAccepted: {
if(index === -1) {
term.addAction(titleField.text, commandField.text, disableOnField.text)
}
else {
term.updateAction(index, titleField.text, commandField.text, disableOnField.text)
}
actionWorker.updateActions()
}

SilicaFlickable {
anchors.fill: parent

Column {
width: parent.width
DialogHeader {
title: (index < 0) ? qsTr("Add new action") : qsTr("Edit action")
}
TextField {
id: titleField
text: title
label: qsTr("Name of the action")
clip: true
}
TextField {
id: commandField
text: command
font.family: "monospace"
label: qsTr("Command to run")
}
TextField {
id: disableOnField
text: disableOn
label: qsTr("Disable action by window title")
}
Column {
x: Theme.paddingLarge
width: parent.width + (2 * x)
Label {
width: parent.width
text: qsTr("Enter the command in one line of text.") + "\n" + qsTr("Here are some helpers:")
wrapMode: Text.Wrap
}

Label {
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
font.pixelSize: Theme.fontSizeSmall
text: "Enter: \\n\n"+
"Ctrl-A: \\x01\n"+
"Ctrl-B: \\x02\n"+
"Ctrl-C: \\x03\n"+
"...\n"+
"Ctrl-X: \\x18\n"+
"Ctrl-Y: \\x19\n"+
"Ctrl-Z: \\x20"
}
}
}
}
}
49 changes: 47 additions & 2 deletions qml/SettingsMenu.qml
Original file line number Diff line number Diff line change
Expand Up @@ -114,12 +114,23 @@ Page {
id: section1
buttonHeight: Theme.iconSizeLarge
title: qsTr("Actions")
Item {
id: actionWorker
property var model: term.getActions()
function updateActions() {
model = term.getActions()
}
}

Component {
id: actionDelegate
ListItem {
contentHeight: columnItem.height + 2*Theme.paddingSmall
id: actionItem
Column {
id: columnItem
x: Theme.paddingLarge
y: Theme.paddingSmall
width: parent.width - 2 * x
Label {
text: modelData.title
Expand All @@ -139,13 +150,47 @@ Page {
term.putString(modelData.command, true);
pageStack.pop();
}

menu: ContextMenu {
MenuItem {
text: qsTr("Edit")
onClicked: pageStack.push(Qt.resolvedUrl("ActionPage.qml"), {
title: modelData.title,
command: modelData.command,
disableOn: modelData.disableOn,
index: index,
actionWorker: actionWorker
})
}
MenuItem {
text: qsTr("Delete")
onClicked: {
actionItem.remorseDelete(function() {
term.deleteAction(index)
actionItem.hidden = true
})
}
}
}
}
}
content.sourceComponent: Column {
Repeater {
model: term.getActions()
id: actionRepeater
model: actionWorker.model
delegate: actionDelegate
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("New...")
onClicked: pageStack.push(Qt.resolvedUrl("ActionPage.qml"), {
title: "",
command: "",
disableOn: "",
index: -1,
actionWorker: actionWorker
})
}
}
}
ExpandingSection {
Expand Down Expand Up @@ -442,7 +487,7 @@ Page {
placeholderText: qsTr("Custom charset")
EnterKey.onClicked: {
if (!text)
text = "UTF-8"
text = "UTF-8"
applyCharset(text);
charsetFieldCombo.value = text;
visible = false;
Expand Down
1 change: 1 addition & 0 deletions resources.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<qresource prefix="/">
<file>qml/AboutLabel.qml</file>
<file>qml/AboutPage.qml</file>
<file>qml/ActionPage.qml</file>
<file>qml/Key.qml</file>
<file>qml/Keyboard.qml</file>
<file>qml/Lineview.qml</file>
Expand Down
12 changes: 11 additions & 1 deletion src/actionitem.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#include "actionitem.h"

ActionItem::ActionItem(QString newTitle, QString newCommand, QObject *parent) : QObject(parent)
ActionItem::ActionItem(QString newTitle, QString newCommand, QString newDisableOn, QObject *parent) : QObject(parent)
{
title = newTitle;
command = newCommand;
disableOn = newDisableOn;
}

QString ActionItem::getTitle() {
Expand All @@ -23,3 +24,12 @@ void ActionItem::setCommand(QString newCommand) {
command = newCommand;
emit commandChanged(newCommand);
}

QString ActionItem::getDisableOn() {
return disableOn;
}

void ActionItem::setDisableOn(QString newDisableOn) {
disableOn = newDisableOn;
emit titleChanged(disableOn);
}
10 changes: 6 additions & 4 deletions src/actionitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,23 @@ class ActionItem : public QObject
{
Q_OBJECT
public:
explicit ActionItem(QString newTitle, QString newCommand, QObject *parent = nullptr);
explicit ActionItem(QString newTitle, QString newCommand, QString newDisableOn, QObject *parent = nullptr);

Q_PROPERTY(QString title READ getTitle WRITE setTitle NOTIFY titleChanged)
Q_PROPERTY(QString command READ getCommand WRITE setCommand NOTIFY commandChanged)
Q_PROPERTY(QString disableOn READ getDisableOn WRITE setDisableOn NOTIFY disableOnChanged)

QString getTitle(), getCommand();
void setTitle(QString newTitle), setCommand(QString newCommand);
QString getTitle(), getCommand(), getDisableOn();
void setTitle(QString newTitle), setCommand(QString newCommand), setDisableOn(QString newDisableOn);

private:
QString title, command;
QString title, command, disableOn;


signals:
void titleChanged(QString);
void commandChanged(QString);
void disableOnChanged(QString);
};

#endif // ACTIONITEM_H
48 changes: 40 additions & 8 deletions src/terminal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1379,25 +1379,57 @@ const QStringList Terminal::grabURLsFromBuffer()

QList<QObject*> Terminal::getActions()
{
// ASCII 30 (0x1E) Record Separator - separates actions
// ASCII 31 (0x1F) Unit Separator - separates title and command
QChar action_sep = 30;
QChar field_sep = 31;

QString actionsString = iUtil->settingsValue("gen/actions").toString();
QStringList actions = actionsString.split(action_sep);

QList<QObject*> actionItems;

foreach(auto actionData, actions) {
foreach(auto const &actionData, actions) {
QStringList action = actionData.split(field_sep);
Q_ASSERT(action.size() == 2);
actionItems << new ActionItem(action[0], action[1]);
Q_ASSERT(action.size() == 3);
actionItems << new ActionItem(action[0], action[1], action[2]);
}

return actionItems;
}

void Terminal::addAction(QString newTitle, QString newCommand, QString newDisableOn)
{
auto actions = getActions();
actions.append(new ActionItem(newTitle, newCommand, newDisableOn));
saveActions(actions);
}

void Terminal::updateAction(int index, QString newTitle, QString newCommand, QString newDisableOn)
{
auto actions = getActions();
Q_ASSERT(actions.size() > index);
static_cast<ActionItem*>(actions.at(index))->setTitle(newTitle);
static_cast<ActionItem*>(actions.at(index))->setCommand(newCommand);
static_cast<ActionItem*>(actions.at(index))->setDisableOn(newDisableOn);
saveActions(actions);
}

void Terminal::deleteAction(int index)
{
auto actions = getActions();
Q_ASSERT(actions.size() > index);
actions.removeAt(index);
saveActions(actions);
}

void Terminal::saveActions(QList<QObject*> actions)
{
QStringList actionStrings;
foreach(auto const &item, actions) {
actionStrings << QString("%1\x1f%2\x1f%3")
.arg(static_cast<ActionItem*>(item)->getTitle(),
static_cast<ActionItem*>(item)->getCommand(),
static_cast<ActionItem*>(item)->getDisableOn());
}
iUtil->setSettingsValue("gen/actions", actionStrings.join(action_sep));
}

void Terminal::scrollBackBufferFwd(int lines)
{
if(iUseAltScreenBuffer || lines<=0)
Expand Down
10 changes: 10 additions & 0 deletions src/terminal.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ class Terminal : public QObject
Q_INVOKABLE const QStringList grabURLsFromBuffer();

Q_INVOKABLE QList<QObject *> getActions();
Q_INVOKABLE void addAction(QString newTitle, QString newCommand, QString newDisableOn);
Q_INVOKABLE void updateAction(int index, QString newTitle, QString newCommand, QString newDisableOn);
Q_INVOKABLE void deleteAction(int index);

void scrollBackBufferFwd(int lines);
void scrollBackBufferBack(int lines);
Expand Down Expand Up @@ -163,6 +166,13 @@ class Terminal : public QObject
QString oscSeq;
int escape;
QRect iSelection;

// ASCII 30 (0x1E) Record Separator - separates actions
// ASCII 31 (0x1F) Unit Separator - separates title and command
QChar action_sep = 30;
QChar field_sep = 31;

void saveActions(QList<QObject*> actions);
};

#endif // TERMINAL_H
1 change: 1 addition & 0 deletions toeterm.pro
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ TRANSLATIONS += \
translations/toeterm-zh_CN.ts

DISTFILES += \
qml/ActionPage.qml \
translations/toeterm-es.ts \
translations/toeterm-fi_FI.ts \
translations/toeterm-nl.ts \
Expand Down

0 comments on commit 5ecefa9

Please sign in to comment.