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 }
53
54 int BookmarkDialog::selectedIndex() const
55 {
56     return ui->tableWidget->currentRow();
57 }
58
59 void BookmarkDialog::insertData(int row, const QString &name, const QString &path)
60 {
61     ui->tableWidget->insertRow(row);
62
63     QTableWidgetItem *iName = new QTableWidgetItem(name);
64     if (m_isReadOnly) {
65         iName->setFlags(iName->flags() ^ Qt::ItemIsEditable);
66     }
67     ui->tableWidget->setItem(row, 0, iName);
68
69     QTableWidgetItem *iPath = new QTableWidgetItem(path);
70     iPath->setFlags(iPath->flags() ^ Qt::ItemIsEditable);
71     ui->tableWidget->setItem(row, 1, iPath);
72 }
73
74 void BookmarkDialog::moveSelectedRows(bool up)
75 {
76     qDebug() << "BookmarkDialog::moveSelectedRows();" << up;
77
78     QList<QTableWidgetItem*> selected = ui->tableWidget->selectedItems();
79     if (selected.isEmpty()) {
80         qDebug() << "Not selected.";
81         return;
82     }
83
84     QVector<QString> before;
85     QVector<QString> after;
86
87     for (int i = 0; i < ui->tableWidget->rowCount(); i++) {
88         QString name = ui->tableWidget->item(i, 0)->data(Qt::DisplayRole).toString();
89         QString path = ui->tableWidget->item(i, 1)->data(Qt::DisplayRole).toString();
90         before << name + "¥t" + path;
91     }
92     qDebug() << "set before" << before;
93
94     after.resize(before.size());
95
96     QVector<int> newRows;
97     foreach (QTableWidgetItem *item, selected) {
98         if (item->column() != 0) {
99             int newRow = (up) ? item->row() - 1 : item->row() + 1;
100             if (newRow < 0) {
101                 return;
102             }
103             else if (newRow >= ui->tableWidget->rowCount()) {
104                 return;
105             }
106
107             after[newRow] = before[item->row()];
108             before[item->row()] = QString::null;
109             newRows << newRow;
110         }
111     }
112
113     qDebug() << "set after(1)" << after;
114     int n = 0;
115     for (int i = 0; i < ui->tableWidget->rowCount(); i++) {
116         if (!before[i].isEmpty()) {
117             while (!after[n].isEmpty()) {
118                 n++;
119             }
120             after[n] = before[i];
121         }
122     }
123     qDebug() << "set after(2)" << after;
124
125     while (ui->tableWidget->rowCount() > 0) {
126         ui->tableWidget->removeRow(0);
127     }
128
129     n = 0;
130     foreach (const QString &val, after) {
131         QStringList list = val.split("¥t");
132         insertData(n, list[0], list[1]);
133         n++;
134     }
135
136     ui->tableWidget->resizeColumnsToContents();
137     ui->tableWidget->resizeRowsToContents();
138
139     foreach (int i, newRows) {
140         for (n = 0; n < 2; n++) {
141             QModelIndex index = ui->tableWidget->model()->index(i, n);
142             ui->tableWidget->selectionModel()->select(index, QItemSelectionModel::Select);
143         }
144     }
145
146 }
147
148 void BookmarkDialog::accept()
149 {
150     QSettings settings;
151     QModelIndex index;
152     int i;
153     for (i = 0; i < ui->tableWidget->rowCount(); i++) {
154         index = ui->tableWidget->model()->index(i, 0);
155         QString name = ui->tableWidget->model()->data(index).toString();
156         if (name.isEmpty()) {
157             ui->tableWidget->setCurrentCell(i, 0);
158             QMessageBox::critical(this, tr("エラー"), tr("名前が未入力です。"));
159             return;
160         }
161
162         index = ui->tableWidget->model()->index(i, 1);
163         QString path = ui->tableWidget->model()->data(index).toString();
164
165         settings.setValue(IniKey_BookmarkEntryName(i), name);
166         settings.setValue(IniKey_BookmarkEntryPath(i), path);
167     }
168     while (!settings.value(IniKey_BookmarkEntryName(i), "").toString().isEmpty()) {
169         settings.remove(IniKey_BookmarkEntryName(i));
170         settings.remove(IniKey_BookmarkEntryPath(i));
171         i++;
172     }
173
174     QDialog::accept();
175 }
176
177 void BookmarkDialog::on_buttonDelete_clicked()
178 {
179     foreach (const QTableWidgetItem *item, ui->tableWidget->selectedItems()) {
180         if (item->column() == 0) {
181             ui->tableWidget->removeRow(item->row());
182         }
183     }
184 }
185
186 void BookmarkDialog::on_buttonUp_clicked()
187 {
188     moveSelectedRows(true);
189 }
190
191 void BookmarkDialog::on_buttonDown_clicked()
192 {
193     moveSelectedRows(false);
194 }
195
196 void BookmarkDialog::on_buttonAdd_clicked()
197 {
198     static QString initPath = QDir::homePath();
199
200     QString path = QFileDialog::getExistingDirectory(
201                 this, tr("フォルダを選択"), initPath);
202     if (!path.isEmpty()) {
203         QFileInfo info(path);
204         QString name(info.fileName());
205         if (name.isEmpty()) {
206             name = "root";
207         }
208         insertData(ui->tableWidget->rowCount(), name, path);
209         initPath = path;
210
211         ui->tableWidget->resizeColumnsToContents();
212         ui->tableWidget->resizeRowsToContents();
213     }
214 }