view gui/src/history-dockwidget.cc @ 14812:9d9eb9bac65e gui

Improved menu structure of file, edit and window menu. Removed ambiguous shortcuts, improved focus handling for operating the GUI with the keyboard. Added new shortcuts to focus subwindows directly. * files-dockwidget: Set focus proxy to the current directory line edit. * history-dockwidget: Set focus proxy to the inline search bar. * file-editor: Removed and improved shortcuts. * main-window: Added new slots for not only showing/hiding subwindows, but also for focussing them directly with Ctrl+0,1..4. Improved menu structure.
author Jacob Dawid <jacob.dawid@googlemail.com>
date Thu, 28 Jun 2012 11:04:37 +0200
parents 4812bcd524a1
children 61c80e9326a8
line wrap: on
line source

/* OctaveGUI - A graphical user interface for Octave
 * Copyright (C) 2011 Jacob Dawid (jacob.dawid@googlemail.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 3 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 "history-dockwidget.h"
#include <QVBoxLayout>

history_dock_widget::history_dock_widget (QWidget * parent)
  : QDockWidget (parent), octave_event_observer ()
{
  setObjectName ("HistoryDockWidget");
  construct ();
}

void
history_dock_widget::event_accepted (octave_event *e)
{
  if (dynamic_cast <octave_update_history_event*> (e))
    {
      // Determine the client's (our) history length and the one of the server.
      int clientHistoryLength = _history_model->rowCount ();
      int serverHistoryLength = command_history::length ();

      // If were behind the server, iterate through all new entries and add
      // them to our history.
      if (clientHistoryLength < serverHistoryLength)
        {
          for (int i = clientHistoryLength; i < serverHistoryLength; i++)
            {
              _history_model->insertRow (0);
              _history_model->setData (_history_model->index (0),
                QString (command_history::get_entry (i).c_str ()));
            }
        }
    }

  // Post a new update event in a given time. This prevents flooding the
  // event queue.
  _update_history_model_timer.start ();
  delete e;
}

void
history_dock_widget::event_reject (octave_event *e)
{
  delete e;
}

void
history_dock_widget::construct ()
{
  _history_model = new QStringListModel ();
  _sort_filter_proxy_model.setSourceModel (_history_model);
  _history_list_view = new QListView (this);
  _history_list_view->setModel (&_sort_filter_proxy_model);
  _history_list_view->setAlternatingRowColors (true);
  _history_list_view->setEditTriggers (QAbstractItemView::NoEditTriggers);
  _history_list_view->setStatusTip (tr ("Doubleclick a command to transfer it to the terminal."));
  _filter_line_edit = new QLineEdit (this);
  _filter_line_edit->setStatusTip (tr ("Enter text to filter the command history."));
  QVBoxLayout *layout = new QVBoxLayout ();

  setWindowTitle (tr ("Command History"));
  setWidget (new QWidget ());

  layout->addWidget (_history_list_view);
  layout->addWidget (_filter_line_edit);
  layout->setMargin (2);

  widget ()->setLayout (layout);

  connect (_filter_line_edit,
           SIGNAL (textEdited (QString)),
           &_sort_filter_proxy_model,
           SLOT (setFilterWildcard (QString)));

  connect (_history_list_view,
           SIGNAL (doubleClicked (QModelIndex)),
           this,
           SLOT (handle_double_click (QModelIndex)));

  connect (this,
           SIGNAL (visibilityChanged (bool)),
           this,
           SLOT (handle_visibility_changed (bool)));

  _update_history_model_timer.setInterval (200);
  _update_history_model_timer.setSingleShot (true);

  connect (&_update_history_model_timer,
           SIGNAL (timeout ()),
           this,
           SLOT (request_history_model_update ()));

  _update_history_model_timer.start ();

  setFocusProxy (_filter_line_edit);
}

void
history_dock_widget::handle_double_click (QModelIndex modelIndex)
{
  emit command_double_clicked (modelIndex.data().toString());
}

void
history_dock_widget::handle_visibility_changed (bool visible)
{
  if (visible)
    emit active_changed (true);
}

void
history_dock_widget::request_history_model_update ()
{
  octave_link::instance ()
      ->post_event (new octave_update_history_event (*this));
}

void
history_dock_widget::closeEvent (QCloseEvent *event)
{
  emit active_changed (false);
  QDockWidget::closeEvent (event);
}