Subversion Repositories Scribus

Rev

Rev 23820 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
1209 cbradney 7
/***************************************************************************
23017 craig 8
        begin                : Jan 2005
9
        copyright            : (C) 2005 by Craig Bradney
10
        email                : cbradney@zip.com.au
1209 cbradney 11
 ***************************************************************************/
12
 
13
/***************************************************************************
14
 *                                                                         *
15
 *   This program is free software; you can redistribute it and/or modify  *
16
 *   it under the terms of the GNU General Public License as published by  *
17
 *   the Free Software Foundation; either version 2 of the License, or     *
18
 *   (at your option) any later version.                                   *
19
 *                                                                         *
20
 ***************************************************************************/
18533 craig 21
 
22
#include <QDebug>
9768 cbradney 23
#include <QObject>
24
#include <QMetaObject>
25
#include <QMenu>
26
#include <QList>
1209 cbradney 27
#include "scmenu.h"
28
#include "scraction.h"
19271 craig 29
#include "util_debug.h"
20185 craig 30
#include "iconmanager.h"
1209 cbradney 31
 
10228 avox 32
 
22635 craig 33
ScrPopupMenu::ScrPopupMenu ( QWidget * parent, const QString& pMenuName, const QString& pMenuText, const QString& parentName, bool pCheckable ) : QObject(parent)
1209 cbradney 34
{
35
        parentMenuName=parentName;
2178 cbradney 36
        parentMenuID=-1;
1209 cbradney 37
        menuText=pMenuText;
38
        menuName=pMenuName;
39
        menuBarID=-1;
40
        menuItemList.clear();
9768 cbradney 41
        localPopupMenu=new QMenu(parent);//, name);
3584 avox 42
//      localPopupMenu->setCheckable(pCheckable);
1209 cbradney 43
        enabled=true;
3580 avox 44
        checkable = pCheckable;
1209 cbradney 45
}
46
 
47
ScrPopupMenu::~ScrPopupMenu()
48
{
49
        delete localPopupMenu;
50
}
51
 
23820 craig 52
QString ScrPopupMenu::getMenuText()
1209 cbradney 53
{
54
        return menuText;
55
}
56
 
22635 craig 57
void ScrPopupMenu::setText(const QString& pMenuText)
2178 cbradney 58
{
59
        menuText=pMenuText;
10687 cbradney 60
        localPopupMenu->menuAction()->setText(menuText);
2178 cbradney 61
}
62
 
23820 craig 63
QIcon ScrPopupMenu::getMenuIcon()
3552 avox 64
{
65
        return menuIcon;
66
}
67
 
22635 craig 68
void ScrPopupMenu::setMenuIcon(const QIcon& pMenuIcon)
3552 avox 69
{
70
        menuIcon=pMenuIcon;
71
}
72
 
23820 craig 73
QString ScrPopupMenu::getMenuName()
1478 cbradney 74
{
75
        return menuName;
76
}
77
 
23820 craig 78
QString ScrPopupMenu::getParentMenuName()
2178 cbradney 79
{
80
        return parentMenuName;
81
}
82
 
10558 cbradney 83
// void ScrPopupMenu::setMenuBarID(int id)
84
// {
85
//      menuBarID=id;
86
// }
23017 craig 87
//
10558 cbradney 88
// int ScrPopupMenu::getMenuBarID()
89
// {
90
//      return menuBarID;
91
// }
1209 cbradney 92
 
9768 cbradney 93
QMenu *ScrPopupMenu::getLocalPopupMenu()
1209 cbradney 94
{
95
        return localPopupMenu;
96
}
97
 
1478 cbradney 98
bool ScrPopupMenu::hasSubMenu(ScrPopupMenu* subMenu)
99
{
8501 cbradney 100
        return menuItemList.contains(QPointer<QObject>(subMenu));
1478 cbradney 101
}
102
 
10575 cbradney 103
// void ScrPopupMenu::setParentMenuID(int id)
104
// {
105
//      parentMenuID=id;
106
// }
23017 craig 107
//
108
//
10575 cbradney 109
// const int ScrPopupMenu::getParentMenuID()
110
// {
111
//      return parentMenuID;
112
// }
2178 cbradney 113
 
1209 cbradney 114
bool ScrPopupMenu::insertSubMenu(ScrPopupMenu* newSubMenu)
115
{
1227 cbradney 116
        if (newSubMenu)
117
        {
118
                menuItemList.append(newSubMenu);
10581 cbradney 119
//              localPopupMenu->insertItem(newSubMenu->getMenuIcon(), newSubMenu->getMenuText(), newSubMenu->getLocalPopupMenu());
120
                QAction *m=localPopupMenu->addMenu(newSubMenu->getLocalPopupMenu());
121
                if (m)
122
                        m->setText(newSubMenu->getMenuText());
1227 cbradney 123
                return true;
124
        }
22638 craig 125
        return false;
1209 cbradney 126
}
127
 
128
bool ScrPopupMenu::removeSubMenu(ScrPopupMenu* subMenu)
129
{
10581 cbradney 130
        if (menuItemList.removeAll(subMenu))
1209 cbradney 131
        {
132
                repopulateLocalMenu();
133
                return true;
134
        }
135
        return false;
136
}
137
 
138
bool ScrPopupMenu::insertMenuItem(ScrAction *newMenuAction)
139
{
1227 cbradney 140
        if (newMenuAction)
141
        {
18438 craig 142
 
18204 fschmid 143
#ifdef Q_OS_MAC
3914 avox 144
                bool menuListHasNoIcons = true;
3587 avox 145
                // look for ScrAction or ScrPopupMenu from the end of the list
17936 craig 146
//              QList< QPointer<QObject> >::Iterator it = menuItemList.end();
18533 craig 147
                int s=menuItemList.size()-1;
9777 cbradney 148
                for (int i=s; i>=0; --i) {
149
                        QObject* menuItem = menuItemList[i];
10760 cbradney 150
                        QString menuItemListClassName = menuItemList[i]->metaObject()->className();
3587 avox 151
                        if (menuItemListClassName == "ScrAction")
152
                        {
24137 craig 153
                                ScrAction * act = qobject_cast<ScrAction *>(menuItem);
22517 craig 154
                                if (act!=nullptr)
10760 cbradney 155
                                        menuListHasNoIcons = act->icon().isNull();
3587 avox 156
                                break;
157
                        }
22638 craig 158
                        if (menuItemListClassName == "ScrPopupMenu")
3587 avox 159
                        {
24137 craig 160
                                ScrPopupMenu * men = qobject_cast<ScrPopupMenu *>(menuItem);
22517 craig 161
                                if (men!=nullptr)
9788 cbradney 162
                                        menuListHasNoIcons = men->getMenuIcon().isNull();
3587 avox 163
                                break;
164
                        }
165
                }
10760 cbradney 166
                if (newMenuAction->icon().isNull() && ! menuListHasNoIcons)
23054 craig 167
                        newMenuAction->setIcon(IconManager::instance().loadIcon("noicon.png"));
3587 avox 168
#endif
18438 craig 169
 
1227 cbradney 170
                menuItemList.append(newMenuAction);
9800 cbradney 171
                localPopupMenu->addAction(newMenuAction);
1227 cbradney 172
                return true;
173
        }
22638 craig 174
        return false;
1209 cbradney 175
}
176
 
8586 cbradney 177
/* Qt4
1236 cbradney 178
bool ScrPopupMenu::insertMenuItem(QWidget *widget)
179
{
180
        if (widget)
181
        {
22517 craig 182
                ScrAction *widgetAction = new ScrAction( nullptr, "widget_action" );
1236 cbradney 183
                menuItemList.append(widgetAction);
184
                localPopupMenu->insertItem(widget);
185
                return true;
186
        }
23017 craig 187
        else
1236 cbradney 188
                return false;
189
}
8586 cbradney 190
*/
1236 cbradney 191
 
1209 cbradney 192
bool ScrPopupMenu::insertMenuItemAfter(ScrAction *newMenuAction, ScrAction *afterMenuAction)
193
{
194
        //Allow duplicate menu items ???
195
        //if (menuItemList.findRef(newMenuAction)!=-1)
196
        //      return false;
23017 craig 197
 
18204 fschmid 198
#ifdef Q_OS_MAC
16035 craig 199
        if (newMenuAction && afterMenuAction)
200
                if (newMenuAction->icon().isNull() && ! (afterMenuAction->icon().isNull()))
23054 craig 201
                        newMenuAction->setIcon(IconManager::instance().loadIcon("noicon.png"));
3580 avox 202
#endif
23017 craig 203
 
10581 cbradney 204
        int pos=menuItemList.indexOf(QPointer<QObject>(afterMenuAction));
205
        menuItemList.insert(++pos, QPointer<QObject>(newMenuAction));
1478 cbradney 206
        /*
1209 cbradney 207
        if (index==-1)
208
                return false;
209
        int newIndex=++index;
210
        bool insSuccess=menuItemList.insert(newIndex, newMenuAction);
1478 cbradney 211
 
1209 cbradney 212
        if (!insSuccess)
213
                return false;
1478 cbradney 214
        */
1209 cbradney 215
        return repopulateLocalMenu();
216
}
217
 
218
bool ScrPopupMenu::removeMenuItem(ScrAction *menuAction)
219
{
10581 cbradney 220
        if (menuItemList.removeAll(menuAction))
1209 cbradney 221
        {
222
                repopulateLocalMenu();
223
                return true;
224
        }
225
        return false;
226
}
227
/*
228
bool ScrPopupMenu::insertMenuItemAfter(ScrAction *newMenuAction, const QString afterMenuName)
229
{
230
        bool retVal=true;
231
        bool found=false;
232
        QPtrListIterator<QObject> menuItemListIt(menuItemList);
233
        QObject *object;
23017 craig 234
        while ( (object = menuItemListIt.current()) != 0  )
1209 cbradney 235
        {
236
                QString menuItemListClassName=object->className();
237
                int index=-1;
238
                //index=menuItemListIt.at();
239
                if (index=-1)
240
                {
241
                        retVal=false;
242
                        break;
243
                }
244
                if (menuItemListClassName=="ScrAction")
245
                {
246
                        qDebug("ScrAction found");
247
                        if(QString(object->name())==QString("separator_action"))
248
                                bool blah=true;//localPopupMenu->insertSeparator();
249
                        else
250
                        {
251
                                //Grab the action from the list, break and call the other after insert function
23017 craig 252
 
1209 cbradney 253
                                int newIndex=++index;
254
                                bool insSuccess=menuItemList.insert(newIndex, newMenuAction);
255
                                if (!insSuccess)
256
                                        return false;
23017 craig 257
 
1209 cbradney 258
                        }
259
                }
260
        }
261
        if (!found)
262
                return false;
263
        if (retVal==false)
264
                return false;
23017 craig 265
 
1209 cbradney 266
        return repopulateLocalMenu();
267
}
268
*/
1236 cbradney 269
 
270
//CB TODO Does NOT handle rebuilding with widgets
1209 cbradney 271
bool ScrPopupMenu::repopulateLocalMenu()
272
{
273
        localPopupMenu->clear();
9768 cbradney 274
        QList< QPointer<QObject> >::Iterator menuItemListIt = menuItemList.begin();
1493 cbradney 275
        while (menuItemListIt!=menuItemList.end())
1209 cbradney 276
        {
1478 cbradney 277
                QObject *listObj=(*menuItemListIt);
22517 craig 278
                if (listObj==nullptr)
1478 cbradney 279
                {
9768 cbradney 280
                        QList< QPointer<QObject> >::Iterator menuItemListItToDelete = menuItemListIt;
1493 cbradney 281
                        ++menuItemListIt;
10581 cbradney 282
                        menuItemList.removeAll(*menuItemListItToDelete);
1478 cbradney 283
                        continue;
284
                }
18438 craig 285
 
10581 cbradney 286
                QString menuItemListClassName=listObj->metaObject()->className();
1209 cbradney 287
                if (menuItemListClassName=="ScrAction")
288
                {
24137 craig 289
                        ScrAction * act = qobject_cast<ScrAction *>(listObj);
22517 craig 290
                        if (act!=nullptr)
9883 cbradney 291
                                localPopupMenu->addAction(act);
1209 cbradney 292
                }
23017 craig 293
                else
1478 cbradney 294
                {
295
                        if (menuItemListClassName=="ScrPopupMenu")
1209 cbradney 296
                        {
24137 craig 297
                                ScrPopupMenu * men = qobject_cast<ScrPopupMenu *>(listObj);
22517 craig 298
                                if (men!=nullptr)
10581 cbradney 299
                                {
18533 craig 300
                                        //qDebug()<<men->localPopupMenu->title()<<men->localPopupMenu->;
10581 cbradney 301
//                                      localPopupMenu->insertItem(men->getMenuIcon(), men->getMenuText(), men->getLocalPopupMenu());
302
                                        QAction *m=localPopupMenu->addMenu(men->getLocalPopupMenu());
303
                                        if (m)
304
                                                m->setText(men->getMenuText());
305
                                }
1209 cbradney 306
                        }
307
                        else
10581 cbradney 308
                                sDebug(QString("Alien found: %1").arg((*menuItemListIt)->metaObject()->className()));
1478 cbradney 309
                }
1493 cbradney 310
                ++menuItemListIt;
1209 cbradney 311
        }
312
        return true;
313
}
314
 
1437 cbradney 315
bool ScrPopupMenu::generateEntryList(QStringList *actNames)
316
{
9768 cbradney 317
        QList< QPointer<QObject> >::Iterator menuItemListIt = menuItemList.begin();
1493 cbradney 318
        while (menuItemListIt!=menuItemList.end())
1437 cbradney 319
        {
1478 cbradney 320
                QObject *listObj=(*menuItemListIt);
22517 craig 321
                if (listObj==nullptr)
1478 cbradney 322
                {
9768 cbradney 323
                        QList< QPointer<QObject> >::Iterator menuItemListItToDelete = menuItemListIt;
1493 cbradney 324
                        ++menuItemListIt;
10581 cbradney 325
                        menuItemList.removeAll(*menuItemListItToDelete);
1478 cbradney 326
                        continue;
327
                }
23017 craig 328
 
10581 cbradney 329
                QString menuItemListClassName=listObj->metaObject()->className();
1437 cbradney 330
                if (menuItemListClassName=="ScrAction")
331
                {
24137 craig 332
                        auto *sca=qobject_cast<ScrAction *>(listObj);
22517 craig 333
                        if (sca!=nullptr)
10581 cbradney 334
                                actNames->append(sca->objectName());
1437 cbradney 335
                }
22638 craig 336
                else
337
                        if (menuItemListClassName=="ScrPopupMenu")
338
                        {
24137 craig 339
                                auto *scp=qobject_cast<ScrPopupMenu *>(listObj);
22638 craig 340
                                if (scp!=nullptr)
341
                                        scp->generateEntryList(actNames);
342
                        }
1493 cbradney 343
                ++menuItemListIt;
1437 cbradney 344
        }
345
        return true;
23017 craig 346
 
1437 cbradney 347
}
348
 
1209 cbradney 349
bool ScrPopupMenu::clear()
350
{
351
        menuItemList.clear(); //CB TODO leaking separators here ?
352
        localPopupMenu->clear();
1437 cbradney 353
        return true;
1209 cbradney 354
}
355
 
356
bool ScrPopupMenu::insertMenuSeparator()
357
{
22517 craig 358
        ScrAction *sepAction = new ScrAction( nullptr );
9857 cbradney 359
        sepAction->setSeparator(true);
1209 cbradney 360
        menuItemList.append(sepAction);
10581 cbradney 361
        localPopupMenu->addSeparator();
1209 cbradney 362
        return true;
363
}
364
 
365
void ScrPopupMenu::setEnabled(bool menuEnabled)
366
{
367
        enabled=menuEnabled;
368
        localPopupMenu->setEnabled(enabled);
369
}
4522 cbradney 370
 
371
void ScrPopupMenu::setParentMenuName(const QString& newParentMenuName)
372
{
373
        if (!parentMenuName.isEmpty())
374
                parentMenuName=newParentMenuName;
4695 cbradney 375
}