37
37
from gettext import gettext as _
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
1077
1077
self.app_info.label.set_size_request(-1, -1)
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)
1082
1082
desc.set_size_request(*size)
1303
1303
self.show_all()
1306
def _update_page(self, app_details):
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)
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
1318
summary = app_details.display_summary
1321
1312
markup = markup % (big, appname, small, gobject.markup_escape_text(summary))
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()
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)
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):
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()
1350
# depending on pkg install state set action labels
1351
self.action_bar.configure(app_details, app_details.pkg_state)
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)
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()
1376
1372
self.share_btn.hide()
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)
1382
1380
# then begin screenshot download and display sequence
1383
1381
self.screenshot.download_and_display()
1386
self._configure_where_is_it()
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)
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)
1413
1412
# Update total size label
1414
gobject.idle_add(self.update_totalsize, True)
1413
gobject.timeout_add(500, self.update_totalsize, True)
1416
1415
# Update addons state bar
1417
1416
self.addons_bar.configure()
1419
def _update_all(self, app_details):
1420
appname = gobject.markup_escape_text(app_details.display_name)
1422
if app_details.pkg_state == PKG_STATE_NOT_FOUND:
1423
summary = app_details._error_not_found
1425
summary = app_details.display_summary
1429
pkg_ambiguous_error = app_details.pkg_state in (PKG_STATE_NOT_FOUND, PKG_STATE_NEEDS_SOURCE)
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)
1440
# depending on pkg install state set action labels
1441
self.action_bar.configure(app_details, app_details.pkg_state)
1444
self._configure_where_is_it()
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)
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)
1455
# depending on pkg install state set action labels
1456
self.action_bar.configure(app_details, app_details.pkg_state)
1459
self._configure_where_is_it()
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)
1499
self._same_app = (self.app and self.app.pkgname and self.app.pkgname == app.pkgname)
1541
old_details = self.app_details
1501
1543
self.app_details = app.get_details(self.db)
1544
self._same_app = self.app_details.same_app(old_details)
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)
1552
self._update_minimal(self.app_details)
1554
self._update_all(self.app_details)
1507
1556
self.emit("selected", self.app)
1509
1558
self.get_usage_counter()