From 81a256d9a4f032f349c2fea52b794dec48150920 Mon Sep 17 00:00:00 2001 From: Lubos Dolezel Date: Wed, 3 Jun 2015 11:25:57 +0200 Subject: historyform ported to Qt4 --- src/gui/CMakeLists.txt | 2 - src/gui/historyform.cpp | 170 ++++++--- src/gui/historyform.h | 16 +- src/gui/historyform.ui | 859 +++++++++++++++++++++++--------------------- src/gui/historylistview.cpp | 91 ----- src/gui/historylistview.h | 52 --- src/sys_settings.cpp | 2 +- src/userintf.h | 2 +- 8 files changed, 589 insertions(+), 605 deletions(-) delete mode 100644 src/gui/historylistview.cpp delete mode 100644 src/gui/historylistview.h (limited to 'src') diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index b1e8926..5d83504 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -51,7 +51,6 @@ qt4_wrap_cpp(twinkle_MOC logviewform.h numberconversionform.h getprofilenameform.h - historylistview.h address_finder.h qt_translator.h core_strings.h @@ -114,7 +113,6 @@ set(TWINKLE_GUI-SRCS dtmfform.cpp getprofilenameform.cpp gui.cpp - historylistview.cpp logviewform.cpp main.cpp messageformview.cpp diff --git a/src/gui/historyform.cpp b/src/gui/historyform.cpp index 690faf0..eb8a469 100644 --- a/src/gui/historyform.cpp +++ b/src/gui/historyform.cpp @@ -25,10 +25,16 @@ #include "util.h" #include "gui.h" #include "q3listview.h" -#include "historylistview.h" #include "qicon.h" #include "audits/memman.h" #include "historyform.h" + +#define HISTCOL_TIMESTAMP 0 +#define HISTCOL_DIRECTION 1 +#define HISTCOL_FROMTO 2 +#define HISTCOL_SUBJECT 3 +#define HISTCOL_STATUS 4 + /* * Constructs a HistoryForm as a child of 'parent', with the * name 'name' and widget flags set to 'f'. @@ -65,11 +71,16 @@ void HistoryForm::languageChange() void HistoryForm::init() { - historyListView->setSorting(HISTCOL_TIMESTAMP, false); - historyListView->setColumnWidthMode(HISTCOL_FROMTO, Q3ListView::Manual); - historyListView->setColumnWidth(HISTCOL_FROMTO, 200); - historyListView->setColumnWidthMode(HISTCOL_SUBJECT, Q3ListView::Manual); - historyListView->setColumnWidth(HISTCOL_SUBJECT, 200); + + m_model = new QStandardItemModel(historyListView); + historyListView->setModel(m_model); + m_model->setColumnCount(5); + + m_model->setHorizontalHeaderLabels(QStringList() << tr("Time") << tr("In/Out") << tr("From/To") << tr("Subject") << tr("Status")); + historyListView->sortByColumn(HISTCOL_TIMESTAMP, Qt::DescendingOrder); + + historyListView->setColumnWidth(HISTCOL_FROMTO, 200); + historyListView->setColumnWidth(HISTCOL_SUBJECT, 200); inCheckBox->setChecked(true); outCheckBox->setChecked(true); @@ -81,17 +92,20 @@ void HistoryForm::init() QIcon inviteIcon(QPixmap(":/icons/images/invite.png")); QIcon deleteIcon(QPixmap(":/icons/images/editdelete.png")); - histPopupMenu = new Q3PopupMenu(this); - MEMMAN_NEW(histPopupMenu); + histPopupMenu = new QMenu(this); itemCall = histPopupMenu->insertItem(inviteIcon, tr("Call..."), this, SLOT(call())); histPopupMenu->insertItem(deleteIcon, tr("Delete"), this, SLOT(deleteEntry())); + + m_pixmapIn = QPixmap(":/icons/images/1leftarrow-yellow.png"); + m_pixmapOut = QPixmap(":/icons/images/1rightarrow.png"); + + m_pixmapOk = QPixmap(":/icons/images/ok.png"); + m_pixmapCancel = QPixmap(":/icons/images/cancel.png"); } void HistoryForm::destroy() { - MEMMAN_DELETE(histPopupMenu); - delete histPopupMenu; } void HistoryForm::loadHistory() @@ -107,23 +121,28 @@ void HistoryForm::loadHistory() unsigned long numberOfCalls = 0; unsigned long totalCallDuration = 0; unsigned long totalConversationDuration = 0; - historyListView->clear(); - list history; - call_history->get_history(history); - for (list::iterator i = history.begin(); i != history.end(); i++) { - if (i->direction == t_call_record::DIR_IN && !inCheckBox->isChecked()) { + + std::list history; + + call_history->get_history(history); + m_history = QList::fromStdList(history); + + for (int x = 0; x < m_history.size(); x++) { + const t_call_record* cr = &m_history[x]; + + if (cr->direction == t_call_record::DIR_IN && !inCheckBox->isChecked()) { continue; } - if (i->direction == t_call_record::DIR_OUT && !outCheckBox->isChecked()) { + if (cr->direction == t_call_record::DIR_OUT && !outCheckBox->isChecked()) { continue; } - if (i->invite_resp_code < 300 && !successCheckBox->isChecked()) { + if (cr->invite_resp_code < 300 && !successCheckBox->isChecked()) { continue; } - if (i->invite_resp_code >= 300 && !missedCheckBox->isChecked()) { + if (cr->invite_resp_code >= 300 && !missedCheckBox->isChecked()) { continue; } - if (!profile_name_list.contains(i->user_profile.c_str()) && + if (!profile_name_list.contains(cr->user_profile.c_str()) && profileCheckBox->isChecked()) { continue; @@ -132,12 +151,12 @@ void HistoryForm::loadHistory() numberOfCalls++; // Calculate total duration - totalCallDuration += i->time_end - i->time_start; - if (i->time_answer != 0) { - totalConversationDuration += i->time_end - i->time_answer; + totalCallDuration += cr->time_end - cr->time_start; + if (cr->time_answer != 0) { + totalConversationDuration += cr->time_end - cr->time_answer; } - t_user *user_config = phone->ref_user_profile(i->user_profile); + t_user *user_config = phone->ref_user_profile(cr->user_profile); // If the user profile is not active, then use the // first user profile for formatting @@ -145,8 +164,58 @@ void HistoryForm::loadHistory() user_config = phone->ref_users().front(); } - new HistoryListViewItem(historyListView, - *i, user_config, timeLastViewed); + m_model->setRowCount(numberOfCalls); + + for (int j = 0; j < 5; j++) + { + QModelIndex index = m_model->index(m_model->rowCount()-1, j); + + m_model->setData(index, QVariant(x), Qt::UserRole); + switch (j) + { + case HISTCOL_TIMESTAMP: + { + QString time = QString::fromStdString(time2str(cr->time_start, "%d %b %Y %H:%M:%S")); + m_model->setData(index, time); + break; + } + case HISTCOL_DIRECTION: + { + m_model->setData(index, QString::fromStdString(cr->get_direction())); + + m_model->setData(index, (cr->direction == t_call_record::DIR_IN ? + m_pixmapIn : m_pixmapOut), Qt::DecorationRole); + + break; + } + case HISTCOL_FROMTO: + { + std::string address; + + address = (cr->direction == t_call_record::DIR_IN ? + ui->format_sip_address(user_config, + cr->from_display, cr->from_uri) : + ui->format_sip_address(user_config, + cr->to_display, cr->to_uri)); + + m_model->setData(index, QString::fromStdString(address)); + + m_model->setData(index, (cr->invite_resp_code < 300 ? + m_pixmapOk : m_pixmapCancel), Qt::DecorationRole); + break; + } + case HISTCOL_SUBJECT: + { + m_model->setData(index, QString::fromStdString(cr->subject)); + break; + } + case HISTCOL_STATUS: + { + m_model->setData(index, QString::fromStdString(cr->invite_resp_reason)); + break; + } + } + } } numberCallsValueTextLabel->setText(QString().setNum(numberOfCalls)); @@ -161,13 +230,9 @@ void HistoryForm::loadHistory() totalDurationValueTextLabel->setText(durationText); // Make the first entry the selected entry. - Q3ListViewItem *first = historyListView->firstChild(); - if (first) { - historyListView->setSelected(first, true); - showCallDetails(first); - } else { - cdrTextEdit->clear(); - } + historyListView->selectRow(0); + + // showCallDetails(first); } // Update history when triggered by a call back function on the user @@ -208,11 +273,12 @@ void HistoryForm::closeEvent( QCloseEvent *e ) QDialog::closeEvent(e); } -void HistoryForm::showCallDetails(Q3ListViewItem *item) +void HistoryForm::showCallDetails(QModelIndex index) { QString s; - t_call_record cr = ((HistoryListViewItem *)item)->get_call_record(); + int x = m_model->data(index, Qt::UserRole).toInt(); + const t_call_record& cr = m_history[x]; cdrTextEdit->clear(); t_user *user_config = phone->ref_user_profile(cr.user_profile); @@ -307,14 +373,15 @@ void HistoryForm::showCallDetails(Q3ListViewItem *item) cdrTextEdit->setText(s); } -void HistoryForm::popupMenu(Q3ListViewItem *item, const QPoint &pos) +void HistoryForm::popupMenu(QPoint pos) { - if (!item) return; - - HistoryListViewItem *histItem = dynamic_cast(item); - if (!histItem) return; + if (!historyListView->selectionModel()->hasSelection()) + return; + + QModelIndex index = historyListView->selectionModel()->currentIndex(); + int x = m_model->data(index, Qt::UserRole).toInt(); - t_call_record cr = histItem->get_call_record(); + const t_call_record& cr = m_history[x]; // An anonymous caller cannot be called bool canCall = !(cr.direction == t_call_record::DIR_IN && @@ -324,12 +391,10 @@ void HistoryForm::popupMenu(Q3ListViewItem *item, const QPoint &pos) histPopupMenu->popup(pos); } -void HistoryForm::call(Q3ListViewItem *item) +void HistoryForm::call(QModelIndex index) { - if (!item) return; - - HistoryListViewItem *histItem = (HistoryListViewItem *)item; - t_call_record cr = histItem->get_call_record(); + int i = m_model->data(index, Qt::UserRole).toInt(); + const t_call_record& cr = m_history[i]; t_user *user_config = phone->ref_user_profile(cr.user_profile); // If the user profile is not active, then use the first profile @@ -368,26 +433,27 @@ void HistoryForm::call(Q3ListViewItem *item) { hide_user = true; } - emit call(user_config, item->text(HISTCOL_FROMTO), subject, hide_user); + emit call(user_config, m_model->data(m_model->index(index.row(), HISTCOL_FROMTO)).toString(), subject, hide_user); } } void HistoryForm::call(void) { - Q3ListViewItem *item = historyListView->currentItem(); - if (item) call(item); + QModelIndex index = historyListView->selectionModel()->currentIndex(); + if (index.isValid()) call(index); } void HistoryForm::deleteEntry(void) { - Q3ListViewItem *item = historyListView->currentItem(); - HistoryListViewItem *histItem = dynamic_cast(item); - if (!histItem) return; + QModelIndex index = historyListView->selectionModel()->currentIndex(); + int i = m_model->data(index, Qt::UserRole).toInt(); + m_model->removeRow(index.row()); - call_history->delete_call_record(histItem->get_call_record().get_id()); + call_history->delete_call_record(m_history[i].get_id()); } void HistoryForm::clearHistory() { call_history->clear(); + m_model->setRowCount(0); } diff --git a/src/gui/historyform.h b/src/gui/historyform.h index 6de4fc5..d6b06c0 100644 --- a/src/gui/historyform.h +++ b/src/gui/historyform.h @@ -1,7 +1,9 @@ #ifndef HISTORYFORM_H #define HISTORYFORM_H #include "phone.h" -#include +#include +#include +#include #include "user.h" #include "ui_historyform.h" @@ -18,9 +20,9 @@ public slots: virtual void update(); virtual void show(); virtual void closeEvent( QCloseEvent * e ); - virtual void showCallDetails( Q3ListViewItem * item ); - virtual void popupMenu( Q3ListViewItem * item, const QPoint & pos ); - virtual void call( Q3ListViewItem * item ); + virtual void showCallDetails( QModelIndex item ); + virtual void popupMenu( QPoint pos ); + virtual void call( QModelIndex index ); virtual void call( void ); virtual void deleteEntry( void ); virtual void clearHistory(); @@ -33,8 +35,12 @@ protected slots: private: time_t timeLastViewed; - Q3PopupMenu *histPopupMenu; + QMenu *histPopupMenu; + QStandardItemModel *m_model; int itemCall; + QPixmap m_pixmapIn, m_pixmapOut; + QPixmap m_pixmapOk, m_pixmapCancel; + QList m_history; void init(); void destroy(); diff --git a/src/gui/historyform.ui b/src/gui/historyform.ui index 68d4edd..c77b3f8 100644 --- a/src/gui/historyform.ui +++ b/src/gui/historyform.ui @@ -1,408 +1,465 @@ - - - - - HistoryForm - - - - 0 - 0 - 872 - 647 - - - - Twinkle - Call History - - - - - - true + + HistoryForm + + + + 0 + 0 + 866 + 641 + + + + Qt::CustomContextMenu + + + Twinkle - Call History + + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + true + + + false + + + + + + + + + Call details + + + + + + Details of the selected call record. - - true + + QTextEdit::AutoAll - - Q3ListView::LastColumn + + true - - - Time - - - true - - - true - - - - - In/Out - - - true - - - true - - - - - From/To - - - true - - - true - - - - - Subject - - - true - - - true - - - - - Status - - - true - - - true - - - - - - - - - - Call details - - - - - - Qt::RichText - - - Q3TextEdit::NoWrap - - - true - - - Q3TextEdit::AutoAll - - - Details of the selected call record. - - - - - - - - - - View - - - - - - &Incoming calls - - - Alt+I - - - Check this option to show incoming calls. - - - - - - - &Outgoing calls - - - Alt+O - - - Check this option to show outgoing calls. - - - - - - - &Answered calls - - - Alt+A - - - Check this option to show answered calls. - - - - - - - &Missed calls - - - Alt+M - - - Check this option to show missed calls. - - - - - - - Current &user profiles only - - - Alt+U - - - Check this option to show only calls associated with this user profile. - - - - - - - - - - - - - - C&lear - - - Alt+L - - - <p>Clear the complete call history.</p> + + + + + + + + + View + + + + + + Check this option to show incoming calls. + + + &Incoming calls + + + Alt+I + + + + + + + Check this option to show outgoing calls. + + + &Outgoing calls + + + Alt+O + + + + + + + Check this option to show answered calls. + + + &Answered calls + + + Alt+A + + + + + + + Check this option to show missed calls. + + + &Missed calls + + + Alt+M + + + + + + + Check this option to show only calls associated with this user profile. + + + Current &user profiles only + + + Alt+U + + + + + + + + + + + + + + <p>Clear the complete call history.</p> <p><b>Note:</b> this will clear <b>all</b> records, also records not shown depending on the checked view options.</p> - - - - - - - - 540 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - Clo&se - - - Alt+S - - - false - - - Close this window. - - - - - - - &Call - - - Alt+C - - - true - - - Call selected address. - - - - - - - - - - - Number of calls: - - - false - - - - - - - ### - - - false - - - - - - - Total call duration: - - - false - - - - - - - ### - - - false - - - - - - - - 460 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - + + + C&lear + + + Alt+L + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 540 + 20 + + + + + + + + Close this window. + + + Clo&se + + + Alt+S + + + false + + + + + + + Call selected address. + + + &Call + + + Alt+C + + + true + + + + + + + + + + + Number of calls: + + + false + + + + + + + ### + + + false + + + + + + + Total call duration: + + + false + + + + + + + ### + + + false + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 460 + 20 + + + + - - - - - historyListView - cdrTextEdit - inCheckBox - outCheckBox - successCheckBox - missedCheckBox - profileCheckBox - clearPushButton - closePushButton - - - user.h - phone.h - q3popupmenu.h - - - - closePushButton - clicked() - HistoryForm - close() - - - historyListView - currentChanged(Q3ListViewItem*) - HistoryForm - showCallDetails(Q3ListViewItem*) - - - inCheckBox - toggled(bool) - HistoryForm - loadHistory() - - - missedCheckBox - toggled(bool) - HistoryForm - loadHistory() - - - outCheckBox - toggled(bool) - HistoryForm - loadHistory() - - - profileCheckBox - toggled(bool) - HistoryForm - loadHistory() - - - successCheckBox - toggled(bool) - HistoryForm - loadHistory() - - - historyListView - rightButtonPressed(Q3ListViewItem*,QPoint,int) - HistoryForm - popupMenu(Q3ListViewItem*,QPoint) - - - historyListView - doubleClicked(Q3ListViewItem*,QPoint,int) - HistoryForm - call(Q3ListViewItem*) - - - clearPushButton - clicked() - HistoryForm - clearHistory() - - - callPushButton - clicked() - HistoryForm - call() - - + + + + + + historyListView + cdrTextEdit + inCheckBox + outCheckBox + successCheckBox + missedCheckBox + profileCheckBox + clearPushButton + closePushButton + + + user.h + phone.h + q3popupmenu.h + + + + + closePushButton + clicked() + HistoryForm + close() + + + 713 + 631 + + + 20 + 20 + + + + + inCheckBox + toggled(bool) + HistoryForm + loadHistory() + + + 689 + 356 + + + 20 + 20 + + + + + missedCheckBox + toggled(bool) + HistoryForm + loadHistory() + + + 689 + 494 + + + 20 + 20 + + + + + outCheckBox + toggled(bool) + HistoryForm + loadHistory() + + + 689 + 402 + + + 20 + 20 + + + + + profileCheckBox + toggled(bool) + HistoryForm + loadHistory() + + + 689 + 540 + + + 20 + 20 + + + + + successCheckBox + toggled(bool) + HistoryForm + loadHistory() + + + 689 + 448 + + + 20 + 20 + + + + + clearPushButton + clicked() + HistoryForm + clearHistory() + + + 27 + 631 + + + 20 + 20 + + + + + callPushButton + clicked() + HistoryForm + call() + + + 799 + 631 + + + 20 + 20 + + + + + historyListView + doubleClicked(QModelIndex) + HistoryForm + call(QModelIndex) + + + 827 + 91 + + + 862 + 300 + + + + + historyListView + customContextMenuRequested(QPoint) + HistoryForm + popupMenu(QPoint) + + + 819 + 45 + + + 858 + 290 + + + + + historyListView + activated(QModelIndex) + HistoryForm + showCallDetails(QModelIndex) + + + 743 + 238 + + + 658 + 300 + + + + + + call(QModelIndex) + popupMenu(QPoint) + showCallDetails(QModelIndex) + diff --git a/src/gui/historylistview.cpp b/src/gui/historylistview.cpp deleted file mode 100644 index 666f3ac..0000000 --- a/src/gui/historylistview.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - Copyright (C) 2005-2009 Michel de Boer - - 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. - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#include "historylistview.h" -#include "util.h" -#include "userintf.h" - -#include "qpixmap.h" -//Added by qt3to4: -#include - -HistoryListViewItem::HistoryListViewItem( Q3ListView * parent, const t_call_record &cr, t_user *user_config, time_t _last_viewed) : - Q3ListViewItem(parent, - time2str(cr.time_start, "%d %b %Y %H:%M:%S").c_str(), - cr.get_direction().c_str(), - (cr.direction == t_call_record::DIR_IN ? - ui->format_sip_address(user_config, - cr.from_display, cr.from_uri).c_str() : - ui->format_sip_address(user_config, - cr.to_display, cr.to_uri).c_str()), - cr.subject.c_str(), - cr.invite_resp_reason.c_str()) -{ - call_record = cr; - last_viewed = _last_viewed; - - // Set direction icon - setPixmap(HISTCOL_DIRECTION, (cr.direction == t_call_record::DIR_IN ? - QPixmap(":/icons/images/1leftarrow-yellow.png") : - QPixmap(":/icons/images/1rightarrow.png"))); - - // Set status icon - setPixmap(HISTCOL_STATUS, (cr.invite_resp_code < 300 ? - QPixmap(":/icons/images/ok.png") : - QPixmap(":/icons/images/cancel.png"))); -} - -void HistoryListViewItem::paintCell(QPainter *painter, const QColorGroup &cg, - int column, int width, int align) -{ - painter->save(); - QColorGroup grp(cg); - if (call_record.time_start > last_viewed && - call_record.rel_cause == t_call_record::CS_FAILURE && - call_record.direction == t_call_record::DIR_IN) - { - // Highlight missed calls since last view - grp.setColor(QColorGroup::Base, QColor("yellow")); - } - Q3ListViewItem::paintCell(painter, grp, column, width, align); - painter->restore(); -} - -int HistoryListViewItem::compare ( Q3ListViewItem * i, int col, bool ascending ) const -{ - if (col != HISTCOL_TIMESTAMP) { - return Q3ListViewItem::compare(i, col, ascending); - } - if (call_record.time_start < ((HistoryListViewItem *)i)->get_time_start()) { - return -1; - } - if (call_record.time_start == ((HistoryListViewItem *)i)->get_time_start()) { - return 0; - } - return 1; -} - -time_t HistoryListViewItem::get_time_start(void) const -{ - return call_record.time_start; -} - -t_call_record HistoryListViewItem::get_call_record(void) const -{ - return call_record; -} diff --git a/src/gui/historylistview.h b/src/gui/historylistview.h deleted file mode 100644 index af1b5ce..0000000 --- a/src/gui/historylistview.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - Copyright (C) 2005-2009 Michel de Boer - - 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. - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef _HISTORYLISTVIEW_H -#define _HISTORYLISTVIEW_H - -#include -#include "q3listview.h" -#include "qpainter.h" -#include "call_history.h" -#include "user.h" - -// Columns of the history list view -#define HISTCOL_TIMESTAMP 0 -#define HISTCOL_DIRECTION 1 -#define HISTCOL_FROMTO 2 -#define HISTCOL_SUBJECT 3 -#define HISTCOL_STATUS 4 - -class HistoryListViewItem : public Q3ListViewItem { -private: - t_call_record call_record; - time_t last_viewed; - -public: - HistoryListViewItem( Q3ListView * parent, const t_call_record &cr, t_user *user_config, - time_t _last_viewed); - - void paintCell(QPainter *painter, const QColorGroup &cg, - int column, int width, int align); - int compare ( Q3ListViewItem * i, int col, bool ascending ) const; - time_t get_time_start(void) const; - t_call_record get_call_record(void) const; -}; - -#endif - diff --git a/src/sys_settings.cpp b/src/sys_settings.cpp index 9a9ee11..cebd5c4 100644 --- a/src/sys_settings.cpp +++ b/src/sys_settings.cpp @@ -981,7 +981,7 @@ string t_sys_settings::about(bool html) const { if (html) s += "
"; s += "\n"; - s += "Copyright (C) 2005-2009 "; + s += "Copyright (C) 2005-2015 "; s += PRODUCT_AUTHOR; if (html) s += "
"; s += "\n"; diff --git a/src/userintf.h b/src/userintf.h index f29ce68..fc45866 100644 --- a/src/userintf.h +++ b/src/userintf.h @@ -35,7 +35,7 @@ #include "twinkle_config.h" #define PRODUCT_DATE VERSION_DATE -#define PRODUCT_AUTHOR "Michel de Boer" +#define PRODUCT_AUTHOR "Michel de Boer and contributors" // Tone definitions // The intervals indicate the length of silence between repetitions -- cgit v1.2.3