RabbitCommon v2.2.6
Loading...
Searching...
No Matches
RabbitRecentMenu.cpp
1// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2// Author Kang Lin <kl222@126.com>
3
4#include "RabbitRecentMenu.h"
5
6#include <QFileInfo>
7#include <QSettings>
8
9#include "RabbitCommonDir.h"
10
11namespace RabbitCommon {
12
13static const qint32 RecentFilesMenuMagic = 0xff;
14
15CRecentMenu::CRecentMenu(QWidget * parent)
16 : QMenu(parent),
17 m_maxCount(10),
18 m_format(QLatin1String("%d %s")),
19 m_DisableSaveState(false),
20 m_bUpdate(true)
21{
22 bool check = connect(this, SIGNAL(triggered(QAction*)),
23 this, SLOT(menuTriggered(QAction*)));
24 Q_ASSERT(check);
25 check = connect(this, SIGNAL(aboutToShow()),
26 this, SLOT(updateRecentFileActions()));
27 Q_ASSERT(check);
28 check = connect(this, SIGNAL(sigSaveState()), this, SLOT(slotSaveState()));
29 Q_ASSERT(check);
30
31 setMaxCount(m_maxCount);
32 if(!m_DisableSaveState)
33 {
34 QSettings settings(
35 RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
36 QSettings::IniFormat);
37 restoreState(settings.value("RecentOpen").toByteArray());
38 }
39}
40
41CRecentMenu::CRecentMenu(const QString & title, QWidget * parent)
42 : CRecentMenu(parent)
43{
44 setTitle(title);
45}
46
47CRecentMenu::CRecentMenu(const QString& title, const QIcon& icon, QWidget * parent)
48 : CRecentMenu(title, parent)
49{
50 setIcon(icon);
51}
52
53void CRecentMenu::addRecentFile(const QString &fileName, const QString &title)
54{
55 _Content content(title, fileName);
56
57 m_OpenContent.removeAll(content);
58 m_OpenContent.prepend(content);
59
60 while (m_OpenContent.size() > maxCount())
61 m_OpenContent.removeLast();
62
63 m_bUpdate = true;
64
65 emit sigSaveState();
66}
67
69{
70 m_OpenContent.clear();
71 m_bUpdate = true;
72 emit sigSaveState();
73}
74
76{
77 if(m_maxCount == count) return;
78 m_maxCount = count;
79 m_bUpdate = true;
80 emit sigSaveState();
81}
82
83int CRecentMenu::maxCount() const
84{
85 return m_maxCount;
86}
87
88void CRecentMenu::setFormat(const QString &format)
89{
90 if (m_format == format) return;
91 m_format = format;
92 m_bUpdate = true;
93 emit sigSaveState();
94}
95
96const QString& CRecentMenu::format() const
97{
98 return m_format;
99}
100
102{
103 m_DisableSaveState = disable;
104 return true;
105}
106
107QByteArray CRecentMenu::saveState() const
108{
109 //TODO: modify version when modify save data
110 int version = 1;
111 QByteArray data;
112 QDataStream stream(&data, QIODevice::WriteOnly);
113
114 stream << qint32(RecentFilesMenuMagic);
115 stream << qint32(version);
116 stream << m_format;
117 stream << m_maxCount;
118 stream << m_OpenContent;
119
120 return data;
121}
122
123bool CRecentMenu::restoreState(const QByteArray &state)
124{
125 QByteArray sd = state;
126 QDataStream stream(&sd, QIODevice::ReadOnly);
127 qint32 magic;
128 qint32 version = 1; //TODO: modify version when modify save data
129
130 stream >> magic;
131 stream >> version;
132 if (magic != RecentFilesMenuMagic)
133 return false;
134
135 //TODO: modify version when modify save data
136 if(version >= 1) {
137 stream >> m_format;
138 stream >> m_maxCount;
139 }
140
141 stream >> m_OpenContent;
142
143 m_bUpdate = true;
144
145 return true;
146}
147
148void CRecentMenu::menuTriggered(QAction* action)
149{
150 if (action->data().isValid())
151 emit recentFileTriggered(action->data().toString());
152}
153
154void CRecentMenu::updateRecentFileActions()
155{
156 if(!m_bUpdate) return;
157
158 int numRecentFiles = qMin(m_OpenContent.size(), maxCount());
159
160 clear();
161
162 for (int i = 0; i < numRecentFiles; ++i) {
163 QString szdName = m_OpenContent[i].m_szTitle;
164 QString szFile = m_OpenContent[i].m_szFile;
165 if(szdName.isEmpty())
166 szdName = QFileInfo(szFile).fileName();
167
168 QString text = m_format;
169 text.replace(QLatin1String("%d"), QString::number(i + 1));
170 text.replace(QLatin1String("%s"), szdName);
171
172 QAction* recentFileAct = addAction(text);
173 QFileInfo fi(szFile);
174 recentFileAct->setEnabled(fi.exists());
175 recentFileAct->setData(szFile);
176 QString szMsg;
177 if(fi.exists())
178 szMsg = tr("Recent open: ") + szFile;
179 else
180 szMsg = tr("The file is not exists. ") + szFile;
181 recentFileAct->setToolTip(szMsg);
182 recentFileAct->setStatusTip(szMsg);
183 recentFileAct->setWhatsThis(szMsg);
184 }
185 addSeparator();
186 addAction(tr("Clear Menu"), this, SLOT(clearMenu()));
187
188 setEnabled(numRecentFiles > 0);
189}
190
191void CRecentMenu::slotSaveState()
192{
193 if(m_DisableSaveState)
194 return;
195
196 QSettings settings(
197 RabbitCommon::CDir::Instance()->GetFileUserConfigure(),
198 QSettings::IniFormat);
199 settings.setValue("RecentOpen", saveState());
200}
201
202QDataStream& operator<< (QDataStream& d, const CRecentMenu::_Content& c)
203{
204 d << c.m_szFile << c.m_szTitle;
205 return d;
206}
207
208QDataStream& operator>> (QDataStream& d, CRecentMenu::_Content& c)
209{
210 d >> c.m_szFile >> c.m_szTitle;
211 return d;
212}
213
214} // namespace RabbitCommon
Recently opened menu.
QByteArray saveState() const
Saves the state of the recent entries.
bool restoreState(const QByteArray &state)
Restores the recent entries to the state specified.
bool disableSaveState(bool disable)
Default enable save state.
CRecentMenu(QWidget *parent=0)
Constructs a menu with parent parent.
void setMaxCount(int)
Sets the maximum number of entries int he menu.
void clearMenu()
Removes all the menu's actions.
void recentFileTriggered(const QString &filename)
This signal is emitted when a recent file in this menu is triggered.
void setFormat(const QString &format)
This property holds the string used to generate the item text.