[X2Go-Commits] [x2goclient] 01/01: Add folder explorer - GUI to management of sessions folders.
git-admin at x2go.org
git-admin at x2go.org
Wed Aug 13 15:34:42 CEST 2014
This is an automated email from the git hooks/post-receive script.
x2go pushed a commit to branch master
in repository x2goclient.
commit 9a7a47e2fbe99d7d11a6712a83cdfc2da3b327c7
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date: Wed Aug 13 15:33:08 2014 +0200
Add folder explorer - GUI to management of sessions folders.
---
debian/changelog | 1 +
folderbutton.cpp | 54 ++++++++--
folderbutton.h | 10 ++
folderexplorer.cpp | 160 +++++++++++++++++++++++++++
folderbutton.h => folderexplorer.h | 63 ++++-------
folderexplorer.ui | 118 ++++++++++++++++++++
onmainwindow.h | 5 +
sessionbutton.cpp | 2 -
sessionbutton.h | 5 +
sessionexplorer.cpp | 209 ++++++++++++++++++++++++++++++++++++
sessionexplorer.h | 12 +++
sessionwidget.cpp | 46 +++++++-
sessionwidget.h | 3 +
x2goclient.pro | 9 +-
14 files changed, 632 insertions(+), 65 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index a266a28..8534eec 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -29,6 +29,7 @@ x2goclient (4.0.3.0-0x2go1) UNRELEASED; urgency=low
x2gohelper.
- Add Makefile for x2gohelper.
- Add support for sessions folders.
+ - Add folder explorer - GUI to management of sessions folders.
[ Mike DePaulo ]
* New upstream release (4.0.3.0):
diff --git a/folderbutton.cpp b/folderbutton.cpp
index 28c7a2b..1c12f97 100644
--- a/folderbutton.cpp
+++ b/folderbutton.cpp
@@ -76,34 +76,68 @@ FolderButton::FolderButton ( ONMainWindow* mw,QWidget *parent, QString folderPat
icon=new QLabel ( this );
- QString sessIcon=":icons/128x128/folder.png";
- QPixmap* pix=new QPixmap( sessIcon );
nameLabel->setWordWrap(true);
nameLabel->setTextInteractionFlags(Qt::NoTextInteraction);
- icon->move ( 10,10 );
+ icon->move ( 10,25 );
if ( !miniMode )
{
nameLabel->move ( 80,34 );
nameLabel->setFixedSize(235,135);
- icon->setPixmap ( pix->scaled ( 64,64,Qt::IgnoreAspectRatio,
- Qt::SmoothTransformation ) );
}
else
{
nameLabel->move ( 64,18 );
nameLabel->setFixedSize(170,120);
- icon->setPixmap ( pix->scaled ( 48,48,Qt::IgnoreAspectRatio,
- Qt::SmoothTransformation ) );
}
- delete pix;
-
+ loadIcon();
}
FolderButton::~FolderButton()
{}
+void FolderButton::loadIcon()
+{
+ X2goSettings *st;
+
+ if (par->getBrokerMode())
+ st=new X2goSettings(par->getConfig()->iniFile,QSettings::IniFormat);
+ else
+ st= new X2goSettings( "sessions" );
+
+ QString sessIcon=":icons/128x128/folder.png";
+ QPixmap* pix;
+
+ QString normPath=(path+"/"+name).split("/",QString::SkipEmptyParts).join("::");
+
+ QByteArray picture=st->setting()->value ( normPath,
+ ( QVariant )QByteArray()).toByteArray();
+ if(!picture.size())
+ {
+ pix=new QPixmap( sessIcon );
+ }
+ else
+ {
+ pix=new QPixmap();
+ pix->loadFromData(picture);
+ }
+ bool miniMode=par->retMiniMode();
+
+ if ( !miniMode )
+ {
+ icon->setPixmap ( pix->scaled ( 64,64,Qt::IgnoreAspectRatio,
+ Qt::SmoothTransformation ) );
+ }
+ else
+ {
+ icon->setPixmap ( pix->scaled ( 48,48,Qt::IgnoreAspectRatio,
+ Qt::SmoothTransformation ) );
+ }
+
+ delete pix;
+}
+
void FolderButton::slotClicked()
{
emit folderSelected ( this );
@@ -118,14 +152,12 @@ bool FolderButton::lessThen ( const FolderButton* b1,
void FolderButton::mousePressEvent ( QMouseEvent * event )
{
- x2goDebug<<"mpress";
SVGFrame::mousePressEvent ( event );
loadBg ( ":/svg/folder_grey.svg" );
}
void FolderButton::mouseReleaseEvent ( QMouseEvent * event )
{
- x2goDebug<<"mrelease";
SVGFrame::mouseReleaseEvent ( event );
int x=event->x();
int y=event->y();
diff --git a/folderbutton.h b/folderbutton.h
index a5eaf99..9eba380 100644
--- a/folderbutton.h
+++ b/folderbutton.h
@@ -47,6 +47,16 @@ public:
{
return path;
}
+ void setPath(QString path)
+ {
+ this->path=path;
+ }
+ void setName(QString name)
+ {
+ this->name=name;
+ }
+ void loadIcon();
+
void setChildrenList(QStringList children);
private:
QString path;
diff --git a/folderexplorer.cpp b/folderexplorer.cpp
new file mode 100644
index 0000000..569cd2a
--- /dev/null
+++ b/folderexplorer.cpp
@@ -0,0 +1,160 @@
+/**************************************************************************
+* Copyright (C) 2005-2014 by Oleksandr Shneyder *
+* o.shneyder at phoca-gmbh.de *
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* This program is distributed in the hope that it will be useful, *
+* but WITHOUT ANY WARRANTY; without even the implied warranty of *
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+* GNU General Public License for more details. *
+* *
+* You should have received a copy of the GNU General Public License *
+* along with this program. If not, see <http://www.gnu.org/licenses/>. *
+***************************************************************************/
+#include "folderexplorer.h"
+#include "x2gologdebug.h"
+#include "sessionexplorer.h"
+#include "folderbutton.h"
+#include <QMenu>
+#include <QFileDialog>
+#include <QInputDialog>
+#include <QMessageBox>
+
+FolderExplorer::FolderExplorer(QString path, SessionExplorer* explorer, QWidget* parent):QDialog(parent)
+{
+ setupUi(this);
+ this->explorer=explorer;
+ root=new QTreeWidgetItem(treeWidget);
+ root->setText(0,"/");
+ root->setIcon(0,QIcon(":icons/128x128/folder.png"));
+ currentPath=path;
+ initFolders(root, "");
+ root->setExpanded(true);
+ if(currentPath=="/")
+ root->setSelected(true);
+ root->setData(0,Qt::UserRole, "/");
+
+}
+
+void FolderExplorer::initFolders(QTreeWidgetItem* parent, QString path)
+{
+ FolderButton* b;
+ foreach(b, *(explorer->getFoldersList()))
+ {
+ if(b->getPath()==path)
+ {
+ QTreeWidgetItem* it=new QTreeWidgetItem(parent);
+ it->setText(0,b->getName());
+ it->setIcon(0, QIcon(*(b->folderIcon())));
+ QString normPath=(b->getPath()+"/"+b->getName()).split("/",QString::SkipEmptyParts).join("/");
+ it->setData(0,Qt::UserRole, normPath+"/");
+ if(normPath+"/"==currentPath)
+ {
+
+ it->setSelected(true);
+ QTreeWidgetItem* p=it->parent();
+ while(p!=root)
+ {
+ p->setExpanded(true);
+ p=p->parent();
+ }
+ }
+ initFolders(it, normPath);
+ }
+ }
+}
+
+void FolderExplorer::slotContextMenu(QPoint p)
+{
+ menuItem=treeWidget->itemAt(p);
+ if(!menuItem)
+ return;
+
+ QMenu menu(treeWidget);
+ connect(menu.addAction(tr("Create New Folder")), SIGNAL(triggered(bool)), this, SLOT(slotNewFolder()));
+
+ if(menuItem!=root)
+ {
+ connect(menu.addAction(tr("Rename Folder...")), SIGNAL(triggered(bool)), this, SLOT(slotChangeName()));
+ connect(menu.addAction(tr("Change Icon...")), SIGNAL(triggered(bool)), this, SLOT(slotChangeIcon()));
+ connect(menu.addAction(tr("Delete Folder...")), SIGNAL(triggered(bool)), this, SLOT(slotDeleteFolder()));
+ }
+ menu.exec(treeWidget->viewport()->mapToGlobal(p));
+}
+
+void FolderExplorer::slotItemSelected(QTreeWidgetItem* it, int)
+{
+ currentPath=it->data(0,Qt::UserRole).toString();
+}
+
+void FolderExplorer::slotChangeIcon()
+{
+ QString path= QFileDialog::getOpenFileName (
+ this,
+ tr ( "Open picture" ),
+ QDir::homePath(),
+ tr ( "Pictures" ) +" (*.png *.xpm *.jpg)" );
+ if ( path!=QString::null )
+ {
+ explorer->setFolderIcon(menuItem->data(0, Qt::UserRole).toString(), path);
+ menuItem->setIcon(0, QIcon(path));
+ }
+}
+
+void FolderExplorer::slotChangeName()
+{
+ bool ok;
+ QString oldPath=menuItem->data(0,Qt::UserRole).toString();
+ QStringList parts=oldPath.split("/",QString::SkipEmptyParts);
+ QString text = QInputDialog::getText(this, tr("X2Go Client"),
+ tr("Folder Name:"), QLineEdit::Normal,
+ parts.last(), &ok);
+ if (ok && !text.isEmpty())
+ {
+ menuItem->setText(0,text);
+ parts.pop_back();
+ parts<<text;
+ currentPath= parts.join("/")+"/";
+ menuItem->setData(0,Qt::UserRole, currentPath);
+ explorer->renameFolder(oldPath, currentPath);
+ }
+}
+
+void FolderExplorer::slotDeleteFolder()
+{
+ if(!explorer->isFolderEmpty(menuItem->data(0, Qt::UserRole).toString()))
+ {
+ QMessageBox::critical(this, tr("Error"), tr("Unable to remove \"")+menuItem->text(0)+
+ tr("\". Folder is not empty. Please remove content of folder and try again."));
+ return;
+ }
+ if(QMessageBox::question(this, "X2Go Client", tr("Delete folder \"")+menuItem->text(0)+"\"?",QMessageBox::Ok|QMessageBox::Cancel) == QMessageBox::Ok)
+ {
+ explorer->deleteFolder(menuItem->data(0, Qt::UserRole).toString());
+ currentPath="/";
+ delete menuItem;
+ }
+}
+
+void FolderExplorer::slotNewFolder()
+{
+ QTreeWidgetItem* it=new QTreeWidgetItem(menuItem);
+ QString name=tr("New Folder");
+ it->setText(0,name);
+ it->setIcon(0, QIcon(":icons/128x128/folder.png"));
+ QString normPath=(menuItem->data(0,Qt::UserRole).toString()+"/"+name).split("/",QString::SkipEmptyParts).join("/");
+ it->setData(0,Qt::UserRole, normPath+"/");
+ treeWidget->clearSelection();
+ it->setSelected(true);
+ QTreeWidgetItem* p=it->parent();
+ while(p!=root)
+ {
+ p->setExpanded(true);
+ p=p->parent();
+ }
+ slotItemSelected(it,0);
+ explorer->createNewFolder(normPath);
+}
diff --git a/folderbutton.h b/folderexplorer.h
similarity index 55%
copy from folderbutton.h
copy to folderexplorer.h
index a5eaf99..608c402 100644
--- a/folderbutton.h
+++ b/folderexplorer.h
@@ -14,56 +14,31 @@
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
-
-#ifndef FOLDERBUTTON_H
-#define FOLDERBUTTON_H
-
-#include "SVGFrame.h"
-#include <QPushButton>
-#include <QLabel>
-class ONMainWindow;
-class QComboBox;
-class QPushButton;
-
-/**
- @author Oleksandr Shneyder <oleksandr.shneyder at obviously-nice.de>
-*/
-class FolderButton : public SVGFrame
+#ifndef FOLDEREXPLORER_H
+#define FOLDEREXPLORER_H
+#include "ui_folderexplorer.h"
+class SessionExplorer;
+class FolderExplorer: public QDialog, Ui_FolderExplorer
{
Q_OBJECT
public:
- FolderButton ( ONMainWindow* mw, QWidget* parent, QString folderPath, QString folderName );
- ~FolderButton();
-
- const QPixmap* folderIcon() {
- return icon->pixmap();
- }
- static bool lessThen ( const FolderButton* b1, const FolderButton* b2 );
- QString getName()
- {
- return name;
- }
- QString getPath()
+ FolderExplorer(QString path, SessionExplorer* explorer, QWidget* parent=0);
+ QString getCurrentPath()
{
- return path;
+ return currentPath;
}
- void setChildrenList(QStringList children);
private:
- QString path;
- QString name;
- QString description;
- QLabel* nameLabel;
- QLabel* icon;
- ONMainWindow* par;
-
+ SessionExplorer* explorer;
+ QTreeWidgetItem* root;
+ QTreeWidgetItem* menuItem;
+ QString currentPath;
+ void initFolders(QTreeWidgetItem* parent, QString path);
private slots:
- void slotClicked();
-signals:
- void folderSelected ( FolderButton* );
- void clicked();
-protected:
- virtual void mousePressEvent ( QMouseEvent * event );
- virtual void mouseReleaseEvent ( QMouseEvent * event );
+ void slotContextMenu(QPoint p);
+ void slotItemSelected(QTreeWidgetItem* it, int);
+ void slotNewFolder();
+ void slotChangeName();
+ void slotChangeIcon();
+ void slotDeleteFolder();
};
-
#endif
diff --git a/folderexplorer.ui b/folderexplorer.ui
new file mode 100644
index 0000000..65eeae2
--- /dev/null
+++ b/folderexplorer.ui
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FolderExplorer</class>
+ <widget class="QDialog" name="FolderExplorer">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Folders</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTreeWidget" name="treeWidget">
+ <property name="contextMenuPolicy">
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ <attribute name="headerVisible">
+ <bool>false</bool>
+ </attribute>
+ <column>
+ <property name="text">
+ <string notr="true">1</string>
+ </property>
+ </column>
+ </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>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>FolderExplorer</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>9</x>
+ <y>290</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>FolderExplorer</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>35</x>
+ <y>290</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>treeWidget</sender>
+ <signal>customContextMenuRequested(QPoint)</signal>
+ <receiver>FolderExplorer</receiver>
+ <slot>slotContextMenu(QPoint)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>152</x>
+ <y>93</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>396</x>
+ <y>182</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>treeWidget</sender>
+ <signal>itemActivated(QTreeWidgetItem*,int)</signal>
+ <receiver>FolderExplorer</receiver>
+ <slot>slotItemSelected(QTreeWidgetItem*,int)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>150</x>
+ <y>106</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>398</x>
+ <y>68</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+ <slots>
+ <slot>slotContextMenu(QPoint)</slot>
+ <slot>slotItemSelected(QTreeWidgetItem*,int)</slot>
+ </slots>
+</ui>
diff --git a/onmainwindow.h b/onmainwindow.h
index f3e589c..e987a22 100644
--- a/onmainwindow.h
+++ b/onmainwindow.h
@@ -530,6 +530,11 @@ public:
return fr;
}
+ ConfigFile* getConfig()
+ {
+ return &config;
+ }
+
void runApplication(QString exec);
diff --git a/sessionbutton.cpp b/sessionbutton.cpp
index dc81171..3091b11 100644
--- a/sessionbutton.cpp
+++ b/sessionbutton.cpp
@@ -286,8 +286,6 @@ void SessionButton::redraw()
else
st= new X2goSettings( "sessions" );
-
-
QString name=st->setting()->value ( sid+"/name",
( QVariant ) tr ( "New Session" ) ).toString();
diff --git a/sessionbutton.h b/sessionbutton.h
index bc4d8f9..6a39648 100644
--- a/sessionbutton.h
+++ b/sessionbutton.h
@@ -48,6 +48,11 @@ public:
{
return path;
}
+ void setPath(QString path)
+ {
+ this->path=path;
+ }
+
private:
QString sid;
QString path;
diff --git a/sessionexplorer.cpp b/sessionexplorer.cpp
index d1604f3..06694f7 100644
--- a/sessionexplorer.cpp
+++ b/sessionexplorer.cpp
@@ -31,6 +31,7 @@
#include "imgframe.h"
#include <QToolButton>
#include "x2gologdebug.h"
+#include <QBuffer>
SessionExplorer::SessionExplorer(ONMainWindow* p):QObject(p)
{
@@ -78,6 +79,9 @@ void SessionExplorer::cleanSessions()
for ( int i=0; i<sessions.size(); ++i )
sessions[i]->close();
sessions.clear();
+ for ( int i=0; i<folders.size(); ++i )
+ folders[i]->close();
+ folders.clear();
}
void SessionExplorer::exportsEdit ( SessionButton* bt )
@@ -93,6 +97,25 @@ void SessionExplorer::exportsEdit ( SessionButton* bt )
}
}
+void SessionExplorer::getFoldersFromConfig()
+{
+ X2goSettings *st;
+
+ if (parent->getBrokerMode())
+ st=new X2goSettings(parent->getConfig()->iniFile,QSettings::IniFormat);
+ else
+ st= new X2goSettings( "sessions" );
+
+ QStringList folders=st->setting()->childKeys();
+ QString folder;
+ foreach(folder,folders)
+ {
+ folder.replace("::","/");
+ if(findFolder(folder)==-1)
+ createFolder(folder);
+ }
+}
+
void SessionExplorer::slotEdit ( SessionButton* bt )
{
@@ -138,6 +161,7 @@ void SessionExplorer::slotCreateDesktopIcon ( SessionButton* bt )
// PyHoca-GUI uses the slash as separator for cascaded menus, so let's handle these on the file system
name.replace("/","::");
+
QString sessIcon=st.setting()->value (
bt->id() +"/icon",
( QVariant )
@@ -235,6 +259,8 @@ SessionButton* SessionExplorer::createBut ( const QString& id )
void SessionExplorer::placeButtons()
{
+ getFoldersFromConfig();
+
setNavigationVisible(currentPath.length()>0);
resize();
int currentIndex=0;
@@ -385,3 +411,186 @@ void SessionExplorer::slotLevelUp()
}
placeButtons();
}
+
+void SessionExplorer::setFolderIcon(QString path, QString icon)
+{
+ QPixmap pix(icon);
+ if(!pix.isNull())
+ {
+ pix=pix.scaled(64,64,Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ path=path.split("/",QString::SkipEmptyParts).join("::");
+
+ X2goSettings *st;
+ if (parent->getBrokerMode())
+ st=new X2goSettings(parent->getConfig()->iniFile,QSettings::IniFormat);
+ else
+ st= new X2goSettings( "sessions" );
+ QByteArray bytes;
+ QBuffer buffer(&bytes);
+ buffer.open(QIODevice::WriteOnly);
+ pix.save(&buffer,"PNG");
+ x2goDebug<<"Save: "<<path;
+ st->setting()->setValue(path, bytes);
+ st->setting()->sync();
+ FolderButton* b;
+ foreach(b, folders)
+ {
+ if((b->getPath()+"/"+b->getName()).split("/",QString::SkipEmptyParts).join("::")==path)
+ {
+ b->loadIcon();
+ break;
+ }
+ }
+ }
+}
+
+void SessionExplorer::createNewFolder(QString path)
+{
+ X2goSettings *st;
+ if (parent->getBrokerMode())
+ st=new X2goSettings(parent->getConfig()->iniFile,QSettings::IniFormat);
+ else
+ st= new X2goSettings( "sessions" );
+
+
+ if(findFolder(path)==-1)
+ {
+ QString name=path;
+ name.replace("/","::");
+ st->setting()->setValue(name, QByteArray());
+ st->setting()->sync();
+ createFolder(path);
+ placeButtons();
+ }
+}
+
+void SessionExplorer::renameFolder(QString oldPath, QString currentPath)
+{
+ FolderButton* b;
+ oldPath=oldPath.split("/",QString::SkipEmptyParts).join("/");
+ currentPath=currentPath.split("/",QString::SkipEmptyParts).join("/");
+
+ QStringList parts=oldPath.split("/",QString::SkipEmptyParts);
+ QString oldName=parts.last();
+ parts.pop_back();
+ QString pathOfFolder=parts.join("/");
+
+
+ foreach(b, folders)
+ {
+ if(b->getPath()==pathOfFolder && b->getName()==oldName)
+ {
+ b->setName(currentPath.split("/",QString::SkipEmptyParts).last());
+ }
+ if((b->getPath()+"/").indexOf(oldPath+"/")==0)
+ {
+ QString newPath=currentPath+b->getPath().mid(oldPath.length());
+ b->setPath(newPath);
+ }
+ }
+
+ SessionButton* s;
+ foreach(s, sessions)
+ {
+ if((s->getPath()+"/").indexOf(oldPath+"/")==0)
+ {
+ QString newPath=currentPath+s->getPath().mid(oldPath.length());
+ s->setPath(newPath);
+ }
+ }
+ if((this->currentPath+"/").indexOf(oldPath+"/")==0)
+ {
+ this->currentPath=currentPath+this->currentPath.mid(oldPath.length());
+ }
+
+ X2goSettings *st;
+ if (parent->getBrokerMode())
+ st=new X2goSettings(parent->getConfig()->iniFile,QSettings::IniFormat);
+ else
+ st= new X2goSettings( "sessions" );
+
+ QStringList folders=st->setting()->childKeys();
+ QString folder;
+ foreach(folder,folders)
+ {
+ QString fname=folder;
+ folder.replace("::","/");
+ if((folder+"/").indexOf(oldPath+"/")==0)
+ {
+ QVariant value=st->setting()->value(fname);
+ folder=currentPath+folder.mid(oldPath.length());
+ folder.replace("/","::");
+ st->setting()->setValue(folder,value);
+ st->setting()->remove(fname);
+ }
+ }
+
+ QStringList sessions=st->setting()->childGroups();
+ QString session;
+ foreach(session, sessions)
+ {
+ QString sname=st->setting()->value(session+"/name").toString();
+ if((sname+"/").indexOf(oldPath+"/")==0)
+ {
+ sname=currentPath+sname.mid(oldPath.length());
+ st->setting()->setValue(session+"/name",sname);
+ }
+ }
+ st->setting()->sync();
+ placeButtons();
+}
+
+bool SessionExplorer::isFolderEmpty(QString path)
+{
+ FolderButton* b;
+ path=path.split("/",QString::SkipEmptyParts).join("/");
+
+ foreach(b, folders)
+ {
+ if(b->getPath()==path)
+ {
+ return false;
+ }
+ }
+
+ SessionButton* s;
+ foreach(s, sessions)
+ {
+ if(s->getPath()==path)
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+void SessionExplorer::deleteFolder(QString path)
+{
+ path=path.split("/",QString::SkipEmptyParts).join("::");
+ X2goSettings *st;
+ if (parent->getBrokerMode())
+ st=new X2goSettings(parent->getConfig()->iniFile,QSettings::IniFormat);
+ else
+ st= new X2goSettings( "sessions" );
+
+ st->setting()->remove(path);
+
+ path.replace("::","/");
+
+
+ for(int i=0; i< folders.count(); ++i)
+ {
+ FolderButton* b=folders[i];
+ if((b->getPath()+"/"+b->getName()).split("/",QString::SkipEmptyParts).join("/")==path)
+ {
+ b->close();
+ folders.removeAt(i);
+ break;
+ }
+ }
+ if(currentPath==path)
+ {
+ currentPath="";
+ }
+ placeButtons();
+}
diff --git a/sessionexplorer.h b/sessionexplorer.h
index 84b8867..beaa471 100644
--- a/sessionexplorer.h
+++ b/sessionexplorer.h
@@ -39,6 +39,10 @@ public:
{
return &sessions;
}
+ QList<FolderButton*> * getFoldersList()
+ {
+ return &folders;
+ }
SessionButton* getLastSession() {
return lastSession;
}
@@ -53,7 +57,14 @@ public:
{
return navigationLayout;
}
+ bool isFolderEmpty(QString path);
void resize();
+ void setFolderIcon(QString path, QString icon);
+ void createNewFolder(QString path);
+ void renameFolder(QString oldPath, QString currentPath);
+ void deleteFolder(QString path);
+
+
//vars
private:
QList<SessionButton*> sessions;
@@ -70,6 +81,7 @@ private:
void setNavigationVisible(bool value);
int findFolder(QString path);
void createFolder(QString path);
+ void getFoldersFromConfig();
public slots:
void slotDeleteButton ( SessionButton * bt );
diff --git a/sessionwidget.cpp b/sessionwidget.cpp
index 0b5265c..874c26f 100644
--- a/sessionwidget.cpp
+++ b/sessionwidget.cpp
@@ -35,6 +35,7 @@
#include <QMessageBox>
#include <QButtonGroup>
#include <QRadioButton>
+#include "folderexplorer.h"
SessionWidget::SessionWidget ( QString id, ONMainWindow * mw,
QWidget * parent, Qt::WindowFlags f )
@@ -44,6 +45,7 @@ SessionWidget::SessionWidget ( QString id, ONMainWindow * mw,
#ifdef Q_WS_HILDON
sessLay->setMargin ( 2 );
#endif
+ this->parent=mw;
sessName=new QLineEdit ( this );
icon=new QPushButton ( QString::null,this );
if ( !miniMode )
@@ -66,6 +68,14 @@ SessionWidget::SessionWidget ( QString id, ONMainWindow * mw,
ilay->addWidget ( icon );
ilay->addWidget ( new QLabel ( tr ( "<< change icon" ),this ) );
+ lPath=new QLabel(this);
+ lPath->setFrameStyle(QFrame::StyledPanel);
+ QPushButton* pathButton=new QPushButton("...",this);
+ QHBoxLayout* pathLay=new QHBoxLayout();
+ pathLay->addWidget(new QLabel(tr("Path:"), this),0);
+ pathLay->addWidget(lPath,1);
+ pathLay->addWidget(pathButton,0);
+
#ifndef Q_WS_HILDON
QGroupBox *sgb=new QGroupBox ( tr ( "&Server" ),this );
#else
@@ -221,6 +231,7 @@ SessionWidget::SessionWidget ( QString id, ONMainWindow * mw,
#ifndef Q_WS_HILDON
sessLay->addLayout ( slay );
sessLay->addLayout ( ilay );
+ sessLay->addLayout ( pathLay );
if ( !miniMode )
sessLay->addSpacing ( 15 );
sessLay->addWidget ( sgb );
@@ -271,6 +282,7 @@ SessionWidget::SessionWidget ( QString id, ONMainWindow * mw,
connect ( proxyType, SIGNAL ( buttonClicked(int)) ,this,SLOT ( slot_proxyType()));
connect (cbProxy, SIGNAL(clicked(bool)), this, SLOT(slot_proxyOptions()));
connect (cbProxySameUser, SIGNAL(clicked(bool)), this, SLOT(slot_proxySameLogin()));
+ connect ( pathButton, SIGNAL(clicked(bool)), this, SLOT(slot_openFolder()));
readConfig();
}
@@ -508,10 +520,22 @@ void SessionWidget::readConfig()
{
X2goSettings st ( "sessions" );
- sessName->setText (
- st.setting()->value (
- sessionId+"/name",
- ( QVariant ) tr ( "New session" ) ).toString().trimmed() );
+ QString name=st.setting()->value (
+ sessionId+"/name",
+ ( QVariant ) tr ( "New session" ) ).toString().trimmed();
+
+ QStringList tails=name.split("/",QString::SkipEmptyParts);
+ QString path;
+ if(tails.count()>0)
+ {
+ name=tails.last();
+ tails.pop_back();
+ path=tails.join("/")+"/";
+ }
+ lPath->setText(path);
+
+ sessName->setText (name);
+
sessIcon=st.setting()->value (
sessionId+"/icon",
( QVariant ) ":icons/128x128/x2gosession.png" ).toString().trimmed();
@@ -780,8 +804,11 @@ void SessionWidget::saveSettings()
{
X2goSettings st ( "sessions" );
+
+ QString normPath=(lPath->text()+"/"+sessName->text()).split("/",QString::SkipEmptyParts).join("/");
+
st.setting()->setValue ( sessionId+"/name",
- ( QVariant ) sessName->text().trimmed() );
+ ( QVariant ) normPath.trimmed() );
st.setting()->setValue ( sessionId+"/icon",
( QVariant ) sessIcon );
st.setting()->setValue ( sessionId+"/host",
@@ -904,3 +931,12 @@ void SessionWidget::slot_krbChecked()
{
cbKrbDelegation->setEnabled(cbKrbLogin->isChecked());
}
+
+void SessionWidget::slot_openFolder()
+{
+ FolderExplorer explorer(lPath->text(), parent->getSessionExplorer(), this);
+ if(explorer.exec()==QDialog::Accepted)
+ {
+ lPath->setText(explorer.getCurrentPath());
+ }
+}
diff --git a/sessionwidget.h b/sessionwidget.h
index 785a79e..4d07e6a 100644
--- a/sessionwidget.h
+++ b/sessionwidget.h
@@ -51,6 +51,7 @@ private slots:
void slot_proxySameLogin();
void slot_proxyGetKey();
void slot_krbChecked();
+ void slot_openFolder();
public slots:
#ifdef Q_OS_LINUX
void slot_rdpDirectClicked();
@@ -63,6 +64,7 @@ private:
QLineEdit* uname;
QLineEdit* server;
QSpinBox* sshPort;
+ ONMainWindow* parent;
#ifdef Q_OS_LINUX
QSpinBox* rdpPort;
#endif
@@ -81,6 +83,7 @@ private:
QLabel* leCmdIp;
QLabel* lPort;
QLabel* lKey;
+ QLabel* lPath;
QPushButton* pbAdvanced;
QString rdpOptions;
QString rdpServer;
diff --git a/x2goclient.pro b/x2goclient.pro
index 22260fb..27ea502 100755
--- a/x2goclient.pro
+++ b/x2goclient.pro
@@ -19,7 +19,8 @@ FORMS += cupsprintsettingsdialog.ui \
brokerpassdialog.ui \
contest.ui \
appdialog.ui \
- helpdialog.ui
+ helpdialog.ui \
+ folderexplorer.ui
TRANSLATIONS += \
x2goclient_de.ts \
@@ -73,7 +74,8 @@ HEADERS += configdialog.h \
x2goutils.h \
helpdialog.h \
sessionexplorer.h \
- folderbutton.h
+ folderbutton.h \
+ folderexplorer.h
SOURCES += sharewidget.cpp \
settingswidget.cpp\
@@ -112,7 +114,8 @@ SOURCES += sharewidget.cpp \
x2goutils.cpp \
helpdialog.cpp \
sessionexplorer.cpp \
- folderbutton.cpp
+ folderbutton.cpp \
+ folderexplorer.cpp
LIBS += -lssh
--
Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goclient.git
More information about the x2go-commits
mailing list