source: orange/Orange/OrangeCanvas/main.py @ 11126:cde82f78c1cd

Revision 11126:cde82f78c1cd, 6.4 KB checked in by Ales Erjavec <ales.erjavec@…>, 19 months ago (diff)

Added main entry point

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