OSDN Git Service

サムネイルモードの実装
[gefu/Gefu.git] / bookmarkdialog.cpp
1 #include "preferences.h"
2 #include "bookmarkdialog.h"
3 #include "ui_bookmarkdialog.h"
4
5 #include <QDebug>
6 #include <QFileDialog>
7 #include <QFileInfo>
8 #include <QMessageBox>
9
10 BookmarkDialog::BookmarkDialog(QWidget *parent) :
11     QDialog(parent),
12     ui(new Ui::BookmarkDialog),
13     m_isReadOnly(false)
14 {
15     ui->setupUi(this);
16     resize(parent->width() * 0.8, height());
17
18     ui->tableWidget->setColumnCount(2);
19 }
20
21 BookmarkDialog::~BookmarkDialog()
22 {
23     delete ui;
24 }
25
26 void BookmarkDialog::setEditMode(bool edit)
27 {
28     ui->buttonAdd->setVisible(edit);
29     ui->buttonDelete->setVisible(edit);
30     ui->buttonDown->setVisible(edit);
31     ui->buttonUp->setVisible(edit);
32
33     m_isReadOnly = !edit;
34     if (m_isReadOnly) {
35         setWindowTitle(tr("ブックマークを開く"));
36     }
37
38     Preferences prefs(this);
39     for (int i = 1; ; i++) {
40         QString name = prefs.getBookmarkEntry(i);
41         if (name.isEmpty()) {
42             break;
43         }
44
45         QString path = prefs.getBookmarkPath(i);
46         insertData(i - 1, name, path);
47     }
48     ui->tableWidget->resizeColumnsToContents();
49     ui->tableWidget->resizeRowsToContents();
50     ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
51     ui->tableWidget->setCurrentCell(0, 0);
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     Preferences prefs(this);
151     prefs.clearBookmark();
152
153     QModelIndex index;
154     int i;
155     for (i = 0; i < ui->tableWidget->rowCount(); i++) {
156         index = ui->tableWidget->model()->index(i, 0);
157         QString name = ui->tableWidget->model()->data(index).toString();
158         if (name.isEmpty()) {
159             ui->tableWidget->setCurrentCell(i, 0);
160             QMessageBox::critical(this, tr("エラー"), tr("名前が未入力です。"));
161             return;
162         }
163
164         index = ui->tableWidget->model()->index(i, 1);
165         QString path = ui->tableWidget->model()->data(index).toString();
166
167         prefs.addBookmark(name, path);
168     }
169
170     QDialog::accept();
171 }
172
173 void BookmarkDialog::on_buttonDelete_clicked()
174 {
175     foreach (const QTableWidgetItem *item, ui->tableWidget->selectedItems()) {
176         if (item->column() == 0) {
177             ui->tableWidget->removeRow(item->row());
178         }
179     }
180 }
181
182 void BookmarkDialog::on_buttonUp_clicked()
183 {
184     moveSelectedRows(true);
185 }
186
187 void BookmarkDialog::on_buttonDown_clicked()
188 {
189     moveSelectedRows(false);
190 }
191
192 void BookmarkDialog::on_buttonAdd_clicked()
193 {
194     static QString initPath = QDir::homePath();
195
196     QString path = QFileDialog::getExistingDirectory(
197                 this, tr("フォルダを選択"), initPath);
198     if (!path.isEmpty()) {
199         QFileInfo info(path);
200         QString name(info.fileName());
201         if (name.isEmpty()) {
202             name = "root";
203         }
204         insertData(ui->tableWidget->rowCount(), name, path);
205         initPath = path;
206
207         ui->tableWidget->resizeColumnsToContents();
208         ui->tableWidget->resizeRowsToContents();
209     }
210 }