-moved the drag and drop stuff to the widget instead of the toplevel window.

This allows drag and drop in the part, which means that in konqueror you can
now drag groups of files from above to the command line part. Which is kind of cool. Now only if we can detect the difference between the dragged dirs and files, because the popup appears too frequently.

svn path=/trunk/kdebase/konsole/; revision=45904
wilder-portage
Lotzi Boloni 26 years ago
parent 152dcd2db2
commit e2935eb1c0
  1. 35
      include/TEWidget.h
  2. 4
      include/konsole.h
  3. 99
      src/TEWidget.C
  4. 22
      src/konsole.C
  5. 13
      src/konsole_part.C

@ -1,14 +1,14 @@
/* -------------------------------------------------------------------------- */
/* */
/* [te_widget.h] Terminal Emulation Widget */
/* */
/* -------------------------------------------------------------------------- */
/* */
/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
/* */
/* This file is part of Konsole - an X terminal for KDE */
/* */
/* -------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* */
/* [te_widget.h] Terminal Emulation Widget */
/* */
/* ----------------------------------------------------------------------- */
/* */
/* Copyright (c) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> */
/* */
/* This file is part of Konsole - an X terminal for KDE */
/* */
/* ----------------------------------------------------------------------- */
#ifndef TE_WIDGET_H
#define TE_WIDGET_H
@ -24,6 +24,8 @@
extern unsigned short vt100_graphics[32];
class TESession;
class TEWidget : public QFrame
// a widget representing attributed text
{ Q_OBJECT
@ -98,6 +100,10 @@ protected:
void mousePressEvent( QMouseEvent* );
void mouseReleaseEvent( QMouseEvent* );
void mouseMoveEvent( QMouseEvent* );
// Dnd
void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event);
virtual int charClass(char) const;
@ -161,6 +167,13 @@ private:
BOOL blinking; // hide text in paintEvent
BOOL hasBlinker; // has characters to blink
QTimer* blinkT; // active when hasBlinker
QPopupMenu* m_drop;
QString dropText;
public:
// current session in this widget
TESession *currentSession;
private slots:
void drop_menu_activated(int item);
};
#endif // TE_WIDGET_H

@ -1,5 +1,5 @@
/* -------------------------------------------------------------------------- */
/* */
/* ----------------------------------------------------------------------- */
/* */
/* [konsole.h] Konsole */
/* */
/* -------------------------------------------------------------------------- */

@ -44,10 +44,12 @@
#include "config.h"
#include "TEWidget.h"
#include "session.h"
#include <qpainter.h>
#include <qclipboard.h>
#include <qstyle.h>
#include <qdragobject.h>
#include <stdio.h>
#include <stdlib.h>
@ -58,6 +60,9 @@
#include "TEWidget.moc"
#include <kapp.h>
#include <kurl.h>
#include <kdebug.h>
#include <klocale.h>
#define HERE printf("%s(%d): here\n",__FILE__,__LINE__)
#define HCNT(Name) // { static int cnt = 1; printf("%s(%d): %s %d\n",__FILE__,__LINE__,Name,cnt++); }
@ -265,6 +270,15 @@ TEWidget::TEWidget(QWidget *parent, const char *name) : QFrame(parent,name)
setColorTable(base_color_table); // init color table
qApp->installEventFilter( this ); //FIXME: see below
// Init DnD ////////////////////////////////////////////////////////////////
currentSession = NULL;
setAcceptDrops(true); // attempt
m_drop = new QPopupMenu;
m_drop->insertItem( i18n("Paste"), 0);
m_drop->insertItem( i18n("cd"), 1);
connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int)));
}
//FIXME: make proper destructor
@ -1000,3 +1014,88 @@ void TEWidget::styleChange(QStyle &)
{
propagateSize();
}
/* --------------------------------------------------------------------- */
/* */
/* Drag & Drop */
/* */
/* --------------------------------------------------------------------- */
void TEWidget::dragEnterEvent(QDragEnterEvent* e)
{
e->accept(QTextDrag::canDecode(e) ||
QUriDrag::canDecode(e));
}
void TEWidget::dropEvent(QDropEvent* event)
{
// The current behaviour when url(s) are dropped is
// * if there is only ONE url and if it's a LOCAL one, ask for paste or cd
// * in all other cases, just paste
// (for non-local ones, or for a list of URLs, 'cd' is nonsense)
QStrList strlist;
KURL *url;
int file_count = 0;
dropText = "";
bool bPopup = true;
if(QUriDrag::decode(event, strlist)) {
if (strlist.count()) {
for(const char* p = strlist.first(); p; p = strlist.next()) {
if(file_count++ > 0) {
dropText += " ";
bPopup = false; // more than one file, don't popup
}
url = new KURL( QString(p) );
if (url->isLocalFile()) {
dropText += url->path(); // local URL : remove protocol
}
else {
dropText += p;
bPopup = false; // a non-local file, don't popup
}
delete url;
p = strlist.next();
}
if (bPopup)
// m_drop->popup(pos() + event->pos());
m_drop->popup(mapToGlobal(event->pos()));
else
{
if (currentSession) {
currentSession->getEmulation()->sendString(dropText.latin1());
}
kdDebug() << "Drop:" << dropText.latin1() << "\n";
}
}
}
else if(QTextDrag::decode(event, dropText)) {
kdDebug() << "Drop:" << dropText.latin1() << "\n";
if (currentSession) {
currentSession->getEmulation()->sendString(dropText.latin1());
}
// Paste it
}
}
void TEWidget::drop_menu_activated(int item)
{
switch (item)
{
case 0: // paste
currentSession->getEmulation()->sendString(dropText);
// KWM::activate((Window)this->winId());
break;
case 1: // cd ...
currentSession->getEmulation()->sendString("cd ");
KURL url( dropText );
currentSession->getEmulation()->sendString(url.directory());
currentSession->getEmulation()->sendString("\n");
// KWM::activate((Window)this->winId());
break;
}
}

@ -90,12 +90,6 @@
#define HERE printf("%s(%d): here\n",__FILE__,__LINE__)
/*
#undef PACKAGE
#undef VERSION
#define PACKAGE "konsole"
#define VERSION "0.9.12"
*/
template class QPtrDict<TESession>;
@ -149,7 +143,8 @@ Konsole::Konsole(const QString& name,
// Init DnD ////////////////////////////////////////////////////////////////
setAcceptDrops(true);
// setAcceptDrops(true);
// FIXME: Now it is in TEWidget. Clean this up
// load session commands ///////////////////////////////////////////////////
@ -341,14 +336,17 @@ void Konsole::makeMenu()
QPopupMenu* m_help = helpMenu(aboutAuthor, false);
m_help->insertItem( i18n("&Technical Reference ..."), this, SLOT(tecRef()),
0, -1, 1);
/*
// Popup menu for drag & drop
m_drop = new QPopupMenu;
m_drop->insertItem( i18n("Paste"), 0);
m_drop->insertItem( i18n("cd"), 1);
connect(m_drop, SIGNAL(activated(int)), SLOT(drop_menu_activated(int)));
*/
m_options->installEventFilter( this );
// For those who would like to add shortcuts here, be aware that
// ALT-key combinations are heavily used by many programs. Thus,
// activating shortcuts here means deactivating them in the other
@ -872,15 +870,12 @@ void Konsole::activateSession()
if (!s) { fprintf(stderr,"session not found\n"); return; } // oops
if (s->schemaNo()!=curr_schema)
{
setSchema(s->schemaNo()); //FIXME: creates flicker? Do only if differs
setSchema(s->schemaNo());
//Set Font. Now setConnect should do the appropriate action.
//if the size has changed, a resize event (noticable to the application)
//should happen. Else, we could even start the application
s->setConnect(TRUE); // does a bulkShow (setImage)
setFont(s->fontNo()); //FIXME: creates flicker?
//FIXME: check here if we're still alife.
// if not, quit, otherwise,
// start propagating quit.
s->setConnect(TRUE); // does a bulkShow (setImage)
setFont(s->fontNo()); //FIXME: creates flicker?
title = s->Title(); // take title from current session
}
else
@ -894,6 +889,7 @@ void Konsole::activateSession()
s->setConnect(TRUE);
}
setHeader();
te->currentSession = se;
keytab_menu_activated(n_keytab); // act. the keytab for this session
}

@ -98,18 +98,7 @@ konsolePart::konsolePart(QWidget *parent, const char *name)
m_extension = new konsoleBrowserExtension(this);
//bool login_shell = false;
//bool welcome = true;
//bool histon = true;
//const char* wname = PACKAGE;
// QCString sz = "";
//sz = args->getOption("vt_sz");
//histon = args->isSet("hist");
//wname = args->getOption("name");
//login_shell = args->isSet("ls");
QStrList eargs;
// welcome = args->isSet("welcome");
const char* shell = getenv("SHELL");
if (shell == NULL || *shell == '\0') shell = "/bin/sh";
@ -125,8 +114,8 @@ konsolePart::konsolePart(QWidget *parent, const char *name)
// initial->run();
initial->setConnect(TRUE);
QTimer::singleShot(0/*100*/,initial,SLOT(run()));
initial->getEmulation()->setKeytrans(0);
te->currentSession = initial;
// setXMLFile("konsole_part.rc");

Loading…
Cancel
Save