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