File: dasher_lock_dialogue.cpp

package info (click to toggle)
dasher 5.0.0~beta~repack2-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 70,872 kB
  • sloc: xml: 181,314; cpp: 70,860; java: 8,020; python: 3,579; makefile: 939; sh: 324; ansic: 223; perl: 71
file content (84 lines) | stat: -rw-r--r-- 2,649 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "GtkDasherControl.h"
#include "dasher.h"
#include "dasher_lock_dialogue.h"

#ifdef WITH_MAEMO
#include <hildon-widgets/hildon-banner.h>
#endif
#include <iostream>

// TODO: Make this a real class

GtkWindow *m_pLockWindow;
GtkProgressBar *m_pLockProgress;
GtkLabel *m_pLockMessage;
unsigned long lastTime;

void dasher_lock_dialogue_new(GtkBuilder *pXML, GtkWindow *pMainWindow) {
#ifndef WITH_MAEMO
  m_pLockWindow = GTK_WINDOW(gtk_builder_get_object(pXML, "lock_window"));
  m_pLockProgress = GTK_PROGRESS_BAR(gtk_builder_get_object(pXML, "lock_progress"));
  m_pLockMessage = GTK_LABEL(gtk_builder_get_object(pXML, "lock_message"));
  lastTime=0;

  gtk_widget_hide(GTK_WIDGET(m_pLockWindow));
  
  gtk_window_set_transient_for(m_pLockWindow, pMainWindow);
#else
  m_pLockWindow = 0;
#endif
}

extern "C" void on_lock_info(GtkDasherControl *pDasherControl, gpointer pLockInfo, gpointer pUserData) {
  // TODO: signals are connected after the Dasher control is created,
  // which is too late to receive notification about intial training
  // etc.
  DasherLockInfo *pInfo = (DasherLockInfo *)pLockInfo;

  //Whether to perform a full refresh of GUI components (too expensive to do every time):
  bool bFullRefresh(pInfo->time-lastTime > 100);
#ifndef WITH_MAEMO
  GtkWidget *pWinWidget(GTK_WIDGET(m_pLockWindow));
  if(pInfo->iPercent!=-1) {
    gtk_label_set_text(m_pLockMessage, pInfo->szMessage);
    gtk_progress_bar_set_fraction(m_pLockProgress, pInfo->iPercent / 100.0);
    if (!gtk_widget_get_visible(pWinWidget)) {
      bFullRefresh = true;
      gtk_widget_show(pWinWidget);
    }
  }
  else if (gtk_widget_get_visible(pWinWidget)) {
    bFullRefresh = true;
    gtk_widget_hide(pWinWidget);
  }
#else
  if(pInfo->iPercent!=-1) {
    if(!m_pLockWindow) {
      bFullRefresh = true;
      m_pLockWindow = hildon_banner_show_progress(NULL, NULL, pInfo->szMessage);
    }
    hildon_banner_set_fraction(HILDON_BANNER(m_pLockWindow), pInfo->iPercent / 100.0);
  }
  else {
    if(m_pLockWindow) {
      bFullRefresh = true;
      gtk_widget_destroy(GTK_WIDGET(m_pLockWindow));
    }
    m_pLockWindow = 0;
  }
#endif

  if (bFullRefresh) {
    //This takes too long, on some hardware / software versions, to perform every time
    // (or else training takes much longer than without progress display!), but we do
    // it every so often to ensure the progress display is visible onscreen.
    // (I've measured it at 40+ iterations upon show() of progress dialogue! and averages 5-6)
    while(gtk_events_pending())
        gtk_main_iteration();
      lastTime=pInfo->time;
  }
}