조성현

add shortest path menu

...@@ -13,7 +13,8 @@ void EdgeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) ...@@ -13,7 +13,8 @@ void EdgeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
13 { 13 {
14 } 14 }
15 15
16 -EdgeItem::EdgeItem(double x1, double y1, double x2, double y2, QColor color, int width) 16 +EdgeItem::EdgeItem(double x1, double y1, double x2, double y2, QColor color, int width,
17 + QString from, QString to)
17 { 18 {
18 this->x1 = x1; 19 this->x1 = x1;
19 this->y1 = y1; 20 this->y1 = y1;
...@@ -22,6 +23,9 @@ EdgeItem::EdgeItem(double x1, double y1, double x2, double y2, QColor color, int ...@@ -22,6 +23,9 @@ EdgeItem::EdgeItem(double x1, double y1, double x2, double y2, QColor color, int
22 23
23 this->color = color; 24 this->color = color;
24 this->width = width; 25 this->width = width;
26 +
27 + this->from = from;
28 + this->to = to;
25 setZValue(0); //노드 앞 가리지 않도록 ZValue 설정 29 setZValue(0); //노드 앞 가리지 않도록 ZValue 설정
26 30
27 /*setFlags(ItemIsSelectable | ItemIsMovable); 31 /*setFlags(ItemIsSelectable | ItemIsMovable);
......
...@@ -9,6 +9,7 @@ class EdgeItem ...@@ -9,6 +9,7 @@ class EdgeItem
9 { 9 {
10 private: 10 private:
11 double x1, y1, x2, y2; 11 double x1, y1, x2, y2;
12 + QString from, to;
12 int width; 13 int width;
13 QColor color; 14 QColor color;
14 15
...@@ -18,7 +19,16 @@ protected: ...@@ -18,7 +19,16 @@ protected:
18 void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; 19 void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
19 20
20 public: 21 public:
21 - EdgeItem(double x1, double y1, double x2, double y2, QColor color, int width); 22 + EdgeItem(double x1, double y1, double x2, double y2, QColor color, int width,
23 + QString from, QString to);
24 +
25 + //getter
26 + QString getFrom() { return from; }
27 + QString getTo() { return to; }
28 +
29 + //setter
30 + void setWidth(int w) { width = w; }
31 + void setColor(QColor color) { this->color = color; }
22 32
23 QRectF boundingRect() const override; 33 QRectF boundingRect() const override;
24 QPainterPath shape() const override; 34 QPainterPath shape() const override;
......
...@@ -31,6 +31,11 @@ void GraphItem::read_more() ...@@ -31,6 +31,11 @@ void GraphItem::read_more()
31 vector<pair<string, string>> edges; 31 vector<pair<string, string>> edges;
32 vector<pair<int, int>> edges_indexes; 32 vector<pair<int, int>> edges_indexes;
33 33
34 + //property maps
35 + auto node_position_map = boost::get(vertex_position, *graph);
36 + auto node_label_map = boost::get(vertex_name, *graph);
37 + auto node_type_map = boost::get(vertex_type, *graph);
38 +
34 int line_cnt = 0; 39 int line_cnt = 0;
35 qDebug() << "* graph reading start"; 40 qDebug() << "* graph reading start";
36 41
...@@ -145,16 +150,16 @@ void GraphItem::read_more() ...@@ -145,16 +150,16 @@ void GraphItem::read_more()
145 150
146 switch (LAYOUT_MODE) { 151 switch (LAYOUT_MODE) {
147 case GRAPH_LAYOUT::RANDOM_LAYOUT: 152 case GRAPH_LAYOUT::RANDOM_LAYOUT:
148 - random_graph_layout(*graph, get(vertex_position, *graph), rect_top); 153 + random_graph_layout(*graph, node_position_map, rect_top);
149 break; 154 break;
150 155
151 case GRAPH_LAYOUT::CIRCLE_LAYOUT: 156 case GRAPH_LAYOUT::CIRCLE_LAYOUT:
152 - circle_graph_layout(*graph, get(vertex_position, *graph), SCREEN_SIZE / 2); 157 + circle_graph_layout(*graph, node_position_map, SCREEN_SIZE / 2);
153 break; 158 break;
154 159
155 case GRAPH_LAYOUT::FRUCHTERMAN_REINGOLD_LAYOUT: 160 case GRAPH_LAYOUT::FRUCHTERMAN_REINGOLD_LAYOUT:
156 fruchterman_reingold_force_directed_layout(*graph, 161 fruchterman_reingold_force_directed_layout(*graph,
157 - get(vertex_position, *graph), 162 + node_position_map,
158 topology, 163 topology,
159 attractive_force(square_distance_attractive_force()) 164 attractive_force(square_distance_attractive_force())
160 .cooling(linear_cooling<double>(50)) 165 .cooling(linear_cooling<double>(50))
...@@ -168,32 +173,30 @@ void GraphItem::read_more() ...@@ -168,32 +173,30 @@ void GraphItem::read_more()
168 nodeList.clear(); 173 nodeList.clear();
169 edgeList.clear(); 174 edgeList.clear();
170 175
171 - //add edges 176 +
172 - auto position = boost::get(vertex_position, *graph);
173 - auto label = boost::get(vertex_name, *graph);
174 - auto nodeType = boost::get(vertex_type, *graph);
175 177
176 //edge_iterator ei, ei_end; 178 //edge_iterator ei, ei_end;
177 vertex_descriptor u, v; 179 vertex_descriptor u, v;
178 for (boost::tie(ei, ei_end) = boost::edges(*graph); ei != ei_end; ++ei) { 180 for (boost::tie(ei, ei_end) = boost::edges(*graph); ei != ei_end; ++ei) {
179 u = source(*ei, *graph); 181 u = source(*ei, *graph);
180 v = target(*ei, *graph); 182 v = target(*ei, *graph);
181 - Point p1 = position[u]; 183 + Point p1 = node_position_map[u];
182 - Point p2 = position[v]; 184 + Point p2 = node_position_map[v];
183 185
184 //make edge item and push it to list 186 //make edge item and push it to list
185 EdgeItem *edge; 187 EdgeItem *edge;
186 188
187 - edge = new EdgeItem(p1[0], p1[1], p2[0], p2[1], QColor(Qt::black), 0); 189 + edge = new EdgeItem(p1[0], p1[1], p2[0], p2[1], QColor(Qt::black), 0,
190 + QString(node_label_map[u].c_str()), QString(node_label_map[v].c_str()));
188 edge->setPos(p1[0], p1[1]); 191 edge->setPos(p1[0], p1[1]);
189 edgeList << edge; 192 edgeList << edge;
190 } 193 }
191 194
192 //add nodes 195 //add nodes
193 for (boost::tie(vi, vi_end) = vertices(*graph); vi != vi_end; ++vi) { 196 for (boost::tie(vi, vi_end) = vertices(*graph); vi != vi_end; ++vi) {
194 - Point p = position[*vi]; 197 + Point p = node_position_map[*vi];
195 - auto nt = nodeType[*vi]; 198 + auto nt = node_type_map[*vi];
196 - std::string name = label[*vi]; 199 + std::string name = node_label_map[*vi];
197 200
198 //make node item and push it to list 201 //make node item and push it to list
199 NodeItem *node; 202 NodeItem *node;
...@@ -244,8 +247,8 @@ void GraphItem::might_know() ...@@ -244,8 +247,8 @@ void GraphItem::might_know()
244 Graph::adjacency_iterator ai, ai_end; 247 Graph::adjacency_iterator ai, ai_end;
245 vector<string> might_know_vec; 248 vector<string> might_know_vec;
246 249
247 - auto label = get(vertex_name, *graph); 250 + auto node_label_map = get(vertex_name, *graph);
248 - auto nodeType = get(vertex_type, *graph); 251 + auto node_type_map = get(vertex_type, *graph);
249 252
250 // 회색 색칠 253 // 회색 색칠
251 for (auto& n : nodeList) { 254 for (auto& n : nodeList) {
...@@ -258,7 +261,7 @@ void GraphItem::might_know() ...@@ -258,7 +261,7 @@ void GraphItem::might_know()
258 261
259 // find target node 262 // find target node
260 for (boost::tie(vi, vi_end) = boost::vertices(*graph); vi!=vi_end; ++vi) { 263 for (boost::tie(vi, vi_end) = boost::vertices(*graph); vi!=vi_end; ++vi) {
261 - if (label[*vi] == std::string(TARGET_AUTHOR_NAME)) { 264 + if (node_label_map[*vi] == std::string(TARGET_AUTHOR_NAME)) {
262 vtarget = vi; 265 vtarget = vi;
263 break; 266 break;
264 } 267 }
...@@ -286,7 +289,7 @@ void GraphItem::might_know() ...@@ -286,7 +289,7 @@ void GraphItem::might_know()
286 for (boost::tie(ai, ai_end) = boost::adjacent_vertices(*vtarget, *graph); 289 for (boost::tie(ai, ai_end) = boost::adjacent_vertices(*vtarget, *graph);
287 ai != ai_end; 290 ai != ai_end;
288 ++ai) { 291 ++ai) {
289 - might_know_vec.push_back(label[*ai]); 292 + might_know_vec.push_back(node_label_map[*ai]);
290 } 293 }
291 294
292 // highlight 295 // highlight
...@@ -318,9 +321,9 @@ void GraphItem::topK_highlight_with_total() ...@@ -318,9 +321,9 @@ void GraphItem::topK_highlight_with_total()
318 vertex_iterator vi, vi_end; 321 vertex_iterator vi, vi_end;
319 Graph::adjacency_iterator ai, ai_end; 322 Graph::adjacency_iterator ai, ai_end;
320 323
321 - auto nodeLabel = boost::get(vertex_name, *graph); 324 + auto node_label_map = boost::get(vertex_name, *graph);
322 - auto nodeType = boost::get(vertex_type, *graph); 325 + auto node_type_map = boost::get(vertex_type, *graph);
323 - auto numOfRecords = boost::get(vertex_record, *graph); 326 + auto node_records_map = boost::get(vertex_record, *graph);
324 327
325 //실적 count 초기화 328 //실적 count 초기화
326 //for (boost::tie(vi, vi_end) = boost::vertices(*graph); vi != vi_end; ++vi) { 329 //for (boost::tie(vi, vi_end) = boost::vertices(*graph); vi != vi_end; ++vi) {
...@@ -333,20 +336,20 @@ void GraphItem::topK_highlight_with_total() ...@@ -333,20 +336,20 @@ void GraphItem::topK_highlight_with_total()
333 // <record, label> 336 // <record, label>
334 TopKHeap<pair<int, string>> heap(TOP_K); 337 TopKHeap<pair<int, string>> heap(TOP_K);
335 for (boost::tie(vi, vi_end) = boost::vertices(*graph); vi != vi_end; ++vi) { 338 for (boost::tie(vi, vi_end) = boost::vertices(*graph); vi != vi_end; ++vi) {
336 - if (nodeType[*vi] != NODE_TYPE::NODE_AUTHOR) { 339 + if (node_type_map[*vi] != NODE_TYPE::NODE_AUTHOR) {
337 continue; 340 continue;
338 } 341 }
339 342
340 int record_cnt = 0; 343 int record_cnt = 0;
341 for (boost::tie(ai, ai_end) = boost::adjacent_vertices(*vi, *graph); 344 for (boost::tie(ai, ai_end) = boost::adjacent_vertices(*vi, *graph);
342 ai != ai_end; ++ai) { 345 ai != ai_end; ++ai) {
343 - if (nodeType[*ai] == NODE_TYPE::NODE_PAPER) { 346 + if (node_type_map[*ai] == NODE_TYPE::NODE_PAPER) {
344 ++record_cnt; 347 ++record_cnt;
345 } 348 }
346 } 349 }
347 350
348 boost::put(vertex_record, *graph, *vi, record_cnt); 351 boost::put(vertex_record, *graph, *vi, record_cnt);
349 - heap.push(make_pair(record_cnt, nodeLabel[*vi])); 352 + heap.push(make_pair(record_cnt, node_label_map[*vi]));
350 353
351 //qDebug() << record_cnt; 354 //qDebug() << record_cnt;
352 } 355 }
...@@ -371,28 +374,53 @@ void GraphItem::topK_highlight_with_total() ...@@ -371,28 +374,53 @@ void GraphItem::topK_highlight_with_total()
371 } 374 }
372 } 375 }
373 376
374 -void GraphItem::test() 377 +void GraphItem::find_shortest_path()
375 { 378 {
376 qDebug("* path highlighting start"); 379 qDebug("* path highlighting start");
377 vertex_iterator vi, vi_end; 380 vertex_iterator vi, vi_end;
378 - //find start, end node's id 381 +
379 - 382 + auto node_idx_map = boost::get(vertex_index, *graph);
380 - auto vertex_idx = boost::get(vertex_index, *graph); 383 + auto node_label_map = boost::get(vertex_name, *graph);
381 - auto nodeLabel = boost::get(vertex_name, *graph); 384 +
382 - 385 + string target_start,
383 - int start_idx=-1, end_idx=-1; 386 + target_end;
384 - for (boost::tie(vi, vi_end)=vertices(*graph); vi!=vi_end; ++vi) { 387 +
385 - //string node_name = boost::get(vertex_name, *graph, *vi); 388 + bool isok = false;
386 - const string& node_name = nodeLabel[*vi]; 389 +
387 - if (node_name == "Jung Gon Kim") { 390 + QInputDialog *inputDialog = new QInputDialog();
388 - start_idx = vertex_idx[*vi]; 391 +
389 - } else if (node_name == "Yong-Jin Kim") { 392 + target_start = inputDialog->getText(nullptr, "Enter target's name", "Start node's name:",
390 - end_idx = vertex_idx[*vi]; 393 + QLineEdit::Normal, "Akira Idoue", &isok).toStdString();
394 + if (!isok) {
395 + qDebug("input cancelled");
396 + return;
397 + }
398 + qDebug() << target_start.c_str();
399 +
400 + target_end = inputDialog->getText(nullptr, "Enter target's name", "End node's name:",
401 + QLineEdit::Normal, "Kayo Kurosaki", &isok).toStdString();
402 + if (!isok) {
403 + qDebug("input cancelled");
404 + return;
405 + }
406 + qDebug() << target_end.c_str();
407 +
408 +
409 +
410 +
411 + int start_idx = -1, end_idx = -1;
412 + for (boost::tie(vi, vi_end) = vertices(*graph); vi != vi_end; ++vi) {
413 + const string& node_name = node_label_map[*vi];
414 + if (node_name == target_start) {
415 + start_idx = node_idx_map[*vi];
416 + }
417 + else if (node_name == target_end) {
418 + end_idx = node_idx_map[*vi];
391 } 419 }
392 } 420 }
393 421
394 - 422 +
395 - if (start_idx==-1 || end_idx==-1) { 423 + if (start_idx == -1 || end_idx == -1) {
396 qDebug() << start_idx << " " << end_idx; 424 qDebug() << start_idx << " " << end_idx;
397 qDebug("no target node"); 425 qDebug("no target node");
398 return; 426 return;
...@@ -402,14 +430,25 @@ void GraphItem::test() ...@@ -402,14 +430,25 @@ void GraphItem::test()
402 return; 430 return;
403 } 431 }
404 432
433 + /*QMessageBox msgBox;
434 + msgBox.setText("The document has been modified.");
435 + msgBox.setInformativeText("Do you want to save your changes?");
436 + msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
437 + msgBox.setDefaultButton(QMessageBox::Save);
438 + int ret = msgBox.exec();
439 + qDebug() << "ret: " << ret;
440 + if (ret == QMessageBox::Save) {
441 + qDebug() << "save";
442 + }*/
443 +
405 vector<vertex_descriptor> parents(num_vertices(*graph)); 444 vector<vertex_descriptor> parents(num_vertices(*graph));
406 vector<double> distances(num_vertices(*graph)); 445 vector<double> distances(num_vertices(*graph));
407 vertex_descriptor start_vertex = boost::vertex(start_idx, *graph); 446 vertex_descriptor start_vertex = boost::vertex(start_idx, *graph);
408 447
409 //shortest path using dijkstra 448 //shortest path using dijkstra
410 boost::dijkstra_shortest_paths(*graph, start_vertex, 449 boost::dijkstra_shortest_paths(*graph, start_vertex,
411 - predecessor_map(boost::make_iterator_property_map(parents.begin(), boost::get(boost::vertex_index, *graph))). 450 + predecessor_map(boost::make_iterator_property_map(parents.begin(), node_idx_map)).
412 - distance_map(boost::make_iterator_property_map(distances.begin(), get(boost::vertex_index, *graph)))); 451 + distance_map(boost::make_iterator_property_map(distances.begin(), node_idx_map)));
413 452
414 //check distances 453 //check distances
415 //qDebug() << "dist: " << distances[end_idx]; 454 //qDebug() << "dist: " << distances[end_idx];
...@@ -426,20 +465,49 @@ void GraphItem::test() ...@@ -426,20 +465,49 @@ void GraphItem::test()
426 465
427 //path finding 466 //path finding
428 qDebug("* path finding start"); 467 qDebug("* path finding start");
468 + vector<string> paths;
429 vertex_descriptor current = boost::vertex(end_idx, *graph); 469 vertex_descriptor current = boost::vertex(end_idx, *graph);
430 - qDebug() << "end: " << nodeLabel[current].c_str(); 470 + paths.push_back(node_label_map[current]);
471 + qDebug() << "end: " << node_label_map[current].c_str();
431 while (1) { 472 while (1) {
432 - current = parents[vertex_idx[current]]; 473 + current = parents[node_idx_map[current]];
433 - qDebug() << nodeLabel[current].c_str(); 474 + paths.push_back(node_label_map[current]);
475 +
476 + qDebug() << node_label_map[current].c_str();
434 if (current == start_vertex) break; 477 if (current == start_vertex) break;
435 } 478 }
436 qDebug("* path finding end"); 479 qDebug("* path finding end");
437 - 480 +
438 481
439 qDebug("* path highlighting start"); 482 qDebug("* path highlighting start");
483 + for (auto& n : nodeList) {
484 + if (find(paths.begin(), paths.end(), n->getLabel().toStdString())
485 + != paths.end()) {
486 + n->setColor(QColor(Qt::blue));
487 + }
488 + }
489 + size_t paths_sz = paths.size();
490 + for (int i = 0; i < paths_sz - 1; ++i) {
491 + for (auto& e : edgeList) {
492 + if ((e->getFrom().toStdString() == paths[i] && e->getTo().toStdString() == paths[i + 1])
493 + || (e->getFrom().toStdString() == paths[i + 1] && e->getTo().toStdString() == paths[i])) {
494 + e->setColor(QColor(Qt::blue));
495 + e->setWidth(3);
496 + }
497 + }
498 + }
440 qDebug("* path highlighting end"); 499 qDebug("* path highlighting end");
441 } 500 }
442 501
502 +void GraphItem::test()
503 +{
504 + qDebug("* test action start");
505 +
506 +
507 +
508 + qDebug("* test action end");
509 +}
510 +
443 //event handler 511 //event handler
444 void GraphItem::mousePressEvent(QGraphicsSceneMouseEvent *event) 512 void GraphItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
445 { 513 {
......
...@@ -29,6 +29,7 @@ public: ...@@ -29,6 +29,7 @@ public:
29 void might_know(); 29 void might_know();
30 void reset_color(); 30 void reset_color();
31 void topK_highlight_with_total(); 31 void topK_highlight_with_total();
32 + void find_shortest_path();
32 33
33 //test 34 //test
34 void test(); 35 void test();
......
...@@ -48,6 +48,9 @@ void MainWindow::createActions() ...@@ -48,6 +48,9 @@ void MainWindow::createActions()
48 resetColorAct = new QAction(tr("Reset colors"), this); 48 resetColorAct = new QAction(tr("Reset colors"), this);
49 resetColorAct->setStatusTip(tr("Reset all node's color")); 49 resetColorAct->setStatusTip(tr("Reset all node's color"));
50 connect(resetColorAct, &QAction::triggered, this, &MainWindow::reset_color); 50 connect(resetColorAct, &QAction::triggered, this, &MainWindow::reset_color);
51 + findShortestPathAct = new QAction(tr("Find Shortest Path"), this);
52 + findShortestPathAct->setStatusTip("Find shortest path between two node");
53 + connect(findShortestPathAct, &QAction::triggered, this, &MainWindow::find_shortest_path);
51 54
52 testAct = new QAction(tr("test action"), this); 55 testAct = new QAction(tr("test action"), this);
53 testAct->setStatusTip(tr("test test")); 56 testAct->setStatusTip(tr("test test"));
...@@ -63,6 +66,7 @@ void MainWindow::createMenus() ...@@ -63,6 +66,7 @@ void MainWindow::createMenus()
63 actionMenu->addAction(mightKnowAct); 66 actionMenu->addAction(mightKnowAct);
64 actionMenu->addAction(topkAct); 67 actionMenu->addAction(topkAct);
65 actionMenu->addAction(resetColorAct); 68 actionMenu->addAction(resetColorAct);
69 + actionMenu->addAction(findShortestPathAct);
66 70
67 testMenu = menuBar()->addMenu(tr("&Test")); 71 testMenu = menuBar()->addMenu(tr("&Test"));
68 testMenu->addAction(testAct); 72 testMenu->addAction(testAct);
...@@ -84,7 +88,7 @@ void MainWindow::might_know() ...@@ -84,7 +88,7 @@ void MainWindow::might_know()
84 88
85 void MainWindow::topk() 89 void MainWindow::topk()
86 { 90 {
87 - graphWidget->topk(); 91 + graphWidget->topk_with_total();
88 } 92 }
89 93
90 void MainWindow::reset_color() 94 void MainWindow::reset_color()
...@@ -92,6 +96,11 @@ void MainWindow::reset_color() ...@@ -92,6 +96,11 @@ void MainWindow::reset_color()
92 graphWidget->reset_color(); 96 graphWidget->reset_color();
93 } 97 }
94 98
99 +void MainWindow::find_shortest_path()
100 +{
101 + graphWidget->find_shortest_path();
102 +}
103 +
95 void MainWindow::test() 104 void MainWindow::test()
96 { 105 {
97 graphWidget->test(); 106 graphWidget->test();
......
...@@ -24,6 +24,7 @@ private: ...@@ -24,6 +24,7 @@ private:
24 QAction *mightKnowAct; 24 QAction *mightKnowAct;
25 QAction *topkAct; 25 QAction *topkAct;
26 QAction *resetColorAct; 26 QAction *resetColorAct;
27 + QAction *findShortestPathAct;
27 28
28 //test 29 //test
29 QMenu *testMenu; 30 QMenu *testMenu;
...@@ -38,6 +39,7 @@ private slots: ...@@ -38,6 +39,7 @@ private slots:
38 void might_know(); 39 void might_know();
39 void topk(); 40 void topk();
40 void reset_color(); 41 void reset_color();
42 + void find_shortest_path();
41 //test 43 //test
42 void test(); 44 void test();
43 }; 45 };
......
...@@ -56,12 +56,19 @@ void PaperGraphWidget::might_know() ...@@ -56,12 +56,19 @@ void PaperGraphWidget::might_know()
56 scene->update(); 56 scene->update();
57 } 57 }
58 58
59 -void PaperGraphWidget::topk() 59 +void PaperGraphWidget::topk_with_total()
60 { 60 {
61 + //ü׷ TopK highlight
61 graphItem->topK_highlight_with_total(); 62 graphItem->topK_highlight_with_total();
62 scene->update(); 63 scene->update();
63 } 64 }
64 65
66 +void PaperGraphWidget::find_shortest_path()
67 +{
68 + graphItem->find_shortest_path();
69 + scene->update();
70 +}
71 +
65 void PaperGraphWidget::reset_color() 72 void PaperGraphWidget::reset_color()
66 { 73 {
67 graphItem->reset_color(); 74 graphItem->reset_color();
...@@ -71,11 +78,12 @@ void PaperGraphWidget::reset_color() ...@@ -71,11 +78,12 @@ void PaperGraphWidget::reset_color()
71 void PaperGraphWidget::test() 78 void PaperGraphWidget::test()
72 { 79 {
73 //test 80 //test
74 - testCombo->addItem(to_string(rand() % 300).c_str()); 81 + //testCombo->addItem(to_string(rand() % 300).c_str());
75 - testCombo->addItem(to_string(rand() % 300).c_str()); 82 + //testCombo->addItem(to_string(rand() % 300).c_str());
76 - testCombo->addItem(to_string(rand() % 300).c_str()); 83 + //testCombo->addItem(to_string(rand() % 300).c_str());
77 84
78 graphItem->test(); 85 graphItem->test();
86 + scene->update();
79 } 87 }
80 88
81 void PaperGraphWidget::handleSelectionChanged(int idx) 89 void PaperGraphWidget::handleSelectionChanged(int idx)
......
...@@ -16,7 +16,8 @@ public: ...@@ -16,7 +16,8 @@ public:
16 //main window slots 16 //main window slots
17 void read_more(); 17 void read_more();
18 void might_know(); 18 void might_know();
19 - void topk(); 19 + void topk_with_total();
20 + void find_shortest_path();
20 void reset_color(); 21 void reset_color();
21 22
22 //test 23 //test
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
7 #include <QGraphicsScene> 7 #include <QGraphicsScene>
8 #include <QGraphicsView> 8 #include <QGraphicsView>
9 #include <QGridLayout> 9 #include <QGridLayout>
10 +#include <QInputDialog>
10 #include <QKeyEvent> 11 #include <QKeyEvent>
11 #include <QList> 12 #include <QList>
12 #include <QMainWindow> 13 #include <QMainWindow>
...@@ -100,8 +101,10 @@ namespace { ...@@ -100,8 +101,10 @@ namespace {
100 /* visualization */ 101 /* visualization */
101 const int NODE_SIZE = 4; 102 const int NODE_SIZE = 4;
102 const int LAYOUT_MODE = GRAPH_LAYOUT::RANDOM_LAYOUT; 103 const int LAYOUT_MODE = GRAPH_LAYOUT::RANDOM_LAYOUT;
104 + //const int SCREEN_SIZE = 3000;
103 const int SCREEN_SIZE = 500; 105 const int SCREEN_SIZE = 500;
104 - const int READ_LINE_UNIT = 20; //한 번에 몇 라인을 읽을지 106 + //const int READ_LINE_UNIT = 20; //한 번에 몇 라인을 읽을지
107 + const int READ_LINE_UNIT = 40;
105 108
106 /* topK */ 109 /* topK */
107 const int TOP_K = 5; //상위 몇 개 아이템에 대해 highlight 할 지 110 const int TOP_K = 5; //상위 몇 개 아이템에 대해 highlight 할 지
......