HAL
recent_files_widget.cpp
Go to the documentation of this file.
3 
5 #include "gui/gui_globals.h"
7 
8 #include <QDir>
9 #include <QFileDialog>
10 #include <QFileInfo>
11 #include <QList>
12 #include <QSettings>
13 #include <QStyle>
14 #include <QVBoxLayout>
15 #include <QDebug>
16 
17 namespace hal
18 {
20  {
21  mFileSystemWatcher = new QFileSystemWatcher(this);
26 
27  mLayout->setContentsMargins(0, 0, 0, 0);
28  mLayout->setSpacing(0);
29 
30  setLayout(mLayout);
31  mLayout->setAlignment(Qt::AlignTop);
32 
33  readSettings();
34  }
35 
37  {
38  QStyle* s = style();
39 
40  s->unpolish(this);
41  s->polish(this);
42 
43  for (QObject* object : mLayout->children())
44  {
45  RecentFileItem* item = qobject_cast<RecentFileItem*>(object);
46 
47  if (item)
48  item->repolish();
49  }
50  }
51 
52  void RecentFilesWidget::handleProjectUsed(const QString& projDir, const QString& fileName)
53  {
54  Q_UNUSED(fileName);
55  prependPath(projDir);
56  }
57 
59  {
60  Q_UNUSED(path);
61  for (RecentFileItem* item : mItems)
62  {
63  bool wasMissing = item->missing();
64  item->setMissing(!QFileInfo(item->file()).exists());
65  if (wasMissing != item->missing())
66  {
67  item->repolish();
68  }
69  }
70  }
71 
72  void RecentFilesWidget::addWatcher(const QString &path)
73  {
74  mFileSystemWatcher->addPath(path);
75  mFileSystemWatcher->addPath(QFileInfo(path).path());
76  }
77 
78  void RecentFilesWidget::prependPath(const QString &path)
79  {
80  auto it = mItems.begin();
81  int count = 0;
82  while (it != mItems.end())
83  {
84  // order of conditions is important here, don't count path entry which gets erased
85  if ((*it)->file() == path || count++ >= sMaxItems - 1)
86  {
87  RecentFileItem* item = *it;
88  mFileSystemWatcher->removePath(item->file());
89  mLayout->removeWidget(item);
90  it = mItems.erase(it);
91  item->deleteLater();
92  }
93  else
94  ++it;
95  }
96 
97  RecentFileItem* item = new RecentFileItem(path, this);
98  mLayout->insertWidget(0, item);
99  mItems.prepend(item);
100  item->repolish();
101  addWatcher(path);
102 
103  updateSettings();
104  }
105 
107  {
108  mLayout->removeWidget(item);
109  mFileSystemWatcher->removePath(item->file());
110  mItems.removeOne(item);
111 
112  delete item;
113 
114  updateSettings();
115  }
116 
117  void RecentFilesWidget::readSettings()
118  {
119  gGuiState->beginReadArray("recent_files");
120  for (int i = 0; i < sMaxItems; ++i)
121  {
123  QString file = gGuiState->value("file").toString();
124 
125  if (file.isEmpty())
126  continue;
127 
128  RecentFileItem* item = new RecentFileItem(gGuiState->value("file").toString(), this);
130 
132 
133  if (!item->missing())
135 
136  mItems.append(item);
137  mLayout->addWidget(item);
138  item->repolish();
139  addWatcher(item->file());
140  }
141  gGuiState->endArray();
142  }
143 
144  void RecentFilesWidget::updateSettings()
145  {
146  gGuiState->beginGroup("recent_files");
147  gGuiState->remove("");
148  gGuiState->endGroup();
149 
150  gGuiState->beginWriteArray("recent_files");
151  int index = 0;
152  for(RecentFileItem* item : mItems)
153  {
154  gGuiState->setArrayIndex(index);
155  gGuiState->setValue("file", item->file());
156  index++;
157  if(index >= sMaxItems)
158  break;
159  }
160  gGuiState->endArray();
161 
162  }
163 }
then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file
static FileManager * get_instance()
static DirectoryStatus directoryStatus(const QString &pathname)
void projectSaved(QString projectDir, QString fileName)
void projectOpened(QString projectDir, QString fileName)
One item in the welcome screen's RecentFiles section.
void removeRequested(RecentFileItem *item)
RecentFilesWidget(QWidget *parent=nullptr)
void handleProjectUsed(const QString &projDir, const QString &fileName)
void handleRemoveRequested(RecentFileItem *item)
void handleItemDisappeared(const QString &path)
QSettings * gGuiState
Definition: plugin_gui.cpp:77
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void insertWidget(int index, QWidget *widget, int stretch, Qt::Alignment alignment)
void setSpacing(int spacing)
bool exists() const const
bool addPath(const QString &path)
void directoryChanged(const QString &path)
void fileChanged(const QString &path)
bool removePath(const QString &path)
void removeWidget(QWidget *widget)
bool setAlignment(QWidget *w, Qt::Alignment alignment)
void setContentsMargins(int left, int top, int right, int bottom)
const QObjectList & children() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void beginGroup(const QString &prefix)
int beginReadArray(const QString &prefix)
void beginWriteArray(const QString &prefix, int size)
void endArray()
void endGroup()
void remove(const QString &key)
void setArrayIndex(int i)
void setValue(const QString &key, const QVariant &value)
QVariant value(const QString &key, const QVariant &defaultValue) const const
virtual void polish(QWidget *widget)
virtual void unpolish(QWidget *widget)
AlignTop
QString toString() const const
void setEnabled(bool)
void setLayout(QLayout *layout)
QStyle * style() const const