📄 mainwindow.cc
字号:
//=======================================================================// MainWindow.cc//-----------------------------------------------------------------------// This file is part of the package paco// Copyright (C) 2004-2007 David Rosal <david.3r@gmail.com>// For more information visit http://paco.sourceforge.net//=======================================================================#include "config.h"#include "Config.h"#include "Lock.h"#include "MainWindow.h"#include "Preferences.h"#include "About.h"#include "PkgSet.h"#include "Find.h"#include "util.h"#include "ImportRPM.h"#include "paco/paco.h"#include <gtkmm/stock.h>#include <gtkmm/toggleaction.h>#include <gtkmm/uimanager.h>#include <gtkmm/actiongroup.h>#include <gtkmm/box.h>#include <gtkmm/separator.h>#include <gtkmm/scrolledwindow.h>#include <sstream>using Glib::ustring;using std::string;using sigc::mem_fun;using namespace Gpaco;MainWindow::MainWindow(): Gtk::Window(), mLabel("", 0.02, 0.5), mTreeView(), mProgressBar(), mpUIManager(Gtk::UIManager::create()), mpActionGroup(Gtk::ActionGroup::create()), mpActionImportRPM(Gtk::Action::create ("ImportRPM", "_Import RPM database...")), mpActionUpdate(Gtk::Action::create ("UpdateDatabase", Gtk::Stock::REFRESH, "_Update database")), mpMenuBar(NULL){ set_default_size(Config::width(), Config::height()); try {#if 0 // glibmm >= 2.14 set_icon_from_file(Glib::get_user_data_dir() + "/pixmaps/gpaco.png");#else set_icon_from_file(DATADIR "/pixmaps/gpaco.png");#endif } catch (...) { } buildUIManager(); mpMenuBar = mpUIManager->get_widget("/MenuBar"); Gtk::ScrolledWindow* pScrolledWindow(Gtk::manage(new Gtk::ScrolledWindow())); pScrolledWindow->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); pScrolledWindow->add(mTreeView); mProgressBar.set_size_request(-1, 0); Gtk::HBox* pHBox(Gtk::manage(new Gtk::HBox())); pHBox->pack_start(mLabel, Gtk::PACK_SHRINK, 8); pHBox->pack_end(mProgressBar, Gtk::PACK_SHRINK); Gtk::VBox* pVBox(Gtk::manage(new Gtk::VBox())); pVBox->pack_start(*mpMenuBar, Gtk::PACK_SHRINK); pVBox->pack_start(*pScrolledWindow); pVBox->pack_start(*(Gtk::manage(new Gtk::HSeparator())), Gtk::PACK_SHRINK, 1); pVBox->pack_start(*pHBox, Gtk::PACK_SHRINK); add(*pVBox); show_all_children(); mProgressBar.hide(); move(Config::xPos(), Config::yPos()); Glib::signal_timeout().connect(mem_fun (*this, &MainWindow::writeLabel), 500); Glib::usleep(10000); checkLock(); Glib::signal_timeout().connect(mem_fun (*this, &MainWindow::checkLock), 500, Glib::PRIORITY_HIGH);}MainWindow::~MainWindow(){ }bool MainWindow::checkLock(){ bool set = !Lock::locked() && Config::logdirWritable(); if (mpActionUpdate) mpActionUpdate->set_sensitive(set); if (mpActionImportRPM) { mpActionImportRPM->set_sensitive(set && !Glib::find_program_in_path("rpm2paco").empty() && !Glib::find_program_in_path("rpm").empty()); } return true;}//---------//// Private ////---------//// [virtual]bool MainWindow::on_delete_event(GdkEventAny*){ quit(); return true;}void MainWindow::quit(){ Config::saveSettings(*this); Glib::usleep(10000); hide();}void MainWindow::menuViewItem(ustring const& name, ustring const& label, int id){ Glib::RefPtr<Gtk::ToggleAction> pToggleAction (Gtk::ToggleAction::create(name, label)); mpActionGroup->add(pToggleAction, sigc::bind<Gtk::TreeViewColumn*> (mem_fun(*this, &MainWindow::viewColumn), mTreeView.get_column(id))); for (guint i = 0; i < Config::cols().size(); ++i) { if (Config::cols()[i] == id) { pToggleAction->activate(); break; } }}void MainWindow::buildUIManager(){ g_assert(mpActionGroup); g_assert(mpActionUpdate); g_assert(mpActionImportRPM); mpActionGroup->add(Gtk::Action::create("MenuFile", "_File")); mpActionGroup->add(mpActionUpdate, mem_fun(mTreeView, &MainTreeView::onUpdateDataBase)); mpActionGroup->add(mpActionImportRPM, mem_fun(*this, &MainWindow::onImportRPM)); mpActionGroup->add(Gtk::Action::create("Quit", Gtk::Stock::QUIT), mem_fun(*this, &MainWindow::quit)); mpActionGroup->add(Gtk::Action::create("MenuEdit", "_Edit")); mpActionGroup->add(Gtk::Action::create("FindFile", Gtk::Stock::FIND, "_Find file"), mem_fun(*this, &MainWindow::find)); mpActionGroup->add(Gtk::Action::create("Preferences", Gtk::Stock::PREFERENCES), mem_fun(*this, &MainWindow::preferences)); mpActionGroup->add(Gtk::Action::create("MenuView", "_View")); menuViewItem("Icon", "_Icon", MainTreeView::COL_ICON); menuViewItem("Name", "_Name", MainTreeView::COL_NAME); menuViewItem("Size", "_Size", MainTreeView::COL_SIZE_INST); menuViewItem("SizeMissing", "Size _missing", MainTreeView::COL_SIZE_MISS); menuViewItem("SizePercent", "Size _percent", MainTreeView::COL_SIZE_PERCENT); menuViewItem("Date", "_Date", MainTreeView::COL_DATE); menuViewItem("Files", "_Files", MainTreeView::COL_FILES_INST); menuViewItem("FilesMissing", "Files m_issing", MainTreeView::COL_FILES_MISS); menuViewItem("FilesPercent", "Files p_ercent", MainTreeView::COL_FILES_PERCENT); menuViewItem("Summary", "_Summary", MainTreeView::COL_SUMMARY); Glib::RefPtr<Gtk::ToggleAction> pRules = Gtk::ToggleAction::create("RulesHint", "_Rules hint"); mpActionGroup->add(pRules, mem_fun(*this, &MainWindow::onSwitchRules)); if (Config::rules()) pRules->activate(); mpActionGroup->add(Gtk::Action::create("MenuHelp", "_Help")); mpActionGroup->add(Gtk::Action::create("About", Gtk::Stock::ABOUT), mem_fun(*this, &MainWindow::about)); mpUIManager->insert_action_group(mpActionGroup); add_accel_group(mpUIManager->get_accel_group()); mpUIManager->add_ui_from_string( "<ui>" " <menubar name='MenuBar'>" " <menu action='MenuFile'>" " <menuitem action='UpdateDatabase'/>" " <menuitem action='ImportRPM'/>" " <separator/>" " <menuitem action='Quit'/>" " </menu>" " <menu action='MenuEdit'>" " <menuitem action='FindFile'/>" " <separator/>" " <menuitem action='Preferences'/>" " </menu>" " <menu action='MenuView'>" " <menuitem action='Icon'/>" " <menuitem action='Name'/>" " <menuitem action='Size'/>" " <menuitem action='SizeMissing'/>" " <menuitem action='SizePercent'/>" " <menuitem action='Date'/>" " <menuitem action='Files'/>" " <menuitem action='FilesMissing'/>" " <menuitem action='FilesPercent'/>" " <menuitem action='Summary'/>" " <separator/>" " <menuitem action='RulesHint'/>" " </menu>" " <menu action='MenuHelp'>" " <menuitem action='About'/>" " </menu>" " </menubar>" "</ui>");}void MainWindow::onSwitchRules(){ mTreeView.switchRules();}void MainWindow::find(){ Find::instance();}void MainWindow::preferences(){ Preferences::instance();}void MainWindow::about(){ About::instance();}void MainWindow::onImportRPM(){ ImportRPM::instance();}void MainWindow::viewColumn(Gtk::TreeViewColumn* pCol){ g_assert(pCol != NULL); pCol->set_visible(!pCol->get_visible());}bool MainWindow::writeLabel(){ if (mProgressBar.is_visible()) { mLabel.set_text("Updating the database..."); return true; } std::ostringstream txt; txt << mTreeView.pkgSet().size() << " Packages | " << Paco::sizeStr(Config::sizeUnit(), mTreeView.pkgSet().sizeInst()); switch (Config::sizeUnit()) { case Paco::KILOBYTE: txt << 'k'; break; case Paco::MEGABYTE: txt << 'M'; break; case Paco::BYTE: txt << " bytes"; } mLabel.set_text(txt.str()); return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -