~ubuntuone-control-tower/software-center/trunk

« back to all changes in this revision

Viewing changes to softwarecenter/view/appdetailsview_gtk.py

mergedĀ lp:~mmcg069/software-center/selectable-AppDescription

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
from gettext import gettext as _
38
38
import apt_pkg
39
39
from softwarecenter.backend import get_install_backend
 
40
from softwarecenter.db.application import AppDetails, Application, NoneTypeApplication
40
41
from softwarecenter.backend.zeitgeist_simple import zeitgeist_singleton
41
 
from softwarecenter.db.application import AppDetails, Application
42
42
from softwarecenter.enums import *
43
43
from softwarecenter.paths import SOFTWARE_CENTER_ICON_CACHE_DIR
44
44
from softwarecenter.utils import ImageDownloader, GMenuSearcher
1045
1045
 
1046
1046
        # app specific data
1047
1047
        self._same_app = False
1048
 
        self.app = None
1049
 
        self.app_details = None
 
1048
        self.app = NoneTypeApplication()
 
1049
        self.app_details = self.app.get_details(self.db)
1050
1050
 
1051
1051
        # addons manager
1052
1052
        self.addons_manager = AddonsManager(self)
1077
1077
            self.app_info.label.set_size_request(-1, -1)
1078
1078
 
1079
1079
        desc = self.app_desc.description
1080
 
        size = desc.height_from_width(w-5*mkit.EM-166)
 
1080
        size = desc.height_from_width(w-6*mkit.EM-166)
1081
1081
        if size:
1082
1082
            desc.set_size_request(*size)
1083
1083
 
1303
1303
        self.show_all()
1304
1304
        return
1305
1305
 
1306
 
    def _update_page(self, app_details):
1307
 
 
 
1306
    def _update_title_markup(self, appname, summary):
1308
1307
        # make title font size fixed as they should look good compared to the 
1309
1308
        # icon (also fixed).
1310
1309
        big = 20*pango.SCALE
1311
1310
        small = 9*pango.SCALE
1312
 
        appname = gobject.markup_escape_text(app_details.display_name)
1313
 
 
1314
1311
        markup = '<b><span size="%s">%s</span></b>\n<span size="%s">%s</span>'
1315
 
        if app_details.pkg_state == PKG_STATE_NOT_FOUND:
1316
 
            summary = app_details._error_not_found
1317
 
        else:
1318
 
            summary = app_details.display_summary
1319
 
        if not summary:
1320
 
            summary = ""
1321
1312
        markup = markup % (big, appname, small, gobject.markup_escape_text(summary))
1322
1313
 
1323
1314
        # set app- icon, name and summary in the header
1327
1318
        self.app_info.header.a11y.set_name("Application: " + appname + ". Summary: " + summary)
1328
1319
        self.app_info.header.a11y.set_role(atk.ROLE_PANEL)
1329
1320
        self.app_info.header.grab_focus()
 
1321
        return
1330
1322
 
 
1323
    def _update_app_icon(self, app_details):
1331
1324
        pb = self._get_icon_as_pixbuf(app_details)
1332
1325
        # should we show the green tick?
1333
1326
        self._show_overlay = app_details.pkg_state == PKG_STATE_INSTALLED
1334
1327
        self.app_info.set_icon_from_pixbuf(pb)
 
1328
        return
1335
1329
 
 
1330
    def _update_layout_error_status(self, pkg_error):
1336
1331
        # if we have an error or if we need to enable a source, then hide everything else
1337
 
        if app_details.pkg_state in (PKG_STATE_NOT_FOUND, PKG_STATE_NEEDS_SOURCE):
 
1332
        if pkg_error:
1338
1333
            self.screenshot.hide()
1339
1334
            self.version_info.hide()
1340
1335
            self.license_info.hide()
1346
1341
            self.support_info.show()
1347
1342
            self.totalsize_info.show()
1348
1343
            self.screenshot.show()
1349
 
 
1350
 
        # depending on pkg install state set action labels
1351
 
        self.action_bar.configure(app_details, app_details.pkg_state)
1352
 
 
 
1344
        return
 
1345
 
 
1346
    def _update_app_description(self, app_details, appname):
1353
1347
        # format new app description
1354
1348
        if app_details.pkg_state == PKG_STATE_ERROR:
1355
1349
            description = app_details.error
1360
1354
        self.app_desc.set_description(description, appname)
1361
1355
        # a11y for description
1362
1356
        #self.app_desc.body.a11y.set_name("Description: " + description)
 
1357
        return
1363
1358
 
 
1359
    def _update_description_footer_links(self, app_details):        
1364
1360
        # show or hide the homepage button and set uri if homepage specified
1365
1361
        if app_details.website:
1366
1362
            self.homepage_btn.show()
1374
1370
            self.share_btn.show()
1375
1371
        else:
1376
1372
            self.share_btn.hide()
 
1373
        return
1377
1374
 
 
1375
    def _update_app_screenshot(self, app_details):
1378
1376
        # get screenshot urls and configure the ScreenshotView...
1379
1377
        if app_details.thumbnail and app_details.screenshot and not self._same_app:
1380
1378
            self.screenshot.configure(app_details)
1381
1379
 
1382
1380
            # then begin screenshot download and display sequence
1383
1381
            self.screenshot.download_and_display()
1384
 
 
1385
 
        # show where it is
1386
 
        self._configure_where_is_it()
1387
 
 
 
1382
        return
 
1383
 
 
1384
    def _update_pkg_info_table(self, app_details):
1388
1385
        # set the strings in the package info table
1389
1386
        if app_details.version:
1390
1387
            version = '%s (%s)' % (app_details.version, app_details.pkgname)
1403
1400
        self.version_info.set_value(version)
1404
1401
        self.license_info.set_value(license)
1405
1402
        self.support_info.set_value(support)
 
1403
        return
1406
1404
 
 
1405
    def _update_addons(self, app_details):
1407
1406
        # refresh addons interface
1408
1407
        self.addon_view.hide_all()
1409
1408
        if not app_details.error:
1411
1410
                             self.app_details.pkgname)
1412
1411
        
1413
1412
        # Update total size label
1414
 
        gobject.idle_add(self.update_totalsize, True)
 
1413
        gobject.timeout_add(500, self.update_totalsize, True)
1415
1414
        
1416
1415
        # Update addons state bar
1417
1416
        self.addons_bar.configure()
1418
1417
        return
1419
1418
 
 
1419
    def _update_all(self, app_details):
 
1420
        appname = gobject.markup_escape_text(app_details.display_name)
 
1421
 
 
1422
        if app_details.pkg_state == PKG_STATE_NOT_FOUND:
 
1423
            summary = app_details._error_not_found
 
1424
        else:
 
1425
            summary = app_details.display_summary
 
1426
        if not summary:
 
1427
            summary = ""
 
1428
 
 
1429
        pkg_ambiguous_error = app_details.pkg_state in (PKG_STATE_NOT_FOUND, PKG_STATE_NEEDS_SOURCE)
 
1430
 
 
1431
        self._update_title_markup(appname, summary)
 
1432
        self._update_app_icon(app_details)
 
1433
        self._update_layout_error_status(pkg_ambiguous_error)
 
1434
        self._update_app_description(app_details, appname)
 
1435
        self._update_description_footer_links(app_details)
 
1436
        self._update_app_screenshot(app_details)
 
1437
        self._update_pkg_info_table(app_details)
 
1438
        self._update_addons(app_details)
 
1439
 
 
1440
        # depending on pkg install state set action labels
 
1441
        self.action_bar.configure(app_details, app_details.pkg_state)
 
1442
 
 
1443
        # show where it is
 
1444
        self._configure_where_is_it()
 
1445
        return
 
1446
 
 
1447
    def _update_minimal(self, app_details, old_details):
 
1448
        pkg_ambiguous_error = app_details.pkg_state in (PKG_STATE_NOT_FOUND, PKG_STATE_NEEDS_SOURCE)
 
1449
 
 
1450
        self._update_app_icon(app_details)
 
1451
        self._update_layout_error_status(pkg_ambiguous_error)
 
1452
        self._update_pkg_info_table(app_details)
 
1453
        self._update_addons(app_details)
 
1454
 
 
1455
        # depending on pkg install state set action labels
 
1456
        self.action_bar.configure(app_details, app_details.pkg_state)
 
1457
 
 
1458
        # show where it is
 
1459
        self._configure_where_is_it()
 
1460
        return
 
1461
 
1420
1462
    def _configure_where_is_it(self):
1421
1463
        # remove old content
1422
1464
        self.desc_installed_where.foreach(lambda c: c.destroy())
1496
1538
        self.action_bar.button.set_sensitive(True)
1497
1539
 
1498
1540
        # init data
1499
 
        self._same_app = (self.app and self.app.pkgname and self.app.pkgname == app.pkgname)
 
1541
        old_details = self.app_details
1500
1542
        self.app = app
1501
1543
        self.app_details = app.get_details(self.db)
 
1544
        self._same_app = self.app_details.same_app(old_details)
 
1545
 
1502
1546
        # for compat with the base class
1503
1547
        self.appdetails = self.app_details
1504
1548
        #print "AppDetailsViewGtk:"
1505
1549
        #print self.appdetails
1506
 
        self._update_page(self.app_details)
 
1550
 
 
1551
        if self._same_app:
 
1552
            self._update_minimal(self.app_details)
 
1553
        else:
 
1554
            self._update_all(self.app_details)
 
1555
 
1507
1556
        self.emit("selected", self.app)
1508
1557
        
1509
1558
        self.get_usage_counter()