[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