summaryrefslogtreecommitdiffstats
path: root/pyanaconda/progress.py
blob: 433d205cb609d1f3abc7fef3692b4df6d21b0983 (plain)
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
#
# progress.py: code for handling the one big progress bar
#
# Copyright (C) 2012  Red Hat, Inc.  All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Author(s): Chris Lumens <clumens@redhat.com>

import logging
log = logging.getLogger("anaconda")

from contextlib import contextmanager
import Queue

# A queue to be used for communicating progress information between a subthread
# doing all the hard work and the main thread that does the GTK updates.  This
# queue should have elements of the following format pushed into it:
#
# (PROGRESS_CODE_*, [arguments])
#
# Arguments vary based on the code given.  See below.
progressQ = Queue.Queue()

# Arguments:
#
# _INIT - [num_steps]
# _STEP - []
# _MESSAGE - [string]
# _COMPLETE - []
# _QUIT - [exit_code]
PROGRESS_CODE_INIT = 0
PROGRESS_CODE_STEP = 1
PROGRESS_CODE_MESSAGE = 2
PROGRESS_CODE_COMPLETE = 3
PROGRESS_CODE_QUIT = 4

# Convenience methods to put things into the queue without the user having to
# know the details of the queue.
def send_init(n_steps):
    progressQ.put((PROGRESS_CODE_INIT, [n_steps]))

def send_step():
    progressQ.put((PROGRESS_CODE_STEP, []))

def send_message(message):
    progressQ.put((PROGRESS_CODE_MESSAGE, [message]))

def send_complete():
    progressQ.put((PROGRESS_CODE_COMPLETE, []))

def send_quit(code):
    progressQ.put((PROGRESS_CODE_QUIT, [code]))

# Surround a block of code with progress updating.  Before the code runs, the
# message is updated so the user can tell what's about to take so long.
# Afterwards, the progress bar is updated to reflect that the task is done.
@contextmanager
def progress_report(message):
    send_message(message)
    log.info(message)
    yield
    send_step()