Po 26 letech od protiprávního policejního zásahu, který byl spuštěn na základě podnětu společnosti Microsoft, Obvodní soud pro Prahu 2 rozsudkem potvrdil, že Mironet prokázal významnou část svého nároku na náhradu škody vůči Ministerstvu spravedlnosti ČR. Soudem nyní přiznaná část nároku znamená rekordní odškodné, jaké kdy české soudy přiznaly za nesprávný postup státu. Spor byl rozdělen na několik škod, u pravomocně uzavřených částí
… více »Lehké desktopové prostředí LXQt bylo vydáno ve verzi 2.4.0. Jde o převážně opravné vydání s drobnými vylepšeními podpory Waylandu.
Počítačová hra Kingdom Come: Deliverance 2 českého studia Warhorse získala cenu BAFTA v kategorii nejlepší příběh. V konkurenci pěti dalších nominovaných děl porazila i úspěšnou francouzskou hru Clair Obscur: Expedition 33, která v letošním ročníku získala cenu za nejlepší hru roku.
Projekt KDE oslaví v říjnu 30 let. Matthias Ettrich poslal 14. října 1996 do diskusní skupiny comp.os.linux.misc zprávu, která započala historii projektu. Důležité milníky jsou zobrazeny na časové ose KDE.
Byly vyhlášeny výsledky letošní volby vedoucí/ho projektu Debian (DPL, Wikipedie). Poprvé povede Debian žena. Novou vedoucí je Sruthi Chandran. Letos byla jedinou kandidátkou. Kandidovala již v letech 2020, 2021, 2024 a 2025. Na konferenci DebConf19 měla přednášku Is Debian (and Free Software) gender diverse enough?
Byla vydána nová verze 10.3 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Přidána byla podpora Orange Pi 4 LTS. Přibyl balíček Prometheus.
Implementace VPN softwaru WireGuard (Wikipedie) pro Windows, tj. WireGuard pro Windows a WireGuardNT, dospěly do verze 1.0.
V Pekingu dnes proběhl 2. ročník půlmaratonu humanoidních robotů. První 3 místa obsadili roboti Honor Lightning v různých týmech. Nový rekord autonomního robota je 50 minut a 26 sekund. Operátorem řízený robot to zvládl i s pádem za 48 minut a 19 sekund. Řízení roboti měli časovou penalizaci 20 %. Před rokem nejrychlejší robot zvládl půlmaraton za 2 hodiny 40 minut a 42 sekund. Aktuální lidský rekord drží Jacob Kiplimo z Ugandy s časem 57 minut a 20 sekund [𝕏].
Stanislav Fort, vedoucí vědecký pracovník z Vlčkovy 'kyberbezpečnostní' firmy AISLE, zkoumal dopady Anthropic Mythos (nový AI model od Anthropicu zaměřený na hledání chyb, který před nedávnem vyplašil celý svět) a předvedl, že schopnosti umělé inteligence nejsou lineárně závislé na velikosti nebo ceně modelu a dokázal, že i některé otevřené modely zvládly v řadě testů odhalit ve zdrojových kódech stejné chyby jako Mythos (například FreeBSD CVE-2026-4747) a to s výrazně nižšími provozními náklady.
Federální návrh zákona H.R.8250 'Parents Decide Act', 13. dubna předložený demokratem Joshem Gottheimerem a podpořený republikánkou Elise Stefanik coby spolupředkladatelkou (cosponsor), by v případě svého schválení nařizoval všem výrobcům operačních systémů při nastavování zařízení ověřovat věk uživatelů a při používání poskytovat tento věkový údaj aplikacím třetích stran. Hlavní rozdíl oproti kalifornskému zákonu AB 1043 a kolorádskému SB26-051 je ten, že federální návrh by platil rovnou pro celé USA.
V tomto článku se pokusím vysvětlit, jak vytvořit jednoduchý modul pro domácí účetníctví KMyMoney. U čtenářů předpokládám znalost programování v C++, výhodou je znalost Qt (na AbcLinuxu vycházel/vychází seriál o knihovně Qt) a případná znalost programování pro platformu KDE. V článku nebudu zacházet do přílišných detailů, protože předpokládám, že případní zájemci o tvorbu modulů v KMyMoney nebudou naprostí programátorští zelenáči.
Ukázkový modul by neměl být příliš složitý. Vytvoříme tedy jednoduchý modul, který bude umět otevřít dokument spojený s příslušnou transakcí v peněžním deníku – například fakturu. Transakci budeme identifikovat podle čísla dokladu (při vydávání faktur určuje číslo faktury účtující, u přijatých faktur jsme odkázáni na vydavatele faktury).
Máme-li faktury uložené v pdf, můžeme do nastavení napsat například:
okular /home/uzivatel/Dokumenty/Faktury/Faktura-%1.pdf
Parametr %1 se nahradí číslem dokladu z transakce v KMyMoney a výsledné jméno souboru se pak použije jako parametr pro aplikaci okular.
Abychom dosáhli požadované funkčnosti, potřebujeme ve skutečnosti vyrobit dva provázané moduly – jeden modul se bude starat o nastavení (cesta k uloženým dokumentům), druhý modul se bude starat o fungování – spuštění požadované akce. Nastavení najdeme v menu Nastavení - Nastavení KMyMoney - Moduly, akci samotnou pak v kontextovém menu transakce a v menu Transakce. Akci samotnou bude možné spustit pouze v případě, že vybraná transakce má vyplněné číslo dokladu, jinak nebude akce povolená.
Nejsem žádný velký programátor, natožpak pro KDE. Naštěstí pro vytvoření takto jednoduchého modulu není nutné nic složitého studovat, stačí se podívat do jiných modulů a prostě opsat, co už je hotové. Další informace proto mohou být poněkud nepřesné, důležité však je, že to funguje.
Jednotlivé části modulu jsou různě pojmenované. Výkonný modul používá prefix kmm_, nastavovací modul pak kcm_kmm_ - podle těchto předpon můžete identifikovat v adresáři /usr/lib/kde moduly pro KMyMoney. Náš modul bude tvořen dvěma soubory: kmm_openattachedfile.so a kcm_kmm_openattachedfile.so.
Každý modul má vlastní adresář ve stromu zdrojových tvarů v kmymoney/kmymoney/plugins. V adresáři najdeme několik souborů (názvy beru z už hotového modulu):
Vlastní objekt modulu je deklarován v hlavičkovém souboru openattachedfile.h. Měl by být potomkem třídy KMyMoneyPlugin::Plugin. Protože se jedná o klasický QObject, musíte v hlavičkovém souboru uvést i makro Q_OBJECT. Modul tak může obsahovat různé sloty, které můžete napojit na signály generované v KMyMoney.
V souboru openattachedfile.cpp najdete vlastní zdrojový tvar akce. Po nezbytných hlavičkách a includech následuje povinné "byl jednou jeden král", kterým se zaregistruje modul v KDE (KGenericFactory, K_EXPORT_COMPONENT_FACTORY atd). Při opisování dbejte pečlivě na to, abyste přepsali všechna místa vlastními řetězci a názvy. Úvod pohádky pokračuje i v konstruktoru.
http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKGenericFactory.html
http://kmymoney2.sourceforge.net/kmymoney2-api/html/classKMyMoneyPlugin_1_1Plugin.html
typedef KGenericFactoryopenattachedfileFactory; K_EXPORT_COMPONENT_FACTORY(kmm_openattachedfile, openattachedfileFactory("kmm_openattachedfile")) /** * Konstruktor pluginu * Přidává akci do menu (podrobnosti jsou v kmm_openattachedfile.rc) * Propojuje vytvořenou akci v menu se slotem v pluginu */ KMMOpenAttachedFilePlugin::KMMOpenAttachedFilePlugin(QObject *parent, const QStringList&) : KMyMoneyPlugin::Plugin(parent, "Open Attached File" /* Musí být shodné s X-KDE-PluginInfo-Name */) { setComponentData(openattachedfileFactory::componentData()); setXMLFile("kmm_openattachedfile.rc");
V konstruktoru dále vytvoříme akci a napojíme ji na náš slot. Dále propojíme sloty slotPlug a slotUnPlug. Při zasunutí modulu se propojují další sloty se signály generovanými aplikací KMyMoney. Netuším, jestli se dají tyto sloty a signály propojit i v konstruktoru – zde jsem se nechal plně inspirovat předlohou, ze které jsem opisoval (modul printcheck). Předpokládám ale, že modul je možné propojit se signály KMyMoney až po zasunutí proto, že při vytvoření (volání konstruktoru) není ještě vytvořené prostředí KMyMoney a funkce viewInterface() by vrátila neužitečnou hodnotu. Chcete-li experimentovat, můžete.
m_action = actionCollection()->addAction("openattachedfile", this, SLOT(slotOpenAttachedFile()));
m_action->setText(i18n("Open Attached File"));
m_action->setEnabled(false);
connect(KMyMoneyPlugin::PluginLoader::instance(), SIGNAL(plug(KPluginInfo*)),
this, SLOT(slotPlug(KPluginInfo*)));
connect(KMyMoneyPlugin::PluginLoader::instance(), SIGNAL(unplug(KPluginInfo*)),
this, SLOT(slotUnplug(KPluginInfo*)));
Další sloty už se týkají vlastní funkce modulu. Vybrané transakce se zapamatují v našem modulu (změna výběru je signalizovaná do slotu slotTransactionsSelected) a při vyvolání akce se s vybranými transakcemi provede požadovaná činnost.
V seznamu vybraných transakcí se pracuje s objektem MyMoneyTransaction (ten je v seznamu transakcí trochu schovaný). Popis tohoto objektu můžete najít zde:
http://kmymoney2.sourceforge.net/kmymoney2-api/html/classMyMoneyTransaction.html
V našem modulu se z objektu využívá pouze volání *it.split().number(),
které vrací číslo dokladu. Podle tohoto čísla se otevírá příslušný dokument.
/**
* Slot volaný při změně výběru transakcí.
* Pokud vybrané transakce obsahují číslo dokumentu, povolí se akce spojená s transakcí, jinak
* je akce v menu neaktivní.
*/
void KMMOpenAttachedFilePlugin::slotTransactionsSelected(const KMyMoneyRegister::SelectedTransactions& transactions) {
bool actionEnabled = false;
m_transactions = transactions;
KMyMoneyRegister::SelectedTransactions::const_iterator it;
for (it = transactions.constBegin(); it != transactions.constEnd(); it++) {
if ( (*it).split().number() != "" ) {
actionEnabled = true;
break;
}
}
m_action->setEnabled(actionEnabled);
}
U vybraných transakcí se startuje externí aplikace podle uloženého nastavení.
K tomu se dostaneme voláním funkce PluginSettings::path(). Využívá
se zde automatického ukládání nastavení v KDE modulech do rc souborů.
Po zaregistrování v souboru pluginsettings.kcfg je možné k hodnotám v nastavovacím
formuláři přistupovat tímto jednoduchým voláním (path je jméno formulářového políčka).
U widgetů z KDE je tato vlastnost bezproblémová, kolem widgetů z KMyMoney je někdy
potřeba vytvořit jednoduchý wrapper, který tuto funkčnost doplní.
/**
* Tento slot je volaný při vyvolání akce z kontextového menu transakce.
* Pro každou vybranou transakci se zadaným číslem dokladu
* zavolá funkci pro otevření příslušného dokumentu.
*/
void KMMOpenAttachedFilePlugin::slotOpenAttachedFile() {
qDebug() << "KMMOpenAttachedFilePlugin::slotOpenAttachedFile()";
KMyMoneyRegister::SelectedTransactions::const_iterator it;
for (it = m_transactions.constBegin(); it != m_transactions.constEnd(); ++it) {
if ( (*it).split().number() == "" ) {
continue;
}
openFile((*it).split().number());
}
}
/**
* Funkce pro otevření dokumentu v zadaném programu.
* Program se startuje nezávisle na KMyMoney. Po ukončení
* programu se volá slotProcessFinished, aby se po nastartovaném
* a ukončeném programu uklidilo.
*/
void KMMOpenAttachedFilePlugin::openFile(const QString& number) {
QStringList params = PluginSettings::path().split(' ');
if (params.isEmpty()) return;
KProcess *process = new KProcess();
process->setProgram(params.takeFirst());
for (int i=0; i
Při programování modulů pro KMyMoney využijete často i další dva objekty (zde nepoužité) – MyMoneyFile a MyMoneyTransactionFilter. Objekt MyMoneyFile vám zprostředkuje přístup do všech vašich dat uložených v KMyMoney, pomocí objektu MyMoneyTransactionFilter pak můžete vybrat pouze transakce, které vás zajímají.
http://kmymoney2.sourceforge.net/kmymoney2-api/html/classMyMoneyTransactionFilter.html
http://kmymoney2.sourceforge.net/kmymoney2-api/html/classMyMoneyFile.html
Akci lze doplnit do prakticky libovolného menu v aplikaci KMyMoney. Umístění je určeno souborem kmm_openattachedfile.rc. Jde o jednoduchý xml soubor. Chcete-li se zorientovat ve struktuře menu aplikace KMyMoney, podívejte se do souboru kmymoneyui.rc (o dva adresáře výše, jste-li v adresáři s modulem).
Díky automatickému ukládání hodnot může být modul pro nastavení velmi jednoduchý. Prakticky nám stačí jen naklikat nastavovací formulář (vytvářejte widget, nikoli okno nebo dialog) a ve vlastním objektu jej pouze vytvořit (setupUi()) a připojit k objektu pluginu. Hezký popis tvorby nastavovací části pluginu najdete v dokumentaci KDE:
http://api.kde.org/4.x-api/kdelibs-apidocs/kdeui/html/classKCModule.html
Při klikání formuláře aplikací Designer z Qt vybírejte pouze widgety určené pro KDE. Jména polí uvádějte prefixem kcfg_ - naše pole pro nastavení aplikace se tak jmenuje kcfg_path. Když uvedete takové pole v souboru pluginsettings.kcfg, bude se hodnota ukládat automaticky a ve výkonné části modulu se k ní dostanete jednoduše voláním PluginSettings::path().
Chcete-li, aby byl modul začlenitelný do hlavního stromu aplikace KMyMoney, všechny
řetězce, které se zobrazují uživateli, pište anglicky a uzavírejte je do volání funkce
i18n(). Asi takto: i18n("This is an English string").
Aby se váš nový modul překládal spolu s aplikací KMyMoney, musíte upravit soubor CMakeLists.txt v nadřízeném adresáři. Prakticky stačí doplnit řádek
ADD_SUBDIRECTORY( openattachedfile )
V tomto souboru se popisuje, co a jak se má při překladu a linkování dělat. Soubor CMakeLists.txt musí být i v adresáři openattachedfile, kde jsou uloženy naše zdrojové kódy. Jeho obsah už je složitější, ale nejjednodušším řešením je opět opisování odjinud. Já jsem opsal a upravil údaje v souboru připojeném k modulu printcheck.
Náš ukázkový modul je jednoduchý, vystačí si s minimem knihoven z KMyMoney. Sáhnete-li po některých dialozích či widgetech z KMyMoney (datum, výběr účtu), může být potřeba přilinkovat i některé další (bohužel statické) knihovny.
Jakmile je modul přeložený a nainstalovaný, měli byste nalézt jeho nastavení
v menu Nastavení - Nastavení KMyMoney - Moduly. Mimo to můžete vyzkoušet modul
pro nastavení i bez startu KMyMoney, použijte program kcmshell4:
kcmshell4 kcm_kmm_openattachedfile.
Vlastní výkonnou část najdete v kontextovém menu transakce – v peněžním deníku klikněte levým tlačítkem na zvolenou transakci. Na konci menu byste měli vidět naši akci "Open attached file".
Množství odkazů jsem uvedl již v textu, zde najdete alespoň krátké shrnutí:
Popis knihovny Qt
Popis API prostředí KDE
Popis API aplikace KMyMoney
I když je modul poměrně jednoduchý, zdrojových souborů je docela dost. Kompletní zdrojové tvary jsou proto ke stažení extra:
Máte-li modul přeložený a odladěný na vlastní kopii KMyMoney, můžete se pokusit o jeho začlenění do KMyMoney. Mně se to dosud nepodařilo, nejsem dostatečně vytvalý a vtěrný. Nebo mi nechodí pošta (to by byla ostuda). Zamýšlel jsem tento článek završit vítězným virtuálním poplácáním po vlastním rameni, ale plugin openattachedfile v hlavním stromu dosud není. Článek mám rozepsaný už nějakou dobu a dospěl jsem k názoru, že bude lepší jej zveřejnit i bez vítězného konce. Případné oznámení o úspěšném začlenění modulu a použitý postup tak najdete nejspíš v mém blogu zde na AbcLinuxu.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej: