You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.9 KiB
212 lines
5.9 KiB
/*
|
|
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library 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
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*/
|
|
|
|
|
|
#include "sidepane.h"
|
|
#include <QComboBox>
|
|
#include <QVBoxLayout>
|
|
#include <QHeaderView>
|
|
#include "placesview.h"
|
|
#include "dirtreeview.h"
|
|
#include "dirtreemodel.h"
|
|
#include "path.h"
|
|
#include "filemenu.h"
|
|
|
|
namespace Fm {
|
|
|
|
SidePane::SidePane(QWidget* parent):
|
|
QWidget(parent),
|
|
view_(nullptr),
|
|
combo_(nullptr),
|
|
iconSize_(24, 24),
|
|
mode_(ModeNone),
|
|
showHidden_(false) {
|
|
|
|
verticalLayout = new QVBoxLayout(this);
|
|
verticalLayout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
combo_ = new QComboBox(this);
|
|
combo_->setFrame(false);
|
|
combo_->addItem(tr("Places"));
|
|
combo_->addItem(tr("Directory Tree"));
|
|
connect(combo_, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &SidePane::onComboCurrentIndexChanged);
|
|
verticalLayout->addWidget(combo_);
|
|
}
|
|
|
|
SidePane::~SidePane() {
|
|
// qDebug("delete SidePane");
|
|
}
|
|
|
|
void SidePane::onComboCurrentIndexChanged(int current) {
|
|
if(current != mode_) {
|
|
setMode(Mode(current));
|
|
}
|
|
}
|
|
|
|
void SidePane::setIconSize(QSize size) {
|
|
iconSize_ = size;
|
|
switch(mode_) {
|
|
case ModePlaces:
|
|
static_cast<PlacesView*>(view_)->setIconSize(size);
|
|
case ModeDirTree:
|
|
static_cast<QTreeView*>(view_)->setIconSize(size);
|
|
break;
|
|
default:
|
|
;
|
|
}
|
|
}
|
|
|
|
void SidePane::setCurrentPath(Fm::FilePath path) {
|
|
Q_ASSERT(path);
|
|
currentPath_ = std::move(path);
|
|
switch(mode_) {
|
|
case ModePlaces:
|
|
static_cast<PlacesView*>(view_)->setCurrentPath(currentPath_);
|
|
break;
|
|
case ModeDirTree:
|
|
static_cast<DirTreeView*>(view_)->setCurrentPath(currentPath_);
|
|
break;
|
|
default:
|
|
;
|
|
}
|
|
}
|
|
|
|
SidePane::Mode SidePane::modeByName(const char* str) {
|
|
if(str == nullptr) {
|
|
return ModeNone;
|
|
}
|
|
if(strcmp(str, "places") == 0) {
|
|
return ModePlaces;
|
|
}
|
|
if(strcmp(str, "dirtree") == 0) {
|
|
return ModeDirTree;
|
|
}
|
|
return ModeNone;
|
|
}
|
|
|
|
const char* SidePane::modeName(SidePane::Mode mode) {
|
|
switch(mode) {
|
|
case ModePlaces:
|
|
return "places";
|
|
case ModeDirTree:
|
|
return "dirtree";
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|
|
|
|
bool SidePane::setHomeDir(const char* /*home_dir*/) {
|
|
if(view_ == nullptr) {
|
|
return false;
|
|
}
|
|
// TODO: SidePane::setHomeDir
|
|
|
|
switch(mode_) {
|
|
case ModePlaces:
|
|
// static_cast<PlacesView*>(view_);
|
|
return true;
|
|
case ModeDirTree:
|
|
// static_cast<PlacesView*>(view_);
|
|
return true;
|
|
default:
|
|
;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void SidePane::initDirTree() {
|
|
DirTreeModel* model = new DirTreeModel(view_);
|
|
model->setShowHidden(showHidden_);
|
|
|
|
Fm::FilePathList rootPaths;
|
|
rootPaths.emplace_back(Fm::FilePath::homeDir());
|
|
rootPaths.emplace_back(Fm::FilePath::fromLocalPath("/"));
|
|
model->addRoots(std::move(rootPaths));
|
|
static_cast<DirTreeView*>(view_)->setModel(model);
|
|
}
|
|
|
|
void SidePane::setMode(Mode mode) {
|
|
if(mode == mode_) {
|
|
return;
|
|
}
|
|
|
|
if(view_) {
|
|
delete view_;
|
|
view_ = nullptr;
|
|
//if(sp->update_popup)
|
|
// g_signal_handlers_disconnect_by_func(sp->view, on_item_popup, sp);
|
|
}
|
|
mode_ = mode;
|
|
|
|
combo_->setCurrentIndex(mode);
|
|
switch(mode) {
|
|
case ModePlaces: {
|
|
PlacesView* placesView = new Fm::PlacesView(this);
|
|
view_ = placesView;
|
|
placesView->setIconSize(iconSize_);
|
|
placesView->setCurrentPath(currentPath_);
|
|
connect(placesView, &PlacesView::chdirRequested, this, &SidePane::chdirRequested);
|
|
break;
|
|
}
|
|
case ModeDirTree: {
|
|
DirTreeView* dirTreeView = new Fm::DirTreeView(this);
|
|
view_ = dirTreeView;
|
|
initDirTree();
|
|
dirTreeView->setIconSize(iconSize_);
|
|
dirTreeView->setCurrentPath(currentPath_);
|
|
connect(dirTreeView, &DirTreeView::chdirRequested, this, &SidePane::chdirRequested);
|
|
connect(dirTreeView, &DirTreeView::openFolderInNewWindowRequested,
|
|
this, &SidePane::openFolderInNewWindowRequested);
|
|
connect(dirTreeView, &DirTreeView::openFolderInNewTabRequested,
|
|
this, &SidePane::openFolderInNewTabRequested);
|
|
connect(dirTreeView, &DirTreeView::openFolderInTerminalRequested,
|
|
this, &SidePane::openFolderInTerminalRequested);
|
|
connect(dirTreeView, &DirTreeView::createNewFolderRequested,
|
|
this, &SidePane::createNewFolderRequested);
|
|
connect(dirTreeView, &DirTreeView::prepareFileMenu,
|
|
this, &SidePane::prepareFileMenu);
|
|
break;
|
|
}
|
|
default:
|
|
;
|
|
}
|
|
if(view_) {
|
|
// if(sp->update_popup)
|
|
// g_signal_connect(sp->view, "item-popup", G_CALLBACK(on_item_popup), sp);
|
|
verticalLayout->addWidget(view_);
|
|
}
|
|
Q_EMIT modeChanged(mode);
|
|
}
|
|
|
|
void SidePane::setShowHidden(bool show_hidden) {
|
|
if(view_ == nullptr || show_hidden == showHidden_) {
|
|
return;
|
|
}
|
|
showHidden_ = show_hidden;
|
|
if(mode_ == ModeDirTree) {
|
|
DirTreeView* dirTreeView = static_cast<DirTreeView*>(view_);
|
|
DirTreeModel* model = static_cast<DirTreeModel*>(dirTreeView->model());
|
|
if(model) {
|
|
model->setShowHidden(showHidden_);
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace Fm
|