1 /* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
2 * Understanding is not required. Only obedience.
4 * This program is free software. It comes without any warranty, to
5 * the extent permitted by applicable law. You can redistribute it
6 * and/or modify it under the terms of the Do What The Fuck You Want
7 * To Public License, Version 2, as published by Sam Hocevar. See
8 * http://sam.zoy.org/wtfpl/COPYING for more details.
14 #include <QInputDialog>
16 #include "eng_bindings.h"
18 #include "eng_commands.h"
19 #include "k8strutils.h"
20 #include "psyccontact.h"
23 ///////////////////////////////////////////////////////////////////////////////
24 EngineBindings::EngineBindings (ChatForm
*aChat
) : QObject(aChat
), mChat(aChat
) {
28 EngineBindings::~EngineBindings () {
32 bool EngineBindings::dispatchBinding (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
33 if (cmd
.isEmpty() || cmd
.length() > 64) return false;
34 // this is Qt black magic, so don't touch it
35 char mtName
[128], buf
[256];
37 qDebug() << "binding:" << cmd
<< "cmb:" << combo
;
38 QByteArray
bt(cmd
.toAscii());
39 sprintf(mtName
, "%s", bt
.constData());
40 for (int f
= 0; mtName
[f
]; f
++) if (mtName
[f
] == '-') mtName
[f
] = '_';
42 sprintf(buf
, "binding_%s(QString,QString,QString)", mtName
);
43 if (metaObject()->indexOfSlot(buf
) >= 0) {
44 sprintf(buf
, "binding_%s", mtName
);
45 QMetaObject::invokeMethod(this, buf
, Qt::AutoConnection
, Q_ARG(QString
, cmd
), Q_ARG(QString
, combo
), Q_ARG(QString
, ctext
));
48 return defaultBinding(cmd
, combo
, ctext
);
52 ///////////////////////////////////////////////////////////////////////////////
53 bool EngineBindings::defaultBinding (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
57 QStringList
cl(K8Str::parseCmdLine(cmd
));
58 if (cl
.length() < 1) return false;
59 if (cl
[0] == "edit-insert-text") {
60 for (int f
= 1; f
< cl
.length(); f
++) mChat
->edChat
->insertPlainText(cl
[f
]);
61 mChat
->edChat
->ensureCursorVisible();
64 if (cl
[0] == "do-command") {
66 while (!s
.isEmpty() && s
[0].isSpace()) s
.remove(0, 1);
67 if (s
.startsWith("do-command")) s
.remove(0, 10);
68 while (!s
.isEmpty() && s
[0].isSpace()) s
.remove(0, 1);
69 if (!s
.isEmpty()) s
.prepend("/");
70 qDebug() << "cmd:" << s
;
71 mChat
->mEngCmds
->doCommand(s
);
74 if (cl
[0] == "chat-with") {
75 if (cl
.length() < 2) {
76 mChat
->startChatWith("");
78 QStringList
lst(mChat
->findByUniPart(cl
[1]));
79 if (lst
.size() < 1) mChat
->optPrint("can't start chat: nothing's found");
80 else if (lst
.size() > 1) mChat
->optPrint("<b>too many unis found!</b><br />\n"+lst
.join("<br />\n"));
81 else mChat
->startChatWith(lst
[0]);
89 void EngineBindings::binding_window_minimize (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
93 mChat
->showMinimized();
97 void EngineBindings::binding_window_hide (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
105 void EngineBindings::binding_activate_menu_status (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
109 //mChat->btStatus->defaultAction()->activate(QAction::Trigger);
110 mChat
->btStatus
->click();
114 void EngineBindings::binding_activate_menu_main (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
118 //mChat->btMainMenu->defaultAction()->activate(QAction::Trigger);
119 mChat
->btMainMenu
->click();
123 void EngineBindings::binding_edit_recode_text (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
127 mChat
->translateMessage();
131 void EngineBindings::binding_edit_insert_new_line (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
135 mChat
->edChat
->insertPlainText("\n");
136 mChat
->edChat
->ensureCursorVisible();
140 void EngineBindings::binding_edit_insert_smile_oo (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
144 mChat
->edChat
->insertPlainText("O_O");
145 mChat
->edChat
->ensureCursorVisible();
149 void EngineBindings::binding_edit_insert_smile_oo_weird (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
158 mChat
->edChat
->insertPlainText(s
);
159 mChat
->edChat
->ensureCursorVisible();
163 void EngineBindings::binding_edit_insert_desu (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
168 mChat
->edChat
->insertPlainText(ch
);
170 mChat
->edChat
->insertPlainText(ch
);
171 mChat
->edChat
->ensureCursorVisible();
175 void EngineBindings::binding_edit_autocomplete (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
179 mChat
->chatAutoComplete();
183 void EngineBindings::binding_chat_send (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
187 mChat
->doSendMessage();
191 void EngineBindings::binding_editor_activate (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
195 mChat
->mUnreadInChat
= false;
196 if (mChat
->mChatUser
) mChat
->mPopMan
->removeById("", mChat
->mChatUser
->uni().toLower());
198 mChat
->edChat
->setFocus();
202 void EngineBindings::binding_clist_activate (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
206 mChat
->webCList
->setFocus();
210 void EngineBindings::binding_chat_activate (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
214 mChat
->webChat
->setFocus();
218 void EngineBindings::binding_set_status_text (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
223 QString stt
= QInputDialog::getText(mChat
, tr("set new status text"), tr("status text:"),
224 QLineEdit::Normal
, mChat
->toStringOpt("/status/text"), &ok
);
226 mChat
->setOpt("/status/text", stt
);
227 mChat
->mProto
->setStatusText(stt
);
228 if (!mChat
->mProto
->isLoggedIn()) return;
229 if (mChat
->mMyStatus
!= mChat
->mProto
->status()) mChat
->setStatus(mChat
->mMyStatus
);
231 if (mChat
->mMyStatus
!= PsycProto::Offline
) {
233 mChat
->mProto
->setStatus(PsycProto::Offline
, mChat
->mProto
->statusText(), mChat
->mMyMood
);
234 mChat
->mProto
->setStatus(PsycProto::Here
, mChat
->mProto
->statusText(), mChat
->mMyMood
);
235 if (mChat
->mMyStatus
!= PsycProto::Here
) mChat
->mProto
->setStatus(mChat
->mMyStatus
, mChat
->mProto
->statusText(), mChat
->mMyMood
);
242 void EngineBindings::binding_chat_close (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
246 mChat
->startChatWith("");
250 void EngineBindings::binding_chat_quote (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
254 mChat
->runChatJS("selectedText()");
255 if (mChat
->mSelText
.isEmpty()) return;
256 int wwdt
= mChat
->toIntOptCU("/editor/wrappos", 64);
257 QString
s(K8Str::wrap(mChat
->mSelText
, wwdt
, mChat
->toStringOptCU("/editor/wrappfx", ">")));
258 mChat
->edChat
->insertPlainText(s
);
259 mChat
->edChat
->ensureCursorVisible();
260 if (mChat
->toBoolOptCU("/editor/unselafterquote", false)) mChat
->runChatJS("unselectText()");
264 void EngineBindings::binding_go_to_unread (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
268 mChat
->switchToUnread();
272 void EngineBindings::binding_action_quit (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
276 if (mChat
->action_quit
->isEnabled()) mChat
->action_quit
->activate(QAction::Trigger
);
280 void EngineBindings::binding_action_edit_account (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
284 if (mChat
->action_accedit
->isEnabled()) mChat
->action_accedit
->activate(QAction::Trigger
);
288 void EngineBindings::binding_action_join_place (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
292 if (mChat
->action_join
->isEnabled()) mChat
->action_join
->activate(QAction::Trigger
);
296 void EngineBindings::binding_action_send_raw_packet (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
300 if (mChat
->action_sendpacket
->isEnabled()) mChat
->action_sendpacket
->activate(QAction::Trigger
);
304 void EngineBindings::binding_action_show_packet_console (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
308 if (mChat
->action_showconsole
->isEnabled()) mChat
->action_showconsole
->activate(QAction::Trigger
);
312 /* rewrite! make one function to set status by number/name! */
313 void EngineBindings::binding_action_status_offline (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
317 if (mChat
->action_stoffline
->isEnabled()) mChat
->action_stoffline
->activate(QAction::Trigger
);
321 void EngineBindings::binding_action_status_vacation (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
325 if (mChat
->action_stvacation
->isEnabled()) mChat
->action_stvacation
->activate(QAction::Trigger
);
329 void EngineBindings::binding_action_status_away (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
333 if (mChat
->action_staway
->isEnabled()) mChat
->action_staway
->activate(QAction::Trigger
);
337 void EngineBindings::binding_action_status_dnd (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
341 if (mChat
->action_stdnd
->isEnabled()) mChat
->action_stdnd
->activate(QAction::Trigger
);
345 void EngineBindings::binding_action_status_nearby (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
349 if (mChat
->action_stnear
->isEnabled()) mChat
->action_stnear
->activate(QAction::Trigger
);
353 void EngineBindings::binding_action_status_busy (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
357 if (mChat
->action_stbusy
->isEnabled()) mChat
->action_stbusy
->activate(QAction::Trigger
);
361 void EngineBindings::binding_action_status_here (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
365 if (mChat
->action_sthere
->isEnabled()) mChat
->action_sthere
->activate(QAction::Trigger
);
369 void EngineBindings::binding_action_status_ffc (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
373 if (mChat
->action_stffc
->isEnabled()) mChat
->action_stffc
->activate(QAction::Trigger
);
377 void EngineBindings::binding_action_status_realtime (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
381 if (mChat
->action_strtime
->isEnabled()) mChat
->action_strtime
->activate(QAction::Trigger
);
385 void EngineBindings::binding_edit_move_home (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
389 mChat
->edChat
->moveCursor(QTextCursor::StartOfLine
, QTextCursor::MoveAnchor
);
393 void EngineBindings::binding_edit_move_end (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
397 mChat
->edChat
->moveCursor(QTextCursor::EndOfLine
, QTextCursor::MoveAnchor
);
401 void EngineBindings::binding_edit_move_top (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
405 mChat
->edChat
->moveCursor(QTextCursor::Start
, QTextCursor::MoveAnchor
);
409 void EngineBindings::binding_edit_move_bottom (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
413 mChat
->edChat
->moveCursor(QTextCursor::End
, QTextCursor::MoveAnchor
);
417 void EngineBindings::binding_edit_move_left (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
421 mChat
->edChat
->moveCursor(QTextCursor::Left
, QTextCursor::MoveAnchor
);
425 void EngineBindings::binding_edit_move_right (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
429 mChat
->edChat
->moveCursor(QTextCursor::Right
, QTextCursor::MoveAnchor
);
433 void EngineBindings::binding_edit_move_up (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
437 mChat
->edChat
->moveCursor(QTextCursor::Up
, QTextCursor::MoveAnchor
);
441 void EngineBindings::binding_edit_move_down (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
445 mChat
->edChat
->moveCursor(QTextCursor::Down
, QTextCursor::MoveAnchor
);
449 void EngineBindings::binding_edit_move_word_left (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
453 mChat
->edChat
->moveCursor(QTextCursor::WordLeft
, QTextCursor::MoveAnchor
);
457 void EngineBindings::binding_edit_move_word_right (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
461 mChat
->edChat
->moveCursor(QTextCursor::WordRight
, QTextCursor::MoveAnchor
);
465 void EngineBindings::binding_edit_clear (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
469 mChat
->edChat
->clear();
470 mChat
->edChat
->ensureCursorVisible();
474 void EngineBindings::binding_edit_select_all (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
478 mChat
->edChat
->selectAll();
482 void EngineBindings::binding_edit_cut (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
486 mChat
->edChat
->cut();
490 void EngineBindings::binding_edit_copy (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
494 mChat
->edChat
->copy();
498 void EngineBindings::binding_edit_paste (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
502 mChat
->edChat
->paste();
506 void EngineBindings::binding_edit_undo (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
510 mChat
->edChat
->undo();
514 void EngineBindings::binding_edit_redo (const QString
&cmd
, const QString
&combo
, const QString
&ctext
) {
518 mChat
->edChat
->redo();
523 void EngineBindings::onShortcutCopy () {
524 //qDebug() << "copy shortcut pressed!";
525 mChat->runChatJS("selectedText()");
526 if (mChat->mSelText.isEmpty()) return;
527 QClipboard *cb = QApplication::clipboard();
528 cb->setText(mChat->mSelText);
529 if (mChat->toBoolOptCU("/editor/unselaftercopy", false)) mChat->runChatJS("unselectText()");
533 void EngineBindings::onShortcutUnsel () {
534 //qDebug() << "unsel shortcut pressed!";
535 mChat->runChatJS("unselectText()");
538 void EngineBindings::onShortcutmChat->checkBlink () {
539 //qDebug() << "close shortcut pressed!";
540 mChat->mUnreadInChat = false;
541 if (mChat->mChatUser) mChat->mPopMan->removeById("", mChat->mChatUser->uni().toLower());