source: orange/Orange/OrangeCanvas/main.py @ 11173:0bcd5f586f7a

Revision 11173:0bcd5f586f7a, 7.6 KB checked in by Ales Erjavec <ales.erjavec@…>, 18 months ago (diff)

Use white icons on black toolbar background.

Line 
1"""
2Orange Canvas main entry point
3
4"""
5
6import os
7import sys
8import re
9import logging
10import optparse
11import cPickle
12from contextlib import nested
13
14import pkg_resources
15
16from PyQt4.QtGui import QFont, QColor
17from PyQt4.QtCore import QRect, QSettings, QDir
18
19from Orange import OrangeCanvas
20from Orange.OrangeCanvas.application.application import CanvasApplication
21from Orange.OrangeCanvas.application.canvasmain import CanvasMainWindow
22
23from Orange.OrangeCanvas.gui.splashscreen import SplashScreen, QPixmap
24from Orange.OrangeCanvas.config import cache_dir
25from Orange.OrangeCanvas import config
26from Orange.OrangeCanvas.utils.redirect import redirect_stdout, redirect_stderr
27
28from Orange.OrangeCanvas.registry import qt
29from Orange.OrangeCanvas.registry import WidgetRegistry, set_global_registry
30from Orange.OrangeCanvas.registry import cache
31
32log = logging.getLogger(__name__)
33
34
35def qt_logging_handle(msg_type, message):
36    print msg_type, message
37
38
39def main(argv=None):
40    if argv is None:
41        argv = sys.argv[1:]
42
43    usage = "usage: %prog [options] [scheme_file]"
44    parser = optparse.OptionParser(usage=usage)
45
46    parser.add_option("--no-discovery",
47                      action="store_true",
48                      help="Don't run widget discovery "
49                           "(use full cache instead)")
50
51    parser.add_option("--force-discovery",
52                      action="store_true",
53                      help="Force full widget discovery "
54                           "(invalidate cache)")
55    parser.add_option("--no-welcome",
56                      action="store_true",
57                      help="Don't show welcome dialog.")
58    parser.add_option("--no-splash",
59                      action="store_true",
60                      help="Don't show splash screen.")
61    parser.add_option("-l", "--log-level",
62                      help="Logging level (0, 1, 2, 3)",
63                      type="int", default=1)
64    parser.add_option("--no-redirect",
65                      action="store_true",
66                      help="Do not redirect stdout/err to canvas output view.")
67    parser.add_option("--style",
68                      help="QStyle to use",
69                      type="str", default=None)
70    parser.add_option("--stylesheet",
71                      help="Application level CSS style sheet to use",
72                      type="str", default="orange.qss")
73    parser.add_option("--qt",
74                      help="Additional arguments for QApplication",
75                      type="str", default=None)
76
77    (options, args) = parser.parse_args(argv)
78
79    levels = [logging.CRITICAL,
80              logging.WARN,
81              logging.INFO,
82              logging.DEBUG]
83
84    logging.basicConfig(level=levels[options.log_level])
85
86    log.info("Starting 'Orange Canvas' application.")
87
88    qt_argv = ["orange-canvas"]
89
90    if options.style is not None:
91        qt_argv += ["-style", options.style]
92
93    if options.qt is not None:
94        qt_argv += options.qt.split()
95
96    log.debug("Starting CanvasApplicaiton with argv = %r.", qt_argv)
97    app = CanvasApplication(qt_argv)
98
99    # Note: config.init must be called after the QApplication constructor
100    config.init()
101    settings = QSettings()
102
103    stylesheet = options.stylesheet
104    stylesheet_string = None
105
106    if stylesheet != "none":
107        if os.path.isfile(stylesheet):
108            stylesheet_string = open(stylesheet, "rb").read()
109        else:
110            if not os.path.splitext(stylesheet)[1]:
111                # no extension
112                stylesheet = os.path.extsep.join([stylesheet, "qss"])
113
114            pkg_name = OrangeCanvas.__name__
115            resource = os.path.join("styles", stylesheet)
116
117            if pkg_resources.resource_exists(pkg_name, resource):
118                stylesheet_string = pkg_resources.resource_string(
119                                        pkg_name, resource)
120                base = pkg_resources.resource_filename(pkg_name, "styles")
121
122                matches = re.findall(
123                    r"^\s@([a-zA-Z0-9_]+?)=([a-zA-Z0-9_/]+?)$",
124                    stylesheet_string,
125                    re.MULTILINE)
126
127                for prefix, search_path in matches:
128                    QDir.addSearchPath(prefix, os.path.join(base, search_path))
129                    log.info("Adding search path %r for prefix, %r",
130                             search_path, prefix)
131            else:
132                log.info("%r style sheet not found.", stylesheet)
133
134    if stylesheet_string is not None:
135        app.setStyleSheet(stylesheet_string)
136
137    # Add the default canvas_icons search path
138    dirpath = os.path.abspath(os.path.dirname(OrangeCanvas.__file__))
139    QDir.addSearchPath("canvas_icons", os.path.join(dirpath, "icons"))
140
141    canvas_window = CanvasMainWindow()
142    canvas_window.resize(1024, 650)
143
144    if not options.force_discovery:
145        reg_cache = cache.registry_cache()
146    else:
147        reg_cache = None
148
149    widget_discovery = qt.QtWidgetDiscovery(cached_descriptions=reg_cache)
150
151    widget_registry = qt.QtWidgetRegistry()
152
153    widget_discovery.found_category.connect(
154        widget_registry.register_category
155    )
156    widget_discovery.found_widget.connect(
157        widget_registry.register_widget
158    )
159
160    want_splash = \
161        settings.value("startup/show-splash-screen", True).toPyObject() and \
162        not options.no_splash
163
164    if want_splash:
165        pm = QPixmap(pkg_resources.resource_filename(
166                        __name__, "icons/orange-splash-screen.png")
167                     )
168        # Text rectangle in which to fit the message.
169        rect = QRect(88, 193, 200, 20)
170        splash_screen = SplashScreen(pixmap=pm, textRect=rect)
171        splash_screen.setFont(QFont("Helvetica", 12))
172        color = QColor("#FFD39F")
173
174        def show_message(message):
175            splash_screen.showMessage(message, color=color)
176
177        widget_discovery.discovery_start.connect(splash_screen.show)
178        widget_discovery.discovery_process.connect(show_message)
179        widget_discovery.discovery_finished.connect(splash_screen.hide)
180
181    log.info("Running widget discovery process.")
182
183    cache_filename = os.path.join(cache_dir(), "widget-registry.pck")
184    if options.no_discovery:
185        widget_registry = cPickle.load(open(cache_filename, "rb"))
186        widget_registry = qt.QtWidgetRegistry(widget_registry)
187    else:
188        widget_discovery.run()
189        # Store cached descriptions
190        cache.save_registry_cache(widget_discovery.cached_descriptions)
191        cPickle.dump(WidgetRegistry(widget_registry),
192                     open(cache_filename, "wb"))
193    set_global_registry(widget_registry)
194    canvas_window.set_widget_registry(widget_registry)
195    canvas_window.show()
196
197    want_welcome = \
198        settings.value("welcomedialog/show-at-startup", True).toBool() \
199        and not options.no_welcome
200
201    canvas_window.raise_()
202
203    if want_welcome and not args:
204        canvas_window.welcome_dialog()
205
206    elif args:
207        log.info("Loading a scheme from the command line argument %r",
208                 args[0])
209        canvas_window.load_scheme(args[0])
210
211    disable_redirect = \
212        settings.value("mainwindow/no-stdout-redirect", False).toBool() or \
213        options.no_redirect
214
215    if not disable_redirect:
216        output = canvas_window.output_view()
217    else:
218        output = None
219
220    with nested(redirect_stdout(output), redirect_stderr(output)):
221        log.info("Entering main event loop.")
222        try:
223            status = app.exec_()
224        except BaseException:
225            log.error("Error in main event loop.", exc_info=True)
226
227    canvas_window.deleteLater()
228    app.processEvents()
229    app.flush()
230    del canvas_window
231    del app
232    return status
233
234
235if __name__ == "__main__":
236    sys.exit(main())
Note: See TracBrowser for help on using the repository browser.