diff options
Diffstat (limited to 'src-qt5/desktop-utils')
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/MainUI.cpp | 27 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/MainUI.h | 26 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/MainUI.ui | 18 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/gitCompat.cpp | 45 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/gitCompat.h | 56 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/gitWizard.cpp | 138 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/gitWizard.h | 67 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/gitWizard.ui | 252 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-fm/lumina-fm.pro | 11 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp | 62 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h | 2 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-textedit/tests/test.cpp | 3 | ||||
-rw-r--r-- | src-qt5/desktop-utils/lumina-textedit/tests/test.sh | 10 |
13 files changed, 688 insertions, 29 deletions
diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.cpp b/src-qt5/desktop-utils/lumina-fm/MainUI.cpp index ea176846..abe14c0d 100644 --- a/src-qt5/desktop-utils/lumina-fm/MainUI.cpp +++ b/src-qt5/desktop-utils/lumina-fm/MainUI.cpp @@ -8,6 +8,8 @@ #include "ui_MainUI.h" #include <QFileInfo> +#include "gitCompat.h" +#include "gitWizard.h" #define DEBUG 0 @@ -21,6 +23,7 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ ui->setupUi(this); + ui->menuGit->setVisible( GIT::isAvailable() ); if(DEBUG){ qDebug() << "Initilization:"; } settings = new QSettings( QSettings::UserScope, "lumina-desktop", "lumina-fm", this); @@ -230,6 +233,10 @@ void MainUI::setupIcons(){ ui->actionManage_Bookmarks->setIcon( LXDG::findIcon("bookmarks-organize","") ); ui->actionAdd_Bookmark->setIcon( LXDG::findIcon("bookmark-new","") ); + //GIT menu + ui->actionRepo_Status->setIcon( LXDG::findIcon("git","document-edit-verify") ); + ui->actionClone_Repository->setIcon( LXDG::findIcon("git","download") ); + // External Devices menu ui->actionScan->setIcon( LXDG::findIcon("system-search","") ); } @@ -606,6 +613,26 @@ void MainUI::CreateBookMark(){ RebuildBookmarksMenu(); } +//Git Menu options +void MainUI::on_menuGit_aboutToShow(){ + QString dir = FindActiveBrowser()->currentDir(); + bool inrepo = GIT::isRepo(dir); + ui->actionRepo_Status->setEnabled( inrepo ); + ui->actionClone_Repository->setEnabled( !inrepo ); +} + +void MainUI::on_actionRepo_Status_triggered(){ + QString status = GIT::status( FindActiveBrowser()->currentDir() ); + QMessageBox::information(this, tr("Git Repository Status"), status); +} + +void MainUI::on_actionClone_Repository_triggered(){ + GitWizard *dlg = new GitWizard(this); + dlg->setWorkingDir( FindActiveBrowser()->currentDir() ); + dlg->show(); +} + + void MainUI::tabChanged(int tab){ if(tab<0){ tab = tabBar->currentIndex(); } if(tab < 0){ return; } diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.h b/src-qt5/desktop-utils/lumina-fm/MainUI.h index 007fff97..6df10a89 100644 --- a/src-qt5/desktop-utils/lumina-fm/MainUI.h +++ b/src-qt5/desktop-utils/lumina-fm/MainUI.h @@ -114,14 +114,14 @@ private slots: void on_actionNew_Window_triggered(); void on_actionNew_Tab_triggered(); void on_actionSearch_triggered(); - void on_actionClose_Browser_triggered(); + void on_actionClose_Browser_triggered(); void on_actionClose_triggered(); - void on_actionRename_triggered(); - void on_actionCut_Selection_triggered(); - void on_actionCopy_Selection_triggered(); - void on_actionPaste_triggered(); - void on_actionDelete_Selection_triggered(); - void on_actionRefresh_triggered(); + void on_actionRename_triggered(); + void on_actionCut_Selection_triggered(); + void on_actionCopy_Selection_triggered(); + void on_actionPaste_triggered(); + void on_actionDelete_Selection_triggered(); + void on_actionRefresh_triggered(); void on_actionView_Hidden_Files_triggered(); void on_actionShow_Action_Buttons_triggered(); void on_actionShow_Thumbnails_triggered(); @@ -132,15 +132,19 @@ private slots: void on_actionLarger_Icons_triggered(); void on_actionSmaller_Icons_triggered(); void CreateBookMark(); - + //Git Menu options + void on_menuGit_aboutToShow(); + void on_actionRepo_Status_triggered(); + void on_actionClone_Repository_triggered(); + //Tab interactions - void tabChanged(int tab = -1); + void tabChanged(int tab = -1); void tabClosed(int tab = -1); void nextTab(); //For keyboard shortcuts void prevTab(); //For keyboard shortcuts - //Other Shortcuts - void togglehiddenfiles(); + //Other Shortcuts + void togglehiddenfiles(); void focusDirWidget(); //Backend Info passing diff --git a/src-qt5/desktop-utils/lumina-fm/MainUI.ui b/src-qt5/desktop-utils/lumina-fm/MainUI.ui index 8078b804..3c11d87e 100644 --- a/src-qt5/desktop-utils/lumina-fm/MainUI.ui +++ b/src-qt5/desktop-utils/lumina-fm/MainUI.ui @@ -176,11 +176,19 @@ <addaction name="separator"/> <addaction name="actionDelete_Selection"/> </widget> + <widget class="QMenu" name="menuGit"> + <property name="title"> + <string>Git</string> + </property> + <addaction name="actionRepo_Status"/> + <addaction name="actionClone_Repository"/> + </widget> <addaction name="menuFile"/> <addaction name="menuEdit"/> <addaction name="menuView"/> <addaction name="menuBookmarks"/> <addaction name="menuExternal_Devices"/> + <addaction name="menuGit"/> </widget> <widget class="QStatusBar" name="statusbar"/> <action name="actionNew_Tab"> @@ -426,6 +434,16 @@ <enum>Qt::ApplicationShortcut</enum> </property> </action> + <action name="actionRepo_Status"> + <property name="text"> + <string>Repo Status</string> + </property> + </action> + <action name="actionClone_Repository"> + <property name="text"> + <string>Clone Repository</string> + </property> + </action> </widget> <resources/> <connections/> diff --git a/src-qt5/desktop-utils/lumina-fm/gitCompat.cpp b/src-qt5/desktop-utils/lumina-fm/gitCompat.cpp new file mode 100644 index 00000000..18e83e6a --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/gitCompat.cpp @@ -0,0 +1,45 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the backend classe for interacting with the "git" utility +//=========================================== +#include "gitCompat.h" +#include <QApplication> + +#define TMPFILE QString("/tmp/.") +GitProcess::GitProcess() : QProcess(){ + this->setProcessChannelMode(QProcess::MergedChannels); + tmpfile.setFileName(TMPFILE +QString::number( (rand()%8999) + 1000 )); + //qDebug() << "Temporary File Name:" << tmpfile.fileName(); + tmpfile.setParent(this); + connect(this, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(cleanup()) ); + connect(this, SIGNAL(readyReadStandardOutput()), this, SLOT(printoutput()) ); +} + +GitProcess::~GitProcess(){ + if(tmpfile.exists()){ tmpfile.remove(); } //ensure that password file never gets left behind +} + +void GitProcess::setSSHPassword(QString pass){ + //Save the password into the temporary file + if( tmpfile.open(QIODevice::WriteOnly) ){ + QTextStream in(&tmpfile); + in << "#!/bin/sh"<<"\n"; + in << "echo \""+pass+"\"" << "\n"; + in << "rm "+tmpfile.fileName()+"\n"; //have the script clean itself up after running once + tmpfile.close(); + } + tmpfile.setPermissions( QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner ); + QApplication::processEvents(); + QProcessEnvironment env = this->processEnvironment(); + env.insert("SSH_ASKPASS", tmpfile.fileName()); + env.insert("DISPLAY",":0"); //will not actually be used - the tmp file sends the password back instantly + this->setProcessEnvironment(env); +} + +void GitProcess::cleanup(){ + if(tmpfile.exists()){ tmpfile.remove(); } //ensure that password file never gets left behind +} diff --git a/src-qt5/desktop-utils/lumina-fm/gitCompat.h b/src-qt5/desktop-utils/lumina-fm/gitCompat.h index 6578bd5b..3e6cb15e 100644 --- a/src-qt5/desktop-utils/lumina-fm/gitCompat.h +++ b/src-qt5/desktop-utils/lumina-fm/gitCompat.h @@ -4,23 +4,49 @@ // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== -// This is the backend classe for interacting with the "git" utility +// This is the backend class for interacting with the "git" utility //=========================================== -#ifdef _LUMINA_FM_GIT_COMPAT_H +#ifndef _LUMINA_FM_GIT_COMPAT_H #define _LUMINA_FM_GIT_COMPAT_H #include <QProcess> #include <QString> #include <QProcessEnvironment> - +#include <QDebug> +#include <QTemporaryFile> #include <LuminaUtils.h> +#include <unistd.h> + +class GitProcess : public QProcess{ + Q_OBJECT +private: + QString log; + QFile tmpfile; +public: + GitProcess(); + ~GitProcess(); + + //Optional Inputs + void setSSHPassword(QString pass); //This is only used for SSH access + +private slots: + void cleanup(); + //void printoutput(){ qDebug() << "Proc Output:" << this->readAllStandardOutput(); } + +protected: + virtual void setupChildProcess(){ + //Need to disable the controlling terminal within this process + setsid(); //Make current process new session leader - resulting in no controlling terminal for this session + } +}; + class GIT{ public: //Check if the git utility is installed and available static bool isAvailable(){ - QString bin = "git" - return isValidBinary(bin); + QString bin = "git"; + return LUtils::isValidBinary(bin); } //Return if the current directory is a git repository @@ -28,7 +54,8 @@ public: QProcess P; P.setProcessEnvironment(QProcessEnvironment::systemEnvironment()); P.setWorkingDirectory(dir); - P.exec("git",QStringList() <<"status" << "--porcelain" ); + P.start("git",QStringList() <<"status" << "--porcelain" ); + P.waitForFinished(); return (0==P.exitCode()); } @@ -38,22 +65,23 @@ public: P.setProcessEnvironment(QProcessEnvironment::systemEnvironment()); P.setWorkingDirectory(dir); P.setProcessChannelMode(QProcess::MergedChannels); - P.exec("git",QStringList() <<"status" ); + P.start("git",QStringList() <<"status" ); + P.waitForFinished(); return P.readAllStandardOutput(); } //Setup a process for running the clone operation (so the calling process can hook up any watchers and start it when ready) - static QProcess setupClone(QString indir, QString url, QString branch = "", int depth = -1){ - QProcess P; - P.setProcessEnvironment( QProcessEnvironment::systemEnvironment() ); - P.setWorkingDirectory(indir); - P.setProgram("git"); + static GitProcess* setupClone(QString indir, QString url, QString branch = "", int depth = -1){ + //NOTE: The returned QProcess needs to be cleaned up when finished + GitProcess *P = new GitProcess(); + P->setWorkingDirectory(indir); + P->setProgram("git"); QStringList args; - args << "clone"; + args << "clone" << "--progress"; if(!branch.isEmpty()){ args << "-b" << branch; } if(depth>0){ args << "--depth" << QString::number(depth); } args << url; - P.setArguments(args); + P->setArguments(args); return P; } }; diff --git a/src-qt5/desktop-utils/lumina-fm/gitWizard.cpp b/src-qt5/desktop-utils/lumina-fm/gitWizard.cpp new file mode 100644 index 00000000..7edfc95f --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/gitWizard.cpp @@ -0,0 +1,138 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the dialog for cloning a git repository +//=========================================== +#include "gitWizard.h" +#include "ui_gitWizard.h" + +#include "gitCompat.h" +#include <QDebug> +#include <QThread> + +GitWizard::GitWizard(QWidget *parent) : QWizard(parent), ui(new Ui::GitWizard){ + ui->setupUi(this); //load the designer form + proc = 0; //not initialized yet + connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(pageChanged(int)) ); + //connect(this, SIGNAL(finished(int)), this, SLOT(finished(int)) ); + connect(ui->line_repo_org, SIGNAL(textChanged(const QString&)), this, SLOT(validateRepo()) ); + connect(ui->line_repo_name, SIGNAL(textChanged(const QString&)), this, SLOT(validateRepo()) ); + connect(ui->line_ssh_pass, SIGNAL(textChanged(const QString&)), this, SLOT(validateType()) ); + connect(ui->line_user, SIGNAL(textChanged(const QString&)), this, SLOT(validateType()) ); + connect(ui->line_pass, SIGNAL(textChanged(const QString&)), this, SLOT(validateType()) ); + connect(ui->radio_type_ssh, SIGNAL(clicked()), this, SLOT(validateType()) ); + connect(ui->radio_type_login, SIGNAL(clicked()), this, SLOT(validateType()) ); + connect(ui->radio_type_anon, SIGNAL(clicked()), this, SLOT(validateType()) ); + connect(ui->check_depth, SIGNAL(clicked()), this, SLOT(validateType()) ); + connect(ui->check_branch, SIGNAL(clicked()), this, SLOT(validateType()) ); + validateRepo(); +} + +GitWizard::~GitWizard(){ + if(proc!=0){ proc->deleteLater(); } +} + +//Input values; +void GitWizard::setWorkingDir(QString path){ + inDir = path; +} + +//============ +// PRIVATE +// ============ +QString GitWizard::assembleURL(){ + QString repo = ui->line_repo_org->text()+"/"+ui->line_repo_name->text()+".git"; + QString url; + if(ui->radio_type_ssh->isChecked()){ url = "git@github.com:"+repo; } + else if(ui->radio_type_anon->isChecked()){ url = "https://github.com/"+repo; } + else if(ui->radio_type_login->isChecked()){ + url = "https://"+ui->line_user->text()+":"+ui->line_pass->text()+"@github.com/"+repo; + } + + return url; +} + +/*void GitWizard::showDownload(GitProcess *P){ + + //P->closeWriteChannel(); + //P->closeReadChannel(GitProcess::StandardOutput); + //P->closeReadChannel(GitProcess::StandardError); + while(P->state()!=QProcess::NotRunning){ + this->thread()->usleep(50000); //50 ms + QApplication::processEvents(); + } + P->deleteLater(); +}*/ + +//================ +// PRIVATE SLOTS +// ================ +void GitWizard::pageChanged(int newpage){ + //called when the "next" button is clicked + if(this->page(newpage)==ui->page_repo){ + validateRepo(); + }else if(this->page(newpage)==ui->page_type){ + //Need to adjust items on this page based on info on last page + ui->radio_type_anon->setEnabled( !ui->check_privaterepo->isChecked() ); + ui->radio_type_ssh->setEnabled( QFile::exists(QDir::homePath()+"/.ssh/id_rsa") ); //TODO - Disable for now until SSH passphrases can be used properly + //Now set the preferred type of login based on which are available + if(ui->radio_type_ssh->isEnabled()){ ui->radio_type_ssh->setChecked(true); } //SSH is preferred if that is available + else if(ui->radio_type_anon->isEnabled()){ ui->radio_type_anon->setChecked(true); } //anonymous next since it is a public repo - no creds really needed + else{ ui->radio_type_login->setChecked(true); } + //Clear any of the UI as needed + ui->line_user->clear(); ui->line_pass->clear(); ui->line_ssh_pass->clear(); + validateType(); + }else if(this->page(newpage)==ui->page_download){ + qDebug() << "Run git clone"; + QString url = assembleURL(); + QString branch; if(ui->check_branch->isChecked()){ branch = ui->line_branch->text(); } + int depth = -1; if(ui->check_depth->isChecked()){ depth = ui->spin_depth->value(); } + proc = GIT::setupClone(inDir, url, branch, depth); + if(proc!=0){ + connect(proc, SIGNAL(readyReadStandardOutput()), this, SLOT(readProc()) ); + connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(procFinished(int)) ); + if(ui->radio_type_ssh->isChecked()){ + proc->setSSHPassword(ui->line_ssh_pass->text()); + } + proc->start(QIODevice::ReadOnly); + this->button(QWizard::FinishButton)->setEnabled(false); + } + } +} + +//Page validation slots +void GitWizard::validateRepo(){ + bool ok = !ui->line_repo_org->text().isEmpty() && !ui->line_repo_name->text().isEmpty(); + this->button(QWizard::NextButton)->setEnabled(ok); +} + +void GitWizard::validateType(){ + bool ok = false; + //Check types first + if(ui->radio_type_login->isChecked()){ ok = !ui->line_user->text().isEmpty() && !ui->line_pass->text().isEmpty(); } + else{ ok = true; } + //Now check optional settings + if(ui->check_branch->isChecked()){ ok = ok && !ui->line_branch->text().isEmpty(); } + if(ui->check_branch->isChecked()){ ok = ok && !ui->line_branch->text().isEmpty(); } + //Now make interface boxes appear/disappear as needed + ui->line_ssh_pass->setVisible(ui->radio_type_ssh->isChecked()); + ui->line_user->setVisible(ui->radio_type_login->isChecked()); + ui->line_pass->setVisible(ui->radio_type_login->isChecked()); + ui->spin_depth->setVisible(ui->check_depth->isChecked()); + ui->line_branch->setVisible(ui->check_branch->isChecked()); + + //Update the button as needed + this->button(QWizard::NextButton)->setEnabled(ok); +} + +void GitWizard::readProc(){ + ui->text_procOutput->append( proc->readAllStandardOutput() ); +} + +void GitWizard::procFinished(int retcode){ + this->button(QWizard::FinishButton)->setEnabled(true); +} + diff --git a/src-qt5/desktop-utils/lumina-fm/gitWizard.h b/src-qt5/desktop-utils/lumina-fm/gitWizard.h new file mode 100644 index 00000000..4a6ec2bc --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/gitWizard.h @@ -0,0 +1,67 @@ +//=========================================== +// Lumina-DE source code +// Copyright (c) 2016, Ken Moore +// Available under the 3-clause BSD license +// See the LICENSE file for full details +//=========================================== +// This is the dialog for cloning a git repository +//=========================================== +#ifndef _LUMINA_FM_GIT_DIALOG_H +#define _LUMINA_FM_GIT_DIALOG_H + +#include <QWizard> +#include <QString> +#include <QMessageBox> + +#include "gitCompat.h" + +namespace Ui{ + class GitWizard; +}; + +class GitWizard : public QWizard{ + Q_OBJECT +public: + GitWizard(QWidget *parent = 0); + ~GitWizard(); + + //Input values; + void setWorkingDir(QString path); + +private: + Ui::GitWizard *ui; + QString inDir; + GitProcess *proc; + + QString assembleURL(); + //void showDownload(GitProcess *P); + +private slots: + //Page Change slots + void pageChanged(int newpage); //called when the "next" button is clicked + //void finished(int); //called when the "finish" button is clicked + + //Page validation slots + void validateRepo(); //for page_repo + void validateType(); //for page_type + + //process output + void readProc(); + void procFinished(int retcode); + +protected: + void closeEvent(QCloseEvent *ev){ + //Make sure the process is not running first + if(proc!=0 && proc->state()!=QProcess::NotRunning){ + ev->ignore(); + if(QMessageBox::Yes == QMessageBox::question(this, tr("Stop Download?"), tr("Kill the current download?") ) ){ + proc->kill(); + } + }else{ + QWizard::closeEvent(ev); + this->deleteLater(); //we need to clean this up completely + } + } +}; + +#endif diff --git a/src-qt5/desktop-utils/lumina-fm/gitWizard.ui b/src-qt5/desktop-utils/lumina-fm/gitWizard.ui new file mode 100644 index 00000000..0f5894b6 --- /dev/null +++ b/src-qt5/desktop-utils/lumina-fm/gitWizard.ui @@ -0,0 +1,252 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>GitWizard</class> + <widget class="QWizard" name="GitWizard"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>456</width> + <height>346</height> + </rect> + </property> + <property name="windowTitle"> + <string>Clone a Git Repository</string> + </property> + <property name="wizardStyle"> + <enum>QWizard::ModernStyle</enum> + </property> + <property name="options"> + <set>QWizard::NoBackButtonOnLastPage|QWizard::NoBackButtonOnStartPage|QWizard::NoCancelButtonOnLastPage</set> + </property> + <widget class="QWizardPage" name="page_repo"> + <property name="title"> + <string>Welcome!</string> + </property> + <property name="subTitle"> + <string>This wizard will guide you through the process of downloading a GIT repository from the internet.</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <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> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>GitHub Repository Settings</string> + </property> + <layout class="QFormLayout" name="formLayout_2"> + <property name="labelAlignment"> + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Organization/User</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="line_repo_org"/> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Repository Name</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLineEdit" name="line_repo_name"/> + </item> + <item row="2" column="1"> + <widget class="QCheckBox" name="check_privaterepo"> + <property name="text"> + <string>Is Private Repository</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QWizardPage" name="page_type"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Type of Access</string> + </property> + <layout class="QFormLayout" name="formLayout"> + <item row="0" column="0"> + <widget class="QRadioButton" name="radio_type_ssh"> + <property name="text"> + <string>Use my SSH Key</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QRadioButton" name="radio_type_login"> + <property name="text"> + <string>Login to server</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLineEdit" name="line_user"> + <property name="placeholderText"> + <string>Username</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="line_pass"> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + <property name="placeholderText"> + <string>Password</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QRadioButton" name="radio_type_anon"> + <property name="text"> + <string>Anonymous (public repositories only)</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QLineEdit" name="line_ssh_pass"> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + <property name="placeholderText"> + <string>Optional SSH Password</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_3"> + <property name="title"> + <string>Advanced Options</string> + </property> + <layout class="QFormLayout" name="formLayout_3"> + <item row="0" column="0"> + <widget class="QCheckBox" name="check_depth"> + <property name="text"> + <string>Custom Depth</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QCheckBox" name="check_branch"> + <property name="text"> + <string>Single Branch</string> + </property> + </widget> + </item> + <item row="1" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QLineEdit" name="line_branch"> + <property name="placeholderText"> + <string>branch name</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="0" column="1"> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QSpinBox" name="spin_depth"> + <property name="minimum"> + <number>1</number> + </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> + </layout> + </widget> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="font"> + <font> + <pointsize>11</pointsize> + <weight>50</weight> + <italic>true</italic> + <bold>false</bold> + </font> + </property> + <property name="text"> + <string>Click "Next" to start downloading the repository</string> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWizardPage" name="page_download"> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QTextEdit" name="text_procOutput"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro index e47ba2f6..91e2952c 100644 --- a/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro +++ b/src-qt5/desktop-utils/lumina-fm/lumina-fm.pro @@ -15,7 +15,9 @@ SOURCES += main.cpp \ BMMDialog.cpp \ widgets/MultimediaWidget.cpp \ widgets/SlideshowWidget.cpp \ - widgets/DirWidget.cpp + widgets/DirWidget.cpp \ + gitCompat.cpp \ + gitWizard.cpp HEADERS += MainUI.h \ FODialog.h \ @@ -25,14 +27,17 @@ HEADERS += MainUI.h \ widgets/DDListWidgets.h \ widgets/MultimediaWidget.h \ widgets/SlideshowWidget.h \ - widgets/DirWidget.h + widgets/DirWidget.h \ + gitCompat.h \ + gitWizard.h FORMS += MainUI.ui \ FODialog.ui \ BMMDialog.ui \ widgets/MultimediaWidget.ui \ widgets/SlideshowWidget.ui \ - widgets/DirWidget.ui + widgets/DirWidget.ui \ + gitWizard.ui icons.files = Insight-FileManager.png icons.path = $${L_SHAREDIR}/pixmaps diff --git a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp index 7dcad6c3..0edb2160 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp +++ b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.cpp @@ -10,6 +10,7 @@ QStringList Custom_Syntax::availableRules(){ QStringList avail; avail << "C++"; //avail << "Python"; + avail << "Shell"; avail << "reST"; return avail; } @@ -40,6 +41,7 @@ QString Custom_Syntax::ruleForFile(QString filename){ QString suffix = filename.section(".",-1); if(suffix=="cpp" || suffix=="hpp" || suffix=="c" || suffix=="h"){ return "C++"; } //else if(suffix=="py" || suffix=="pyc"){ return "Python"; } + else if(suffix=="sh"){ return "Shell"; } else if(suffix=="rst"){ return "reST"; } return ""; } @@ -101,6 +103,66 @@ void Custom_Syntax::loadRules(QString type){ srule.endPattern = QRegExp("\\*/"); splitrules << srule; + }else if(type=="Shell"){ + //Keywords (standard Shell definitions) + QStringList keywords; + keywords << "alias" << "alloc" << "bg" << "bind" << " bindkey" << "break" \ + << "breaksw"<<"builtins"<<"case"<<"cd"<<"chdir"<<"command"<<"complete"<<"continue"<<"default" \ + <<"dirs"<<"do"<<"done"<<"echo"<<"echotc"<<"elif"<<"else"<<"end"<<"endif"<<"endsw"<<"esac"<<"eval" \ + <<"exec"<<"exit"<<"export"<<"false"<<"fc"<<"fg"<<"filetest"<<"fi"<<"for"<<"foreach"<<"getopts" \ + <<"glob"<<"goto"<<"hash"<<"hashstat"<<"history"<<"hup"<<"if"<<"jobid"<<"jobs"<<"kill"<<"limit" \ + <<"local"<<"log"<<"login"<<"logout"<<"ls-F"<<"nice"<<"nohup"<<"notify"<<"onintr"<<"popd" \ + <<"printenv"<<"printf"<<"pushd"<<"pwd"<<"read"<<"readonly"<<"rehash"<<"repeat"<<"return" \ + <<"sched"<<"set"<<"setenv"<<"settc"<<"setty"<<"setvar"<<"shift"<<"source"<<"stop"<<"suspend" \ + <<"switch"<<"telltc"<<"test"<<"then"<<"time"<<"times"<<"trap"<<"true"<<"type"<<"ulimit"<<"umask" \ + <<"unalias"<<"uncomplete"<<"unhash"<<"unlimit"<<"unset"<<"unsetenv"<<"until"<<"wait" \ + <<"where"<<"which"<<"while"; + + SyntaxRule rule; + rule.format.setForeground( QColor(settings->value("colors/keyword").toString()) ); + rule.format.setFontWeight(QFont::Bold); + for(int i=0; i<keywords.length(); i++){ + rule.pattern = QRegExp("\\b"+keywords[i]+"\\b"); //turn each keyword into a QRegExp and insert the rule + rules << rule; + } + //Alternate Keywords (built-in functions) + /*keywords.clear(); + keywords << "for" << "while" << "switch" << "case" << "if" << "else" << "return" << "exit"; + rule.format.setForeground( QColor(settings->value("colors/altkeyword").toString()) ); + for(int i=0; i<keywords.length(); i++){ + rule.pattern = QRegExp("\\b"+keywords[i]+"\\b"); //turn each keyword into a QRegExp and insert the rule + rules << rule; + }*/ + //Variable Names + rule.format.setForeground( QColor(settings->value("colors/class").toString()) ); + rule.pattern = QRegExp("\\$\\{[^\\n\\}]+\\}"); + rules << rule; + rule.pattern = QRegExp("\\$[^\\s$]+(?=\\s|$)"); + rules << rule; + //Quotes + rule.format.setForeground( QColor(settings->value("colors/text").toString()) ); + rule.format.setFontWeight(QFont::Normal); + rule.pattern = QRegExp( "\"[^\"\\\\]*(\\\\(.|\\n)[^\"\\\\]*)*\"|'[^'\\\\]*(\\\\(.|\\n)[^'\\\\]*)*'"); + rules << rule; + //Functions + rule.format.setForeground( QColor(settings->value("colors/function").toString()) ); + rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()"); + rules << rule; + //Proprocessor commands + rule.format.setForeground( QColor(settings->value("colors/preprocessor").toString()) ); + rule.pattern = QRegExp("^#![^\n]*"); + rules << rule; + //Comment (single line) + rule.format.setForeground( QColor(settings->value("colors/comment").toString()) ); + rule.pattern = QRegExp("#[^\n]*"); + rules << rule; + //Comment (multi-line) + //SyntaxRuleSplit srule; + //srule.format = rule.format; //re-use the single-line comment format + //srule.startPattern = QRegExp("/\\*"); + //srule.endPattern = QRegExp("\\*/"); + //splitrules << srule; + }else if(type=="Python"){ //Keywords QStringList keywords; diff --git a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h index 781ff65d..f834e275 100644 --- a/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h +++ b/src-qt5/desktop-utils/lumina-textedit/syntaxSupport.h @@ -101,7 +101,7 @@ protected: if(splitactive>=0 || index<start){ continue; } //skip this one - falls within a multi-line pattern above while(index>=0){ int len = patt.matchedLength(); - setFormat(index, len, rules[i].format); + if(format(index)==currentBlock().charFormat()){ setFormat(index, len, rules[i].format); } //only apply highlighting if not within a section already index = patt.indexIn(text, index+len); //go to the next match } }//end loop over normal (single-line) patterns diff --git a/src-qt5/desktop-utils/lumina-textedit/tests/test.cpp b/src-qt5/desktop-utils/lumina-textedit/tests/test.cpp index 1b50e302..e135227d 100644 --- a/src-qt5/desktop-utils/lumina-textedit/tests/test.cpp +++ b/src-qt5/desktop-utils/lumina-textedit/tests/test.cpp @@ -13,3 +13,6 @@ comment */ stuff some /*single line comment with multi-line tags */ + +"some text" +"some text with url: http://sample.com" diff --git a/src-qt5/desktop-utils/lumina-textedit/tests/test.sh b/src-qt5/desktop-utils/lumina-textedit/tests/test.sh new file mode 100644 index 00000000..8eb7450c --- /dev/null +++ b/src-qt5/desktop-utils/lumina-textedit/tests/test.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +echo "some text" #with a comment +for i in ["a","b","c"] +do +echo ${i}withsometext +done + +variable$variable sdfgbuj +variable${variable}satoibnsoin |