1 //////////////////////////////////////////////////////////////////////
2 //
3 // BeeBEEP Copyright (C) 2010-2021 Marco Mastroddi
4 //
5 // BeeBEEP is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published
7 // by the Free Software Foundation, either version 3 of the License,
8 // or (at your option) any later version.
9 //
10 // BeeBEEP is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with BeeBEEP. If not, see <http://www.gnu.org/licenses/>.
17 //
18 // Author: Marco Mastroddi <marco.mastroddi(AT)gmail.com>
19 //
20 // $Id: GuiPresetMessageList.cpp 1455 2020-12-23 10:17:53Z mastroddi $
21 //
22 //////////////////////////////////////////////////////////////////////
23 
24 #include "GuiConfig.h"
25 #include "GuiPresetMessageList.h"
26 #include "IconManager.h"
27 #include "Settings.h"
28 
29 
GuiPresetMessageList(QWidget * parent)30 GuiPresetMessageList::GuiPresetMessageList( QWidget* parent )
31   : QTreeWidget( parent )
32 {
33   setObjectName( "GuiPresetMessageList" );
34 
35   setColumnCount( 1 );
36   header()->hide();
37   setRootIsDecorated( false );
38   setSortingEnabled( true );
39 
40   setContextMenuPolicy( Qt::CustomContextMenu );
41   setMouseTracking( true );
42   setSelectionMode( QAbstractItemView::SingleSelection );
43   setAlternatingRowColors( true );
44 
45   mp_actNew = new QAction( IconManager::instance().icon( "preset-message.png" ), tr( "New" ), this );
46   mp_actEdit = new QAction( IconManager::instance().icon( "preset-message-edit.png" ), tr( "Edit" ), this );
47   mp_actRename = new QAction( IconManager::instance().icon( "preset-message-edit.png" ), tr( "Rename" ), this );
48   mp_actRemove = new QAction( IconManager::instance().icon( "preset-message-remove.png" ), tr( "Delete" ), this );
49 
50   setToolTip( tr( "Right click on panel to create a new preset message" ) );
51 
52   connect( this, SIGNAL( customContextMenuRequested( const QPoint& ) ), this, SLOT( showContextMenu( const QPoint& ) ) );
53   connect( this, SIGNAL( itemDoubleClicked( QTreeWidgetItem*, int ) ), this, SLOT( onDoubleClicked( QTreeWidgetItem*, int ) ), Qt::QueuedConnection );
54 }
55 
sizeHint() const56 QSize GuiPresetMessageList::sizeHint() const
57 {
58   return QSize( BEE_DOCK_WIDGET_SIZE_HINT_WIDTH, BEE_DOCK_WIDGET_SIZE_HINT_HEIGHT_SMALL );
59 }
60 
loadFromSettings()61 void GuiPresetMessageList::loadFromSettings()
62 {
63   if( topLevelItemCount() > 0 )
64     clear();
65 
66   const QMap<QString,QVariant>& preset_messages = Settings::instance().presetMessages();
67   if( preset_messages.isEmpty() )
68     return;
69 
70   QMap<QString,QVariant>::const_iterator it = preset_messages.constBegin();
71   while( it != preset_messages.constEnd() )
72   {
73     QTreeWidgetItem* item = new QTreeWidgetItem( this );
74     if( it.key().isEmpty() )
75       item->setText( 0, it.value().toString() );
76     else
77       item->setText( 0, it.key() );
78     item->setData( 0, Qt::UserRole+1, it.key() );
79     item->setData( 0, Qt::UserRole+2, it.value() );
80     item->setToolTip( 0, it.value().toString() );
81     item->setTextAlignment( 0, Qt::AlignCenter );
82     ++it;
83   }
84 }
85 
onDoubleClicked(QTreeWidgetItem * item,int)86 void GuiPresetMessageList::onDoubleClicked( QTreeWidgetItem* item, int )
87 {
88   if( item )
89     emit presetMessageSelected( item->data( 0, Qt::UserRole+2 ).toString() );
90 }
91 
showContextMenu(const QPoint & p)92 void GuiPresetMessageList::showContextMenu( const QPoint& p )
93 {
94   QMenu* menu = new QMenu( this );
95   QTreeWidgetItem* item = itemAt( p );
96   if( item )
97   {
98     menu->addAction( mp_actRename );
99     menu->addSeparator();
100     menu->addAction( mp_actEdit );
101     menu->addSeparator();
102     menu->addAction( mp_actRemove );
103   }
104   else
105   {
106     menu->addAction( mp_actNew );
107     clearSelection();
108   }
109 
110   QAction* ret_act = menu->exec( QCursor::pos() );
111   if( !ret_act )
112     return;
113 
114   if( ret_act == mp_actRename )
115     onRename( item );
116   else if( ret_act == mp_actEdit )
117     onEdit( item );
118   else if( ret_act == mp_actRemove )
119     onRemove( item );
120   else
121     onNew();
122 }
123 
savePreset(const QString & preset_key,const QString & preset_value)124 void GuiPresetMessageList::savePreset( const QString& preset_key, const QString& preset_value )
125 {
126   QMap<QString,QVariant> preset_messages = Settings::instance().presetMessages();
127   preset_messages.insert( preset_key, preset_value );
128   Settings::instance().setPresetMessages( preset_messages );
129 }
130 
removePreset(const QString & preset_key)131 void GuiPresetMessageList::removePreset( const QString& preset_key )
132 {
133   QMap<QString,QVariant> preset_messages = Settings::instance().presetMessages();
134   preset_messages.remove( preset_key );
135   Settings::instance().setPresetMessages( preset_messages );
136 }
137 
onNew()138 void GuiPresetMessageList::onNew()
139 {
140 #if QT_VERSION >= 0x050200
141   QString new_preset = QInputDialog::getMultiLineText( this, Settings::instance().programName(),
142                                                        tr( "Please insert your new preset message." ),
143                                                        QString( "" ) );
144 #else
145   QString new_preset = QInputDialog::getText( this, Settings::instance().programName(),
146                                               tr( "Please insert your new preset message." ),
147                                               QLineEdit::Normal, QString( "" ) );
148 #endif
149 
150   if( new_preset.simplified().isEmpty() )
151     return;
152 
153   savePreset( new_preset, new_preset );
154   loadFromSettings();
155   Settings::instance().save();
156 }
157 
onEdit(QTreeWidgetItem * item)158 void GuiPresetMessageList::onEdit( QTreeWidgetItem* item )
159 {
160   if( !item )
161     return;
162 #if QT_VERSION >= 0x050200
163   QString edit_preset = QInputDialog::getMultiLineText( this, Settings::instance().programName(),
164                                                         tr( "Edit your preset message." ),
165                                                         item->data( 0, Qt::UserRole+2 ).toString() );
166 #else
167   QString edit_preset = QInputDialog::getText( this, Settings::instance().programName(),
168                                                tr( "Edit your preset message." ),
169                                                QLineEdit::Normal, item->data( 0, Qt::UserRole+2 ).toString() );
170 #endif
171 
172   if( edit_preset.simplified().isEmpty() )
173     return;
174 
175   savePreset( item->data( 0, Qt::UserRole+1 ).toString(), edit_preset );
176   loadFromSettings();
177   Settings::instance().save();
178 }
179 
onRename(QTreeWidgetItem * item)180 void GuiPresetMessageList::onRename( QTreeWidgetItem* item )
181 {
182   if( !item )
183     return;
184   QString edit_preset_key = QInputDialog::getText( this, Settings::instance().programName(),
185                                                           tr( "Edit the name of your preset message." ), QLineEdit::Normal,
186                                                           item->data( 0, Qt::UserRole+1 ).toString() );
187 
188   if( edit_preset_key.simplified().isEmpty() )
189     return;
190 
191   removePreset( item->data( 0, Qt::UserRole+1 ).toString() );
192   savePreset( edit_preset_key.simplified(), item->data( 0, Qt::UserRole+2 ).toString() );
193   loadFromSettings();
194   Settings::instance().save();
195 }
196 
onRemove(QTreeWidgetItem * item)197 void GuiPresetMessageList::onRemove( QTreeWidgetItem* item )
198 {
199   if( !item )
200     return;
201   if( QMessageBox::question( this, Settings::instance().programName(), tr( "Do you want to delete this preset?" ),
202                              tr( "Yes" ), tr( "No" ), QString(), 1, 1 ) != 0 )
203     return;
204 
205   removePreset( item->data( 0, Qt::UserRole+1 ).toString() );
206   loadFromSettings();
207   Settings::instance().save();
208 }
209