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.
248 lines
6.7 KiB
248 lines
6.7 KiB
/*
|
|
|
|
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
|
|
|
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, 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),
|
|
showHidden_(false),
|
|
mode_(ModeNone),
|
|
view_(NULL),
|
|
combo_(NULL),
|
|
currentPath_(NULL),
|
|
iconSize_(24, 24) {
|
|
|
|
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() {
|
|
if(currentPath_)
|
|
fm_path_unref(currentPath_);
|
|
// qDebug("delete SidePane");
|
|
}
|
|
|
|
void SidePane::onPlacesViewChdirRequested(int type, FmPath* path) {
|
|
Q_EMIT chdirRequested(type, path);
|
|
}
|
|
|
|
void SidePane::onDirTreeViewChdirRequested(int type, FmPath* path) {
|
|
Q_EMIT chdirRequested(type, path);
|
|
}
|
|
|
|
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(FmPath* path) {
|
|
Q_ASSERT(path != NULL);
|
|
if(currentPath_)
|
|
fm_path_unref(currentPath_);
|
|
currentPath_ = fm_path_ref(path);
|
|
switch(mode_) {
|
|
case ModePlaces:
|
|
static_cast<PlacesView*>(view_)->setCurrentPath(path);
|
|
break;
|
|
case ModeDirTree:
|
|
static_cast<DirTreeView*>(view_)->setCurrentPath(path);
|
|
break;
|
|
default:;
|
|
}
|
|
}
|
|
|
|
SidePane::Mode SidePane::modeByName(const char* str) {
|
|
if(str == NULL)
|
|
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 NULL;
|
|
}
|
|
}
|
|
|
|
#if 0 // FIXME: are these APIs from libfm-qt needed?
|
|
|
|
QString SidePane::modeLabel(SidePane::Mode mode) {
|
|
switch(mode) {
|
|
case ModePlaces:
|
|
return tr("Places");
|
|
case ModeDirTree:
|
|
return tr("Directory Tree");
|
|
}
|
|
return QString();
|
|
}
|
|
|
|
QString SidePane::modeTooltip(SidePane::Mode mode) {
|
|
switch(mode) {
|
|
case ModePlaces:
|
|
return tr("Shows list of common places, devices, and bookmarks in sidebar");
|
|
case ModeDirTree:
|
|
return tr("Shows tree of directories in sidebar");
|
|
}
|
|
return QString();
|
|
}
|
|
#endif
|
|
|
|
bool SidePane::setHomeDir(const char* home_dir) {
|
|
if(view_ == NULL)
|
|
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() {
|
|
// TODO
|
|
DirTreeModel* model = new DirTreeModel(view_);
|
|
FmFileInfoJob* job = fm_file_info_job_new(NULL, FM_FILE_INFO_JOB_NONE);
|
|
model->setShowHidden(showHidden_);
|
|
|
|
GList* l;
|
|
/* query FmFileInfo for home dir and root dir, and then,
|
|
* add them to dir tree model */
|
|
fm_file_info_job_add(job, fm_path_get_home());
|
|
fm_file_info_job_add(job, fm_path_get_root());
|
|
/* FIXME: maybe it's cleaner to use run_async here? */
|
|
fm_job_run_sync_with_mainloop(FM_JOB(job));
|
|
for(l = fm_file_info_list_peek_head_link(job->file_infos); l; l = l->next) {
|
|
FmFileInfo* fi = FM_FILE_INFO(l->data);
|
|
model->addRoot(fi);
|
|
}
|
|
g_object_unref(job);
|
|
|
|
static_cast<DirTreeView*>(view_)->setModel(model);
|
|
}
|
|
|
|
void SidePane::setMode(Mode mode) {
|
|
if(mode == mode_)
|
|
return;
|
|
|
|
if(view_) {
|
|
delete view_;
|
|
view_ = NULL;
|
|
//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::onPlacesViewChdirRequested);
|
|
break;
|
|
}
|
|
case ModeDirTree: {
|
|
DirTreeView* dirTreeView = new Fm::DirTreeView(this);
|
|
view_ = dirTreeView;
|
|
initDirTree();
|
|
dirTreeView->setIconSize(iconSize_);
|
|
dirTreeView->setCurrentPath(currentPath_);
|
|
connect(dirTreeView, &DirTreeView::chdirRequested, this, &SidePane::onDirTreeViewChdirRequested);
|
|
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_ == NULL || 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
|