| 246 | } |
| 247 | |
| 248 | void TWUtils::updateRecentFileActions(QObject *parent, QList<QAction*> &actions, QMenu *menu, QAction * clearAction) /* static */ |
| 249 | { |
| 250 | Tw::Settings settings; |
| 251 | QStringList fileList, labelList; |
| 252 | if (settings.contains(QString::fromLatin1("recentFiles"))) { |
| 253 | QList<QVariant> files = settings.value(QString::fromLatin1("recentFiles")).toList(); |
| 254 | foreach (const QVariant& v, files) { |
| 255 | QMap<QString,QVariant> map = v.toMap(); |
| 256 | if (map.contains(QString::fromLatin1("path"))) |
| 257 | fileList.append(map.value(QString::fromLatin1("path")).toString()); |
| 258 | } |
| 259 | } |
| 260 | else { |
| 261 | // check for an old "recentFilesList" entry, and migrate it |
| 262 | if (settings.contains(QString::fromLatin1("recentFileList"))) { |
| 263 | fileList = settings.value(QString::fromLatin1("recentFileList")).toStringList(); |
| 264 | QList<QVariant> files; |
| 265 | foreach (const QString& path, fileList) { |
| 266 | QMap<QString,QVariant> map; |
| 267 | map.insert(QString::fromLatin1("path"), path); |
| 268 | files.append(QVariant(map)); |
| 269 | } |
| 270 | settings.remove(QString::fromLatin1("recentFileList")); |
| 271 | settings.setValue(QString::fromLatin1("recentFiles"), files); |
| 272 | } |
| 273 | } |
| 274 | |
| 275 | // Generate label list (list of filenames without directory components) |
| 276 | labelList = Tw::Utils::WindowManager::constructUniqueFileLabels(fileList); |
| 277 | |
| 278 | QStringList::size_type numRecentFiles = fileList.size(); |
| 279 | |
| 280 | foreach(QAction * sep, menu->actions()) { |
| 281 | if (sep->isSeparator()) |
| 282 | delete sep; |
| 283 | } |
| 284 | |
| 285 | while (actions.size() < numRecentFiles) { |
| 286 | QAction *act = new QAction(parent); |
| 287 | act->setVisible(false); |
| 288 | QObject::connect(act, &QAction::triggered, TWApp::instance(), &TWApp::openRecentFile); |
| 289 | actions.append(act); |
| 290 | menu->insertAction(clearAction, act); |
| 291 | } |
| 292 | |
| 293 | while (actions.size() > numRecentFiles) { |
| 294 | QAction *act = actions.takeLast(); |
| 295 | delete act; |
| 296 | } |
| 297 | |
| 298 | for (QStringList::size_type i = 0; i < numRecentFiles; ++i) { |
| 299 | // a "&" inside a menu label is considered a mnemonic, thus, we need to escape them |
| 300 | labelList[i].replace(QString::fromLatin1("&"), QString::fromLatin1("&&")); |
| 301 | |
| 302 | actions[i]->setText(QDir::toNativeSeparators(labelList[i])); |
| 303 | actions[i]->setData(fileList[i]); |
| 304 | actions[i]->setToolTip(QDir::toNativeSeparators(fileList[i])); |
| 305 | actions[i]->setVisible(true); |