OSDN Git Service

Ver0.19
[gefu/Gefu.git] / bookmarkdialog.cpp
1 #include "common.h"
2 #include "bookmarkdialog.h"
3 #include "ui_bookmarkdialog.h"
4
5 #include <QDebug>
6 #include <QFileDialog>
7 #include <QFileInfo>
8 #include <QMessageBox>
9 #include <QSettings>
10 //#include <QVector>
11
12 BookmarkDialog::BookmarkDialog(QWidget *parent) :
13     QDialog(parent),
14     ui(new Ui::BookmarkDialog),
15     m_isReadOnly(false)
16 {
17     ui->setupUi(this);
18     resize(parent->width() * 0.8, height());
19
20     ui->tableWidget->setColumnCount(2);
21 }
22
23 BookmarkDialog::~BookmarkDialog()
24 {
25     delete ui;
26 }
27
28 void BookmarkDialog::setEditMode(bool edit)
29 {
30     ui->buttonAdd->setVisible(edit);
31     ui->buttonDelete->setVisible(edit);
32     ui->buttonDown->setVisible(edit);
33     ui->buttonUp->setVisible(edit);
34
35     m_isReadOnly = !edit;
36     if (m_isReadOnly) {
37         setWindowTitle(tr("ブックマークを開く"));
38     }
39
40     QSettings settings;
41     for (int i = 0; ; i++) {
42         QString name = settings.value(IniKey_BookmarkEntryName(i), "").toString();
43         if (name.isEmpty()) {
44             break;
45         }
46
47         QString path = settings.value(IniKey_BookmarkEntryPath(i)).toString();
48         insertData(i, name, path);
49     }
50     ui->tableWidget->resizeColumnsToContents();
51     ui->tableWidget->resizeRowsToContents();
52     ui->tableWidget->setCurrentCell(0, 0);
53 }
54
55 int BookmarkDialog::selectedIndex() const
56 {
57     return ui->tableWidget->currentRow();
58 }
59
60 void BookmarkDialog::insertData(int row, const QString &name, const QString &path)
61 {
62     ui->tableWidget->insertRow(row);
63
64     QTableWidgetItem *iName = new QTableWidgetItem(name);
65     if (m_isReadOnly) {
66         iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);
67     }
68     ui->tableWidget->setItem(row, 0, iName);
69
70     QTableWidgetItem *iPath = new QTableWidgetItem(path);
71     iPath->setFlags(iPath->flags() ^ Qt::ItemIsEditable);
72     ui->tableWidget->setItem(row, 1, iPath);
73 }
74
75 void BookmarkDialog::moveSelectedRows(bool up)
76 {
77     qDebug() << "BookmarkDialog::moveSelectedRows();" << up;
78
79     QList<QTableWidgetItem*> selected = ui->tableWidget->selectedItems();
80     if (selected.isEmpty()) {
81         qDebug() << "Not selected.";
82         return;
83     }
84
85     QVector<QString> before;
86     QVector<QString> after;
87
88     for (int i = 0; i < ui->tableWidget->rowCount(); i++) {
89         QString name = ui->tableWidget->item(i, 0)->data(Qt::DisplayRole).toString();
90         QString path = ui->tableWidget->item(i, 1)->data(Qt::DisplayRole).toString();
91         before << name + "¥t" + path;
92     }
93     qDebug() << "set before" << before;
94
95     after.resize(before.size());
96
97     QVector<int> newRows;
98     foreach (QTableWidgetItem *item, selected) {
99         if (item->column() != 0) {
100             int newRow = (up) ? item->row() - 1 : item->row() + 1;
101             if (newRow < 0) {
102                 return;
103             }
104             else if (newRow >= ui->tableWidget->rowCount()) {
105                 return;
106             }
107
108             after[newRow] = before[item->row()];
109             before[item->row()] = QString::null;
110             newRows << newRow;
111         }
112     }
113
114     qDebug() << "set after(1)" << after;
115     int n = 0;
116     for (int i = 0; i < ui->tableWidget->rowCount(); i++) {
117         if (!before[i].isEmpty()) {
118             while (!after[n].isEmpty()) {
119                 n++;
120             }
121             after[n] = before[i];
122         }
123     }
124     qDebug() << "set after(2)" << after;
125
126     while (ui->tableWidget->rowCount() > 0) {
127         ui->tableWidget->removeRow(0);
128     }
129
130     n = 0;
131     foreach (const QString &val, after) {
132         QStringList list = val.split("¥t");
133         insertData(n, list[0], list[1]);
134         n++;
135     }
136
137     ui->tableWidget->resizeColumnsToContents();
138     ui->tableWidget->resizeRowsToContents();
139
140     foreach (int i, newRows) {
141         for (n = 0; n < 2; n++) {
142             QModelIndex index = ui->tableWidget->model()->index(i, n);
143             ui->tableWidget->selectionModel()->select(index, QItemSelectionModel::Select);
144         }
145     }
146
147 }
148
149 void BookmarkDialog::accept()
150 {
151     QSettings settings;
152     QModelIndex index;
153     int i;
154     for (i = 0; i < ui->tableWidget->rowCount(); i++) {
155         index = ui->tableWidget->model()->index(i, 0);
156         QString name = ui->tableWidget->model()->data(index).toString();
157         if (name.isEmpty()) {
158             ui->tableWidget->setCurrentCell(i, 0);
159             QMessageBox::critical(this, tr("エラー"), tr("名前が未入力です。"));
160             return;
161         }
162
163         index = ui->tableWidget->model()->index(i, 1);
164         QString path = ui->tableWidget->model()->data(index).toString();
165
166         settings.setValue(IniKey_BookmarkEntryName(i), name);
167         settings.setValue(IniKey_BookmarkEntryPath(i), path);
168     }
169     while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {
170         settings.remove(IniKey_BookmarkEntryName(i));
171         settings.remove(IniKey_BookmarkEntryPath(i));
172         i++;
173     }
174
175     QDialog::accept();
176 }
177
178 void BookmarkDialog::on_buttonDelete_clicked()
179 {
180     foreach (const QTableWidgetItem *item, ui->tableWidget->selectedItems()) {
181         if (item->column() == 0) {
182             ui->tableWidget->removeRow(item->row());
183         }
184     }
185 }
186
187 void BookmarkDialog::on_buttonUp_clicked()
188 {
189     moveSelectedRows(true);
190 }
191
192 void BookmarkDialog::on_buttonDown_clicked()
193 {
194     moveSelectedRows(false);
195 }
196
197 void BookmarkDialog::on_buttonAdd_clicked()
198 {
199     static QString initPath = QDir::homePath();
200
201     QString path = QFileDialog::getExistingDirectory(
202                 this, tr("フォルダを選択"), initPath);
203     if (!path.isEmpty()) {
204         QFileInfo info(path);
205         QString name(info.fileName());
206         if (name.isEmpty()) {
207             name = "root";
208         }
209         insertData(ui->tableWidget->rowCount(), name, path);
210         initPath = path;
211
212         ui->tableWidget->resizeColumnsToContents();
213         ui->tableWidget->resizeRowsToContents();
214     }
215 }