filebrowser inline edit disabled for android

This commit is contained in:
Zira project 2020-11-19 19:26:46 +05:00
parent f88c61a113
commit a6cb6646d4
9 changed files with 567 additions and 8 deletions

View File

@ -54,6 +54,7 @@ SOURCES += \
src/parserworker.cpp \
src/createfiledialog.cpp \
src/createfolderdialog.cpp \
src/renamedialog.cpp \
src/filebrowser.cpp \
src/editortabs.cpp \
src/parsephp.cpp \
@ -110,6 +111,7 @@ HEADERS += \
include/parserworker.h \
include/createfiledialog.h \
include/createfolderdialog.h \
include/renamedialog.h \
include/filebrowser.h \
include/editortabs.h \
include/parsephp.h \
@ -147,6 +149,7 @@ FORMS += \
ui/mainwindow.ui \
ui/createfile.ui \
ui/createfolder.ui \
ui/rename.ui \
ui/createproject.ui \
ui/search.ui \
ui/editproject.ui \

View File

@ -21,6 +21,7 @@ public:
FileBrowser(QTreeWidget * widget, QLineEdit * line, Settings * settings);
void showCreateFileDialog(QString startDir = "");
void showCreateFolderDialog(QString startDir = "");
void showRenameDialog(QString startPath);
void showCreateProjectDialog(bool phpLintEnabled, bool phpCSEnabled, QString startDir = "");
void showEditProjectDialog(QString title, QString path, bool phpLintEnabled, bool phpCSEnabled);
void openProject(QString startDir = "");

View File

@ -42,6 +42,7 @@ namespace Ui {
class MainWindow;
class CreateFileDialog;
class CreateFolderDialog;
class RenameDialog;
class CreateProjectDialog;
class EditProjectDialog;
class SearchDialog;
@ -108,6 +109,7 @@ private slots:
void on_actionOpenFile_triggered();
void on_actionNewFile_triggered();
void on_actionNewFolder_triggered();
void on_actionRename_triggered();
void on_actionUpdateProject_triggered();
void on_actionRescanProject_triggered();
void on_actionCloseProject_triggered();

34
include/renamedialog.h Normal file
View File

@ -0,0 +1,34 @@
/*******************************************
* Zira Editor
* A lightweight PHP Editor
* (C)2019 https://github.com/ziracms/editor
*******************************************/
#ifndef RENAMEFILEDIALOG_H
#define RENAMEFILEDIALOG_H
#include "ui_rename.h"
#include <QDialog>
class RenameDialog : public QDialog
{
Q_OBJECT
public:
RenameDialog(QWidget * parent);
~RenameDialog() override;
void setDirectory(QString path);
void setName(QString path);
QString getDirectory();
QString getName();
QString getPath();
void focusName();
protected:
void checkPath(QString directory, QString name);
private:
Ui::RenameDialog * ui;
QString directory;
private slots:
void nameChanged(QString path);
};
#endif // RENAMEFILEDIALOG_H

View File

@ -17,6 +17,7 @@
#include "helper.h"
#include "createfiledialog.h"
#include "createfolderdialog.h"
#include "renamedialog.h"
#include "createprojectdialog.h"
#include "editprojectdialog.h"
#include "project.h"
@ -365,6 +366,12 @@ void FileBrowser::fbCreateNewItemRequested(QTreeWidgetItem * item, QString actio
QFileInfo fInfo(path);
if (!fInfo.exists() || !fInfo.isReadable() || !fInfo.isWritable() || !fInfo.isDir()) return;
#if defined(Q_OS_ANDROID)
if (actionName == FB_ACTION_NAME_CREATE_FILE) showCreateFileDialog(path);
else if (actionName == FB_ACTION_NAME_CREATE_FOLDER) showCreateFolderDialog(path);
return;
#endif
editMode = true;
/*
if (isGesturesEnabled) disableGestures();
@ -399,6 +406,11 @@ void FileBrowser::fbEditItemRequested(QTreeWidgetItem * item, QString actionName
QFileInfo fInfo(path);
if (!fInfo.exists() || !fInfo.isReadable() || !fInfo.isWritable()) return;
#if defined(Q_OS_ANDROID)
showRenameDialog(path);
return;
#endif
editMode = true;
/*
if (isGesturesEnabled) disableGestures();
@ -582,9 +594,7 @@ void FileBrowser::fbPasteItem(QTreeWidgetItem * item)
QString newPath = path + "/" + fInfo.fileName();
if (!Helper::fileOrFolderExists(newPath)) {
if (!Helper::copyFile(fbcopypath, newPath)) {
QMessageBox msgBox;
msgBox.setText(QObject::tr("Could not create new file or folder."));
msgBox.exec();
emit showError(QObject::tr("Could not create new file or folder."));
} else {
// reload
fbReloadItem(item);
@ -639,9 +649,7 @@ void FileBrowser::showCreateFileDialog(QString startDir)
refreshFileBrowserDirectory(directory);
}
} else {
QMessageBox msgBox;
msgBox.setText(QObject::tr("File or folder with such name already exists."));
msgBox.exec();
emit showError(QObject::tr("File or folder with such name already exists."));
}
fbcopypath = ""; fbcutpath = "";
fbcopyitem = nullptr; fbcutitem = nullptr;
@ -673,6 +681,35 @@ void FileBrowser::showCreateFolderDialog(QString startDir)
fbcopyitem = nullptr; fbcutitem = nullptr;
}
void FileBrowser::showRenameDialog(QString startPath)
{
if (startPath.size() == 0) return;
QFileInfo fm(startPath);
QString directory = fm.absolutePath();
QString name = fm.fileName();
treeWidget->clearFocus();
RenameDialog dialog(treeWidget);
dialog.setDirectory(directory);
dialog.setName(name);
dialog.focusName();
if (dialog.exec() != QDialog::Accepted) return;
QString path = dialog.getPath();
if (path.size() == 0) return;
if (!Helper::fileOrFolderExists(path)) {
if (!Helper::renameFileOrFolder(startPath, path)) {
emit showError(QObject::tr("Could not rename file or folder."));
} else {
emit fileOrFolderRenamed(startPath, path);
// reload
refreshFileBrowserDirectory(directory);
}
} else {
emit showError(QObject::tr("File or folder with such name already exists."));
}
fbcopypath = ""; fbcutpath = "";
fbcopyitem = nullptr; fbcutitem = nullptr;
}
void FileBrowser::showCreateProjectDialog(bool phpLintEnabled, bool phpCSEnabled, QString startDir)
{
if (startDir.size() == 0) startDir = fbpath;
@ -796,7 +833,6 @@ bool FileBrowser::eventFilter(QObject *watched, QEvent *event)
fileBrowserDoubleClicked(item, 0);
} else if (keyEvent->key() == Qt::Key_Return && editMode) {
editMode = false;
treeWidget->setFocus(); // workaround for Android (causes segmentation fault if QMessageBox is displayed)
} else if (keyEvent->key() == Qt::Key_Up) {
if (treeWidget->topLevelItemCount() == 0 || treeWidget->currentItem() == treeWidget->topLevelItem(0)) {
pathLine->setFocus();

View File

@ -817,13 +817,14 @@ void MainWindow::editorBackForwardChanged()
void MainWindow::editorActionsChanged()
{
bool undo = false, redo = false, back = false, forward = false;
bool undo = false, redo = false, back = false, forward = false, rename = false;
Editor * textEditor = getActiveEditor();
if (textEditor != nullptr) {
undo = textEditor->isUndoable();
redo = textEditor->isRedoable();
back = textEditor->isBackable();
forward = textEditor->isForwadable();
rename = true;
}
QList<QAction *> editActions = ui->menuEdit->actions();
foreach (QAction * action, editActions) {
@ -835,6 +836,8 @@ void MainWindow::editorActionsChanged()
action->setEnabled(back);
} else if (action->objectName() == "actionForward") {
action->setEnabled(forward);
} else if (action->objectName() == "actionRename") {
action->setEnabled(rename);
}
}
}
@ -1084,6 +1087,13 @@ void MainWindow::on_actionNewFolder_triggered()
filebrowser->showCreateFolderDialog();
}
void MainWindow::on_actionRename_triggered()
{
QString fileName = getCurrentTabFilename();
if (fileName.size() == 0 || !Helper::fileExists(fileName)) return;
filebrowser->showRenameDialog(fileName);
}
void MainWindow::on_actionNewProject_triggered()
{
filebrowser->showCreateProjectDialog(parsePHPLintEnabled, parsePHPCSEnabled);

102
src/renamedialog.cpp Normal file
View File

@ -0,0 +1,102 @@
/*******************************************
* Zira Editor
* A lightweight PHP Editor
* (C)2019 https://github.com/ziracms/editor
*******************************************/
#include "renamedialog.h"
#include <QPushButton>
#include <QFileDialog>
#include "helper.h"
RenameDialog::RenameDialog(QWidget * parent) :
QDialog(parent),
ui(new Ui::RenameDialog())
{
ui->setupUi(this);
setModal(true);
connect(ui->renameDialogFileLineEdit, SIGNAL(textChanged(QString)), this, SLOT(nameChanged(QString)));
ui->renameDialogPathLabel->setVisible(false);
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
ui->buttonBox->setContentsMargins(0, 0, 20, 0);
ui->renameDialogHeaderLabel->setStyleSheet(DIALOG_HEADER_STYLESHEET);
directory = "";
// maximize dialog in Android
#if defined(Q_OS_ANDROID)
setWindowState( windowState() | Qt::WindowMaximized);
#endif
}
RenameDialog::~RenameDialog()
{
delete ui;
}
void RenameDialog::nameChanged(QString path)
{
QString directory = getDirectory();
if (path.size() > 0 && directory.size() > 0) {
ui->renameDialogResultLabel->setText(directory + QDir::separator() + path);
ui->renameDialogPathLabel->setVisible(true);
} else {
ui->renameDialogResultLabel->setText("");
ui->renameDialogPathLabel->setVisible(false);
}
checkPath(directory, path);
}
void RenameDialog::checkPath(QString directory, QString name)
{
if (directory.size() == 0 || name.size() == 0 ||
!Helper::fileOrFolderExists(directory) ||
Helper::fileOrFolderExists(directory + QDir::separator() + name)
) {
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
} else {
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
}
}
void RenameDialog::setDirectory(QString path)
{
directory = path;
}
QString RenameDialog::getDirectory()
{
return directory;
}
void RenameDialog::setName(QString path)
{
ui->renameDialogFileLineEdit->setText(path);
}
QString RenameDialog::getName()
{
QString filename = ui->renameDialogFileLineEdit->text();
if (filename.size() > 0 && filename.mid(0, 1) == QDir::separator()) filename = filename.mid(1);
return filename;
}
QString RenameDialog::getPath()
{
QString directory = getDirectory();
QString filename = getName();
if (directory.size() > 0 && directory.mid(directory.size()-1, 1) == QDir::separator()) directory = directory.mid(0, directory.size()-1);
if (filename.size() > 0 && filename.mid(0, 1) == QDir::separator()) filename = filename.mid(1);
if (directory.size() > 0 && filename.size() > 0) {
return directory + QDir::separator() + filename;
}
return "";
}
void RenameDialog::focusName()
{
ui->renameDialogFileLineEdit->setFocus();
}

View File

@ -130,6 +130,8 @@
<addaction name="actionBack"/>
<addaction name="actionForward"/>
<addaction name="separator"/>
<addaction name="actionRename"/>
<addaction name="separator"/>
<addaction name="actionFindReplace"/>
<addaction name="actionSearchInFiles"/>
<addaction name="actionMultiSelect"/>
@ -1238,6 +1240,11 @@
<string>Multi-Selection</string>
</property>
</action>
<action name="actionRename">
<property name="text">
<string>Rename</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>

364
ui/rename.ui Normal file
View File

@ -0,0 +1,364 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RenameDialog</class>
<widget class="QDialog" name="RenameDialog">
<property name="windowModality">
<enum>Qt::NonModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>400</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>600</width>
<height>400</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="windowTitle">
<string>Rename file or folder</string>
</property>
<property name="modal">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="createFileDialogLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<item>
<widget class="QFrame" name="renameDialogFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>6</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="renameDialogHeaderLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLabel" name="renameDialogHeaderLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>100</height>
</size>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
<underline>false</underline>
</font>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="lineWidth">
<number>1</number>
</property>
<property name="text">
<string>Rename file or folder</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="margin">
<number>20</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="renameScrollAreaVerticalLayout">
<property name="leftMargin">
<number>10</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QScrollArea" name="renameScrollArea">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="renameScrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>580</width>
<height>247</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="renameDialogInfoLayout">
<property name="leftMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<item>
<widget class="QLabel" name="renameDialogInfoLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="text">
<string>Specify file or folder name:</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="renameDialogFileLayout">
<property name="leftMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<item>
<widget class="QLabel" name="renameDialogFileLabel">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Name:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="renameDialogFileLineEdit">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="renameDialogResultLayout">
<property name="leftMargin">
<number>10</number>
</property>
<property name="rightMargin">
<number>10</number>
</property>
<item>
<widget class="QLabel" name="renameDialogPathLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="font">
<font>
<weight>50</weight>
<bold>false</bold>
</font>
</property>
<property name="text">
<string>Path:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="renameDialogResultLabel">
<property name="minimumSize">
<size>
<width>0</width>
<height>50</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>RenameDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>224</x>
<y>174</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>199</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>RenameDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>292</x>
<y>180</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>199</y>
</hint>
</hints>
</connection>
</connections>
</ui>