[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    key macro with kate plugin
From:       Krister Wicksell Eriksson <krister.wicksell () spray ! se>
Date:       2002-02-23 19:43:25
[Download RAW message or body]

Hi

I would like to make a plugin for kate that make it possible to record key 
macros. Like in Kylix and Delphi for example (Ctrl+Shift+R/P). Have checked 
the kate code but can't find a way to read which keys are being pressed. So 
can any one give me a hint if it is possible.

Have made a quick test with kedit. Have attached a patch.

Thanks
  Krister

-- 
krister.wicksell@spray.se
http://hem.spray.se/krister.wicksell/


["kdelibs-kedit_key_recording-20020223.patch" (text/x-diff)]

? kdelibs-kedit_key_recording-20020223.patch
Index: kdeui/keditcl.h
===================================================================
RCS file: /home/kde/kdelibs/kdeui/keditcl.h,v
retrieving revision 1.56
diff -u -3 -p -u -r1.56 keditcl.h
--- kdeui/keditcl.h	2002/02/08 20:10:36	1.56
+++ kdeui/keditcl.h	2002/02/23 19:15:30
@@ -21,6 +21,7 @@
 #ifndef __KEDITCL_H__
 #define __KEDITCL_H__
 
+#include <qptrlist.h>
 #include <qmultilineedit.h>
 #include <qstring.h>
 #include <kdialogbase.h>
@@ -268,7 +269,26 @@ public:
      */
     void setOverwriteEnabled(bool b);
 
+    /**
+     * If key recording is enabled.
+     */
+    bool isRecording() { return recording; }
+
+    /**
+     * Start key recording.
+     */
+    void startRecording();
+
+    /**
+     * Stop key recording.
+     */
+    void stopRecording();
 
+    /**
+     * Play recorded keys.
+     */
+    void play();
+
 signals:
     /** This signal is emitted if the user dropped a URL over the text editor
       * @ref QMultiLineEdit widget.
@@ -397,6 +417,14 @@ private:
     bool        fill_column_is_set;
     bool        word_wrap_is_set;
     int         fill_column_value;
+
+    bool recording;
+    QPtrList<QKeyEvent> *recorded_keys;
+
+    /**
+     * Record a key event.
+     */
+    void record(QKeyEvent *e);
 
     class KEditPrivate;
     KEditPrivate *d;
Index: kdeui/keditcl1.cpp
===================================================================
RCS file: /home/kde/kdelibs/kdeui/keditcl1.cpp,v
retrieving revision 1.54
diff -u -3 -p -u -r1.54 keditcl1.cpp
--- kdeui/keditcl1.cpp	2002/01/21 01:06:40	1.54
+++ kdeui/keditcl1.cpp	2002/02/23 19:15:30
@@ -61,10 +61,14 @@ KEdit::KEdit(QWidget *_parent, const cha
     replace_dialog= NULL;
     gotodialog = NULL;
 
+    recording = false;
+    recorded_keys = new QPtrList<QKeyEvent>;
+    recorded_keys->setAutoDelete(true);
+
     setAcceptDrops(true);
     KCursor::setAutoHideCursor( this, true );
-    
-    connect(this, SIGNAL(cursorPositionChanged(int,int)), 
+
+    connect(this, SIGNAL(cursorPositionChanged(int,int)),
             this, SLOT(slotCursorPositionChanged()));
 }
 
@@ -72,6 +76,7 @@ KEdit::KEdit(QWidget *_parent, const cha
 KEdit::~KEdit()
 {
   delete d;
+  delete recorded_keys;
 }
 
 void
@@ -380,7 +385,7 @@ void KEdit::keyPressEvent ( QKeyEvent *e
     }
 
     if(!atEnd()){
- 
+
       getCursorPosition(&line,&col);
       killstring = textLine(line);
       killstring = killstring.mid(col,killstring.length());
@@ -420,6 +425,7 @@ void KEdit::keyPressEvent ( QKeyEvent *e
 
     QMultiLineEdit::keyPressEvent(e);
     setModified(true);
+    record(e);
     return;
   }
 
@@ -438,6 +444,7 @@ void KEdit::keyPressEvent ( QKeyEvent *e
 
     killing = false;
     setModified(true);
+    record(e);
     return;
   }
 
@@ -445,18 +452,21 @@ void KEdit::keyPressEvent ( QKeyEvent *e
 
   if ((e->state() & ControlButton ) && (e->key() == Key_Insert) ){
     copy();
+    record(e);
     return;
   }
 
   if ((e->state() & ShiftButton ) && (e->key() == Key_Insert) ){
     paste();
     setModified(true);
+    record(e);
     return;
   }
 
   if ((e->state() & ShiftButton ) && (e->key() == Key_Delete) ){
     cut();
     setModified(true);
+    record(e);
     return;
   }
 
@@ -465,28 +475,33 @@ void KEdit::keyPressEvent ( QKeyEvent *e
     if (e->key() == Key_Insert){
        this->setOverwriteMode(!this->isOverwriteMode());
        emit toggle_overwrite_signal();
+       record(e);
        return;
     }
   }
 
   if ( KStdAccel::isEqual( e, KStdAccel::deleteWordBack()) ) {
-    moveCursor(MoveWordBackward, true);  
+    moveCursor(MoveWordBackward, true);
     if (hasSelectedText())
       del();
     e->accept();
     setModified(true);
+    record(e);
     return;
   }
   else if ( KStdAccel::isEqual( e, KStdAccel::deleteWordForward()) ) {
-    moveCursor(MoveWordForward, true);  
+    moveCursor(MoveWordForward, true);
     if (hasSelectedText())
       del();
     e->accept();
     setModified(true);
+    record(e);
     return;
   }
 
   QMultiLineEdit::keyPressEvent(e);
+  if (e->isAccepted())
+    record(e);
 }
 
 void KEdit::installRBPopup(QPopupMenu *p) {
@@ -522,7 +537,7 @@ void KEdit::doGotoLine() {
    }
   
    int max_parag = paragraphs();
-     
+
    int line = 0;
    int parag = -1;
    int lines_in_parag = 0; 
@@ -575,6 +590,37 @@ void  KEdit::dropEvent(QDropEvent* e) {
 void KEdit::setOverwriteEnabled(bool b)
 {
   d->overwriteEnabled = b;
+}
+
+void KEdit::startRecording()
+{
+  if (!recording)
+  {
+    recording = true;
+    recorded_keys->clear();
+  }
+}
+
+void KEdit::stopRecording()
+{
+  recording = false;
+}
+
+void KEdit::play()
+{
+  if (recording)
+    return;
+
+  QKeyEvent *e;
+  for (e = recorded_keys->first(); e != 0; e = recorded_keys->next())
+    keyPressEvent(e);
+}
+
+void KEdit::record(QKeyEvent *e)
+{
+  if (recording)
+    recorded_keys->append(new QKeyEvent(e->type(), e->key(), e->ascii(), e->state(),
+                                        e->text(), e->isAutoRepeat(), e->count()));
 }
 
 // QWidget::create() turns off mouse-Tracking which would break auto-hiding

["kdeutils-kedit_key_recording-20020223.patch" (text/x-diff)]

? kdeutils-kedit_key_recording-20020223.patch
? kedit/dummy.cpp
Index: kedit/kedit.cpp
===================================================================
RCS file: /home/kde/kdeutils/kedit/kedit.cpp,v
retrieving revision 1.156
diff -u -3 -p -u -r1.156 kedit.cpp
--- kedit/kedit.cpp	2002/01/25 21:15:50	1.156
+++ kedit/kedit.cpp	2002/02/23 19:15:53
@@ -225,6 +225,12 @@ void TopLevel::setupActions()
     KStdAction::keyBindings(this, SLOT(editKeys()), actionCollection());
     KStdAction::configureToolbars(this, SLOT(editToolbars()), actionCollection());
 
+    playAction = new KAction(i18n("&Play"), 0, (Qt::SHIFT + Qt::CTRL + Qt::Key_P), this,
+                             SLOT(play()), actionCollection(), "play");
+
+    recordAction = new KToggleAction(i18n("&Record"), 0, (Qt::SHIFT + Qt::CTRL + Qt::Key_R), this,
+                                     SLOT(record()), actionCollection(), "record");
+
     createGUI();
 }
 
@@ -1300,7 +1306,7 @@ void TopLevel::openURL( const KURL& _url
     else
     {
       if (_mode & OPEN_NEW == 0)
-      {     
+      {
          KMessageBox::error(this, i18n("Cannot download file!"));
          return;
       }
@@ -1482,6 +1488,22 @@ void TopLevel::writeSettings( void )
   config->sync();
 }
 
+void TopLevel::play()
+{
+  eframe->play();
+}
+
+void TopLevel::record()
+{
+  if(recordAction->isChecked())
+  {
+    eframe->startRecording();
+  }
+  else
+  {
+    eframe->stopRecording();
+  }
+}
 
 void TopLevel::toggle_overwrite(){
 
Index: kedit/kedit.h
===================================================================
RCS file: /home/kde/kdeutils/kedit/kedit.h,v
retrieving revision 1.61
diff -u -3 -p -u -r1.61 kedit.h
--- kedit/kedit.h	2001/10/14 04:16:55	1.61
+++ kedit/kedit.h	2002/02/23 19:15:53
@@ -140,6 +140,8 @@ private:
     KAction *copyAction;
     KAction *undoAction;
     KAction *redoAction;
+    KAction *playAction;
+    KToggleAction *recordAction;
 
     int open_mode;
 
@@ -196,6 +198,8 @@ public slots:
     void search_again();
     void toggle_overwrite();
     void writeSettings();
+    void play();
+    void record();
 
     void spellcheck();
     void spell_started ( KSpell *);
Index: kedit/keditui.rc
===================================================================
RCS file: /home/kde/kdeutils/kedit/keditui.rc,v
retrieving revision 1.6
diff -u -3 -p -u -r1.6 keditui.rc
--- kedit/keditui.rc	2001/03/07 07:39:07	1.6
+++ kedit/keditui.rc	2002/02/23 19:15:53
@@ -6,5 +6,9 @@
     <Action name="insert_date"/>
     <Action name="clean_spaces"/>
   </Menu>
+  <Menu name="tools"><text>&amp;Tools</text>
+    <Action name="play"/>
+    <Action name="record"/>
+  </Menu>
 </MenuBar>
 </kpartgui>

>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic