view libgui/src/files-dockwidget.cc @ 16437:919796a440c6

use signal for changing directory * files-dockwidget.cc (files_dock_widget::files_dock_widget): Set title to "File Browser", not "Current Directory". * files-dockwidget.h, files-dockwidget.cc (files_dock_widget::change_directory_up): Rename from files_dock_widget::do_up_directory. Change all uses. (files_dock_widget::_last_current_directory): Delete variable and all uses. (files_dock_widget::accept_directory_line_edit): Rename from handle_directory_entered. Change all uses. (files_dock_widget::item_double_clicked): Call set_current_directory instead of display_directory. (files_dock_widget::set_current_directory): Also emit displayed_directory_changed signal. (files_dock_widget::display_directory): Sort list. Don't emit displayed_directory_changed. private: * file-editor-tab.cc (file_editor_tab::run_file): Delete unused local variable current_path. * main-window.h, main-window.cc (main_window::current_working_directory_has_changed): Delete function and all uses. (main_window::browse_for_directory): Rename from main_window::change_current_working_directory. Change all uses. (main_window::change_directory): Rename from main_window::set_current_working_directory. Change all uses. Update display. (main_window::change_directory_up): Rename from main_window::current_working_directory_up. Change all uses. Use absolute path for ".." directory. (main_window::accept_directory_line_edit): Rename from main_window::current_working_directory_entered. Change all uses. (main_window::construct): Set initial working directory to current directory at startup. * octave-qt-link.h, octave-qt-link.cc (octave_qt_link::do_change_directory): New function. (octave_qt_link::change_directory_signal): New signal. * octave-event-listener.h (octave_event_listener::current_directory_has_changed): Delete. * dirfns.cc (octave_change_to_directory): Also call octave_link::change_directory. * octave-link.h, octave-link.cc (octave_link::last_cwd): Delete variable and all uses. (octave_link::do_generate_events): Don't track current directory or post directory changed event. (octave_link::last_working_directory, octave_link::do_last_working_directory): Delete. (octave_link::do_change_directory): Rename from octave_link::do_last_working_directory.
author John W. Eaton <jwe@octave.org>
date Fri, 05 Apr 2013 00:40:12 -0400
parents 28136851099a
children 3207f1d62e74
line wrap: on
line source

/*

Copyright (C) 2011-2012 Jacob Dawid

This file is part of Octave.

Octave 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 3 of the License, or (at your
option) any later version.

Octave 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 Octave; see the file COPYING.  If not, see
<http://www.gnu.org/licenses/>.

*/

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "resource-manager.h"
#include "files-dockwidget.h"

#include <QApplication>
#include <QFileInfo>
#include <QCompleter>
#include <QSettings>
#include <QProcess>
#include <QDebug>
#include <QHeaderView>

files_dock_widget::files_dock_widget (QWidget *p)
  : octave_dock_widget (p)
{
  setObjectName ("FilesDockWidget");
  setWindowIcon (QIcon(":/actions/icons/logo.png"));
  setWindowTitle (tr ("File Browser"));
  setWidget (new QWidget (this));

  // Create a toolbar
  _navigation_tool_bar = new QToolBar ("", widget ());
  _navigation_tool_bar->setAllowedAreas (Qt::TopToolBarArea);
  _navigation_tool_bar->setMovable (false);
  _navigation_tool_bar->setIconSize (QSize (20, 20));

  _directory_icon = QIcon(":/actions/icons/up.png");
  _directory_up_action = new QAction (_directory_icon, "", _navigation_tool_bar);
  _directory_up_action->setStatusTip (tr ("Move up one directory."));

  _current_directory = new QLineEdit (_navigation_tool_bar);
  _current_directory->setStatusTip (tr ("Enter the path or filename."));

  _navigation_tool_bar->addAction (_directory_up_action);
  _navigation_tool_bar->addWidget (_current_directory);
  connect (_directory_up_action, SIGNAL (triggered ()), this,
           SLOT (change_directory_up ()));

  // TODO: Add other buttons for creating directories

  // Create the QFileSystemModel starting in the home directory
  QString homePath = QDir::homePath ();

  _file_system_model = new QFileSystemModel (this);
  _file_system_model->setFilter (QDir::NoDotAndDotDot | QDir::AllEntries);
  QModelIndex rootPathIndex = _file_system_model->setRootPath (homePath);

  // Attach the model to the QTreeView and set the root index
  _file_tree_view = new QTreeView (widget ());
  _file_tree_view->setModel (_file_system_model);
  _file_tree_view->setRootIndex (rootPathIndex);
  _file_tree_view->setSortingEnabled (true);
  _file_tree_view->setAlternatingRowColors (true);
  _file_tree_view->setAnimated (true);
  _file_tree_view->setStatusTip (tr ("Doubleclick a file to open it."));

  // get sort column and order as well as cloumn state (order and width)
  QSettings *settings = resource_manager::get_settings ();
  // FIXME -- what should happen if settings is 0?
  _file_tree_view->sortByColumn (
              settings->value ("filesdockwidget/sort_files_by_column",0).toInt (),
              static_cast<Qt::SortOrder>(settings->value ("filesdockwidget/sort_files_by_order",Qt::AscendingOrder).toUInt ())
  );
  _file_tree_view->header ()->restoreState (settings->value ("filesdockwidget/column_state").toByteArray ());
  
  _current_directory->setText(_file_system_model->fileInfo (rootPathIndex).
                              absoluteFilePath ());

  connect (_file_tree_view, SIGNAL (doubleClicked (const QModelIndex &)), this,
           SLOT (item_double_clicked (const QModelIndex &)));

  // Layout the widgets vertically with the toolbar on top
  QVBoxLayout *vbox_layout = new QVBoxLayout ();
  vbox_layout->setSpacing (0);
  vbox_layout->addWidget (_navigation_tool_bar);
  vbox_layout->addWidget (_file_tree_view);
  vbox_layout->setMargin (1);
  widget ()->setLayout (vbox_layout);
  // TODO: Add right-click contextual menus for copying, pasting, deleting files (and others)

  connect (_current_directory, SIGNAL (returnPressed ()),
           this, SLOT (accept_directory_line_edit ()));

  QCompleter *
    completer = new QCompleter (_file_system_model, this);
  _current_directory->setCompleter (completer);

  setFocusProxy (_current_directory);
}

files_dock_widget::~files_dock_widget ()
{
  QSettings *settings = resource_manager::get_settings ();
  int sort_column = _file_tree_view->header ()->sortIndicatorSection ();
  Qt::SortOrder sort_order = _file_tree_view->header ()->sortIndicatorOrder ();
  settings->setValue ("filesdockwidget/sort_files_by_column", sort_column);
  settings->setValue ("filesdockwidget/sort_files_by_order", sort_order);
  settings->setValue ("filesdockwidget/column_state", _file_tree_view->header ()->saveState ());
  settings->sync ();
}

void
files_dock_widget::item_double_clicked (const QModelIndex& index)
{
  // Retrieve the file info associated with the model index.
  QFileInfo fileInfo = _file_system_model->fileInfo (index);

  set_current_directory (fileInfo.absoluteFilePath ());
}

void
files_dock_widget::set_current_directory (const QString& dir)
{
  display_directory (dir);

  emit displayed_directory_changed (dir);
}

void
files_dock_widget::accept_directory_line_edit (void)
{
  display_directory (_current_directory->text ());
}

void
files_dock_widget::change_directory_up (void)
{
  QDir dir = QDir (_file_system_model->filePath (_file_tree_view->rootIndex ()));
  dir.cdUp ();
  display_directory (dir.absolutePath ());
}

void
files_dock_widget::display_directory (const QString& dir)
{
  QFileInfo fileInfo (dir);
  if (fileInfo.exists ())
    {
      if (fileInfo.isDir ())
        {
          _file_tree_view->setRootIndex (_file_system_model->
                                         index (fileInfo.absoluteFilePath ()));
          _file_system_model->setRootPath (fileInfo.absoluteFilePath ());
          _file_system_model->sort (0, Qt::AscendingOrder);
          _current_directory->setText (fileInfo.absoluteFilePath ());
        }
      else
        {
          if (QFile::exists (fileInfo.absoluteFilePath ()))
            emit open_file (fileInfo.absoluteFilePath ());
        }
    }
}

void
files_dock_widget::notice_settings (const QSettings *settings)
{
  // Qsettings pointer is checked before emitting.

  // file names are always shown, other columns can be hidden by settings
  _file_tree_view->setColumnHidden (0, false);
  _file_tree_view->setColumnHidden (1, !settings->value ("showFileSize",false).toBool ());
  _file_tree_view->setColumnHidden (2, !settings->value ("showFileType",false).toBool ());
  _file_tree_view->setColumnHidden (3, !settings->value ("showLastModified",false).toBool ());
  _file_tree_view->setAlternatingRowColors (settings->value ("useAlternatingRowColors",true).toBool ());
  if (settings->value ("showHiddenFiles",false).toBool ())
    {
      // TODO: React on option for hidden files.
    }
}