diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 24601aa2..04f28971 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,251 +1,252 @@ include(ECMAddAppIcon) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/config) include_directories(config dcc irc viewer upnp) set(core_SRCS #==================================== #=== Application config/preferences.cpp application.cpp dbus.cpp mainwindow.cpp main.cpp common.cpp sound.cpp ssllabel.cpp statusbar.cpp bookmarkhandler.cpp scriptlauncher.cpp konsolepanel.cpp notificationhandler.cpp awaymanager.cpp connectionmanager.cpp connectionsettings.cpp identity.cpp identitydialog.cpp #=== GUI urlcatcher.cpp queuetuner.cpp quickconnectdialog.cpp ) set (irc_SRCS #== IRC irc/server.cpp irc/query.cpp irc/channel.cpp irc/channellistpanel.cpp irc/channelnick.cpp irc/modebutton.cpp irc/joinchanneldialog.cpp irc/invitedialog.cpp irc/topichistorymodel.cpp irc/irccharsets.cpp irc/nick.cpp irc/nickinfo.cpp irc/nicklistview.cpp irc/nicksonline.cpp irc/nicksonlineitem.cpp #=== Server irc/inputfilter.cpp irc/outputfilter.cpp irc/outputfilterresolvejob.cpp irc/ircqueue.cpp irc/servergroupdialog.cpp irc/servergroupsettings.cpp irc/serverison.cpp irc/serverlistdialog.cpp irc/serverlistview.cpp irc/serversettings.cpp ) ki18n_wrap_ui(irc_SRCS irc/channellistpanelui.ui irc/channeldialogui.ui irc/joinchannelui.ui irc/serverdialogui.ui irc/servergroupdialogui.ui irc/serverlistdialogui.ui irc/invitedialog.ui ) #=== Configuration dialog pages set(config_SRCS config/configdialog.cpp config/settingsdialog.cpp config/alias_config.cpp config/autoreplace_config.cpp config/dcc_config.cpp config/highlight_config.cpp config/ignore_config.cpp config/nicklistbehavior_config.cpp config/osd_config.cpp config/tabs_config.cpp config/theme_config.cpp config/quickbuttons_config.cpp config/warnings_config.cpp config/connectionbehavior_config.cpp + config/highlighttreewidget.cpp ) ki18n_wrap_ui(config_SRCS config/alias_configui.ui config/autoreplace_configui.ui config/chatwindowappearance_config.ui config/chatwindowbehaviour_config.ui config/colorsappearance_config.ui config/connectionbehavior_config.ui config/dcc_configui.ui config/fontappearance_config.ui config/generalbehavior_configui.ui config/highlight_configui.ui config/ignore_configui.ui config/log_config.ui config/nicklistbehavior_configui.ui config/osd_configui.ui config/quickbuttons_configui.ui config/tabnotifications_config.ui config/tabs_configui.ui config/theme_configui.ui config/warnings_configui.ui config/watchednicknames_configui.ui ) #=== Viewer set(viewer_SRCS viewer/ircinput.cpp viewer/ircview.cpp viewer/chatwindow.cpp viewer/rawlog.cpp viewer/statuspanel.cpp viewer/ircviewbox.cpp viewer/viewcontainer.cpp viewer/pasteeditor.cpp viewer/highlight.cpp viewer/highlightviewitem.cpp viewer/ignore.cpp viewer/ignorelistviewitem.cpp viewer/irccolorchooser.cpp viewer/logfilereader.cpp viewer/insertchardialog.cpp viewer/osd.cpp viewer/topiclabel.cpp viewer/awaylabel.cpp viewer/editnotifydialog.cpp viewer/emoticons.cpp viewer/images.cpp viewer/quickbutton.cpp viewer/searchbar.cpp viewer/irccontextmenus.cpp viewer/trayicon.cpp viewer/viewspringloader.cpp viewer/channeloptionsdialog.cpp viewer/topicedit.cpp viewer/topichistoryview.cpp viewer/viewtree.cpp ) ki18n_wrap_ui(viewer_SRCS viewer/channeloptionsui.ui viewer/irccolorchooserui.ui viewer/pasteeditor.ui ) #=== DCC set(dcc_SRCS dcc/chat.cpp dcc/chatcontainer.cpp dcc/dcccommon.cpp dcc/dccfiledialog.cpp dcc/recipientdialog.cpp dcc/resumedialog.cpp dcc/transfer.cpp dcc/transferdetailedinfopanel.cpp dcc/transfermanager.cpp dcc/transferpanel.cpp dcc/transferrecv.cpp dcc/transfersend.cpp dcc/transferlistmodel.cpp dcc/transferview.cpp dcc/whiteboard.cpp dcc/whiteboardcolorchooser.cpp dcc/whiteboardfontchooser.cpp dcc/whiteboardglobals.cpp dcc/whiteboardpaintarea.cpp dcc/whiteboardtoolbar.cpp ) ki18n_wrap_ui(dcc_SRCS dcc/transferdetailedinfopanelui.ui dcc/transferdetailedtimeinfopanelui.ui dcc/whiteboardtoolbarui.ui dcc/whiteboardfontchooserui.ui ) if (Qca-qt5_FOUND) set(cipher_SRCS cipher.cpp) endif (Qca-qt5_FOUND) set(upnp_SRCS upnp/soap.cpp upnp/upnpdescriptionparser.cpp upnp/upnpmcastsocket.cpp upnp/upnprouter.cpp ) set (completed_SRCS ${core_SRCS} ${irc_SRCS} ${viewer_SRCS} ${config_SRCS} ${cipher_SRCS} ${upnp_SRCS} ${dcc_SRCS}) set (konversation_SRCS ${completed_SRCS}) ki18n_wrap_ui(konversation_SRCS identitydialog.ui queuetunerbase.ui viewer/searchbarbase.ui ) kconfig_add_kcfg_files(konversation_SRCS config/preferences_base.kcfgc) # Sets the icon on Windows and OSX file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/../data/images/icons/*apps-konversation.png") ecm_add_app_icon(konversation_SRCS ICONS ${ICONS_SRCS}) add_executable(konversation ${konversation_SRCS}) target_link_libraries(konversation Qt5::Widgets KF5::Archive KF5::Bookmarks KF5::ConfigWidgets KF5::Crash KF5::Emoticons KF5::I18n KF5::IdleTime KF5::NotifyConfig KF5::KIOFileWidgets KF5::KIOWidgets KF5::Parts KF5::Solid KF5::Wallet KF5::WidgetsAddons KF5::GlobalAccel KF5::DBusAddons KF5::CoreAddons KF5::Notifications KF5::WindowSystem KF5::IconThemes KF5::ItemViews Phonon::phonon4qt5) if (Qca-qt5_FOUND) target_link_libraries(konversation qca-qt5) endif () if (WIN32) target_link_libraries(konversation ws2_32) # for symbols from winsock2.h: ntohl, etc. endif() install(TARGETS konversation ${INSTALL_TARGETS_DEFAULT_ARGS}) diff --git a/src/config/highlight_config.cpp b/src/config/highlight_config.cpp index bf8a05c3..82555ad1 100644 --- a/src/config/highlight_config.cpp +++ b/src/config/highlight_config.cpp @@ -1,320 +1,322 @@ /* 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 2 of the License, or (at your option) any later version. */ /* Copyright (C) 2006 Dario Abatianni Copyright (C) 2006 John Tapsell */ #include "highlight_config.h" #include "highlightviewitem.h" #include "application.h" #include "sound.h" #include "preferences.h" #include #include #include Highlight_Config::Highlight_Config(QWidget* parent, const char* name) : QWidget(parent) { setObjectName(name); setupUi(this); // reset flag to defined state (used to block signals when just selecting a new item) newItemSelected = false; loadSettings(); soundPlayBtn->setIcon(QIcon::fromTheme("media-playback-start")); soundURL->setWhatsThis(i18n("Select Sound File")); // This code was copied from KNotifyWidget::openSoundDialog() (knotifydialog.cpp) [it's under LGPL v2] // find the first "sound"-resource that contains files QStringList soundDirs = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, "konversation/sounds"); soundDirs += QStandardPaths::locate(QStandardPaths::GenericDataLocation, "sounds", QStandardPaths::LocateDirectory); if (!soundDirs.isEmpty()) { QDir dir; dir.setFilter( QDir::Files | QDir::Readable ); QStringList::ConstIterator it = soundDirs.constBegin(); while ( it != soundDirs.constEnd() ) { dir = *it; if ( dir.isReadable() && dir.count() > 2 ) { soundURL->setStartDir(QUrl(*it)); break; } ++it; } } // End copy connect(highlightListView, &QTreeWidget::currentItemChanged, this, &Highlight_Config::highlightSelected); + connect(highlightListView, &QTreeWidget::itemChanged, this, &Highlight_Config::modified); + connect(highlightListView, &HighlightTreeWidget::itemDropped, this, &Highlight_Config::modified); connect(patternInput, &KLineEdit::textChanged, this, &Highlight_Config::patternChanged); connect(enableNotificationsCheckbox, &QCheckBox::toggled, this, &Highlight_Config::notifyModeChanged); connect(patternColor, &KColorButton::changed, this, &Highlight_Config::colorChanged); connect(soundURL, &KUrlRequester::textChanged, this, &Highlight_Config::soundURLChanged); connect(soundPlayBtn, &QToolButton::clicked, this, &Highlight_Config::playSound); connect(autoTextInput, &KLineEdit::textChanged, this, &Highlight_Config::autoTextChanged); connect(chatWindowsInput, &KLineEdit::textChanged, this, &Highlight_Config::chatWindowsChanged); connect(newButton, &QPushButton::clicked, this, &Highlight_Config::addHighlight); connect(removeButton, &QPushButton::clicked, this, &Highlight_Config::removeHighlight); updateButtons(); } Highlight_Config::~Highlight_Config() { } void Highlight_Config::restorePageToDefaults() { if (highlightListView->topLevelItemCount() != 0) { highlightListView->clear(); emit modified(); } } void Highlight_Config::loadSettings() { highlightListView->clear(); foreach (Highlight* currentHighlight, Preferences::highlightList()) { HighlightViewItem *item = new HighlightViewItem(highlightListView,currentHighlight); item->setFlags(item->flags() &~ Qt::ItemIsDropEnabled); } highlightListView->setCurrentItem(highlightListView->topLevelItem(0)); // remember current list for hasChanged() m_oldHighlightList=currentHighlightList(); } bool Highlight_Config::hasChanged() { return (m_oldHighlightList!=currentHighlightList()); } // Slots: void Highlight_Config::highlightSelected(QTreeWidgetItem* item) { // check if there was a widget selected at all if (item) { // make a highlight item out of the generic qlistviewitem HighlightViewItem* highlightItem = static_cast(item); // tell all now emitted signals that we just clicked on a new item, so they should // not emit the modified() signal. newItemSelected = true; patternColor->setColor(highlightItem->getColor()); patternInput->setText(highlightItem->getPattern()); enableNotificationsCheckbox->setChecked(highlightItem->getNotify()); soundURL->setUrl(highlightItem->getSoundURL()); autoTextInput->setText(highlightItem->getAutoText()); chatWindowsInput->setText(highlightItem->getChatWindows()); // all signals will now emit the modified() signal again newItemSelected = false; // remember to enable all edit widgets } updateButtons(); } void Highlight_Config::updateButtons() { bool enabled = highlightListView->currentItem() != NULL; // enable or disable edit widgets patternLabel->setEnabled(enabled); patternInput->setEnabled(enabled); colorLabel->setEnabled(enabled); patternColor->setEnabled(enabled); enableNotificationsLabel->setEnabled(enabled); enableNotificationsCheckbox->setEnabled(enabled); soundURL->setEnabled(enabled); soundLabel->setEnabled(enabled); soundPlayBtn->setEnabled(enabled); autoTextLabel->setEnabled(enabled); autoTextInput->setEnabled(enabled); chatWindowsLabel->setEnabled(enabled); chatWindowsInput->setEnabled(enabled); } void Highlight_Config::patternChanged(const QString& newPattern) { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (!newItemSelected && item) { item->setPattern(newPattern); emit modified(); } } void Highlight_Config::notifyModeChanged(bool enabled) { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (!newItemSelected && item) { item->setNotify(enabled); emit modified(); } } void Highlight_Config::colorChanged(const QColor& newColor) { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (!newItemSelected && item) { item->setColor(newColor); emit modified(); } } void Highlight_Config::soundURLChanged(const QString& newURL) { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (!newItemSelected && item) { item->setSoundURL(QUrl(newURL)); emit modified(); } } void Highlight_Config::autoTextChanged(const QString& newText) { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (!newItemSelected && item) { item->setAutoText(newText); emit modified(); } } void Highlight_Config::chatWindowsChanged(const QString& newChatWindows) { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (!newItemSelected && item) { item->setChatWindows(newChatWindows); emit modified(); } } void Highlight_Config::addHighlight() { Highlight* newHighlight = new Highlight(i18n("New"), false, QColor("#ff0000"), QUrl(), QString(), QString(), true); HighlightViewItem* item = new HighlightViewItem(highlightListView, newHighlight); item->setFlags(item->flags() &~ Qt::ItemIsDropEnabled); highlightListView->setCurrentItem(item); patternInput->setFocus(); patternInput->selectAll(); emit modified(); } void Highlight_Config::removeHighlight() { HighlightViewItem* item = static_cast(highlightListView->currentItem()); if (item) { delete item; item = static_cast(highlightListView->currentItem()); if (item) { highlightListView->setCurrentItem(item); } emit modified(); } updateButtons(); } QList Highlight_Config::getHighlightList() { QList newList; HighlightViewItem* item = static_cast(highlightListView->topLevelItem(0)); while (item) { newList.append(new Highlight(item->getPattern(), item->getRegExp(), item->getColor(), item->getSoundURL(), item->getAutoText(), item->getChatWindows(), item->getNotify())); item = static_cast(highlightListView->itemBelow(item)); } return newList; } QStringList Highlight_Config::currentHighlightList() { QStringList newList; HighlightViewItem* item = static_cast(highlightListView->topLevelItem(0)); while (item) { newList.append(item->getPattern() + QString(item->getRegExp()) + item->getColor().name() + item->getSoundURL().url() + item->getAutoText() + item->getChatWindows() + QString::number(item->getNotify())); item = static_cast(highlightListView->itemBelow(item)); } return newList; } void Highlight_Config::playSound() { Application *konvApp = Application::instance(); konvApp->sound()->play(soundURL->url()); } void Highlight_Config::saveSettings() { KSharedConfigPtr config = KSharedConfig::openConfig(); // Write all highlight entries QList hiList = getHighlightList(); int i = 0; foreach (Highlight* hl, hiList) { KConfigGroup grp = config->group(QString("Highlight%1").arg(i)); grp.writeEntry("Pattern", hl->getPattern()); grp.writeEntry("RegExp", hl->getRegExp()); grp.writeEntry("Color", hl->getColor()); grp.writePathEntry("Sound", hl->getSoundURL().url()); grp.writeEntry("AutoText", hl->getAutoText()); grp.writeEntry("ChatWindows", hl->getChatWindows()); grp.writeEntry("Notify", hl->getNotify()); i++; } Preferences::setHighlightList(hiList); // Remove unused entries... while (config->hasGroup(QString("Highlight%1").arg(i))) { config->deleteGroup(QString("Highlight%1").arg(i)); i++; } // remember current list for hasChanged() m_oldHighlightList=currentHighlightList(); } diff --git a/src/config/highlight_configui.ui b/src/config/highlight_configui.ui index 1b06b586..e9c7002d 100644 --- a/src/config/highlight_configui.ui +++ b/src/config/highlight_configui.ui @@ -1,483 +1,488 @@ Highlight_ConfigUI 0 0 614 585 0 0 0 0 Ena&ble sound for highlights false false Alwa&ys highlight own current nick: Always highlight own &lines: Qt::Horizontal QSizePolicy::Expanding 120 20 Qt::Horizontal QSizePolicy::Expanding 50 20 Qt::Horizontal QSizePolicy::Expanding 50 21 Highlight List - + true true QAbstractItemView::InternalMove false true RegEx Highlights Sound Auto Text Chat Windows 0 0 &New 0 0 &Remove Qt::Vertical QSizePolicy::Expanding 20 250 QFormLayout::AllNonFixedFieldsGrow false &Pattern: false patternInput false 1 0 false Color: false false false &Sound: false soundURL false 0 0 audio/x-wav audio/x-mp3 application/ogg audio/x-adpcm false 0 0 Test sound false A&uto text: false autoTextInput false false Chat windows: false chatWindowsInput false 1 0 This highlight will only be searched for in chat windows listed here by name, or in all chat windows if the field is left empty. Multiple names have to be separated by commas. false Enable &notifications: enableNotificationsCheckbox false - - KColorButton - QPushButton -
kcolorbutton.h
-
KLineEdit QLineEdit
klineedit.h
+ + KColorButton + QPushButton +
kcolorbutton.h
+
KUrlRequester QWidget
kurlrequester.h
+ + HighlightTreeWidget + QTreeWidget +
highlighttreewidget.h
+
highlightListView newButton removeButton patternInput patternColor soundURL soundPlayBtn autoTextInput chatWindowsInput enableNotificationsCheckbox kcfg_HighlightSoundsEnabled kcfg_HighlightNick kcfg_HighlightNickColor kcfg_HighlightOwnLines kcfg_HighlightOwnLinesColor klineedit.h kcolorbutton.h kurlrequester.h kcfg_HighlightNick toggled(bool) kcfg_HighlightNickColor setEnabled(bool) 20 20 20 20 kcfg_HighlightOwnLines toggled(bool) kcfg_HighlightOwnLinesColor setEnabled(bool) 20 20 20 20
diff --git a/src/config/highlighttreewidget.cpp b/src/config/highlighttreewidget.cpp new file mode 100644 index 00000000..6495c142 --- /dev/null +++ b/src/config/highlighttreewidget.cpp @@ -0,0 +1,27 @@ +/* + 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 2 of the License, or + (at your option) any later version. +*/ + +/* + Copyright (C) 2017 Peter Simonsson +*/ + +#include "highlighttreewidget.h" + +#include + +HighlightTreeWidget::HighlightTreeWidget(QWidget *parent) : + QTreeWidget(parent) +{ +} + +void HighlightTreeWidget::dropEvent(QDropEvent *event) +{ + QTreeWidget::dropEvent(event); + + if (event->isAccepted()) + emit itemDropped(); +} diff --git a/src/config/highlighttreewidget.h b/src/config/highlighttreewidget.h new file mode 100644 index 00000000..db1c3725 --- /dev/null +++ b/src/config/highlighttreewidget.h @@ -0,0 +1,31 @@ +/* + 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 2 of the License, or + (at your option) any later version. +*/ + +/* + Copyright (C) 2017 Peter Simonsson +*/ + +#ifndef HIGHLIGHTTREEWIDGET_H +#define HIGHLIGHTTREEWIDGET_H + +#include + +class HighlightTreeWidget : public QTreeWidget +{ + Q_OBJECT + + public: + HighlightTreeWidget(QWidget *parent = nullptr); + + protected: + virtual void dropEvent(QDropEvent *event); + + signals: + void itemDropped(); +}; + +#endif // HIGHLIGHTTREEWIDGET_H